fix: Google-Token-Fehler wird sichtbar gemacht und dem User gemeldet
Wenn der Access-Token eines Google-Accounts abläuft und der Refresh
fehlschlägt, wurde die leere Terminliste bisher still zurückgegeben
(kein Log, keine UI-Meldung). Jetzt wird der Fehler geloggt, an den
Aufrufer weitergegeben und als Toast-Meldung im Frontend angezeigt
("Token abgelaufen – bitte Konto trennen und neu verbinden").
Das Events-Endpoint gibt nun {events, errors} statt ein reines Array
zurück; das Frontend extrahiert die Events entsprechend.
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user