import uuid from fastapi import APIRouter, status from app.api.deps import CurrentUser, SessionDep from app.schemas.event import EventCreate, EventRead, EventUpdate from app.services import event_service, tree_service router = APIRouter(prefix="/trees", tags=["events"]) @router.post("/{tree_id}/events", response_model=EventRead, status_code=status.HTTP_201_CREATED) async def create_event( tree_id: uuid.UUID, data: EventCreate, session: SessionDep, current: CurrentUser ) -> EventRead: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) event = await event_service.create_event( session, actor=current, tree=tree, **data.model_dump() ) return EventRead.model_validate(event) @router.get("/{tree_id}/events", response_model=list[EventRead]) async def list_tree_events( tree_id: uuid.UUID, session: SessionDep, current: CurrentUser ) -> list[EventRead]: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) events = await event_service.list_events(session, viewer_id=current.id, tree=tree) return [EventRead.model_validate(e) for e in events] @router.get("/{tree_id}/persons/{person_id}/events", response_model=list[EventRead]) async def list_person_events( tree_id: uuid.UUID, person_id: uuid.UUID, session: SessionDep, current: CurrentUser ) -> list[EventRead]: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) events = await event_service.list_events_for_person( session, viewer_id=current.id, tree=tree, person_id=person_id ) return [EventRead.model_validate(e) for e in events] @router.patch("/{tree_id}/events/{event_id}", response_model=EventRead) async def update_event( tree_id: uuid.UUID, event_id: uuid.UUID, data: EventUpdate, session: SessionDep, current: CurrentUser, ) -> EventRead: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) event = await event_service.update_event( session, actor=current, tree=tree, event_id=event_id, changes=data.model_dump(exclude_unset=True), ) return EventRead.model_validate(event) @router.delete("/{tree_id}/events/{event_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_event( tree_id: uuid.UUID, event_id: uuid.UUID, session: SessionDep, current: CurrentUser ) -> None: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) await event_service.delete_event(session, actor=current, tree=tree, event_id=event_id)