from pydantic import BaseModel, Field from dmp.rosters.types import FanDataListOrderBy # Always populate by name BaseModel.model_config["populate_by_name"] = True class GetRostersInput(BaseModel): vendor_id: int | None = Field( None, alias="vendorId", description="Account vendor id", ) subaccount_id: int | None = Field( None, alias="subaccountId", description="Account subaccount id", ) countries: list[str] | None = Field( None, description="Country ISO2 list", ) search: str | None = Field( None, description="Search by partial name match", ) exclude_local_reps: bool | None = Field( None, alias="excludeLocalReps", description="Exclude local reps", ) order_by: list[FanDataListOrderBy] | None = Field( None, alias="orderBy", description="Order by field(s)", ) limit: int | None = Field( None, ge=1, le=10000, description="Page size limit", ) offset: int | None = Field( None, ge=0, description="Page offset", ) class FanDataListDetail(BaseModel): name: str vendor_id: int | None = Field(alias="vendorId") subaccount_id: int | None = Field(alias="subaccountId") fans_count: int = Field(alias="fansCount") global_participant_id: str | None = Field(alias="globalParticipantId") custom_list_id: str | None = Field(alias="customListId") fans_count_7_days_change: int = Field(alias="fansCount7DaysChange") fans_count_28_days_change: int = Field(alias="fansCount28DaysChange") fans_count_6_month_change: int = Field(alias="fansCount6MonthChange") fans_count_1_year_change: int = Field(alias="fansCount1YearChange") fans_count_7_days_percent_change: float = Field(alias="fansCount7DaysPercentChange") fans_count_28_days_percent_change: float = Field( alias="fansCount28DaysPercentChange" ) fans_count_6_month_percent_change: float = Field( alias="fansCount6MonthPercentChange" ) fans_count_1_year_percent_change: float = Field(alias="fansCount1YearPercentChange") fan_data_owner: bool = Field(True, alias="fanDataOwner") spotify_monthly_listeners: int | None = Field(alias="spotifyMonthlyListeners") instagram_followers: int | None = Field(alias="instagramFollowers") tiktok_followers: int | None = Field(alias="tiktokFollowers") spotify_followers: int | None = Field(alias="spotifyFollowers") facebook_followers: int | None = Field(alias="facebookFollowers") youtube_followers: int | None = Field(alias="youtubeFollowers") twitter_followers: int | None = Field(alias="twitterFollowers") soundcloud_followers: int | None = Field(alias="soundcloudFollowers") deezer_followers: int | None = Field(alias="deezerFollowers") engagement_benchmark: int | None = Field(alias="engagementBenchmark") engagement_ratio: float = Field(alias="engagementRatio") email_consent_fans_count: int = Field(alias="emailConsentFansCount") ad_consent_fans_count: int = Field(alias="adConsentFansCount") sms_consent_fans_count: int = Field(default=0, alias="smsConsentFansCount") class FanDataList(BaseModel): id: str name: str is_main_rep: bool | None = Field(default=None, alias="isMainRep") class SearchRostersInput(BaseModel): vendor_id: int | None = Field( None, alias="vendorId", description="Account vendor id", ) subaccount_id: int | None = Field( None, alias="subaccountId", description="Account subaccount id", ) search: str | None = Field( None, description="Search by partial name match", ) exclude_local_reps: bool | None = Field( None, alias="excludeLocalReps", description="Exclude local reps", ) limit: int | None = Field( None, ge=1, le=10000, description="Page size limit", ) class SearchRostersOutput(BaseModel): artists: list[FanDataList] custom_lists: list[FanDataList] = Field(alias="customLists") class GetCustomListsInput(BaseModel): custom_list_ids: list[str] = Field(alias="customListIds", min_length=1) class GetLocalRepCountriesInput(BaseModel): vendor_id: int = Field(alias="vendorId") subaccount_id: int = Field(alias="subaccountId") global_participant_ids: list[str] = Field(alias="globalParticipantIds")