This commit is contained in:
@@ -3,6 +3,9 @@ import hashlib, secrets
|
||||
from datetime import datetime, timedelta
|
||||
from sqlalchemy import select
|
||||
from models import Admin, Channel, ChannelAccess, SCOPE_POST, SCOPE_SHARE
|
||||
from sqlalchemy.exc import OperationalError
|
||||
|
||||
|
||||
|
||||
def make_token(nbytes: int = 9) -> str:
|
||||
# Короткий URL-safe токен (<= ~12-16 символов укладывается в /start payload)
|
||||
@@ -41,28 +44,25 @@ async def has_scope_on_channel(session, admin_id: int, channel_id: int, scope: i
|
||||
return (acc.scopes & scope) == scope
|
||||
|
||||
async def list_channels_for_admin(session, admin_id: int):
|
||||
"""Каналы, куда можно постить: владелец + активные доступы с SCOPE_POST."""
|
||||
# Владелец
|
||||
q1 = await session.execute(select(Channel).where(Channel.admin_id == admin_id))
|
||||
owned = q1.scalars().all()
|
||||
|
||||
# Доступы
|
||||
q2 = await session.execute(
|
||||
select(ChannelAccess).where(
|
||||
ChannelAccess.invited_admin_id == admin_id,
|
||||
ChannelAccess.status == "active",
|
||||
try:
|
||||
q2 = await session.execute(
|
||||
select(ChannelAccess).where(
|
||||
ChannelAccess.invited_admin_id == admin_id,
|
||||
ChannelAccess.status == "active",
|
||||
)
|
||||
)
|
||||
)
|
||||
access_rows = q2.scalars().all()
|
||||
access_map = {ar.channel_id for ar in access_rows if (ar.scopes & SCOPE_POST)}
|
||||
if not access_map:
|
||||
rows = q2.scalars().all()
|
||||
except OperationalError:
|
||||
return owned # таблицы ещё нет — просто вернём свои каналы
|
||||
|
||||
can_post_ids = {r.channel_id for r in rows if (r.scopes & SCOPE_POST)}
|
||||
if not can_post_ids:
|
||||
return owned
|
||||
|
||||
q3 = await session.execute(select(Channel).where(Channel.id.in_(access_map)))
|
||||
q3 = await session.execute(select(Channel).where(Channel.id.in_(can_post_ids)))
|
||||
shared = q3.scalars().all()
|
||||
|
||||
# Уникальный список (owner + shared)
|
||||
all_channels = {c.id: c for c in owned}
|
||||
d = {c.id: c for c in owned}
|
||||
for c in shared:
|
||||
all_channels[c.id] = c
|
||||
return list(all_channels.values())
|
||||
d[c.id] = c
|
||||
return list(d.values())
|
||||
|
||||
Reference in New Issue
Block a user