first commit
This commit is contained in:
72
backend/app/api/cases.py
Normal file
72
backend/app/api/cases.py
Normal file
@@ -0,0 +1,72 @@
|
||||
"""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}
|
||||
Reference in New Issue
Block a user