diff --git a/src/app/api/settings/disappearing-messages/route.js b/src/app/api/settings/disappearing-messages/route.js index 6795f63..53c6bc4 100644 --- a/src/app/api/settings/disappearing-messages/route.js +++ b/src/app/api/settings/disappearing-messages/route.js @@ -75,7 +75,14 @@ export async function PUT(request) { return NextResponse.json({ error: 'Invalid token' }, { status: 401 }); } - const { default_message_retention_days } = await request.json(); + let body; + try { + body = await request.json(); + } catch { + return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 }); + } + + const { default_message_retention_days } = body; // Validate input if (typeof default_message_retention_days !== 'number' || default_message_retention_days < 0) { diff --git a/src/app/api/settings/disappearing-messages/route.test.js b/src/app/api/settings/disappearing-messages/route.test.js index 4b4c8b1..68427cd 100644 --- a/src/app/api/settings/disappearing-messages/route.test.js +++ b/src/app/api/settings/disappearing-messages/route.test.js @@ -130,4 +130,17 @@ describe('settings disappearing messages authentication', () => { expect(mocks.authGetUser).toHaveBeenCalledWith('valid-token'); expect(mocks.updateEq).toHaveBeenCalledWith('auth_user_id', 'auth-user-id'); }); + + it('returns 400 for malformed PUT JSON instead of a generic 500', async () => { + const { PUT } = await import('./route.js'); + const response = await PUT({ + headers: new Headers({ authorization: 'Bearer valid-token' }), + json: vi.fn().mockRejectedValue(new SyntaxError('Unexpected token')) + }); + const body = await response.json(); + + expect(response.status).toBe(400); + expect(body.error).toBe('Invalid JSON body'); + expect(mocks.from).not.toHaveBeenCalled(); + }); });