initial commit

This commit is contained in:
2025-12-25 15:25:46 +03:00
commit 58827ac124
20 changed files with 1854 additions and 0 deletions

80
middlewares/auth.py Normal file
View File

@@ -0,0 +1,80 @@
from typing import Callable, Dict, Any, Awaitable
from aiogram import BaseMiddleware
from aiogram.types import Message, CallbackQuery
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from database.connection import async_session_maker
from database.models import User
import logging
logger = logging.getLogger(__name__)
class AuthMiddleware(BaseMiddleware):
"""
Middleware для проверки авторизации пользователя.
Пропускает команду /start и проверяет наличие telegram_id в БД для остальных запросов.
"""
async def __call__(
self,
handler: Callable[[Message | CallbackQuery, Dict[str, Any]], Awaitable[Any]],
event: Message | CallbackQuery,
data: Dict[str, Any]
) -> Any:
# Пропускаем команду /start
if isinstance(event, Message) and event.text and event.text.startswith('/start'):
return await handler(event, data)
# Пропускаем callback'и регистрации и входа
if isinstance(event, CallbackQuery) and event.data:
if event.data in ['login', 'register', 'main_menu']:
return await handler(event, data)
# Проверяем авторизацию
telegram_id = event.from_user.id
try:
async with async_session_maker() as session:
result = await session.execute(
select(User).where(User.telegram_id == telegram_id)
)
user = result.scalar_one_or_none()
if not user:
if isinstance(event, CallbackQuery):
await event.answer("⛔ Сначала авторизуйтесь через /start", show_alert=True)
else:
await event.answer("⛔ Сначала авторизуйтесь через /start")
return
# Добавляем пользователя в данные
data['user'] = user
data['session'] = session
except Exception as e:
logger.error(f"Ошибка в AuthMiddleware: {e}")
if isinstance(event, CallbackQuery):
await event.answer("❌ Ошибка проверки авторизации", show_alert=True)
else:
await event.answer("❌ Ошибка проверки авторизации")
return
return await handler(event, data)
class DatabaseMiddleware(BaseMiddleware):
"""
Middleware для предоставления сессии БД в обработчики.
"""
async def __call__(
self,
handler: Callable[[Message | CallbackQuery, Dict[str, Any]], Awaitable[Any]],
event: Message | CallbackQuery,
data: Dict[str, Any]
) -> Any:
async with async_session_maker() as session:
data['session'] = session
return await handler(event, data)