import uuid from fastapi import APIRouter, status from app.api.deps import CurrentUser, SessionDep from app.schemas.relationship import RelationshipCreate, RelationshipRead from app.services import relationship_service, tree_service router = APIRouter(prefix="/trees", tags=["relationships"]) @router.post( "/{tree_id}/relationships", response_model=RelationshipRead, status_code=status.HTTP_201_CREATED, ) async def create_relationship( tree_id: uuid.UUID, data: RelationshipCreate, session: SessionDep, current: CurrentUser ) -> RelationshipRead: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) relationship = await relationship_service.create_relationship( session, actor=current, tree=tree, **data.model_dump() ) return RelationshipRead.model_validate(relationship) @router.get( "/{tree_id}/persons/{person_id}/relationships", response_model=list[RelationshipRead], ) async def list_person_relationships( tree_id: uuid.UUID, person_id: uuid.UUID, session: SessionDep, current: CurrentUser ) -> list[RelationshipRead]: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) rels = await relationship_service.list_relationships_for_person( session, viewer_id=current.id, tree=tree, person_id=person_id ) return [RelationshipRead.model_validate(r) for r in rels] @router.delete( "/{tree_id}/relationships/{relationship_id}", status_code=status.HTTP_204_NO_CONTENT ) async def delete_relationship( tree_id: uuid.UUID, relationship_id: uuid.UUID, session: SessionDep, current: CurrentUser ) -> None: tree = await tree_service.get_tree(session, viewer_id=current.id, tree_id=tree_id) await relationship_service.delete_relationship( session, actor=current, tree=tree, relationship_id=relationship_id )