"""Decision API — AP0.9c.""" from __future__ import annotations from typing import Literal, Optional from capabilities import require_capability from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, Field from services import decisions as decision_service from tenant_context import TenantContext router = APIRouter(prefix="/api/decisions", tags=["decisions"]) class DecisionUpdateRequest(BaseModel): title: Optional[str] = Field(default=None, min_length=1, max_length=255) description: Optional[str] = None status: Optional[Literal["proposed", "decided", "superseded"]] = None outcome: Optional[str] = None decided_by_actor_id: Optional[str] = None @router.get("/{decision_id}") def get_decision( decision_id: str, ctx: TenantContext = Depends(require_capability("kairo.decision.read")), ): item = decision_service.get_decision(tenant_id=ctx.tenant_id, decision_id=decision_id) if not item: raise HTTPException(status_code=404, detail="Entscheidung nicht gefunden") return item @router.patch("/{decision_id}") def update_decision( decision_id: str, body: DecisionUpdateRequest, ctx: TenantContext = Depends(require_capability("kairo.decision.manage")), ): try: item = decision_service.update_decision( tenant_id=ctx.tenant_id, decision_id=decision_id, user_id=ctx.user_id, title=body.title, description=body.description, status=body.status, outcome=body.outcome, decided_by_actor_id=body.decided_by_actor_id, ) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc if not item: raise HTTPException(status_code=404, detail="Entscheidung nicht gefunden") return item @router.delete("/{decision_id}", status_code=204) def delete_decision( decision_id: str, ctx: TenantContext = Depends(require_capability("kairo.decision.manage")), ): if not decision_service.delete_decision( tenant_id=ctx.tenant_id, decision_id=decision_id, user_id=ctx.user_id ): raise HTTPException(status_code=404, detail="Entscheidung nicht gefunden")