48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
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
|