"""Track endpoints.""" from fastapi import APIRouter, Depends, HTTPException from neo4j import Driver from contributor.api.auth import profiles_from_scope from contributor.api.datasources import get_neo4j_driver from contributor.api.schemas.tracks import TrackDataloaderRequest, TrackParticipations from contributor.connectors.neo4j import neo4j_session from contributor.logic import tracks as track_logic router = APIRouter(prefix="/tracks", tags=["tracks"]) @router.get( "/{tuid}", operation_id="get_track_participations_for_track", response_model=TrackParticipations, summary="Get contributor participations for a track", description="Returns all contributor participations for a track by track ID.", ) def get_track_participations_for_track( tuid: int, profiles: list[dict] = Depends(profiles_from_scope), driver: Driver = Depends(get_neo4j_driver), ) -> TrackParticipations: with neo4j_session(driver) as session: result = track_logic.get_track_participations_for_track( session, track_id=tuid, profiles=profiles, ) if result is None: raise HTTPException(status_code=404, detail="Track not found") return TrackParticipations.model_validate(result) @router.post( "/dataloader", operation_id="load_track_participations", response_model=list[TrackParticipations], summary="Load multiple tracks' participations by track IDs", description="Returns a list of tracks with contributor participations.", ) def load_track_participations( request: TrackDataloaderRequest, profiles: list[dict] = Depends(profiles_from_scope), driver: Driver = Depends(get_neo4j_driver), ) -> list[TrackParticipations]: with neo4j_session(driver) as session: results = track_logic.get_track_participations_by_track_ids( session, track_ids=[track.tuid for track in request.tracks], profiles=profiles, ) return [TrackParticipations.model_validate(result) for result in results]