"""Case CRUD API.""" from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.database import get_db from app.models import Case from app.schemas import CaseCreate, CaseUpdate, CaseResponse, CaseListResponse router = APIRouter() @router.get("", response_model=CaseListResponse) async def list_cases(db: AsyncSession = Depends(get_db)): r = await db.execute(select(Case).order_by(Case.created_at.desc())) cases = r.scalars().all() return CaseListResponse(items=[CaseResponse.model_validate(c) for c in cases]) @router.post("", response_model=CaseResponse) async def create_case(body: CaseCreate, db: AsyncSession = Depends(get_db)): case = Case( case_number=body.case_number, victim_name=body.victim_name, description=body.description or "", ) db.add(case) await db.commit() await db.refresh(case) return CaseResponse.model_validate(case) @router.get("/{case_id}", response_model=CaseResponse) async def get_case(case_id: int, db: AsyncSession = Depends(get_db)): r = await db.execute(select(Case).where(Case.id == case_id)) case = r.scalar_one_or_none() if not case: raise HTTPException(status_code=404, detail="Case not found") return CaseResponse.model_validate(case) @router.put("/{case_id}", response_model=CaseResponse) async def update_case(case_id: int, body: CaseUpdate, db: AsyncSession = Depends(get_db)): r = await db.execute(select(Case).where(Case.id == case_id)) case = r.scalar_one_or_none() if not case: raise HTTPException(status_code=404, detail="Case not found") if body.case_number is not None: case.case_number = body.case_number if body.victim_name is not None: case.victim_name = body.victim_name if body.description is not None: case.description = body.description if body.total_loss is not None: case.total_loss = body.total_loss if body.status is not None: case.status = body.status await db.commit() await db.refresh(case) return CaseResponse.model_validate(case) @router.delete("/{case_id}") async def delete_case(case_id: int, db: AsyncSession = Depends(get_db)): r = await db.execute(select(Case).where(Case.id == case_id)) case = r.scalar_one_or_none() if not case: raise HTTPException(status_code=404, detail="Case not found") await db.delete(case) await db.commit() return {"ok": True}