from datetime import datetime from fansifter_common.adapters.db.orm import type_annotation_map from sqlalchemy import ForeignKey from sqlalchemy.ext.associationproxy import AssociationProxy, association_proxy from sqlalchemy.orm import ( DeclarativeBase, Mapped, MappedAsDataclass, mapped_column, relationship, ) class Model(MappedAsDataclass, DeclarativeBase): """Base class for all default db models.""" type_annotation_map = type_annotation_map class MetaUserConnection(Model): __tablename__ = "meta_user_connection" id: Mapped[str] = mapped_column(primary_key=True) token: Mapped[str] updated_at: Mapped[datetime] is_valid: Mapped[bool] ad_accounts: Mapped[list["MetaAdAccount"]] = relationship( secondary="meta_user_connection_ad_account", back_populates="connections" ) external_id: AssociationProxy[str] = association_proxy( "ad_accounts", "external_id", ) class MetaAdAccount(Model): __tablename__ = "meta_ad_account" id: Mapped[str] = mapped_column(primary_key=True) external_id: Mapped[str] connections: Mapped[list["MetaUserConnection"]] = relationship( secondary="meta_user_connection_ad_account", back_populates="ad_accounts" ) class MetaUserConnectionAdAccount(Model): __tablename__ = "meta_user_connection_ad_account" user_connection_id: Mapped[str] = mapped_column( ForeignKey(MetaUserConnection.id), primary_key=True ) ad_account_id: Mapped[str] = mapped_column( ForeignKey(MetaAdAccount.id), primary_key=True ) class TiktokUserConnection(Model): __tablename__ = "tiktok_user_connection" id: Mapped[str] = mapped_column(primary_key=True) token: Mapped[str] updated_at: Mapped[datetime] is_valid: Mapped[bool] ad_accounts: Mapped[list["TiktokAdAccount"]] = relationship( secondary="tiktok_user_connection_ad_account", back_populates="connections" ) external_id: AssociationProxy[str] = association_proxy( "ad_accounts", "external_id", ) class TiktokAdAccount(Model): __tablename__ = "tiktok_ad_account" id: Mapped[str] = mapped_column(primary_key=True) external_id: Mapped[str] connections: Mapped[list["TiktokUserConnection"]] = relationship( secondary="tiktok_user_connection_ad_account", back_populates="ad_accounts" ) class TiktokUserConnectionAdAccount(Model): __tablename__ = "tiktok_user_connection_ad_account" user_connection_id: Mapped[str] = mapped_column( ForeignKey(TiktokUserConnection.id), primary_key=True ) ad_account_id: Mapped[str] = mapped_column( ForeignKey(TiktokAdAccount.id), primary_key=True )