from datetime import UTC, datetime from typing import TYPE_CHECKING from sqlalchemy import INTEGER, DateTime, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from db.base import Base if TYPE_CHECKING: from db.models import Subscription class RWSyncOutbox(Base): __tablename__ = "rw_sync_outbox" id: Mapped[int] = mapped_column(INTEGER, primary_key=True, autoincrement=True) subscription_id: Mapped[int] = mapped_column( ForeignKey("subscriptions.id"), nullable=False, unique=True ) revision: Mapped[int] = mapped_column(INTEGER, nullable=False, default=1) attempts: Mapped[int] = mapped_column(INTEGER, nullable=False, default=0) next_attempt_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) locked_until: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(UTC) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, default=lambda: datetime.now(UTC), onupdate=lambda: datetime.now(UTC), ) subscription: Mapped["Subscription"] = relationship("Subscription", lazy="selectin")