"""Global participant endpoints.""" from fastapi import APIRouter, Depends from neo4j import Driver from contributor.api.auth import profiles_from_scope from contributor.api.datasources import get_neo4j_driver from contributor.api.schemas.projects import ( ProjectContributors, ProjectDataloaderRequest, ProjectKey, ) from contributor.connectors.neo4j import neo4j_session from contributor.logic import projects as project_logic router = APIRouter(prefix="/projects", tags=["projects"]) @router.get( "/{project_id}", operation_id="get_project_contributors", response_model=ProjectContributors, summary="Get project's contributors by project ID", description="Returns contributors related to a project", ) def get_project_contributors( project_id: int, profiles: list[dict] = Depends(profiles_from_scope), driver: Driver = Depends(get_neo4j_driver), ) -> ProjectContributors: with neo4j_session(driver) as session: results = project_logic.get_project_contributors( session, project_ids=[project_id], profiles=profiles, ) if not results: return ProjectContributors( project=ProjectKey(project_id=project_id), contributors=[], ) return ProjectContributors.model_validate(results[0]) @router.post( "/dataloader", operation_id="load_project_contributors", response_model=list[ProjectContributors], summary="Load multiple projects' contributors by project IDs", description="Returns a list of projects with their contributors.", ) def load_project_contributors( request: ProjectDataloaderRequest, profiles: list[dict] = Depends(profiles_from_scope), driver: Driver = Depends(get_neo4j_driver), ) -> list[ProjectContributors]: project_ids = [p.project_id for p in request.projects] with neo4j_session(driver) as session: results = project_logic.get_project_contributors( session, project_ids=project_ids, profiles=profiles, ) return [ProjectContributors.model_validate(result) for result in results]