aboutsummaryrefslogtreecommitdiff
path: root/handlers/middleware.py
diff options
context:
space:
mode:
Diffstat (limited to 'handlers/middleware.py')
-rw-r--r--handlers/middleware.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/handlers/middleware.py b/handlers/middleware.py
new file mode 100644
index 0000000..87a117a
--- /dev/null
+++ b/handlers/middleware.py
@@ -0,0 +1,56 @@
1from typing import Any, Awaitable, Callable
2
3from aiogram import BaseMiddleware
4from aiogram.types import CallbackQuery, Message, TelegramObject
5from sqlalchemy.ext.asyncio import AsyncSession
6
7from database import sessions
8from models import User
9
10
11class InjectSessionMiddleware(BaseMiddleware):
12 async def __call__[T](
13 self,
14 handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]],
15 event: TelegramObject,
16 data: dict[str, Any],
17 ) -> Any:
18 async with sessions.begin() as session:
19 data["session"] = session
20 handler_result = await handler(event, data)
21 return handler_result
22
23
24class UserAccessMiddleware(BaseMiddleware):
25 async def __call__(
26 self,
27 handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]],
28 event: TelegramObject,
29 data: dict[str, Any],
30 ) -> Any:
31 if not isinstance(event, (Message, CallbackQuery)):
32 raise TypeError(
33 f"UserAccessMiddleware doesn't support event with type: {type(event).__name__}",
34 event,
35 )
36
37 if isinstance(event, Message):
38 user_id = event.chat.id
39 else:
40 user_id = event.from_user.id
41
42 session: AsyncSession = data["session"]
43 user = await session.get(User, user_id)
44 if user is None:
45 error_text = "Вы не добавлены в список пользователей VPN"
46
47 if isinstance(event, Message):
48 await event.answer(error_text)
49 else:
50 await event.answer(error_text)
51
52 return
53
54 data["user"] = user
55
56 return await handler(event, data)