from typing import Any, Awaitable, Callable from aiogram import BaseMiddleware from aiogram.types import TelegramObject from sqlalchemy.ext.asyncio import AsyncSession from app.repositories.user import UserRepository from app.services.referral_service import ReferralService from app.services.user_service import UserService class ServicesMiddleware(BaseMiddleware): """Builds application services from the request-scoped session (dependency injection).""" async def __call__( self, handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]], event: TelegramObject, data: dict[str, Any], ) -> Any: session: AsyncSession = data["session"] users = UserRepository(session) referrals = ReferralService(users) data["user_service"] = UserService(users, referrals) return await handler(event, data)