from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Boolean from sqlalchemy.orm import relationship from db import Base from datetime import datetime # Битовые флаги прав SCOPE_POST = 1 # право постить SCOPE_MANAGE_BTNS = 2 # право управлять кнопками (опционально) SCOPE_SHARE = 4 # право делиться дальше (опционально) class ChannelAccess(Base): __tablename__ = "channel_accesses" id = Column(Integer, primary_key=True) channel_id = Column(Integer, ForeignKey("channels.id"), nullable=False) # Кто выдал доступ (владелец/менеджер с SCOPE_SHARE) invited_by_admin_id = Column(Integer, ForeignKey("admins.id"), nullable=False) # Кому выдан доступ (заполняется при активации, до активации = NULL) invited_admin_id = Column(Integer, ForeignKey("admins.id"), nullable=True) # Безопасно: храним ХЭШ токена приглашения (сам токен не храним) token_hash = Column(String, nullable=False) scopes = Column(Integer, default=SCOPE_POST, nullable=False) # битовая маска status = Column(String, default="pending", nullable=False) # pending|active|revoked|expired created_at = Column(DateTime, default=datetime.utcnow, nullable=False) accepted_at = Column(DateTime, nullable=True) revoked_at = Column(DateTime, nullable=True) expires_at = Column(DateTime, nullable=True) channel = relationship("Channel", foreign_keys=[channel_id]) class Admin(Base): __tablename__ = 'admins' id = Column(Integer, primary_key=True) tg_id = Column(Integer, unique=True, nullable=False) class Channel(Base): __tablename__ = 'channels' id = Column(Integer, primary_key=True) name = Column(String) link = Column(String) admin_id = Column(Integer, ForeignKey('admins.id')) buttons = relationship('Button', back_populates='channel') class Group(Base): __tablename__ = 'groups' id = Column(Integer, primary_key=True) name = Column(String, nullable=False) link = Column(String, nullable=False) admin_id = Column(Integer, ForeignKey('admins.id')) buttons = relationship('Button', back_populates='group') class Button(Base): __tablename__ = 'buttons' id = Column(Integer, primary_key=True) name = Column(String, nullable=False) url = Column(String, nullable=False) channel_id = Column(Integer, ForeignKey('channels.id'), nullable=True) group_id = Column(Integer, ForeignKey('groups.id'), nullable=True) channel = relationship('Channel', back_populates='buttons') group = relationship('Group', back_populates='buttons')