"""Product 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.products import ( ProductContributors, ProductDataloaderRequest, ) from contributor.connectors.neo4j import neo4j_session from contributor.logic import contributors as product_logic router = APIRouter(prefix="/products", tags=["products"]) @router.get( "/{product_id}", operation_id="get_product_contributors", response_model=ProductContributors, summary="Get contributors for a product", description="Returns all contributors credited on a product.", ) def get_product_contributors( product_id: int, profiles: list[dict] = Depends(profiles_from_scope), driver: Driver = Depends(get_neo4j_driver), ) -> ProductContributors: with neo4j_session(driver) as session: results = product_logic.get_product_contributors( session, product_ids=[product_id], profiles=profiles, ) if not results: raise HTTPException(status_code=404) return ProductContributors.model_validate(results[0]) @router.post( "/dataloader", operation_id="load_product_contributors", response_model=list[ProductContributors], summary="Load multiple products' contributors by product IDs", description="Returns a list of products with their contributors.", ) def load_product_contributors( request: ProductDataloaderRequest, profiles: list[dict] = Depends(profiles_from_scope), driver: Driver = Depends(get_neo4j_driver), ) -> list[ProductContributors]: product_ids = [p.product_id for p in request.products] with neo4j_session(driver) as session: results = product_logic.get_product_contributors( session, product_ids=product_ids, profiles=profiles, ) return [ProductContributors.model_validate(result) for result in results]