from __future__ import annotations import uuid from fastapi import APIRouter, Depends, Query, status from sqlalchemy.ext.asyncio import AsyncSession from app.core.deps import get_current_user, get_db_session from app.schemas.document import DocumentCreate, DocumentSummary from app.schemas.etmf import EtmfNodeCreate, EtmfNodeRead, EtmfNodeUpdate, EtmfTreeNode from app.services import etmf_service router = APIRouter() @router.get("/tree", response_model=list[EtmfTreeNode]) async def get_etmf_tree( study_id: uuid.UUID = Query(...), db: AsyncSession = Depends(get_db_session), current_user=Depends(get_current_user), ) -> list[EtmfTreeNode]: return await etmf_service.list_etmf_tree(db, study_id=study_id, current_user=current_user) @router.post("/nodes", response_model=EtmfNodeRead, status_code=status.HTTP_201_CREATED) async def create_etmf_node( payload: EtmfNodeCreate, db: AsyncSession = Depends(get_db_session), current_user=Depends(get_current_user), ) -> EtmfNodeRead: node = await etmf_service.create_node(db, payload, current_user) return EtmfNodeRead.model_validate(node) @router.patch("/nodes/{node_id}", response_model=EtmfNodeRead) async def update_etmf_node( node_id: uuid.UUID, payload: EtmfNodeUpdate, db: AsyncSession = Depends(get_db_session), current_user=Depends(get_current_user), ) -> EtmfNodeRead: node = await etmf_service.update_node(db, node_id, payload, current_user) return EtmfNodeRead.model_validate(node) @router.get("/nodes/{node_id}/documents", response_model=list[DocumentSummary]) async def list_etmf_node_documents( node_id: uuid.UUID, site_id: uuid.UUID | None = Query(None), db: AsyncSession = Depends(get_db_session), current_user=Depends(get_current_user), ) -> list[DocumentSummary]: return await etmf_service.list_node_documents(db, node_id=node_id, site_id=site_id, current_user=current_user) @router.post("/nodes/{node_id}/documents", response_model=DocumentSummary, status_code=status.HTTP_201_CREATED) async def create_etmf_node_document( node_id: uuid.UUID, payload: DocumentCreate, db: AsyncSession = Depends(get_db_session), current_user=Depends(get_current_user), ) -> DocumentSummary: return await etmf_service.create_node_document(db, node_id=node_id, payload=payload, current_user=current_user)