Позволяет пользователями библиотеки брать/возвращать книги, администратору управлять книгами библиотеки и контролировать действия пользователей.
- Фреймворк: FastAPI
- База данных: PostgreSQL
- ORM: SQLAlchemy
- Аутентификация: JWT
- Управление миграциями: Alembic
- Тестирование: Pytest
Клонируем репозиторий, переходим в него:
git clone https://github.com/manson427/Library.git
cd Library
В папке / находится файл settings_example.yml, который необходимо переименовать в settings.yml и заполнить собственными значениями;
Для запуска приложения в контейнерах необходимо docker-compose_example_run.yml переименовать в docker-compose.yml Запустить Docker-compose, в контейнерах поднимутся само приложение и postgres.
docker compose up --build
После выполнения всех шагов, приложение становится доступным по адресу http://localhost:8000
Документация и список конечных точек доступны по адресу http://localhost:8000/docs
Для запуска тестирования в контейнерах необходимо файл docker-compose_example_test.yml переименовать в docker-compose.yml Запустить Docker-compose, в контейнерах поднимутся само приложение и postgres.
docker compose up --build
В приложение представлена система аутентификации на основе JWT и refresh-token: Выдача токенов производится при авторизации, затем, при истечении срока действия JWT в случае, если срок действия refresh-token не истек, оба JWT и refresh-token автоматически выдаются пользователю и сохраняются в httpOnly куках. Реализован следующий функционал:
- создание/редактирование/удаление книг авторов и жанров, а так же связей между ними;
- получение и возврат книг читателями;
- получение связанных данных по книгам;
- получение статистики работы библиотеки (выданные/просроченные/возвращенные не вовремя и т.д.)
По задумке, книги, авторы и жанры создаются без связей. Далее администратор назначает связи и может запрашивать связанные данные.
Связи БД many-to-many реализованы через паттерн association object.
Работа с таблицами БД выполняется через паттерн repository. В базовом репозитории реализованы основные функции работы с таблицами. Объекты репозитории таблиц наследуют базовый репозиторий и дополняются собственными функциями. Далее все объекты репозитории таблиц объединяются в единый объект путём создания экземпляров, который вызывается в ендпоинтах FastAPI. В результате, значительная часть работы с БД написана в многократно используемом базовом репозитории.
Функции работы с БД в базовом репозитории используют прямое обращение к одной таблице. Функции работы с БД в дочернем репозитории используют join и selectinload для предоставления связанных данных.
Функции взятия и возврата книги реализованы через ORM - получают на вход объекты alchemy, изменяют их и методом add вносят изменения.
Получаемые от пользователя данные валидируются pydantic. Pydantic валидация получаемых из БД данных выполняется через интегрированные в alchemy объекты методы. Так как используется selectinload, некоторые модели имеют вложенную структуру. Поэтому дерево моделей pydantic и методов валидации получились плохо читаемы, наверное это не лучшая практика.
Таблицы БД создаются через применение alembic миграции 1_create_table. Вторая миграция 2_seed наполняет таблицы исходными данными (данные созданы в тексте миграции).
По ТЗ количество одновременно выдаваемых книг 5. В проекте для корректного выполнения тестов необходимо использовать значение по умолчанию 2 (см settings.yml).
Тестами покрыты все ендпоинты (54шт) и выдаемые ими исключения. Для тестов создан набор фикстур, изменяющий строку подключения к рабочей БД на строку подключения к тестовой БД и применяющий миграцию для каждого тестируемого модуля.
Доступ к ендпоинтам настраивается на основе ролей пользователей. Роли к ендпоинту прикрепляются декоратором.
Логирование на базе loguru для ендпоинтов в случае внесения изменений в БД.