Init project
This commit is contained in:
47
birthday_pool_bot/telegram_bot/ui/middlewares/auth.py
Normal file
47
birthday_pool_bot/telegram_bot/ui/middlewares/auth.py
Normal file
@@ -0,0 +1,47 @@
|
||||
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
|
||||
Reference in New Issue
Block a user