73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
|
|
"""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}
|