{"version":3,"file":"index.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/admin/oauth-clients/index.ts"],"sourcesContent":["/**\n * OAuth client management endpoints\n *\n * GET  /_emdash/api/admin/oauth-clients — List all registered OAuth clients\n * POST /_emdash/api/admin/oauth-clients — Register a new OAuth 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 { handleOAuthClientCreate, handleOAuthClientList } from \"#api/handlers/oauth-clients.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\n\nexport const prerender = false;\n\nconst createClientSchema = z.object({\n\tid: z\n\t\t.string()\n\t\t.min(1, \"Client ID is required\")\n\t\t.max(255, \"Client ID must be at most 255 characters\"),\n\tname: z.string().min(1, \"Name is required\").max(255, \"Name must be at most 255 characters\"),\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\tscopes: z.array(z.string()).optional(),\n});\n\n/**\n * List all registered OAuth clients.\n */\nexport const GET: APIRoute = async ({ 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 result = await handleOAuthClientList(emdash.db);\n\treturn unwrapResult(result);\n};\n\n/**\n * Register a new OAuth client.\n */\nexport const POST: APIRoute = async ({ 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\ttry {\n\t\tconst body = await parseBody(request, createClientSchema);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleOAuthClientCreate(emdash.db, body);\n\t\treturn unwrapResult(result, 201);\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to create OAuth client\", \"CLIENT_CREATE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;AAeA,MAAa,YAAY;AAEzB,MAAM,qBAAqB,EAAE,OAAO;CACnC,IAAI,EACF,QAAQ,CACR,IAAI,GAAG,wBAAwB,CAC/B,IAAI,KAAK,2CAA2C;CACtD,MAAM,EAAE,QAAQ,CAAC,IAAI,GAAG,mBAAmB,CAAC,IAAI,KAAK,sCAAsC;CAC3F,cAAc,EACZ,MAAM,EAAE,QAAQ,CAAC,IAAI,wCAAwC,CAAC,CAC9D,IAAI,GAAG,wCAAwC;CACjD,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CACtC,CAAC;;;;AAKF,MAAa,MAAgB,OAAO,EAAE,aAAa;CAClD,MAAM,EAAE,QAAQ,SAAS;AAEzB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CAGpE,MAAM,SAAS,YAAY,MAAM,uBAAuB;AACxD,KAAI,OAAQ,QAAO;AAGnB,QAAO,aADQ,MAAM,sBAAsB,OAAO,GAAG,CAC1B;;;;;AAM5B,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;AAEzB,KAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CAGpE,MAAM,SAAS,YAAY,MAAM,uBAAuB;AACxD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,mBAAmB;AACzD,MAAI,aAAa,KAAK,CAAE,QAAO;AAG/B,SAAO,aADQ,MAAM,wBAAwB,OAAO,IAAI,KAAK,EACjC,IAAI;UACxB,OAAO;AACf,SAAO,YAAY,OAAO,iCAAiC,sBAAsB"}