85 lines
3.4 KiB
Python
85 lines
3.4 KiB
Python
<<<<<<< HEAD
|
||
from datetime import datetime
|
||
|
||
|
||
from sqlalchemy import Column, Integer, String, ForeignKey, Text
|
||
=======
|
||
from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Boolean
|
||
>>>>>>> main
|
||
from sqlalchemy.orm import relationship
|
||
from db import Base
|
||
from datetime import datetime
|
||
|
||
<<<<<<< HEAD
|
||
class ActionLog(Base):
|
||
__tablename__ = 'action_logs'
|
||
id = Column(Integer, primary_key=True)
|
||
admin_id = Column(Integer)
|
||
action = Column(String)
|
||
details = Column(String)
|
||
timestamp = Column(String, default=lambda: datetime.utcnow().isoformat())
|
||
|
||
=======
|
||
# Битовые флаги прав
|
||
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])
|
||
>>>>>>> main
|
||
class Admin(Base):
|
||
__tablename__ = 'admins'
|
||
id = Column(Integer, primary_key=True)
|
||
tg_id = Column(Integer, nullable=False)
|
||
channel_id = Column(Integer, ForeignKey('channels.id'), nullable=True)
|
||
inviter_id = Column(Integer, nullable=True)
|
||
invite_token = Column(String, nullable=True, unique=True)
|
||
|
||
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')
|