45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
/**
|
|
* 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<string, unknown>) ?? {};
|
|
|
|
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()),
|
|
});
|
|
}
|