{"version":3,"file":"_id_.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/admin/oauth-clients/[id].ts"],"sourcesContent":["/**\n * Single OAuth client endpoints\n *\n * GET    /_emdash/api/admin/oauth-clients/:id — Get a client\n * PUT    /_emdash/api/admin/oauth-clients/:id — Update a client\n * DELETE /_emdash/api/admin/oauth-clients/:id — Delete a client\n */\n\nimport type { APIRoute } from \"astro\";\nimport { z } from \"zod\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, handleError, unwrapResult } from \"#api/error.js\";\nimport {\n\thandleOAuthClientDelete,\n\thandleOAuthClientGet,\n\thandleOAuthClientUpdate,\n} from \"#api/handlers/oauth-clients.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\n\nexport const prerender = false;\n\nconst updateClientSchema = z.object({\n\tname: z.string().min(1).max(255).optional(),\n\tredirectUris: z\n\t\t.array(z.string().url(\"Each redirect URI must be a valid URL\"))\n\t\t.min(1, \"At least one redirect URI is required\")\n\t\t.optional(),\n\tscopes: z.array(z.string()).nullable().optional(),\n});\n\n/**\n * Get a single OAuth client.\n */\nexport const GET: APIRoute = async ({ params, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash is not initialized\", 500);\n\t}\n\n\tconst denied = requirePerm(user, \"oauth_clients:manage\");\n\tif (denied) return denied;\n\n\tconst clientId = params.id;\n\tif (!clientId) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"Client ID is required\", 400);\n\t}\n\n\tconst result = await handleOAuthClientGet(emdash.db, clientId);\n\treturn unwrapResult(result);\n};\n\n/**\n * Update an OAuth client.\n */\nexport const PUT: APIRoute = async ({ params, request, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash is not initialized\", 500);\n\t}\n\n\tconst denied = requirePerm(user, \"oauth_clients:manage\");\n\tif (denied) return denied;\n\n\tconst clientId = params.id;\n\tif (!clientId) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"Client ID is required\", 400);\n\t}\n\n\ttry {\n\t\tconst body = await parseBody(request, updateClientSchema);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleOAuthClientUpdate(emdash.db, clientId, body);\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to update OAuth client\", \"CLIENT_UPDATE_ERROR\");\n\t}\n};\n\n/**\n * Delete an OAuth client.\n */\nexport const DELETE: APIRoute = async ({ params, locals }) => {\n\tconst { emdash, user } = locals;\n\n\tif (!emdash?.db) {\n\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash is not initialized\", 500);\n\t}\n\n\tconst denied = requirePerm(user, \"oauth_clients:manage\");\n\tif (denied) return denied;\n\n\tconst clientId = params.id;\n\tif (!clientId) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"Client ID is required\", 400);\n\t}\n\n\ttry {\n\t\tconst result = await handleOAuthClientDelete(emdash.db, clientId);\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to delete OAuth client\", \"CLIENT_DELETE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;AAoBA,MAAa,YAAY;AAEzB,MAAM,qBAAqB,EAAE,OAAO;CACnC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU;CAC3C,cAAc,EACZ,MAAM,EAAE,QAAQ,CAAC,IAAI,wCAAwC,CAAC,CAC9D,IAAI,GAAG,wCAAwC,CAC/C,UAAU;CACZ,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,UAAU;CACjD,CAAC;;;;AAKF,MAAa,MAAgB,OAAO,EAAE,QAAQ,aAAa;CAC1D,MAAM,EAAE,QAAQ,SAAS;AAEzB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CAGpE,MAAM,SAAS,YAAY,MAAM,uBAAuB;AACxD,KAAI,OAAQ,QAAO;CAEnB,MAAM,WAAW,OAAO;AACxB,KAAI,CAAC,SACJ,QAAO,SAAS,oBAAoB,yBAAyB,IAAI;AAIlE,QAAO,aADQ,MAAM,qBAAqB,OAAO,IAAI,SAAS,CACnC;;;;;AAM5B,MAAa,MAAgB,OAAO,EAAE,QAAQ,SAAS,aAAa;CACnE,MAAM,EAAE,QAAQ,SAAS;AAEzB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CAGpE,MAAM,SAAS,YAAY,MAAM,uBAAuB;AACxD,KAAI,OAAQ,QAAO;CAEnB,MAAM,WAAW,OAAO;AACxB,KAAI,CAAC,SACJ,QAAO,SAAS,oBAAoB,yBAAyB,IAAI;AAGlE,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,mBAAmB;AACzD,MAAI,aAAa,KAAK,CAAE,QAAO;AAG/B,SAAO,aADQ,MAAM,wBAAwB,OAAO,IAAI,UAAU,KAAK,CAC5C;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,iCAAiC,sBAAsB;;;;;;AAOnF,MAAa,SAAmB,OAAO,EAAE,QAAQ,aAAa;CAC7D,MAAM,EAAE,QAAQ,SAAS;AAEzB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CAGpE,MAAM,SAAS,YAAY,MAAM,uBAAuB;AACxD,KAAI,OAAQ,QAAO;CAEnB,MAAM,WAAW,OAAO;AACxB,KAAI,CAAC,SACJ,QAAO,SAAS,oBAAoB,yBAAyB,IAAI;AAGlE,KAAI;AAEH,SAAO,aADQ,MAAM,wBAAwB,OAAO,IAAI,SAAS,CACtC;UACnB,OAAO;AACf,SAAO,YAAY,OAAO,iCAAiC,sBAAsB"}