"""Domains: top-level organizational buckets.""" from fastapi import APIRouter, Request, Form, Depends from fastapi.templating import Jinja2Templates from fastapi.responses import RedirectResponse from sqlalchemy.ext.asyncio import AsyncSession from typing import Optional from core.database import get_db from core.base_repository import BaseRepository from core.sidebar import get_sidebar_data router = APIRouter(prefix="/domains", tags=["domains"]) templates = Jinja2Templates(directory="templates") @router.get("/") async def list_domains(request: Request, db: AsyncSession = Depends(get_db)): repo = BaseRepository("domains", db) sidebar = await get_sidebar_data(db) items = await repo.list(sort="sort_order") return templates.TemplateResponse("domains.html", { "request": request, "sidebar": sidebar, "items": items, "page_title": "Domains", "active_nav": "domains", }) @router.get("/create") async def create_form(request: Request, db: AsyncSession = Depends(get_db)): sidebar = await get_sidebar_data(db) return templates.TemplateResponse("domain_form.html", { "request": request, "sidebar": sidebar, "page_title": "New Domain", "active_nav": "domains", "item": None, }) @router.post("/create") async def create_domain( request: Request, name: str = Form(...), color: Optional[str] = Form(None), description: Optional[str] = Form(None), db: AsyncSession = Depends(get_db), ): repo = BaseRepository("domains", db) domain = await repo.create({"name": name, "color": color, "description": description}) return RedirectResponse(url="/domains", status_code=303) @router.get("/{domain_id}/edit") async def edit_form(domain_id: str, request: Request, db: AsyncSession = Depends(get_db)): repo = BaseRepository("domains", db) sidebar = await get_sidebar_data(db) item = await repo.get(domain_id) if not item: return RedirectResponse(url="/domains", status_code=303) return templates.TemplateResponse("domain_form.html", { "request": request, "sidebar": sidebar, "page_title": f"Edit {item['name']}", "active_nav": "domains", "item": item, }) @router.post("/{domain_id}/edit") async def update_domain( domain_id: str, request: Request, name: str = Form(...), color: Optional[str] = Form(None), description: Optional[str] = Form(None), db: AsyncSession = Depends(get_db), ): repo = BaseRepository("domains", db) await repo.update(domain_id, {"name": name, "color": color, "description": description}) return RedirectResponse(url="/domains", status_code=303) @router.post("/{domain_id}/delete") async def delete_domain(domain_id: str, db: AsyncSession = Depends(get_db)): repo = BaseRepository("domains", db) await repo.soft_delete(domain_id) return RedirectResponse(url="/domains", status_code=303)