{"version":3,"file":"_name_.mjs","names":[],"sources":["../../../../../src/astro/routes/api/widget-areas/[name].ts"],"sourcesContent":["/**\n * Widget area by name endpoints\n *\n * GET    /_emdash/api/widget-areas/:name - Get area with widgets\n * DELETE /_emdash/api/widget-areas/:name - Delete area\n */\n\nimport type { APIRoute } from \"astro\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, apiSuccess, handleError } from \"#api/error.js\";\nimport { rowToWidget } from \"#widgets/index.js\";\nimport type { WidgetRow } from \"#widgets/types.js\";\n\nexport const prerender = false;\n\nexport const GET: APIRoute = async ({ params, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\tconst { name } = params;\n\n\tconst denied = requirePerm(user, \"widgets:read\");\n\tif (denied) return denied;\n\n\tif (!name) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name is required\", 400);\n\t}\n\n\ttry {\n\t\t// Get the area\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.selectAll()\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\t// Get widgets for this area\n\t\tconst widgets = await db\n\t\t\t.selectFrom(\"_emdash_widgets\")\n\t\t\t.selectAll()\n\t\t\t.$castTo<WidgetRow>()\n\t\t\t.where(\"area_id\", \"=\", area.id)\n\t\t\t.orderBy(\"sort_order\", \"asc\")\n\t\t\t.execute();\n\n\t\treturn apiSuccess({\n\t\t\t...area,\n\t\t\twidgets: widgets.map((row) => rowToWidget(row)),\n\t\t});\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to fetch widget area\", \"WIDGET_AREA_GET_ERROR\");\n\t}\n};\n\nexport const DELETE: APIRoute = async ({ params, locals }) => {\n\tconst { emdash, user } = locals;\n\tconst db = emdash.db;\n\tconst { name } = params;\n\n\tconst denied = requirePerm(user, \"widgets:manage\");\n\tif (denied) return denied;\n\n\tif (!name) {\n\t\treturn apiError(\"VALIDATION_ERROR\", \"name is required\", 400);\n\t}\n\n\ttry {\n\t\t// Check if area exists\n\t\tconst area = await db\n\t\t\t.selectFrom(\"_emdash_widget_areas\")\n\t\t\t.select(\"id\")\n\t\t\t.where(\"name\", \"=\", name)\n\t\t\t.executeTakeFirst();\n\n\t\tif (!area) {\n\t\t\treturn apiError(\"NOT_FOUND\", `Widget area \"${name}\" not found`, 404);\n\t\t}\n\n\t\t// Delete area (widgets cascade)\n\t\tawait db.deleteFrom(\"_emdash_widget_areas\").where(\"id\", \"=\", area.id).execute();\n\n\t\treturn apiSuccess({ deleted: true });\n\t} catch (error) {\n\t\treturn handleError(error, \"Failed to delete widget area\", \"WIDGET_AREA_DELETE_ERROR\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;AAcA,MAAa,YAAY;AAEzB,MAAa,MAAgB,OAAO,EAAE,QAAQ,aAAa;CAC1D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAClB,MAAM,EAAE,SAAS;CAEjB,MAAM,SAAS,YAAY,MAAM,eAAe;AAChD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,KACJ,QAAO,SAAS,oBAAoB,oBAAoB,IAAI;AAG7D,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,WAAW,CACX,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;EAIrE,MAAM,UAAU,MAAM,GACpB,WAAW,kBAAkB,CAC7B,WAAW,CACX,SAAoB,CACpB,MAAM,WAAW,KAAK,KAAK,GAAG,CAC9B,QAAQ,cAAc,MAAM,CAC5B,SAAS;AAEX,SAAO,WAAW;GACjB,GAAG;GACH,SAAS,QAAQ,KAAK,QAAQ,YAAY,IAAI,CAAC;GAC/C,CAAC;UACM,OAAO;AACf,SAAO,YAAY,OAAO,+BAA+B,wBAAwB;;;AAInF,MAAa,SAAmB,OAAO,EAAE,QAAQ,aAAa;CAC7D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,KAAK,OAAO;CAClB,MAAM,EAAE,SAAS;CAEjB,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,KAAI,OAAQ,QAAO;AAEnB,KAAI,CAAC,KACJ,QAAO,SAAS,oBAAoB,oBAAoB,IAAI;AAG7D,KAAI;EAEH,MAAM,OAAO,MAAM,GACjB,WAAW,uBAAuB,CAClC,OAAO,KAAK,CACZ,MAAM,QAAQ,KAAK,KAAK,CACxB,kBAAkB;AAEpB,MAAI,CAAC,KACJ,QAAO,SAAS,aAAa,gBAAgB,KAAK,cAAc,IAAI;AAIrE,QAAM,GAAG,WAAW,uBAAuB,CAAC,MAAM,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;AAE/E,SAAO,WAAW,EAAE,SAAS,MAAM,CAAC;UAC5B,OAAO;AACf,SAAO,YAAY,OAAO,gCAAgC,2BAA2B"}