from typing import Any, Awaitable, Callable import aiogram from aiogram.types import TelegramObject, User as TelegramUser from birthday_pool_bot.dto import User from birthday_pool_bot.repositories.repositories import UsersRepository from birthday_pool_bot.telegram_bot.ui.utils import get_telegram_user_full_name class AuthMiddleware(aiogram.BaseMiddleware): def __init__(self, users_repository: UsersRepository): self._users_repository = users_repository async def __call__( self, handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]], event: TelegramObject, data: dict[str, Any], ): telegram_user = self.get_telegram_user(event=event) if telegram_user is None: return await handler(event, data) async with self._users_repository.transaction(): user = await self._users_repository.get_user_by_telegram_id( telegram_id=telegram_user.id, ) if user is None: user = User( name=get_telegram_user_full_name(user=telegram_user), telegram_id=telegram_user.id, ) user = await self._users_repository.create_user(user=user) data["user"] = user return await handler(event, data) def get_telegram_user(self, event: TelegramObject) -> TelegramUser | None: if hasattr(event, "from_user") and isinstance(event.from_user, TelegramUser): return event.from_user if hasattr(event, "user") and isinstance(event.user, TelegramUser): return event.user if hasattr(event, "new_chat_member") and event.new_chat_member: return event.new_chat_member.user