feat: Полный рефакторинг с модульной архитектурой
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Исправлены критические ошибки callback обработки - Реализована модульная архитектура с применением SOLID принципов - Добавлена система dependency injection - Создана новая структура: interfaces, repositories, components, controllers - Исправлены проблемы с базой данных (добавлены отсутствующие столбцы) - Заменены заглушки на полную функциональность управления розыгрышами - Добавлены отчеты о проделанной работе и документация Архитектура готова для production и легко масштабируется
This commit is contained in:
@@ -4,12 +4,13 @@ from aiogram.types import Message, CallbackQuery, InlineKeyboardButton, InlineKe
|
||||
from aiogram.filters import Command, StateFilter
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.fsm.state import State, StatesGroup
|
||||
import logging
|
||||
|
||||
from src.core.database import async_session_maker
|
||||
from src.core.registration_services import RegistrationService, AccountService
|
||||
from src.core.services import UserService
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
router = Router()
|
||||
|
||||
|
||||
@@ -22,6 +23,8 @@ class RegistrationStates(StatesGroup):
|
||||
@router.callback_query(F.data == "start_registration")
|
||||
async def start_registration(callback: CallbackQuery, state: FSMContext):
|
||||
"""Начать процесс регистрации"""
|
||||
logger.info(f"Получен запрос на регистрацию от пользователя {callback.from_user.id}")
|
||||
|
||||
text = (
|
||||
"📝 Регистрация в системе\n\n"
|
||||
"Для участия в розыгрышах необходимо зарегистрироваться.\n\n"
|
||||
|
||||
109
src/handlers/test_handlers.py
Normal file
109
src/handlers/test_handlers.py
Normal file
@@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Тестовый обработчик для проверки команды /start и /admin
|
||||
"""
|
||||
|
||||
from aiogram import Router, F
|
||||
from aiogram.types import Message, CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup
|
||||
from aiogram.filters import Command
|
||||
|
||||
from src.core.config import ADMIN_IDS
|
||||
from src.core.permissions import is_admin
|
||||
|
||||
# Создаем роутер для тестов
|
||||
test_router = Router()
|
||||
|
||||
|
||||
@test_router.message(Command("test_start"))
|
||||
async def cmd_test_start(message: Message):
|
||||
"""Тестовая команда /test_start"""
|
||||
user_id = message.from_user.id
|
||||
first_name = message.from_user.first_name
|
||||
is_admin_user = is_admin(user_id)
|
||||
|
||||
welcome_text = f"👋 Привет, {first_name}!\n\n"
|
||||
welcome_text += "🎯 Это тестовая версия команды /start\n\n"
|
||||
|
||||
if is_admin_user:
|
||||
welcome_text += "👑 У вас есть права администратора!\n\n"
|
||||
|
||||
buttons = [
|
||||
[InlineKeyboardButton(text="🔧 Админ-панель", callback_data="admin_panel")],
|
||||
[InlineKeyboardButton(text="➕ Создать розыгрыш", callback_data="create_lottery")],
|
||||
[InlineKeyboardButton(text="🎲 Активные розыгрыши", callback_data="list_lotteries")]
|
||||
]
|
||||
else:
|
||||
welcome_text += "👤 Обычный пользователь\n\n"
|
||||
|
||||
buttons = [
|
||||
[InlineKeyboardButton(text="🎲 Активные розыгрыши", callback_data="list_lotteries")],
|
||||
[InlineKeyboardButton(text="📝 Мои участия", callback_data="my_participations")],
|
||||
[InlineKeyboardButton(text="💳 Мой счёт", callback_data="my_account")]
|
||||
]
|
||||
|
||||
await message.answer(
|
||||
welcome_text,
|
||||
reply_markup=InlineKeyboardMarkup(inline_keyboard=buttons)
|
||||
)
|
||||
|
||||
|
||||
@test_router.message(Command("test_admin"))
|
||||
async def cmd_test_admin(message: Message):
|
||||
"""Тестовая команда /test_admin"""
|
||||
if not is_admin(message.from_user.id):
|
||||
await message.answer("❌ У вас нет прав для выполнения этой команды")
|
||||
return
|
||||
|
||||
await message.answer(
|
||||
"🔧 <b>Админ-панель</b>\n\n"
|
||||
"👑 Добро пожаловать в панель администратора!\n\n"
|
||||
"Доступные функции:",
|
||||
parse_mode="HTML",
|
||||
reply_markup=InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="👥 Управление пользователями", callback_data="admin_users")],
|
||||
[InlineKeyboardButton(text="🎲 Управление розыгрышами", callback_data="admin_lotteries")],
|
||||
[InlineKeyboardButton(text="📊 Статистика", callback_data="admin_stats")],
|
||||
[InlineKeyboardButton(text="🏠 Главное меню", callback_data="back_to_main")]
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
@test_router.callback_query(F.data == "test_callback")
|
||||
async def test_callback_handler(callback: CallbackQuery):
|
||||
"""Тестовый обработчик callback"""
|
||||
await callback.answer()
|
||||
await callback.message.edit_text(
|
||||
"✅ Callback работает!\n\n"
|
||||
"Это означает, что кнопки и обработчики функционируют корректно.",
|
||||
reply_markup=InlineKeyboardMarkup(inline_keyboard=[
|
||||
[InlineKeyboardButton(text="🔙 Назад", callback_data="back_to_main")]
|
||||
])
|
||||
)
|
||||
|
||||
|
||||
@test_router.callback_query(F.data == "back_to_main")
|
||||
async def back_to_main_handler(callback: CallbackQuery):
|
||||
"""Возврат к главному меню"""
|
||||
await callback.answer()
|
||||
|
||||
user_id = callback.from_user.id
|
||||
is_admin_user = is_admin(user_id)
|
||||
|
||||
text = f"🏠 Главное меню\n\nВаш ID: {user_id}\n"
|
||||
text += f"Статус: {'👑 Администратор' if is_admin_user else '👤 Пользователь'}"
|
||||
|
||||
if is_admin_user:
|
||||
buttons = [
|
||||
[InlineKeyboardButton(text="🔧 Админ-панель", callback_data="admin_panel")],
|
||||
[InlineKeyboardButton(text="🎲 Розыгрыши", callback_data="list_lotteries")]
|
||||
]
|
||||
else:
|
||||
buttons = [
|
||||
[InlineKeyboardButton(text="🎲 Розыгрыши", callback_data="list_lotteries")],
|
||||
[InlineKeyboardButton(text="📝 Мои участия", callback_data="my_participations")]
|
||||
]
|
||||
|
||||
await callback.message.edit_text(
|
||||
text,
|
||||
reply_markup=InlineKeyboardMarkup(inline_keyboard=buttons)
|
||||
)
|
||||
Reference in New Issue
Block a user