From aeaca7653476c24bb403df9ee97ce1fe89f02e5a Mon Sep 17 00:00:00 2001 From: Marcel Raddatz Date: Thu, 2 Apr 2026 13:58:37 +0200 Subject: [PATCH] =?UTF-8?q?fix(auth):=20handle=20users=20without=20househo?= =?UTF-8?q?ld=20=E2=80=94=20fallback=20to=20'Kein=20Haushalt'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes non-null assertions on householdId/householdName. Users who haven't joined a household get a fallback name in the sidebar. Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/app.d.ts | 2 +- frontend/src/hooks.server.test.ts | 30 ++++++++++++++++++++++++++++++ frontend/src/hooks.server.ts | 6 +++--- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/frontend/src/app.d.ts b/frontend/src/app.d.ts index 6c9d3a6..d510808 100644 --- a/frontend/src/app.d.ts +++ b/frontend/src/app.d.ts @@ -12,7 +12,7 @@ declare global { rolle: 'planer' | 'mitglied'; }; haushalt?: { - id: string; + id: string | undefined; name: string; }; } diff --git a/frontend/src/hooks.server.test.ts b/frontend/src/hooks.server.test.ts index b27342e..708071e 100644 --- a/frontend/src/hooks.server.test.ts +++ b/frontend/src/hooks.server.test.ts @@ -101,6 +101,36 @@ describe('auth guard (hooks.server.ts handle)', () => { expect(resolve).toHaveBeenCalledWith(event); }); + it('handles user without household gracefully', async () => { + mockGet.mockResolvedValue({ + data: { + data: { + id: '456', + displayName: 'Neu', + householdId: null, + householdName: null, + householdRole: null, + email: 'neu@example.com', + systemRole: 'user' + } + }, + error: undefined + }); + + const { event, resolve } = createEvent('/planner', 'valid-session'); + await handle({ event, resolve }); + expect(event.locals.benutzer).toEqual({ + id: '456', + name: 'Neu', + rolle: 'mitglied' + }); + expect(event.locals.haushalt).toEqual({ + id: undefined, + name: 'Kein Haushalt' + }); + expect(resolve).toHaveBeenCalledWith(event); + }); + it('redirects to /login with redirect param when session validation fails', async () => { mockGet.mockResolvedValue({ data: undefined, error: { status: 401 } }); diff --git a/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts index afa1868..0f60418 100644 --- a/frontend/src/hooks.server.ts +++ b/frontend/src/hooks.server.ts @@ -39,11 +39,11 @@ export const handle: Handle = async ({ event, resolve }) => { event.locals.benutzer = { id: user.id!, name: user.displayName!, - rolle: user.householdRole as 'planer' | 'mitglied' + rolle: (user.householdRole as 'planer' | 'mitglied') ?? 'mitglied' }; event.locals.haushalt = { - id: user.householdId!, - name: user.householdName! + id: user.householdId ?? undefined, + name: user.householdName ?? 'Kein Haushalt' }; return resolve(event);