from typing import Any from fastapi import APIRouter, Depends from pyxdi.ext.fastapi import Inject from campaigns.api import auth, query_params, schemas from campaigns.api.schemas import Artist from campaigns.campaigns.enums import CampaignStatus from campaigns.campaigns.handlers import ( GetCampaignsArtistsHandler, GetCampaignsArtistsRequest, SearchCampaignsHandler, SearchCampaignsRequest, ) router = APIRouter(tags=["campaigns"]) @router.get( "/campaigns/statuses", operation_id="getCampaignsStatuses", response_model=list[CampaignStatus], ) async def get_campaigns_statuses() -> list[CampaignStatus]: return CampaignStatus.choices() @router.get( "/campaigns/artists", operation_id="getCampaignsArtists", description="Get artists list for already created campaigns", response_model=list[Artist], ) @router.get( "/meta/campaigns/artists", operation_id="getMetaCampaignsArtists", description="Get artists list for already created campaigns", response_model=list[Artist], deprecated=True, ) async def get_campaigns_artists( identity_id: str = Depends(auth.get_identity_id), profile_id: int = Depends(auth.get_profile_id), handler: GetCampaignsArtistsHandler = Inject(), ) -> list[dict[str, str]]: artist_ids = await handler.handle( GetCampaignsArtistsRequest(identity_id=identity_id, profile_id=profile_id) ) return [{"id": artist_id} for artist_id in artist_ids] @router.get( "/campaigns", operation_id="searchCampaigns", response_model=schemas.LimitOffsetPage[schemas.Campaign], response_model_by_alias=True, ) @router.get( "/meta/campaigns", operation_id="searchMetaCampaigns", response_model=schemas.LimitOffsetPage[schemas.MetaCampaign], response_model_by_alias=True, deprecated=True, ) async def search_campaigns( identity_id: str = Depends(auth.get_identity_id), profile_id: int = Depends(auth.get_profile_id), params: query_params.CampaignSearchQueryParams = Depends(), handler: SearchCampaignsHandler = Inject(), ) -> Any: response = await handler.handle( SearchCampaignsRequest( identity_id=identity_id, profile_id=profile_id, vendor_id=params.vendor_id, subaccount_id=params.subaccount_id, global_participant_ids=params.global_participant_ids, statuses=params.statuses, objectives=params.objectives, platforms=params.platforms, search=params.search, order_by=params.order_by, limit=params.limit, offset=params.offset, ) ) return schemas.LimitOffsetPage( items=response.items, total=response.total, limit=params.limit, offset=params.offset, )