{"version":3,"file":"_domain_.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/admin/allowed-domains/[domain].ts"],"sourcesContent":["/**\n * PATCH/DELETE /_emdash/api/admin/allowed-domains/[domain]\n *\n * Admin endpoints for managing a specific allowed domain.\n * PATCH - Update domain settings (enabled, defaultRole)\n * DELETE - Remove an allowed domain\n */\n\nimport type { APIRoute } from \"astro\";\n\nexport const prerender = false;\n\nimport { builtinRoleForLevel, roleFromLevel } from \"@premium-cms/auth\";\nimport { createKyselyAdapter } from \"@premium-cms/auth/adapters/kysely\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { allowedDomainUpdateBody } from \"#api/schemas.js\";\nimport { AuthzRepository } from \"#db/repositories/authz.js\";\n\n/**\n * PATCH - Update domain settings\n */\nexport const PATCH: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { domain } = params;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"Database not configured\", 500);\n\t}\n\n\tif (!domain) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"Domain is required\", 400);\n\t}\n\n\tconst denied = requirePerm(user, \"users:manage\");\n\tif (denied) return denied;\n\n\tconst adapter = createKyselyAdapter(emdash.db);\n\n\ttry {\n\t\tconst body = await parseBody(request, allowedDomainUpdateBody);\n\t\tif (isParseError(body)) return body;\n\n\t\t// Check if domain exists\n\t\tconst existing = await adapter.getAllowedDomain(domain);\n\t\tif (!existing) {\n\t\t\treturn apiError(\"NOT_FOUND\", \"Domain not found\", 404);\n\t\t}\n\n\t\tlet defaultRole = body.defaultRole;\n\t\tlet defaultRoleId: string | undefined;\n\t\tif (body.defaultRoleId !== undefined) {\n\t\t\tconst summary = await new AuthzRepository(emdash.db).getRole(body.defaultRoleId);\n\t\t\tif (!summary) return apiError(\"UNKNOWN_ROLE\", \"Role not found\", 400);\n\t\t\tdefaultRoleId = summary.id;\n\t\t\tdefaultRole = summary.level as typeof defaultRole;\n\t\t} else if (defaultRole !== undefined) {\n\t\t\tdefaultRoleId = `role:${builtinRoleForLevel(defaultRole).slug}`;\n\t\t}\n\n\t\t// Update domain\n\t\tconst enabled = body.enabled ?? existing.enabled;\n\t\tawait adapter.updateAllowedDomain(domain, enabled, defaultRole, defaultRoleId);\n\n\t\t// Fetch updated domain\n\t\tconst updated = await adapter.getAllowedDomain(domain);\n\n\t\treturn apiSuccess({\n\t\t\tsuccess: true,\n\t\t\tdomain: updated\n\t\t\t\t? {\n\t\t\t\t\t\tdomain: updated.domain,\n\t\t\t\t\t\tdefaultRole: updated.defaultRole,\n\t\t\t\t\t\tdefaultRoleId: updated.defaultRoleId,\n\t\t\t\t\t\troleName: roleFromLevel(updated.defaultRole),\n\t\t\t\t\t\tenabled: updated.enabled,\n\t\t\t\t\t\tcreatedAt: updated.createdAt.toISOString(),\n\t\t\t\t\t}\n\t\t\t\t: null,\n\t\t});\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to update allowed domain\", \"DOMAIN_UPDATE_ERROR\");\n\t}\n};\n\n/**\n * DELETE - Remove an allowed domain\n */\nexport const DELETE: APIRoute = async ({ params, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst { domain } = params;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"Database not configured\", 500);\n\t}\n\n\tif (!domain) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"Domain is required\", 400);\n\t}\n\n\tconst denied = requirePerm(user, \"users:manage\");\n\tif (denied) return denied;\n\n\tconst adapter = createKyselyAdapter(emdash.db);\n\n\ttry {\n\t\t// Check if domain exists (optional - delete is idempotent)\n\t\tconst existing = await adapter.getAllowedDomain(domain);\n\t\tif (!existing) {\n\t\t\treturn apiError(\"NOT_FOUND\", \"Domain not found\", 404);\n\t\t}\n\n\t\tawait adapter.deleteAllowedDomain(domain);\n\n\t\treturn apiSuccess({ success: true });\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to delete allowed domain\", \"DOMAIN_DELETE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAUA,MAAa,YAAY;;;;AAczB,MAAa,QAAkB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACrE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,WAAW;AAEnB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,2BAA2B,IAAI;AAGlE,KAAI,CAAC,OACJ,QAAO,SAAS,oBAAoB,sBAAsB,IAAI;CAG/D,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,UAAU,oBAAoB,OAAO,GAAG;AAE9C,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,wBAAwB;AAC9D,MAAI,aAAa,KAAK,CAAE,QAAO;EAG/B,MAAM,WAAW,MAAM,QAAQ,iBAAiB,OAAO;AACvD,MAAI,CAAC,SACJ,QAAO,SAAS,aAAa,oBAAoB,IAAI;EAGtD,IAAI,cAAc,KAAK;EACvB,IAAI;AACJ,MAAI,KAAK,kBAAkB,QAAW;GACrC,MAAM,UAAU,MAAM,IAAI,gBAAgB,OAAO,GAAG,CAAC,QAAQ,KAAK,cAAc;AAChF,OAAI,CAAC,QAAS,QAAO,SAAS,gBAAgB,kBAAkB,IAAI;AACpE,mBAAgB,QAAQ;AACxB,iBAAc,QAAQ;aACZ,gBAAgB,OAC1B,iBAAgB,QAAQ,oBAAoB,YAAY,CAAC;EAI1D,MAAM,UAAU,KAAK,WAAW,SAAS;AACzC,QAAM,QAAQ,oBAAoB,QAAQ,SAAS,aAAa,cAAc;EAG9E,MAAM,UAAU,MAAM,QAAQ,iBAAiB,OAAO;AAEtD,SAAO,WAAW;GACjB,SAAS;GACT,QAAQ,UACL;IACA,QAAQ,QAAQ;IAChB,aAAa,QAAQ;IACrB,eAAe,QAAQ;IACvB,UAAU,cAAc,QAAQ,YAAY;IAC5C,SAAS,QAAQ;IACjB,WAAW,QAAQ,UAAU,aAAa;IAC1C,GACA;GACH,CAAC;UACM,OAAO;AACf,SAAO,YAAY,OAAO,mCAAmC,sBAAsB;;;;;;AAOrF,MAAa,SAAmB,OAAO,EAAE,QAAQ,aAAa;CAC7D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,EAAE,WAAW;AAEnB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,2BAA2B,IAAI;AAGlE,KAAI,CAAC,OACJ,QAAO,SAAS,oBAAoB,sBAAsB,IAAI;CAG/D,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;CAEnB,MAAM,UAAU,oBAAoB,OAAO,GAAG;AAE9C,KAAI;AAGH,MAAI,CADa,MAAM,QAAQ,iBAAiB,OAAO,CAEtD,QAAO,SAAS,aAAa,oBAAoB,IAAI;AAGtD,QAAM,QAAQ,oBAAoB,OAAO;AAEzC,SAAO,WAAW,EAAE,SAAS,MAAM,CAAC;UAC5B,OAAO;AACf,SAAO,YAAY,OAAO,mCAAmC,sBAAsB"}