RESTful API для управления библиотечным каталогом и процессом заимствования книг. Система позволяет:
- Аутентифицировать библиотекарей (регистрация, логин, JWT).
- Управлять CRUD операциями для книг и читателей.
- Выдавать и возвращать книги с бизнес-логикой лимитов и учётом доступных копий.
- Получать публичный список книг и защищённый список заимствований по читателю.
src/
├── main.py # Точка входа и инициализация FastAPI
├── config.py # Общие настройки приложения
├── database.py # Настройка SQLAlchemy Engine и SessionLocal
├── auth/ # Аутентификация и безопасность
│ ├── __init__.py
│ ├── config.py # Конфигурация JWT и паролей
│ ├── constants.py # Константы (ключи, префиксы)
│ ├── dependencies.py # Depends для текущего пользователя и токена
│ ├── models.py # User, UserToken
│ ├── route.py # Маршруты /users и /auth
│ ├── schema.py # Pydantic-схемы регистрации, логина, ответов
│ ├── security.py # Хеширование паролей и генерация токенов
│ ├── service.py # AuthService: регистрация, логин, refresh, reset
│ └── utils.py # Вспомогательные функции для токенов и хешей
├── books/ # Модуль управления книгами
│ ├── models.py # Модель Books
│ ├── schemas.py # Схемы BookCreate, BookUpdate, BookResponse
│ ├── service.py # CRUD и бизнес-логика для книг
│ └── router.py # Маршруты /books
├── reader/ # Модуль управления читателями
│ ├── models.py # Модель Readers
│ ├── schemas.py # Схемы ReaderCreate, ReaderUpdate, ReaderSchema
│ ├── service.py # CRUD и бизнес-логика для читателей
│ └── router.py # Маршруты /readers
├── borrow/ # Модуль заимствований
│ ├── models.py # Модель BorrowedBook
│ ├── schemas.py # Схемы BorrowRequest, BorrowResponse, ReturnResponse
│ ├── service.py # Бизнес-логика выдачи/возврата и список заимствований
│ └── router.py # Маршруты /borrow
└── common/ # Общие миксины и базовые модели
├── __init__.py
├── mixin.py # AuditMixin
├── models.py # BaseLibraryModel
└── schema.py # Базовые Pydantic-схемы
alembic/ # Миграции Alembic
└── versions/ # Версии миграций
-
Убедитесь, что установлены Docker и Docker Compose.
-
Запустите контейнеры (включая БД PostgreSQL):
docker-compose up -d
-
При необходимости проверьте логи и статус сервиса БД:
docker-compose ps docker-compose logs db
-
Создайте
.envна основе.env.example:POSTGRES_USER=user POSTGRES_PASSWORD=password POSTGRES_HOST=0.0.0.0 POSTGRES_PORT=5434 POSTGRES_DB=postgres_db -
Создайте виртуальное окружение и установите зависимости:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt- Инициализация alembic
alembic init alembic- Запустите миграции:
alembic upgrade head
-
Запустите приложение:
uvicorn src.main:app --reload
- BaseLibraryModel: общий базовый класс для всех моделей, автоматическое определение
__tablename__,dict(),__repr__. - AuditMixin:
id(UUID),created_by,created_at,updated_at,updated_by. - Users и UserToken: модели для аутентификации.
- Books, Readers, BorrowedBook: модели каталога, читателей и заимствований.
Миграции Alembic:
initial tables— создание всех таблиц.add description to books— добавление опционального поляdescriptionвbooksи массовое обновление старых записей.
-
Выдача книги (
POST /borrow):- Проверка наличия свободных копий (
total_copies > 0). - Декремент
total_copiesи создание записи вBorrowedBook. - Ограничение: не более 3 активных заимствований на читателя.
- Проверка наличия свободных копий (
-
Возврат книги (
POST /borrow/return):- Поиск активной записи займа (
return_date IS NULL). - Инкремент
total_copiesи записьreturn_date.
- Поиск активной записи займа (
-
Список невозвращённых книг (
GET /borrow/readers/{reader_id}/unreturned):- Возвращает книги по
reader_id, гдеreturn_date IS NULL.
- Возвращает книги по
-
JWT via
python-jose, хеширование паролей черезpasslib[bcrypt]. -
Эндпоинты защищены частью маршрутов:
- Публично:
POST /users/register,POST /auth/token. - Защищено: все
/books,/readers,/borrow,/users/me.
- Публично:
-
Access и refresh токены:
- Access token имеет короткий срок (
ACCESS_TOKEN_EXPIRE_MINUTES). - Refresh token —
REFRESH_TOKEN_EXPIRE_MINUTES, обновляется черезPOST /auth/token/refresh.
- Access token имеет короткий срок (
- Pytest + pytest-asyncio + TestClient.
- Юнит-тесты сервисов: попытка взять 4 книгу, взять нет в наличии, вернуть невыданную.
- Интеграционные тесты: регистрация, логин, доступ к защищённым эндпоинтам с токеном и без.
Система напоминаний читателю: автоматически отправлять email-уведомление читателю за день до дедлайна возврата.
Реализация:
- Добавить поле
due_dateв модельBorrowedBook. - Фоновая задача (cron или Celery beat), проходящая по списку активных заимствований и отправляющая уведомления через SMTP или сторонний сервис (Mailgun).
- API для настройки срока возврата и настройки уведомлений в профиле библиотекаря.