import { NextResponse } from "next/server"; import { auth } from "@/auth"; import { ApiError } from "@/lib/errors"; import { logger } from "@/lib/logger"; export type ApiHandlerContext

= { params: Promise

; t0: number; }; export function withApiHandler

>( ctx: string, handler: (req: Request, ctx: ApiHandlerContext

) => Promise ) { return async ( request: Request, routeContext?: { params: Promise

} ): Promise => { const t0 = Date.now(); const session = await auth(); if (!session) { logger.warn(ctx, "unauthorized"); return NextResponse.json({ message: "Unauthorized" }, { status: 401 }); } const handlerCtx: ApiHandlerContext

= { params: routeContext?.params ?? (Promise.resolve({}) as Promise

), t0, }; try { return await handler(request, handlerCtx); } catch (error) { if (error instanceof ApiError) { const level = error.statusCode >= 500 ? "error" : "warn"; logger[level](ctx, error.message, { status: error.statusCode, duration: Date.now() - t0, }); return NextResponse.json( { message: error.message }, { status: error.statusCode } ); } logger.error(ctx, "unexpected error", { error: String(error), duration: Date.now() - t0, }); return NextResponse.json( { message: "Internal server error" }, { status: 500 } ); } }; }