from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from typing import Optional, List from app.database import get_db from app.models.person import Person from app.schemas.person import PersonCreate, PersonUpdate, PersonResponse from app.routers.auth import get_current_session from app.models.settings import Settings router = APIRouter() @router.get("/", response_model=List[PersonResponse]) async def get_people( search: Optional[str] = Query(None), db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Get all people with optional search.""" query = select(Person) if search: query = query.where(Person.name.ilike(f"%{search}%")) query = query.order_by(Person.name.asc()) result = await db.execute(query) people = result.scalars().all() return people @router.post("/", response_model=PersonResponse, status_code=201) async def create_person( person: PersonCreate, db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Create a new person.""" new_person = Person(**person.model_dump()) db.add(new_person) await db.commit() await db.refresh(new_person) return new_person @router.get("/{person_id}", response_model=PersonResponse) async def get_person( person_id: int, db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Get a specific person by ID.""" result = await db.execute(select(Person).where(Person.id == person_id)) person = result.scalar_one_or_none() if not person: raise HTTPException(status_code=404, detail="Person not found") return person @router.put("/{person_id}", response_model=PersonResponse) async def update_person( person_id: int, person_update: PersonUpdate, db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Update a person.""" result = await db.execute(select(Person).where(Person.id == person_id)) person = result.scalar_one_or_none() if not person: raise HTTPException(status_code=404, detail="Person not found") update_data = person_update.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(person, key, value) await db.commit() await db.refresh(person) return person @router.delete("/{person_id}", status_code=204) async def delete_person( person_id: int, db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Delete a person.""" result = await db.execute(select(Person).where(Person.id == person_id)) person = result.scalar_one_or_none() if not person: raise HTTPException(status_code=404, detail="Person not found") await db.delete(person) await db.commit() return None