"""Entity CRUD endpoints.""" from fastapi import APIRouter, Depends, HTTPException from sqlmodel import Session, select from ten31portal.audit import record_audit from ten31portal.auth import get_current_user, require_writer from ten31portal.database import get_session from ten31portal.models import Entity, EntityStatus, User from ten31portal.schemas import EntityCreate, EntityResponse, EntityUpdate router = APIRouter(prefix="/api/entities", tags=["entities"]) @router.get("") def list_entities( user: User = Depends(get_current_user), session: Session = Depends(get_session), ) -> list[EntityResponse]: rows = session.exec(select(Entity)).all() return [EntityResponse.model_validate(r, from_attributes=True) for r in rows] @router.get("/{entity_id}") def get_entity( entity_id: int, user: User = Depends(get_current_user), session: Session = Depends(get_session), ) -> EntityResponse: entity = session.get(Entity, entity_id) if entity is None: raise HTTPException(status_code=404, detail="Entity not found") return EntityResponse.model_validate(entity, from_attributes=True) @router.post("", status_code=201) def create_entity( body: EntityCreate, user: User = Depends(require_writer), session: Session = Depends(get_session), ) -> EntityResponse: entity = Entity(**body.model_dump()) session.add(entity) session.flush() record_audit(session, user.id, "create", "entity", entity.id, body.model_dump()) session.commit() session.refresh(entity) return EntityResponse.model_validate(entity, from_attributes=True) @router.patch("/{entity_id}") def update_entity( entity_id: int, body: EntityUpdate, user: User = Depends(require_writer), session: Session = Depends(get_session), ) -> EntityResponse: entity = session.get(Entity, entity_id) if entity is None: raise HTTPException(status_code=404, detail="Entity not found") changes = body.model_dump(exclude_unset=True) for key, val in changes.items(): setattr(entity, key, val) session.add(entity) session.flush() record_audit(session, user.id, "update", "entity", entity.id, changes) session.commit() session.refresh(entity) return EntityResponse.model_validate(entity, from_attributes=True)