""" Декораторы для хендлеров """ from functools import wraps from aiogram.types import Message, CallbackQuery from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from database.models import User import config async def get_user_from_db(session: AsyncSession, user_id: int) -> User | None: """Получить пользователя из БД""" result = await session.execute(select(User).where(User.user_id == user_id)) return result.scalar_one_or_none() def admin_only(func): """Только для администраторов""" @wraps(func) async def wrapper(message: Message, *args, **kwargs): if not config.is_admin(message.from_user.id): await message.answer('❌ Эта команда доступна только администраторам') return return await func(message, *args, **kwargs) return wrapper def verified_only(func): """Только для верифицированных жильцов""" @wraps(func) async def wrapper(message: Message, *args, **kwargs): # Проверяем в БД from database.db import AsyncSessionLocal from sqlalchemy import select from database.models import User async with AsyncSessionLocal() as session: user = await get_user_from_db(session, message.from_user.id) if not user or not user.verified: await message.answer( '❗ Для использования этой команды пройдите верификацию\n' 'Отправьте номер квартиры фото квитанции' ) return return await func(message, *args, **kwargs) return wrapper def admin_callback_only(func): """Только для администраторов (callback queries)""" @wraps(func) async def wrapper(callback: CallbackQuery, *args, **kwargs): if not config.is_admin(callback.from_user.id): await callback.answer('❌ Только для администраторов', show_alert=True) return return await func(callback, *args, **kwargs) return wrapper