{"version":3,"file":"verify.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/auth/signup/verify.ts"],"sourcesContent":["/**\n * GET /_emdash/api/auth/signup/verify\n *\n * Validate a signup verification token (called when user clicks email link).\n * Returns the email and role for the UI to display.\n */\n\nimport type { APIRoute } from \"astro\";\n\nexport const prerender = false;\n\nimport { validateSignupToken, SignupError, roleFromLevel } from \"@premium-cms/auth\";\nimport { createKyselyAdapter } from \"@premium-cms/auth/adapters/kysely\";\n\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { AuthzRepository } from \"#db/repositories/authz.js\";\n\nexport const GET: APIRoute = async ({ url, locals }) => {\n\tconst { emdash } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash is not initialized\", 500);\n\t}\n\n\tconst token = url.searchParams.get(\"token\");\n\n\tif (!token) {\n\t\treturn apiError(\"MISSING_PARAM\", \"Token is required\", 400);\n\t}\n\n\ttry {\n\t\tconst adapter = createKyselyAdapter(emdash.db);\n\t\tconst result = await validateSignupToken(adapter, token);\n\n\t\treturn apiSuccess({\n\t\t\tsuccess: true,\n\t\t\temail: result.email,\n\t\t\trole: result.role,\n\t\t\troleId: result.roleId,\n\t\t\troleName: await roleDisplayName(emdash.db, result.roleId, result.role),\n\t\t});\n\t} catch (error) {\n\t\tif (error instanceof SignupError) {\n\t\t\tconst statusMap: Record<string, number> = {\n\t\t\t\tinvalid_token: 404,\n\t\t\t\ttoken_expired: 410,\n\t\t\t\tuser_exists: 409,\n\t\t\t\tdomain_not_allowed: 403,\n\t\t\t};\n\t\t\treturn apiError(error.code.toUpperCase(), error.message, statusMap[error.code] ?? 400);\n\t\t}\n\n\t\treturn handleError(error, \"Failed to validate signup token\", \"SIGNUP_VERIFY_ERROR\");\n\t}\n};\n\n/** Human name for a role, preferring the roles table over the legacy level. */\nasync function roleDisplayName(\n\tdb: import(\"kysely\").Kysely<import(\"#db/types.js\").Database>,\n\troleId: string | null,\n\tlevel: number,\n): Promise<string> {\n\tif (roleId) {\n\t\tconst summary = await new AuthzRepository(db).roleSummary(roleId);\n\t\tif (summary) return summary.name;\n\t}\n\treturn roleFromLevel(level as 10 | 20 | 30 | 40 | 50) ?? \"Unknown\";\n}\n"],"mappings":";;;;;;;;AASA,MAAa,YAAY;AAQzB,MAAa,MAAgB,OAAO,EAAE,KAAK,aAAa;CACvD,MAAM,EAAE,WAAW;AAEnB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CAGpE,MAAM,QAAQ,IAAI,aAAa,IAAI,QAAQ;AAE3C,KAAI,CAAC,MACJ,QAAO,SAAS,iBAAiB,qBAAqB,IAAI;AAG3D,KAAI;EAEH,MAAM,SAAS,MAAM,oBADL,oBAAoB,OAAO,GAAG,EACI,MAAM;AAExD,SAAO,WAAW;GACjB,SAAS;GACT,OAAO,OAAO;GACd,MAAM,OAAO;GACb,QAAQ,OAAO;GACf,UAAU,MAAM,gBAAgB,OAAO,IAAI,OAAO,QAAQ,OAAO,KAAK;GACtE,CAAC;UACM,OAAO;AACf,MAAI,iBAAiB,YAOpB,QAAO,SAAS,MAAM,KAAK,aAAa,EAAE,MAAM,SANN;GACzC,eAAe;GACf,eAAe;GACf,aAAa;GACb,oBAAoB;GACpB,CACkE,MAAM,SAAS,IAAI;AAGvF,SAAO,YAAY,OAAO,mCAAmC,sBAAsB;;;;AAKrF,eAAe,gBACd,IACA,QACA,OACkB;AAClB,KAAI,QAAQ;EACX,MAAM,UAAU,MAAM,IAAI,gBAAgB,GAAG,CAAC,YAAY,OAAO;AACjE,MAAI,QAAS,QAAO,QAAQ;;AAE7B,QAAO,cAAc,MAAgC,IAAI"}