Перейти к содержанию

Архитектура проекта eebook-users

1. Обзор архитектуры

Проект построен по принципам чистой архитектуры с чётким разделением на слои:

src/
├── adapters/               # Адаптеры для внешних систем и хранилищ
│   ├── interfaces.py       # Протоколы для внешних сервисов
│   ├── password_hasher.py  # Реализация хешера паролей
│   ├── repository.py       # Реализация репозиториев
│   ├── orm.py              # ORM-модели SQLAlchemy
│   ├── factory.py          # Фабрики адаптеров
│   └── vault.py            # Провайдер секретов (Vault)
│
├── config/                 # Конфигурация и настройки
│   ├── settings.py         # Pydantic-модель конфигурации
│   ├── loader.py           # Загрузка и валидация настроек
│   └── exceptions.py       # Ошибки конфигурации
│
├── domain/                 # Доменный слой (чистая бизнес-логика)
│   ├── model.py            # Доменные модели пользователя
│   └── exceptions.py       # Исключения доменного уровня
│
├── entity/                 # Вспомогательные модели (например, для ORM/DTO)
│   └── models.py
│
├── entrypoints/            # Точки входа приложения
│   ├── api/                # HTTP API-эндпоинты
│   │   └── endpoints.py
│   └── fastapi_app.py      # Инициализация FastAPI
│
├── infrastructure/         # Инфраструктурный слой
│   ├── database/           # Работа с базой данных
│   │   ├── engine.py       # Настройка движка SQLAlchemy
│   │   ├── exceptions.py   # Ошибки инфраструктуры БД
│   │   └── migrations/     # Alembic-миграции
│   ├── lifespan.py         # Контекст жизненного цикла приложения
│   └── logging/            # Конфигурация логирования
│
├── service_layer/          # Сервисный слой (application layer)
│   ├── users_service.py    # Сервис пользователей
│   ├── uow.py              # Unit of Work
│   ├── dependencies.py     # FastAPI зависимости
│   └── exceptions.py       # Ошибки сервисного уровня
│
├── bootstrap.py            # Инициализация приложения
├── exceptions.py           # Общие исключения
└── main.py                 # Точка входа (run)

2. Взаимодействие слоёв

entrypoints
    ↓
service_layer  →  domain
    ↓              ↑
infrastructure → adapters
    ↓
  config

2.1. Назначение слоёв

  • entrypoints - Точки входа в приложение (HTTP API, CLI, задачи по расписанию)
  • service_layer - Прикладная логика, координация операций, бизнес-правила
  • domain - Чистая бизнес-логика, доменные модели и исключения
  • adapters - Адаптеры для работы с внешними системами и БД
  • infrastructure - Низкоуровневые детали (БД, кеш, брокеры сообщений)
  • config - Конфигурация приложения и настройки окружения

3. Инициализация приложения

3.1. Запуск приложения

  1. Запускается lifespan (контекстный менеджер FastAPI)
  2. Вызывается bootstrap()
  3. Происходит инициализация компонентов:
Source code in src/bootstrap.py
16
17
18
19
20
21
22
23
24
25
26
27
async def bootstrap() -> Settings:
    try:
        configure_logging()
        await SettingsLoader().load()
        settings = Settings()  # type: ignore
        _ = get_engine()
        logger.info('Bootstrap успешно инициализировал компоненты')
        return settings

    except Exception as e:
        logger.exception('Bootstrap failed')
        raise BootstrapInitializationError(f'Failed to bootstrap application: {str(e)}') from e

3.2. Обработка запроса

  1. Запрос приходит в FastAPI эндпоинт
  2. Через DI внедряются зависимости из service_layer.dependencies
  3. Создается сессия БД через get_db()
  4. Вызывается соответствующий сервис/юзкейс
  5. Происходит работа с репозиториями в рамках UoW
  6. Результат возвращается клиенту

4. Ключевые компоненты

4.1. Ключевые компоненты

4.1.1. bootstrap.py

Центральная точка инициализации приложения:

  • Настройка логгера
  • Загрузка конфигурации из переменных окружения
  • Инициализация БД и миграций
  • Настройка зависимостей
  • Инициализация FastAPI приложения

4.1.2. Unit of Work (UoW)

Паттерн "Единица работы" для управления транзакциями:

  • Документация UoW
  • Обеспечивает атомарность операций
  • Управляет жизненным циклом сессий БД

4.1.3. Сервис пользователей

Основной сервис для работы с пользователями:

  • Документация UserService
  • Управление жизненным циклом пользователей
  • Аутентификация и авторизация
  • Управление профилями

4.1.4. Конфигурация

Управление настройками приложения:

  • Загрузка из переменных окружения
  • Валидация через Pydantic
  • Поддержка разных окружений (dev, test, prod)

Эта документация даёт полное представление об архитектуре проекта и принципах его работы. Для более детального изучения отдельных компонентов обратитесь к соответствующим разделам документации.