from datetime import datetime from sqlalchemy import Column, Integer, BigInteger, String, DateTime, ForeignKey, Text, Boolean from sqlalchemy.orm import relationship from app.db.base import Base class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) tg_id = Column(BigInteger, unique=True, nullable=False, index=True) name = Column(String(255)) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) class Chat(Base): __tablename__ = "chats" id = Column(Integer, primary_key=True) chat_id = Column(BigInteger, unique=True, nullable=False, index=True) type = Column(String(32)) # "group" | "supergroup" | "channel" title = Column(String(255)) owner_user_id = Column(Integer, ForeignKey("users.id"), nullable=True, index=True) can_post = Column(Boolean, default=False, nullable=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) owner = relationship("User") class Draft(Base): __tablename__ = "drafts" id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey("users.id"), index=True) text = Column(Text, nullable=True) status = Column(String(16), default="editing", index=True) # editing | ready | sent created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=datetime.utcnow, nullable=False) user = relationship("User") media = relationship("DraftMedia", cascade="all, delete-orphan", back_populates="draft") class DraftMedia(Base): __tablename__ = "draft_media" id = Column(Integer, primary_key=True) draft_id = Column(Integer, ForeignKey("drafts.id"), index=True) kind = Column(String(16)) # photo | video | animation file_id = Column(String(255)) """Ordering inside album.""" order = Column(Integer, default=0) draft = relationship("Draft", back_populates="media") class Delivery(Base): __tablename__ = "deliveries" id = Column(Integer, primary_key=True) draft_id = Column(Integer, ForeignKey("drafts.id"), index=True) chat_id = Column(BigInteger, index=True) status = Column(String(16), default="new", index=True) # new | sent | failed error = Column(Text, nullable=True) message_ids = Column(Text, nullable=True) # CSV for album parts created_at = Column(DateTime, default=datetime.utcnow, nullable=False)