from __future__ import annotations from datetime import datetime import sqlalchemy as sa from fansifter_common.adapters.db.models import Query from fansifter_common.utils import timezone from fansifter_common.utils.uuid import uuid_string from sqlalchemy.orm import Mapped, mapped_column from app.adapters.db import Model class Domain(Model, kw_only=True): __tablename__ = "email_domain" id: Mapped[str] = mapped_column(primary_key=True, default_factory=uuid_string) domain: Mapped[str] class AutomatedEmailQuery(Query["AutomatedEmail"]): def update_last_sent_at(self, email_id: str) -> None: stmt = ( sa.update(AutomatedEmail) .where(AutomatedEmail.id == email_id) .values(last_sent_at=timezone.now()) ) self.session.execute(stmt) class AutomatedEmail(Model, kw_only=True): __tablename__ = "email_automated" id: Mapped[str] = mapped_column(primary_key=True, default_factory=uuid_string) name: Mapped[str] vendor_id: Mapped[int] domain_id: Mapped[str | None] = mapped_column(name="email_domain_id", default=None) sender_name: Mapped[str | None] = mapped_column(default=None) email_username: Mapped[str | None] = mapped_column(default=None) subject: Mapped[str | None] = mapped_column(default=None) html_content: Mapped[str | None] = mapped_column(default=None) css_content: Mapped[str | None] = mapped_column(default=None) compressed_content: Mapped[str | None] = mapped_column(default=None) preview_text: Mapped[str | None] = mapped_column(default=None) last_sent_at: Mapped[datetime | None] = mapped_column(default=None) query = AutomatedEmailQuery.as_descriptor() class AutomatedEmailSendBatch(Model, kw_only=True): __tablename__ = "email_automated_send_batch" id: Mapped[str] = mapped_column(primary_key=True, default_factory=uuid_string) key: Mapped[str] automated_email_id: Mapped[str] last_sent_row_id: Mapped[int] = mapped_column( default=0, server_default=sa.text("0") ) completed_at: Mapped[datetime | None] = mapped_column(default=None) created_at: Mapped[datetime] = mapped_column( default_factory=timezone.now, server_default=sa.func.now() ) updated_at: Mapped[datetime] = mapped_column( default_factory=timezone.now, onupdate=timezone.now, server_default=sa.func.now(), ) @property def is_completed(self) -> bool: return self.completed_at is not None