homeio
PublikFork dari doctor-io/homeio
route.ts
import { z } from "zod";
import { type NextRequest, NextResponse } from "next/server";
import {
createRequestId,
logServerAction,
withServerTiming,
} from "@/lib/server/logging/logger";
import { getAuthCookieName } from "@/lib/server/modules/auth/cookies";
import { AuthError, verifyUnlockPassword } from "@/lib/server/modules/auth/service";
export const runtime = "nodejs";
const unlockSchema = z.object({
password: z.string().min(1),
});
export async function POST(request: NextRequest) {
const requestId = createRequestId();
const sessionToken = request.cookies.get(getAuthCookieName())?.value;
try {
const body = await request.json();
const parsed = unlockSchema.safeParse(body);
if (!parsed.success) {
return NextResponse.json(
{
error: "Invalid request payload",
},
{ status: 400 },
);
}
await withServerTiming(
{
layer: "api",
action: "auth.unlock",
requestId,
},
async () => {
await verifyUnlockPassword({
sessionToken,
password: parsed.data.password,
});
},
);
return NextResponse.json({ ok: true });
} catch (error) {
const statusCode = error instanceof AuthError ? error.statusCode : 500;
logServerAction({
level: statusCode >= 500 ? "error" : "warn",
layer: "api",
action: "auth.unlock",
status: "error",
requestId,
error,
});
return NextResponse.json(
{
error: error instanceof AuthError ? error.message : "Unlock failed",
},
{ status: statusCode },
);
}
}