import uuid from fastapi import APIRouter, status from app.api.deps import CurrentUser, SessionDep from app.schemas.source import CitationCreate, CitationRead, CitationUpdate from app.services import citation_service, tree_service router = APIRouter(prefix="/trees", tags=["citations"]) @router.post( "/{tree_id}/citations", response_model=CitationRead, status_code=status.HTTP_201_CREATED ) async def create_citation( tree_id: uuid.UUID, data: CitationCreate, session: SessionDep, current: CurrentUser ) -> CitationRead: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) citation = await citation_service.create_citation( session, actor=current, tree=tree, **data.model_dump() ) return CitationRead.model_validate(citation) @router.get("/{tree_id}/citations", response_model=list[CitationRead]) async def list_citations( tree_id: uuid.UUID, session: SessionDep, current: CurrentUser ) -> list[CitationRead]: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) citations = await citation_service.list_citations(session, viewer_id=current.id, tree=tree) return [CitationRead.model_validate(c) for c in citations] @router.patch("/{tree_id}/citations/{citation_id}", response_model=CitationRead) async def update_citation( tree_id: uuid.UUID, citation_id: uuid.UUID, data: CitationUpdate, session: SessionDep, current: CurrentUser, ) -> CitationRead: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) citation = await citation_service.update_citation( session, actor=current, tree=tree, citation_id=citation_id, changes=data.model_dump(exclude_unset=True), ) return CitationRead.model_validate(citation) @router.delete("/{tree_id}/citations/{citation_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_citation( tree_id: uuid.UUID, citation_id: uuid.UUID, session: SessionDep, current: CurrentUser ) -> None: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) await citation_service.delete_citation( session, actor=current, tree=tree, citation_id=citation_id )