Files
fund-tracer/backend/app/api/cases.py

73 lines
2.5 KiB
Python
Raw Normal View History

2026-03-09 14:46:56 +08:00
"""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}