50 lines
2.0 KiB
Python
50 lines
2.0 KiB
Python
"""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)
|