from sqlalchemy import Boolean, Column, DateTime, Index, Integer, String, ForeignKey, func from sqlalchemy_json import mutable_json_type from sqlalchemy.dialects.postgresql import ARRAY, JSONB from sqlalchemy.ext.declarative import declarative_base, declared_attr Base = declarative_base() class Application(Base): """Application model. Specific application (or project) that is supported by the service. Attributes: slug: unique application slug. name: application name. """ __tablename__ = "applications" id = Column(Integer, primary_key=True, autoincrement=True) slug = Column(String(30), nullable=False, unique=True, index=True) name = Column(String(100), nullable=True) settings = Column(mutable_json_type(dbtype=JSONB, nested=True), nullable=True) types = Column(ARRAY(String(30)), nullable=True) class AppRelatedMixin: @declared_attr def app_slug(cls): return Column(String(30), ForeignKey(Application.slug), nullable=False) class HiddenDeleteMixin: is_active = Column(Boolean, nullable=False, default=True) class Account(HiddenDeleteMixin, AppRelatedMixin, Base): __tablename__ = "account" __table_args__ = (Index("ix_app_slug_active_user", "app_slug", "user_id", "is_active"),) id = Column(Integer, primary_key=True, autoincrement=True) user_id = Column(String(50), nullable=False) _active = Column(Boolean, nullable=False, default=True) class FeedMessage(AppRelatedMixin, Base): __tablename__ = "feed_messages" id = Column(Integer, primary_key=True, autoincrement=True) created_at = Column(DateTime, default=func.now()) updated_at = Column(DateTime, default=func.now(), onupdate=func.now()) public = Column(Boolean, default=True, nullable=False) ttl = Column(Integer) message_id = Column(Integer, nullable=True, default=None) event_id = Column(Integer, nullable=True, default=None) account_id = Column(Integer, nullable=True, default=None) meta = Column(mutable_json_type(dbtype=JSONB, nested=True), nullable=True, default=None) data = Column(mutable_json_type(dbtype=JSONB, nested=True), nullable=True, default=None) status = Column(Boolean, nullable=False, default=True)