{"version":3,"file":"_slug_.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/admin/byline-fields/[slug].ts"],"sourcesContent":["/**\n * Byline custom-field schema management — single field CRUD.\n *\n * - GET    /_emdash/api/admin/byline-fields/{slug}    read one definition\n * - PATCH  /_emdash/api/admin/byline-fields/{slug}    update label / required /\n *                                                     translatable / validation /\n *                                                     sort order\n * - DELETE /_emdash/api/admin/byline-fields/{slug}    drop the definition and all\n *                                                     stored values (FK CASCADE +\n *                                                     app-level cleanup; see\n *                                                     `BylineSchemaRegistry.deleteField`)\n *\n * Thin wrappers around the handler layer; status mapping happens in\n * `unwrapResult`. `slug` and `type` are immutable post-create — see\n * `bylineFieldUpdateBody`. Flipping `translatable` while value rows\n * exist surfaces as a 409 `TRANSLATABLE_LOCKED`.\n *\n * Phase 4 of Discussion #1174.\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, requireDb, unwrapResult } from \"#api/error.js\";\nimport {\n\thandleBylineFieldDelete,\n\thandleBylineFieldGet,\n\thandleBylineFieldUpdate,\n} from \"#api/handlers/byline-fields.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { bylineFieldUpdateBody } from \"#api/schemas.js\";\n\nexport const prerender = false;\n\n// GET requires `schema:read` (Editor+); see sibling `index.ts` GET\n// for rationale.\nexport const GET: APIRoute = async ({ params, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst denied = requirePerm(user, \"schema:read\");\n\tif (denied) return denied;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst slug = params.slug;\n\tif (!slug) return apiError(\"MISSING_PARAM\", \"Field slug is required\", 400);\n\n\tconst result = await handleBylineFieldGet(emdash.db, slug);\n\treturn unwrapResult(result);\n};\n\nexport const PATCH: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst denied = requirePerm(user, \"schema:manage\");\n\tif (denied) return denied;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst slug = params.slug;\n\tif (!slug) return apiError(\"MISSING_PARAM\", \"Field slug is required\", 400);\n\n\tconst body = await parseBody(request, bylineFieldUpdateBody);\n\tif (isParseError(body)) return body;\n\n\tconst result = await handleBylineFieldUpdate(emdash.db, slug, {\n\t\tlabel: body.label,\n\t\trequired: body.required,\n\t\ttranslatable: body.translatable,\n\t\t// `null` clears the stored validation; `undefined` leaves it as-is.\n\t\t// The zod schema makes `validation` itself optional, so an absent\n\t\t// key reaches the handler as `undefined`.\n\t\tvalidation: body.validation,\n\t\tsortOrder: body.sortOrder,\n\t});\n\treturn unwrapResult(result);\n};\n\nexport const DELETE: APIRoute = async ({ params, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst denied = requirePerm(user, \"schema:manage\");\n\tif (denied) return denied;\n\n\tconst dbErr = requireDb(emdash?.db);\n\tif (dbErr) return dbErr;\n\n\tconst slug = params.slug;\n\tif (!slug) return apiError(\"MISSING_PARAM\", \"Field slug is required\", 400);\n\n\tconst result = await handleBylineFieldDelete(emdash.db, slug);\n\treturn unwrapResult(result);\n};\n"],"mappings":";;;;;;;;;;;;;;;AAgCA,MAAa,YAAY;AAIzB,MAAa,MAAgB,OAAO,EAAE,QAAQ,aAAa;CAC1D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,SAAS,YAAY,MAAM,cAAc;AAC/C,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,OAAO,OAAO;AACpB,KAAI,CAAC,KAAM,QAAO,SAAS,iBAAiB,0BAA0B,IAAI;AAG1E,QAAO,aADQ,MAAM,qBAAqB,OAAO,IAAI,KAAK,CAC/B;;AAG5B,MAAa,QAAkB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACrE,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,SAAS,YAAY,MAAM,gBAAgB;AACjD,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,OAAO,OAAO;AACpB,KAAI,CAAC,KAAM,QAAO,SAAS,iBAAiB,0BAA0B,IAAI;CAE1E,MAAM,OAAO,MAAM,UAAU,SAAS,sBAAsB;AAC5D,KAAI,aAAa,KAAK,CAAE,QAAO;AAY/B,QAAO,aAVQ,MAAM,wBAAwB,OAAO,IAAI,MAAM;EAC7D,OAAO,KAAK;EACZ,UAAU,KAAK;EACf,cAAc,KAAK;EAInB,YAAY,KAAK;EACjB,WAAW,KAAK;EAChB,CAAC,CACyB;;AAG5B,MAAa,SAAmB,OAAO,EAAE,QAAQ,aAAa;CAC7D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,SAAS,YAAY,MAAM,gBAAgB;AACjD,KAAI,OAAQ,QAAO;CAEnB,MAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,KAAI,MAAO,QAAO;CAElB,MAAM,OAAO,OAAO;AACpB,KAAI,CAAC,KAAM,QAAO,SAAS,iBAAiB,0BAA0B,IAAI;AAG1E,QAAO,aADQ,MAAM,wBAAwB,OAAO,IAAI,KAAK,CAClC"}