{"version":3,"file":"index.mjs","names":[],"sources":["../../../../../../src/astro/routes/api/admin/policies/index.ts"],"sourcesContent":["/**\n * GET  /_emdash/api/admin/policies — list policies with the roles holding them\n * POST /_emdash/api/admin/policies — create a policy\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { isParseError, parseBody } from \"#api/parse.js\";\nimport { policyCreateBody } from \"#api/schemas.js\";\nimport { invalidateAuthzCache } from \"#auth/authz.js\";\nimport { entriesGrantedBy, pluginCatalogEntries } from \"#auth/route-catalog.js\";\nimport { AuthzRepository } from \"#db/repositories/authz.js\";\n\nimport { authzErrorResponse } from \"../roles/index.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ locals, url }) => {\n\tconst { emdash, user } = locals;\n\tif (!emdash?.db) return apiError(\"NOT_CONFIGURED\", \"EmDash is not initialized\", 500);\n\tconst denied = requirePerm(user, \"policies:read\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst items = await new AuthzRepository(emdash.db).listPolicies();\n\t\t// `?withRoutes=1` annotates each policy with the catalogue entries its\n\t\t// grants cover — what the Routes tab uses to show \"granted by\".\n\t\tconst withRoutes = url.searchParams.get(\"withRoutes\") === \"1\";\n\t\treturn apiSuccess({\n\t\t\titems: withRoutes\n\t\t\t\t? items.map((p) => ({ ...p, routeIds: entriesGrantedBy(p.rules, pluginCatalogEntries(emdash.listPluginRoutes?.() ?? [])).map((e) => e.id) }))\n\t\t\t\t: items,\n\t\t});\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to list policies\", \"POLICY_LIST_ERROR\");\n\t}\n};\n\nexport const POST: APIRoute = async ({ request, locals }) => {\n\tconst { emdash, user } = locals;\n\tif (!emdash?.db) return apiError(\"NOT_CONFIGURED\", \"EmDash is not initialized\", 500);\n\tconst denied = requirePerm(user, \"policies:manage\");\n\tif (denied) return denied;\n\n\ttry {\n\t\tconst body = await parseBody(request, policyCreateBody);\n\t\tif (isParseError(body)) return body;\n\n\t\tconst item = await new AuthzRepository(emdash.db).createPolicy(body);\n\t\tinvalidateAuthzCache();\n\t\treturn apiSuccess({ item }, 201);\n\t} catch (error) {\n\t\treturn (\n\t\t\tauthzErrorResponse(error) ??\n\t\t\thandleError(error, \"Failed to create policy\", \"POLICY_CREATE_ERROR\")\n\t\t);\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,MAAa,YAAY;AAEzB,MAAa,MAAgB,OAAO,EAAE,QAAQ,UAAU;CACvD,MAAM,EAAE,QAAQ,SAAS;AACzB,KAAI,CAAC,QAAQ,GAAI,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CACpF,MAAM,SAAS,YAAY,MAAM,gBAAgB;AACjD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,QAAQ,MAAM,IAAI,gBAAgB,OAAO,GAAG,CAAC,cAAc;AAIjE,SAAO,WAAW,EACjB,OAFkB,IAAI,aAAa,IAAI,aAAa,KAAK,MAGtD,MAAM,KAAK,OAAO;GAAE,GAAG;GAAG,UAAU,iBAAiB,EAAE,OAAO,qBAAqB,OAAO,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG;GAAE,EAAE,GAC3I,OACH,CAAC;UACM,OAAO;AACf,SAAO,YAAY,OAAO,2BAA2B,oBAAoB;;;AAI3E,MAAa,OAAiB,OAAO,EAAE,SAAS,aAAa;CAC5D,MAAM,EAAE,QAAQ,SAAS;AACzB,KAAI,CAAC,QAAQ,GAAI,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;CACpF,MAAM,SAAS,YAAY,MAAM,kBAAkB;AACnD,KAAI,OAAQ,QAAO;AAEnB,KAAI;EACH,MAAM,OAAO,MAAM,UAAU,SAAS,iBAAiB;AACvD,MAAI,aAAa,KAAK,CAAE,QAAO;EAE/B,MAAM,OAAO,MAAM,IAAI,gBAAgB,OAAO,GAAG,CAAC,aAAa,KAAK;AACpE,wBAAsB;AACtB,SAAO,WAAW,EAAE,MAAM,EAAE,IAAI;UACxB,OAAO;AACf,SACC,mBAAmB,MAAM,IACzB,YAAY,OAAO,2BAA2B,sBAAsB"}