feat: Полный рефакторинг с модульной архитектурой
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:
2025-11-17 05:34:08 +09:00
parent 4e06e6296c
commit 4a741715f5
24 changed files with 3427 additions and 1050 deletions

View File

@@ -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"

View 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)
)