Implement structured logging for API routes (P3.7)

Replace console.error with pino structured logger across API routes
and add key event logging per observability spec:
- Auth failure (warn): reason
- Period logged (info): userId, date
- Override toggled (info): userId, override, enabled
- Decision calculated (info): userId, decision, reason
- Error events (error): err object with stack trace

Files updated:
- auth-middleware.ts: Added structured logging for auth failures
- cycle/period/route.ts: Added Period logged event + error logging
- calendar/[userId]/[token].ics/route.ts: Replaced console.error
- overrides/route.ts: Added Override toggled events
- today/route.ts: Added Decision calculated event

Tests: 720 passing (added 3 new structured logging tests)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-11 09:19:55 +00:00
parent 00d902a396
commit 714194f2d3
7 changed files with 124 additions and 12 deletions

View File

@@ -4,6 +4,7 @@ import type { NextRequest } from "next/server";
import { NextResponse } from "next/server";
import { withAuth } from "@/lib/auth-middleware";
import { logger } from "@/lib/logger";
import { createPocketBaseClient } from "@/lib/pocketbase";
import type { OverrideType } from "@/types";
@@ -59,6 +60,12 @@ export const POST = withAuth(async (request: NextRequest, user) => {
.collection("users")
.update(user.id, { activeOverrides: newOverrides });
// Log override toggle per observability spec
logger.info(
{ userId: user.id, override: overrideToAdd, enabled: true },
"Override toggled",
);
return NextResponse.json({ activeOverrides: newOverrides });
});
@@ -98,5 +105,11 @@ export const DELETE = withAuth(async (request: NextRequest, user) => {
.collection("users")
.update(user.id, { activeOverrides: newOverrides });
// Log override toggle per observability spec
logger.info(
{ userId: user.id, override: overrideToRemove, enabled: false },
"Override toggled",
);
return NextResponse.json({ activeOverrides: newOverrides });
});