from fastapi import APIRouter, Depends, Form, Request from fastapi.responses import RedirectResponse from anode_client import anode_request from auth import require_admin from templating import templates router = APIRouter(prefix="/admin/technik") @router.get("") def index(user: dict = Depends(require_admin)): return RedirectResponse("/admin/technik/merkmale", status_code=303) # --- Merkmale --- @router.get("/merkmale") def merkmale_liste(request: Request, user: dict = Depends(require_admin)): merkmale_result = anode_request("GET", "/api/v1/merkmale") merkmale = merkmale_result.get("merkmale", []) if merkmale_result.get("success") else [] kategorien_result = anode_request("GET", "/api/v1/kategorien") kategorien = kategorien_result.get("kategorien", []) if kategorien_result.get("success") else [] return templates.TemplateResponse( request, "admin/technik_merkmale.html", {"user": user, "merkmale": merkmale, "kategorien": kategorien}, ) @router.post("/merkmale") def merkmal_anlegen( key: str = Form(...), name: str = Form(...), description: str = Form(default=""), user: dict = Depends(require_admin), ): anode_request( "POST", "/api/v1/merkmale", json={"key": key, "name": name, "description": description or None}, ) return RedirectResponse("/admin/technik/merkmale", status_code=303) @router.post("/merkmale/{merkmal_id}") def merkmal_aktualisieren( merkmal_id: str, name: str = Form(...), description: str = Form(default=""), kategorie_id: str = Form(default=""), im_auftragskatalog: str = Form(default=""), user: dict = Depends(require_admin), ): anode_request( "PATCH", f"/api/v1/merkmale/{merkmal_id}", json={ "name": name, "description": description or None, "kategorie_id": kategorie_id or None, "im_auftragskatalog": im_auftragskatalog == "on", }, ) return RedirectResponse("/admin/technik/merkmale", status_code=303) # --- Kategorien --- @router.get("/kategorien") def kategorien_liste(request: Request, user: dict = Depends(require_admin)): result = anode_request("GET", "/api/v1/kategorien") kategorien = result.get("kategorien", []) if result.get("success") else [] return templates.TemplateResponse( request, "admin/technik_kategorien.html", {"user": user, "kategorien": kategorien} ) @router.post("/kategorien") def kategorie_anlegen( key: str = Form(...), name: str = Form(...), description: str = Form(default=""), sort_order: int = Form(default=0), user: dict = Depends(require_admin), ): anode_request( "POST", "/api/v1/kategorien", json={"key": key, "name": name, "description": description or None, "sort_order": sort_order}, ) return RedirectResponse("/admin/technik/kategorien", status_code=303) # --- Workspaces --- @router.get("/workspaces") def workspaces_liste(request: Request, user: dict = Depends(require_admin)): result = anode_request("GET", "/api/v1/workspaces") workspaces = result.get("workspaces", []) if result.get("success") else [] orgs_result = anode_request("GET", "/api/v1/organizations") organizations = orgs_result.get("organizations", []) if orgs_result.get("success") else [] return templates.TemplateResponse( request, "admin/technik_workspaces.html", {"user": user, "workspaces": workspaces, "organizations": organizations}, ) @router.post("/workspaces") def workspace_anlegen( key: str = Form(...), name: str = Form(...), description: str = Form(default=""), organization_id: str = Form(default=""), user: dict = Depends(require_admin), ): anode_request( "POST", "/api/v1/workspaces", json={ "key": key, "name": name, "description": description or None, "organization_id": organization_id or None, }, ) return RedirectResponse("/admin/technik/workspaces", status_code=303) @router.get("/workspaces/{workspace_id}") def workspace_detail(request: Request, workspace_id: str, user: dict = Depends(require_admin)): result = anode_request("GET", f"/api/v1/workspaces/{workspace_id}") workspace = result.get("workspace") if result.get("success") else None merkmale_result = anode_request("GET", "/api/v1/merkmale") alle_merkmale = merkmale_result.get("merkmale", []) if merkmale_result.get("success") else [] komponierte_ids = {m["id"] for m in workspace["merkmale"]} if workspace else set() verfuegbare_merkmale = [m for m in alle_merkmale if m["id"] not in komponierte_ids] return templates.TemplateResponse( request, "admin/technik_workspace_detail.html", { "user": user, "workspace": workspace, "workspace_id": workspace_id, "verfuegbare_merkmale": verfuegbare_merkmale, }, ) @router.post("/workspaces/{workspace_id}/merkmale") def workspace_merkmal_hinzufuegen( workspace_id: str, merkmal_id: str = Form(...), user: dict = Depends(require_admin) ): anode_request("POST", f"/api/v1/workspaces/{workspace_id}/merkmale/{merkmal_id}") return RedirectResponse(f"/admin/technik/workspaces/{workspace_id}", status_code=303) @router.post("/workspaces/{workspace_id}/merkmale/{merkmal_id}/entfernen") def workspace_merkmal_entfernen( workspace_id: str, merkmal_id: str, user: dict = Depends(require_admin) ): anode_request("DELETE", f"/api/v1/workspaces/{workspace_id}/merkmale/{merkmal_id}") return RedirectResponse(f"/admin/technik/workspaces/{workspace_id}", status_code=303) # --- Backends / Blueprints (nur Anzeige) --- @router.get("/backends") def backends_liste(request: Request, user: dict = Depends(require_admin)): backends_result = anode_request("GET", "/api/v1/backends") backends = backends_result.get("backends", []) if backends_result.get("success") else [] blueprints_result = anode_request("GET", "/api/v1/blueprints") blueprints = blueprints_result.get("blueprints", []) if blueprints_result.get("success") else [] return templates.TemplateResponse( request, "admin/technik_backends.html", {"user": user, "backends": backends, "blueprints": blueprints}, )