import uuid from datetime import datetime from fansifter_common.adapters.db.orm import type_annotation_map from fansifter_common.adapters.db.types import ChoiceType from sqlalchemy import text from sqlalchemy.orm import ( DeclarativeBase, Mapped, MappedAsDataclass, mapped_column, ) from app.enums import AdReportingPlatform, AppConnectionStatus class ReportingModel(MappedAsDataclass, DeclarativeBase): """Base class for all default db models.""" type_annotation_map = type_annotation_map # This models are used only for tests class AdReportingAdDbt(ReportingModel, kw_only=True): __tablename__ = "ad_reporting_ad_dbt" id: Mapped[str] = mapped_column( primary_key=True, unique=True, default_factory=lambda: str(uuid.uuid4()) ) source_schema: Mapped[str] = mapped_column(primary_key=True) platform: Mapped[AdReportingPlatform] = mapped_column( ChoiceType(AdReportingPlatform) ) creative_id: Mapped[str | None] creative_image_url: Mapped[str | None] creative_video_url: Mapped[str | None] creative_post_url: Mapped[str | None] creative_original_thumbnail_url: Mapped[str | None] synced_at: Mapped[datetime] class AdReportingCreativeThumbnail(ReportingModel, kw_only=True): __tablename__ = "ad_reporting_creative_thumbnail" id: Mapped[str] = mapped_column( primary_key=True, default_factory=lambda: str(uuid.uuid4()), server_default=text("uuid_generate_v4()"), ) creative_id: Mapped[str] platform: Mapped[str] source_url: Mapped[str] img_s3_obj_key: Mapped[str | None] img_url: Mapped[str | None] timg64x64_s3_obj_key: Mapped[str | None] timg64x64_url: Mapped[str | None] synced_at: Mapped[datetime] modified_at: Mapped[datetime] fails_count: Mapped[int] = mapped_column(default=0) class MetaAdReportingConnection(ReportingModel, kw_only=True): __tablename__ = "meta_ad_reporting_connection" id: Mapped[str] = mapped_column(primary_key=True, unique=True) fivetran_schema: Mapped[str] status: Mapped[AppConnectionStatus] _fivetran_deleted: Mapped[bool] = mapped_column(default=False) class TiktokAdReportingConnection(ReportingModel, kw_only=True): __tablename__ = "tiktok_ad_reporting_connection" id: Mapped[str] = mapped_column(primary_key=True, unique=True) fivetran_schema: Mapped[str] status: Mapped[AppConnectionStatus] _fivetran_deleted: Mapped[bool] = mapped_column(default=False) class GoogleAdReportingConnection(ReportingModel, kw_only=True): __tablename__ = "google_ad_reporting_connection" id: Mapped[str] = mapped_column(primary_key=True, unique=True) fivetran_schema: Mapped[str] status: Mapped[AppConnectionStatus] _fivetran_deleted: Mapped[bool] = mapped_column(default=False)