Files
vector/backend/routers/cases.py
T
2026-06-08 16:34:28 +00:00

63 lines
2.2 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException, Query
from backend.database import db
from backend.routers.auth import require_roles
from backend.schemas import CaseCreate, CaseListResponse, CaseResponse, CaseUpdate
router = APIRouter(prefix='/api/v1/cases', tags=['cases'], dependencies=[Depends(require_roles(['operator', 'field', 'admin']))])
@router.post('', response_model=CaseResponse)
def create_case(payload: CaseCreate) -> dict:
data = payload.model_dump(exclude_none=True)
gps = data.pop('gps', None) or {}
note = data.pop('note', None)
if note is not None and 'notes' not in data:
data['notes'] = note
if gps:
data['gps_lat'] = gps.get('lat')
data['gps_lon'] = gps.get('lon')
case = db.create_case(**data)
if data.get('status'):
db.update_case(case.id, status=data['status'])
return case.to_detail()
@router.get('', response_model=CaseListResponse)
def list_cases(page: int = Query(default=1, ge=1), page_size: int = Query(default=20, ge=1, le=100)) -> dict:
cases = db.list_cases()
start = (page - 1) * page_size
end = start + page_size
items = [c.to_detail() for c in cases[start:end]]
return {'items': items, 'total': len(cases), 'page': page, 'page_size': page_size}
@router.get('/{case_id}', response_model=CaseResponse)
def get_case(case_id: str) -> dict:
case = db.get_case(case_id)
if not case:
raise HTTPException(status_code=404, detail='Case not found')
return case.to_detail()
@router.patch('/{case_id}', response_model=CaseResponse)
def patch_case(case_id: str, payload: CaseUpdate) -> dict:
data = payload.model_dump(exclude_none=True)
note = data.pop('note', None)
if note is not None and 'notes' not in data:
data['notes'] = note
case = db.update_case(case_id, **data)
if not case:
raise HTTPException(status_code=404, detail='Case not found')
return case.to_detail()
@router.delete('/{case_id}')
def delete_case(case_id: str) -> dict[str, bool]:
deleted = db.delete_case(case_id)
if not deleted:
raise HTTPException(status_code=404, detail='Case not found')
return {'deleted': True}