# Voice Bot - Архитектура ## Обзор Voice Bot был рефакторен в соответствии с принципами чистой архитектуры, следуя паттернам, используемым в `helper_bot`. ## Структура проекта ``` voice_bot/ ├── handlers/ │ ├── __init__.py # Экспорт всех модулей │ ├── constants.py # Константы и сообщения │ ├── dependencies.py # Dependency injection и middleware │ ├── exceptions.py # Кастомные исключения │ ├── services.py # Бизнес-логика │ ├── utils.py # Вспомогательные функции │ ├── voice_handler.py # Обработчики голосовых сообщений │ └── callback_handler.py # Обработчики callback'ов ├── keyboards/ │ └── keyboards.py # Клавиатуры ├── utils/ │ └── helper_func.py # Устаревшие функции (для совместимости) ├── main.py # Точка входа └── README.md # Этот файл ``` ## Принципы архитектуры ### 1. Разделение ответственности - **Handlers** - только обработка событий и координация - **Services** - бизнес-логика и операции с данными - **Utils** - вспомогательные функции - **Constants** - константы и сообщения ### 2. Dependency Injection - Использование `VoiceBotMiddleware` для внедрения зависимостей - Типизированные зависимости `BotDB` и `Settings` - Автоматическое получение экземпляров через `get_global_instance()` ### 3. Обработка ошибок - Кастомные исключения для разных типов ошибок - Логирование всех ошибок - Graceful fallback для пользователей ### 4. Константы - Все строки и значения вынесены в `constants.py` - Легко изменять сообщения и настройки - Централизованное управление конфигурацией ## Основные компоненты ### VoiceBotService Основной сервис для работы с голосовыми сообщениями: - Отправка приветственных сообщений - Управление аудио файлами - Работа с базой данных ### AudioFileService Сервис для работы с аудио файлами: - Генерация имен файлов - Сохранение в базу данных - Скачивание и сохранение файлов ### VoiceBotMiddleware Middleware для dependency injection: - Автоматическое внедрение зависимостей - Обработка ошибок - Совместимость с MagicData ## Использование ### Импорт сервисов ```python from voice_bot.handlers.services import VoiceBotService, AudioFileService from voice_bot.handlers.utils import get_last_message_text ``` ### Использование в handlers ```python @voice_router.message(Command("start")) async def start(message: types.Message, bot_db: BotDB, settings: Settings): voice_service = VoiceBotService(bot_db, settings) await voice_service.send_welcome_messages(message, user_emoji) ``` ### Обработка ошибок ```python try: result = voice_service.get_random_audio(user_id) except AudioProcessingError as e: logger.error(f"Ошибка при получении аудио: {e}") # Обработка ошибки ``` ## Миграция Для использования новой архитектуры: 1. Замените прямые вызовы функций на использование сервисов 2. Используйте dependency injection вместо глобальных переменных 3. Обрабатывайте исключения через кастомные классы 4. Используйте константы вместо хардкода строк ## Преимущества новой архитектуры - **Тестируемость** - легко создавать моки и тесты - **Поддерживаемость** - четкое разделение ответственности - **Расширяемость** - легко добавлять новые функции - **Читаемость** - понятная структура кода - **Переиспользование** - сервисы можно использовать в разных местах