/** * POST /api/tools/unlock { handle, toolId } * Deducts VOID credits and permanently marks the tool as unlocked for this handle. */ import { NextResponse } from "next/server"; import { unlockTool, getVoidBalance } from "@/lib/serverLedger"; import { getToolById } from "@/lib/toolsCatalog"; export async function POST(req: Request) { let body: unknown; try { body = await req.json(); } catch { return NextResponse.json({ ok: false, error: "Invalid JSON" }, { status: 400 }); } const { handle, toolId } = (body as Record) ?? {}; if (typeof handle !== "string" || !handle.trim()) { return NextResponse.json({ ok: false, error: "handle is required" }, { status: 400 }); } if (typeof toolId !== "string" || !toolId.trim()) { return NextResponse.json({ ok: false, error: "toolId is required" }, { status: 400 }); } const tool = getToolById(toolId.trim()); if (!tool) { return NextResponse.json({ ok: false, error: "Unknown tool" }, { status: 404 }); } if (tool.comingSoon) { return NextResponse.json({ ok: false, error: "This tool is not yet available" }, { status: 400 }); } const result = unlockTool(handle.trim(), tool.id, tool.cost); if (!result.ok) { return NextResponse.json({ ok: false, error: result.error }, { status: 402 }); } return NextResponse.json({ ok: true, toolId: tool.id, voidSpent: tool.cost, voidBalance: getVoidBalance(handle.trim()), }); }