1 Project Architecture
BBQQYT edited this page 2025-08-10 18:55:28 +03:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Архитектура проекта

Этот документ описывает техническое устройство приложения и основные технологии, используемые в проекте.

💻 Технологический стек

  • Язык: Kotlin (100%)
  • UI: Jetpack Compose — для построения всего пользовательского интерфейса.
  • Архитектура: MVVM (Model-View-ViewModel)
  • Асинхронность: Kotlin Coroutines & Flow
  • Внедрение зависимостей: Hilt
  • Навигация: Navigation Compose
  • Работа с сетью: Retrofit & OkHttp
  • Хранение данных:
    • Room — для хранения истории чатов и сообщений.
    • Jetpack DataStore — для хранения настроек и API-ключей.
  • Сериализация: Kotlinx.serialization
  • Загрузка изображений: Coil

🏗️ Структура слоев

Проект следует классической многослойной архитектуре.

1. UI Layer (/ui)

  • Построен полностью на Jetpack Compose.
  • Каждый экран или группа экранов (chat, chatlist, settings) имеет свой ViewModel.
  • ViewModel управляет состоянием экрана через StateFlow<UiState>.
  • Экраны (Composable-функции) подписываются на UiState и перерисовываются при его изменении.

2. Data Layer (/data)

  • Реализован по паттерну Repository.
  • ChatRepository: Центральный узел для всех операций с чатами. Координирует работу с локальной базой данных (ChatDao) и сетевыми провайдерами (LlmProvider).
  • PersonaRepository: Отвечает за загрузку официальных и пользовательских персонажей.
  • SettingsRepository и TokenManager: Управляют чтением и записью всех настроек приложения из DataStore.

3. Источники данных (/data/local и /data/network)

  • Локальные:

    • AppDatabase (Room): Содержит таблицы chats (ChatEntity) и messages (MessageEntity).
    • DataStore: Используется через SettingsRepository для хранения пар "ключ-значение".
  • Сетевые:

    • LlmProvider: Гибкий интерфейс для взаимодействия с LLM. Имеет реализации GeminiLlmProvider и OpenAiCompatibleLlmProvider.
    • LlmProviderFactory: Фабрика, которая предоставляет нужную реализацию LlmProvider в зависимости от настроек. Это позволяет легко добавлять новых провайдеров.
    • Retrofit-интерфейсы: PersonaApiService и GenericLlmApiService для выполнения HTTP-запросов.

🎨 Система тем (/ui/theme/theming)

Одной из ключевых особенностей является гибкая система тем.

  • ThemeManager: Центральный объект, который на основе выбранной в настройках AppTheme предоставляет конфигурацию ThemeConfig.
  • ThemeConfig: Data-класс, который содержит ссылки на нужные @Composable-функции для каждого экрана (chatListScreen, chatScreen).
  • AppNavGraph: При построении графа навигации он получает ThemeConfig и вызывает функции из него, тем самым полностью подменяя реализацию экранов.

Это позволяет каждой теме иметь не только свою цветовую схему, но и уникальную структуру и логику UI.