from dataclasses import dataclass from audience_common.auth.account import Account from fastapi import Query from campaigns.campaigns.enums import CampaignStatus from campaigns.campaigns.handlers import SearchCampaignsRequest from campaigns.meta.enums import ( CampaignCallToAction, CampaignContentType, CampaignObjective, CampaignPlatform, CampaignPlatformSelector, ) # Common @dataclass class AccountQueryParams: vendor_id: int = Query(alias="vendorId") subaccount_id: int | None = Query(None, alias="subaccountId") @property def account(self) -> Account: return Account(vendor_id=self.vendor_id, subaccount_id=self.subaccount_id or 0) # Facebook @dataclass class FacebookTargetingGeolocationQueryParams: search: str = Query(description="A search term", min_length=3) limit: int = Query(25, description="Max number of results returned", le=500) @dataclass class FacebookTargetingInterestQueryParams: search: str = Query(description="A search term", min_length=3) limit: int = Query(25, description="Max number of results returned", le=500) @dataclass class FacebookPublishedPagePostsQueryParams(AccountQueryParams): limit: int = Query(10, description="Max number of results returned", le=100) # Campaigns @dataclass class CampaignSearchQueryParams: vendor_id: int | None = Query( None, alias="vendorId", description="Label id", ) subaccount_id: int | None = Query( None, alias="subaccountId", description="Label subaccount id", ) global_participant_ids: list[str] | None = Query( None, alias="globalParticipantIds", description="Artist ids", ) statuses: list[CampaignStatus] | None = Query( None, alias="statuses", description="Statuses", ) objectives: list[CampaignObjective] | None = Query( None, alias="objectives", description="Objectives", ) platforms: list[CampaignPlatform] | None = Query( None, alias="platforms", description="Platforms", ) search: str | None = Query( None, description="A search term", ) order_by: str = Query( SearchCampaignsRequest.DEFAULT_ORDER_BY, alias="orderBy", description="Order by field(s)", ) limit: int = Query( SearchCampaignsRequest.DEFAULT_LIMIT, ge=1, le=100, description="Page size limit", ) offset: int = Query( SearchCampaignsRequest.DEFAULT_OFFSET, ge=0, description="Page offset", ) # Meta @dataclass class MetaCampaignAdFormatsQueryParams: content_type: CampaignContentType = Query( alias="contentType", description="Campaign content type" ) platform: CampaignPlatformSelector = Query(description="Campaign platform") @dataclass class MetaCampaignAdPreviewInputQueryParams: content_type: CampaignContentType = Query( alias="contentType", description="Campaign content type" ) ad_format_id: str = Query(alias="adFormatId") post_external_id: str | None = Query(None, alias="postExternalId") primary_text: str | None = Query(None, alias="primaryText") headline: str | None = Query(None) description: str | None = Query(None) website_url: str | None = Query(None, alias="websiteUrl") call_to_action: CampaignCallToAction | None = Query( None, alias="callToAction", description="Campaign call to action type", )