diff --git a/backend/routers/caldav_router.py b/backend/routers/caldav_router.py index a0d61aa..1aa38e4 100644 --- a/backend/routers/caldav_router.py +++ b/backend/routers/caldav_router.py @@ -347,13 +347,15 @@ def get_events( .filter(models.GoogleAccount.user_id == current_user.id) .all() ) + google_errors = [] for g_acc in google_accounts: try: all_events.extend(get_google_events(g_acc, start_dt, end_dt, db)) except Exception as exc: logger.error("Error fetching Google Calendar for %s: %s", g_acc.email, exc) + google_errors.append({"email": g_acc.email}) - return all_events + return {"events": all_events, "errors": google_errors} @router.post("/events") diff --git a/backend/routers/google_router.py b/backend/routers/google_router.py index d771d61..0a1c443 100644 --- a/backend/routers/google_router.py +++ b/backend/routers/google_router.py @@ -373,8 +373,9 @@ def get_google_events(account: models.GoogleAccount, start_dt: datetime, end_dt: """Fetch events from all enabled Google calendars for an account.""" try: token = _refresh_access_token(account, db) - except Exception: - return [] + except Exception as exc: + logger.error("Token refresh failed for Google account %s: %s", account.email, exc) + raise all_events = [] try: diff --git a/frontend/js/calendar.js b/frontend/js/calendar.js index bfa22a3..631d012 100644 --- a/frontend/js/calendar.js +++ b/frontend/js/calendar.js @@ -124,7 +124,7 @@ function prefetchIfNeeded(viewStart, viewEnd) { const from = new Date(eventCache.end); const to = new Date(eventCache.end.getTime() + PREFETCH_EXT); api.get(`/caldav/events?start=${from.toISOString()}&end=${to.toISOString()}`) - .then(evs => { _mergeEvents(evs); eventCache.end = to; }) + .then(r => { _mergeEvents(r.events || r); eventCache.end = to; }) .catch(() => {}) .finally(() => { eventCache._fwdPending = false; }); } @@ -134,7 +134,7 @@ function prefetchIfNeeded(viewStart, viewEnd) { const from = new Date(eventCache.start.getTime() - PREFETCH_EXT); const to = new Date(eventCache.start); api.get(`/caldav/events?start=${from.toISOString()}&end=${to.toISOString()}`) - .then(evs => { _mergeEvents(evs); eventCache.start = from; }) + .then(r => { _mergeEvents(r.events || r); eventCache.start = from; }) .catch(() => {}) .finally(() => { eventCache._bwdPending = false; }); } @@ -161,7 +161,13 @@ async function fetchAndRender(force = false) { showLoading(); try { - const events = await api.get(`/caldav/events?start=${fetchStart.toISOString()}&end=${fetchEnd.toISOString()}`); + const resp = await api.get(`/caldav/events?start=${fetchStart.toISOString()}&end=${fetchEnd.toISOString()}`); + const events = resp.events || resp; + if (resp.errors && resp.errors.length) { + for (const err of resp.errors) { + showToast(`Google (${err.email}): Token abgelaufen – bitte Konto trennen und neu verbinden`, true); + } + } eventCache.start = fetchStart; eventCache.end = fetchEnd; eventCache.events = events;