personal-site/src/pages/cap/redeem.ts
2026-07-10 12:33:49 -07:00

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 },
);
};