"""Middlewares for bot.""" from typing import Callable, Dict, Any, Awaitable from aiogram import BaseMiddleware from aiogram.types import TelegramObject from sqlalchemy.ext.asyncio import AsyncSession from bot.db.base import get_session from bot.logging_config import get_logger logger = get_logger(__name__) class DatabaseSessionMiddleware(BaseMiddleware): """Middleware to provide database session to handlers.""" async def __call__( self, handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], event: TelegramObject, data: Dict[str, Any], ) -> Any: """ Inject database session into handler data. Args: handler: Handler function event: Telegram event data: Handler data Returns: Handler result """ async for session in get_session(): data["session"] = session return await handler(event, data) class LoggingMiddleware(BaseMiddleware): """Middleware for logging incoming updates.""" async def __call__( self, handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], event: TelegramObject, data: Dict[str, Any], ) -> Any: """ Log incoming updates. Args: handler: Handler function event: Telegram event data: Handler data Returns: Handler result """ # Log update from aiogram.types import Message, CallbackQuery if isinstance(event, Message): user_id = event.from_user.id if event.from_user else "unknown" text = event.text or "[non-text message]" logger.debug(f"Message from {user_id}: {text[:50]}") elif isinstance(event, CallbackQuery): user_id = event.from_user.id if event.from_user else "unknown" data_str = event.data or "[no data]" logger.debug(f"Callback from {user_id}: {data_str}") return await handler(event, data)