ACL, channel_charing
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2025-09-06 10:57:10 +09:00
parent c6104455d8
commit 5c81aae29c
10 changed files with 657 additions and 275 deletions

View File

@@ -1,7 +1,36 @@
from sqlalchemy import Column, Integer, String, ForeignKey, Text
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)