36 lines
1,000 B
TypeScript
36 lines
1,000 B
TypeScript
import type { APIRoute } from "astro";
|
|
import { createCap } from "@lib/CapAdapter";
|
|
export const prerender = false;
|
|
|
|
export const POST: APIRoute = async (context) => {
|
|
if (!context.session) {
|
|
return new Response(
|
|
JSON.stringify({ success: false, error: "Session unavailable." }),
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
|
|
let body: { token?: unknown; solutions?: unknown };
|
|
try {
|
|
body = await context.request.json();
|
|
} catch {
|
|
return new Response(JSON.stringify({ success: false }), { status: 400 });
|
|
}
|
|
|
|
const { token, solutions } = body ?? {};
|
|
if (
|
|
typeof token !== "string" ||
|
|
token.length > 256 ||
|
|
!Array.isArray(solutions) ||
|
|
solutions.length > 128 ||
|
|
!solutions.every((s) => typeof s === "number")
|
|
) {
|
|
return new Response(JSON.stringify({ success: false }), { status: 400 });
|
|
}
|
|
|
|
const cap = createCap(context.session);
|
|
return new Response(
|
|
JSON.stringify(await cap.redeemChallenge({ token, solutions })),
|
|
{ status: 200 },
|
|
);
|
|
};
|