import { redeemDigaCode } from "../../db/diga"; /** * POST /api/onboarding/redeem-diga-code * * Löst einen DiGA-Rezept-Code ein und stuft den User auf Vollzugang hoch * (`grants_plan`, Default 'legend'). Skipped Trial + Onboarding (step='done'). * * Body: { code: string } * Response 200: { success: true, plan: 'legend' } * Response 400: { error: 'not_found' | 'already_used' | 'expired' | 'invalid_input' } * * Test-Codes (siehe Migration `20260517_add_diga_codes`): REBREAK-TEST-001..010 */ export default defineEventHandler(async (event) => { const user = await requireUser(event); const body = await readBody(event).catch(() => ({})); const code = body?.code; if (typeof code !== "string" || code.trim().length === 0) { throw createError({ statusCode: 400, data: { error: "invalid_input", message: "Code fehlt." }, }); } const res = await redeemDigaCode(user.id, code); if (!res.ok) { throw createError({ statusCode: 400, data: { error: res.reason, message: errorMessage(res.reason) }, }); } return { success: true, plan: res.plan }; }); function errorMessage(reason: "not_found" | "already_used" | "expired"): string { switch (reason) { case "not_found": return "Dieser Code existiert nicht. Bitte prüfe die Schreibweise."; case "already_used": return "Dieser Code wurde bereits eingelöst."; case "expired": return "Dieser Code ist abgelaufen."; } }