from typing import Dict, List, Literal, Optional, Union from pydantic import BaseModel, Field from typing_extensions import Annotated class UserBase(BaseModel): user_id: str class InitiateFileUploadOut(BaseModel): collectionId: str fileKey: str class Collection(BaseModel): id: str name: str status: str parentId: Optional[str] dateCreated: str type: str totalProfiles: int class ConsequenceGroup(BaseModel): id: str type: str description: str count: int items: List[str] accepted: List[str] class ExportCsvOut(BaseModel): profileCount: int downloadUrl: Optional[str] # Analytics class DataItem(BaseModel): id: str label: str value: float class TreeMapItem(BaseModel): id: str parent: str label: str value: float class CalendarItem(BaseModel): id: str day: str value: float class InfoItem(BaseModel): id: str name: str description: str class InfoTab(BaseModel): id: str name: str items: List[InfoItem] class DataGroup(BaseModel): id: str group: str items: List[DataItem] class MultiLine(BaseModel): id: str label: str graph: List[DataItem] class PieChart(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[DataItem] class BarChart(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[DataItem] class AreaChart(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[DataItem] class StackChart(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[DataGroup] keys: List[str] maxValue: float class GroupChart(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[DataGroup] keys: List[str] maxValue: float class LineChart(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[MultiLine] curve: str maxValue: float class TreeMap(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[TreeMapItem] class CalendarChart(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[CalendarItem] class Choropleth(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[DataItem] region: str projection: str class InfoTabs(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[InfoTab] class RadarChart(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[DataGroup] keys: List[str] maxValue: float class ParetoChart(BaseModel): id: str type: str label: str description: Optional[str] options: Optional[dict] data: List[DataItem] class TableColumn(BaseModel): id: str key: str label: str type: str range: Optional[List[float]] valueFormat: str class TableChart(BaseModel): id: str type: str label: str options: List[TableColumn] data: List[Dict[str, Optional[Union[str, int, float]]]] ChartTypes = Union[ PieChart, BarChart, AreaChart, StackChart, GroupChart, TreeMap, CalendarChart, LineChart, Choropleth, InfoTabs, RadarChart, ParetoChart, TableChart, ] class AnalyticsGroup(BaseModel): id: str name: str description: str charts: List[ChartTypes] ### # Filters class BaseFilterOption(BaseModel): typename: str = Field(alias="__typename") class LocationFilter(BaseFilterOption): typename: Literal["LocationFilter"] = Field(alias="__typename") id: str minDistance: Optional[int] maxDistance: Optional[int] radiusPlaceholder: Optional[str] searchPlaceholder: Optional[str] searchInputDelay: Optional[int] searchLayers: Optional[str] searchSize: Optional[int] class Range(BaseFilterOption): typename: Literal["Range"] = Field(alias="__typename") id: str name: str placeholder: Optional[str] min: Optional[int] max: Optional[int] class MultiSelect(BaseFilterOption): typename: Literal["MultiSelect"] = Field(alias="__typename") id: str name: str label: str value: str FilterOptions = Annotated[ Union[Range, MultiSelect, LocationFilter], Field(discriminator="typename") ] class Filter(BaseModel): id: str type: str label: str options: List[FilterOptions] class SavedFilter(BaseModel): id: str type: str values: List[str] class FilterGroup(BaseModel): id: str name: str description: str filters: List[Filter] ### # Klaviyo class KlaviyoStatus(BaseModel): status: Literal["connected", "not_connected", "unknown"] class KlaviyoList(BaseModel): timestampUpdated: str personCount: int name: str timestampCreated: str listType: str folder: Optional[str] id: str # Facebook class FbStatus(BaseModel): status: str class FbUser(BaseModel): status: str id: Optional[str] grantedScopes: List[str] class AdAccount(BaseModel): id: str name: str description: str status: int businessId: Optional[str] businessName: Optional[str] class AdAccountExtended(BaseModel): id: str adaccountId: str name: str description: str status: int businessId: Optional[str] businessName: Optional[str] sharedStatus: str class AudienceSource(BaseModel): cawType: str cawSchema: str class Audience(BaseModel): id: str name: str description: str size: int collectionId: Optional[int] class FbSchemaUpdateStatus(BaseModel): status: str class FbCountry(BaseModel): id: str name: str class FbLookalikeRatio(BaseModel): id: float name: str class FbAuthInput(BaseModel): accessToken: str data_access_expiration_time: Optional[int] expiresIn: Optional[int] grantedScopes: str graphDomain: Optional[str] signedRequest: Optional[str] userID: str class AudienceExtended(BaseModel): id: str name: str description: str size: int collectionId: int sharedWith: List[AdAccountExtended] ratio: Optional[FbLookalikeRatio] countries: List[FbCountry] parentId: Optional[str] source: Optional[AudienceSource] timestampCreated: str timestampUpdated: str