import datetime from pydantic import AnyHttpUrl, BaseModel, Field from dmp.api.schemas import ( AdReportingConnection, AssignLabelsToAdPlatformUserAdAccountsInput, ) from dmp.app_connections.enums import AppConnectionStatus from dmp.audiences.enums import AudienceExportJustification, AudienceExportStatus from dmp.core.types import EncryptedToken, PlainToken from dmp.google.enums import GoogleUserConnectionStatus from dmp.google.types import GoogleAdAccountOrderBy from dmp.meta.enums import MetaUserConnectionStatus # Always populate by name BaseModel.model_config["populate_by_name"] = True class GoogleUser(BaseModel): id: str name: str granted_scopes: list[str] = Field(alias="grantedScopes") class GoogleUserInput(BaseModel): user_id: str = Field(alias="userId", description="Google user id") class GoogleUserConnectionAdAccount(BaseModel): id: str external_id: str = Field(alias="externalId") name: str class GoogleUserConnection(BaseModel): user: GoogleUser | None status: GoogleUserConnectionStatus required_scopes: list[str] = Field(alias="requiredScopes") ad_accounts: list[GoogleUserConnectionAdAccount] = Field(alias="adAccounts") ad_accounts_count: int = Field(alias="adAccountsCount") class GoogleAdAccount(BaseModel): id: str user_ad_account_id: str | None = Field(alias="userAdAccountId") user_id: str | None = Field(alias="userId", description="Google user id") external_id: str = Field(alias="externalId") name: str vendor_id: int | None = Field(alias="vendorId") subaccount_id: int | None = Field(alias="subaccountId") is_self_connected: bool = Field(alias="isSelfConnected") user_connection_status: MetaUserConnectionStatus = Field( alias="userConnectionStatus" ) user_self_connected: bool = Field(alias="userSelfConnected") ad_reporting_connection_status: AppConnectionStatus = Field( alias="adReportingConnectionStatus" ) ad_reporting_self_connected: bool = Field(alias="adReportingSelfConnected") sharing_user_id: str | None = Field( alias="sharingUserId", description="Google user id for sharing connection" ) reporting_user_id: str | None = Field( alias="reportingUserId", description="Google user id for reporting connection" ) campaigns_count: int = Field(alias="campaignsCount") class GoogleUserAdAccount(BaseModel): id: str name: str vendor_id: int | None = Field(alias="vendorId") subaccount_id: int | None = Field(alias="subaccountId") class GetGoogleAdAccountsInput(BaseModel): vendor_id: int | None = Field(None, alias="vendorId") subaccount_id: int | None = Field(None, alias="subaccountId") limit: int | None = Field(None) offset: int | None = Field(None) order_by: list[GoogleAdAccountOrderBy] | None = Field( None, alias="orderBy", description="Order by field(s)", ) class DeleteGoogleAdAccountsInput(BaseModel): vendor_id: int = Field(alias="vendorId") subaccount_id: int = Field(alias="subaccountId") class AssignLabelsToGoogleUserAdAccountsInput( AssignLabelsToAdPlatformUserAdAccountsInput ): pass # 3. Audience-Related Classes class GoogleAudience(BaseModel): id: str external_id: str = Field(alias="externalId") name: str fans_count: int = Field(alias="fansCount") created_at: datetime.datetime = Field(alias="createdAt") class GoogleAudienceShare(BaseModel): audience_id: str = Field(alias="audienceId") audience_external_id: str = Field(alias="audienceExternalId") user_list_resource: str = Field(alias="userListResource") audience_name: str = Field(alias="audienceName") fans_count: int = Field(alias="fansCount") ad_account_external_id: str = Field(alias="adAccountExternalId") parent_ad_account_external_id: str | None = Field(alias="parentAdAccountExternalId") user_access_token: EncryptedToken = Field(alias="userAccessToken") class GoogleAudienceShareStatus(BaseModel): audience_id: str = Field(alias="audienceId") audience_name: str = Field(alias="audienceName") ad_account_name: str = Field(alias="adAccountName") status: AudienceExportStatus fans_count: int = Field(alias="fansCount") processed_fans: int = Field(alias="processedFans") progress: float seconds_remaining: int | None = Field(alias="secondsRemaining") url: str class ShareGoogleAudienceInput(BaseModel): audience_id: str = Field(alias="audienceId") ad_account_id: str = Field(alias="adAccountId") justification: AudienceExportJustification reason_notes: str | None = Field(None, alias="reasonNotes") class GoogleAdReportingConnection(AdReportingConnection): pass class RefreshGoogleAdReportingConnectionInput(BaseModel): fivetran_connection_id: str = Field(alias="fivetranConnectorId") class ConnectGoogleAdReportingInput(BaseModel): user_id: str = Field(alias="userId") redirect_uri: AnyHttpUrl = Field(alias="redirectUri") class ConnectGoogleUserInput(BaseModel): auth_code: PlainToken = Field(alias="authCode") redirect_uri: str = Field(alias="redirectUri") code_verifier: str = Field(alias="codeVerifier")