Stabilize staff concurrency and premium emoji; enable verified Drone deployment
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2026-09-13 19:48:41 +09:00
parent 733298bf06
commit cb35bb12e3
86 changed files with 2993 additions and 2455 deletions

49
src/middlewares/access.py Normal file
View File

@@ -0,0 +1,49 @@
"""Check every staff message/callback, including unfinished FSM dialogs."""
from aiogram import BaseMiddleware
from aiogram.types import CallbackQuery
from src.core.access import current_role, get_role
class AccessMiddleware(BaseMiddleware):
def __init__(self, *, allow_cashier=False, public_handlers=()):
self.allow_cashier = allow_cashier
self.public_handlers = set(public_handlers)
async def __call__(self, handler, event, data):
selected = data.get("handler")
if selected and selected.callback.__name__ in self.public_handlers:
return await handler(event, data)
actor = event.from_user
role = await get_role(actor.id) if actor else "user"
allowed = {"super_admin", "admin"}
if self.allow_cashier:
allowed.add("cashier")
if role not in allowed:
if isinstance(event, CallbackQuery):
await event.answer("❌ Недостаточно прав", show_alert=True)
else:
await event.answer("❌ Недостаточно прав")
return
token = current_role.set((actor.id, role))
try:
return await handler(event, data)
finally:
current_role.reset(token)
class ChatAccessMiddleware(BaseMiddleware):
async def __call__(self, handler, event, data):
from src.core.access import is_admin
from src.core.chat_services import ChatPermissionService
from src.core.database import async_session_maker
admin = await is_admin(event.from_user.id)
async with async_session_maker() as session:
allowed, reason = await ChatPermissionService.can_send_message(session, event.from_user.id, is_admin=admin)
if not allowed:
if isinstance(event, CallbackQuery):
await event.answer(reason, show_alert=True)
else:
await event.answer(reason)
return
return await handler(event, data)