Skip to content

manson427/Library

Repository files navigation

API для Управления Библиотекой

Позволяет пользователями библиотеки брать/возвращать книги, администратору управлять книгами библиотеки и контролировать действия пользователей.

  • Фреймворк: 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 для ендпоинтов в случае внесения изменений в БД.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages