https://github.com/excellent-84/library_api
RESTful API для управления библиотечным каталогом. Система позволяет управлять информацией о книгах, авторах, читателях и выдачей книг.
https://github.com/excellent-84/library_api
alembic docker fastapi jwt postgresql pydantic pytest python sqlalchemy
Last synced: 2 months ago
JSON representation
RESTful API для управления библиотечным каталогом. Система позволяет управлять информацией о книгах, авторах, читателях и выдачей книг.
- Host: GitHub
- URL: https://github.com/excellent-84/library_api
- Owner: Excellent-84
- Created: 2025-01-19T21:35:45.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2025-03-01T14:36:58.000Z (over 1 year ago)
- Last Synced: 2025-03-17T22:11:52.608Z (over 1 year ago)
- Topics: alembic, docker, fastapi, jwt, postgresql, pydantic, pytest, python, sqlalchemy
- Language: Python
- Homepage:
- Size: 93.8 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## API для Управления Библиотекой
Описание проекта
RESTful API для управления библиотечным каталогом. Система позволяет управлять информацией о книгах, авторах, читателях и выдачей книг.
- Регистрация и Аутентификация пользователей с использованием JWT токенов по email. Пользователи разделены на роли: администратор и читатель. Первому зарегистрированному пользователю присваивается роль администратора, всем последующим - читатель. Администратор может изменять роли пользователей. Администратор может управлять всеми ресурсами, читатель — только просмотр и взаимодействие с книгами.
- Управление книгами. CRUD операции для книг.
- Управление авторами. CRUD операции для авторов.
- Управление читателями. Администратор может просматривать список читателей. Читатели могут обновлять свою информацию.
- Выдача и возврат книг. Возможность выдачи книги читателю. Ограничение количества выдаваемых книг на одного читателя до 5. Фиксация даты выдачи и предполагаемой даты возврата. Обработка возврата книг и обновление количества доступных экземпляров.
- Дополнительно:
- Пагинация и фильтрация для списков книг, авторов и выданных книг.
- Валидация входящих данных с использованием Pydantic.
- Обработка ошибок с соответствующими HTTP статусами.
- Логирование основных событий.
- Alembic для управления миграциями базы данных.
- Юнит-тесты для основных эндпоинтов.
- Документация ReDoc, Swagger.
- Развертывание проекта с помощью Docker.
Как запустить проект
##### Клонировать репозиторий и перейти в него в командной строке:
```bash
$ git clone https://github.com/Excellent-84/library_api.git
$ cd library_api
```
##### Создать файл .env и указать необходимые токены по примеру .env.example:
```bash
$ touch .env
```
##### Собрать и запустить контейнеры с помощью Docker:
```bash
$ docker compose up -d
```
##### При необходимости проверить логи запущенного контейнера:
```bash
$ docker logs library_api
```
##### Проект будет доступен по адресу:
```bash
http://localhost:8000
```
##### Тестирование. Запуск тестов pytest внутри контейнера:
```bash
$ docker exec -it library_api pytest
```
Примеры запросов к API с помощью Postman
##### Регистрация пользователя в базе данных:
Метод POST к эндпоинту http://localhost:8000/users/register/
Во вкладке Body выбрать raw. Указать данные в формате json.
Пример запроса:
```bash
{
"email": "example@example.com",
"username": "example_user",
"password": "example_password"
}
```
Пример ответа:
```bash
{
"email": "example@example.com",
"id": 1,
"username": "example_user",
"is_active": true,
"role": "reader"
}
```
##### Аутентификация пользователя:
Метод POST к эндпоинту http://localhost:8000/users/login/
Во вкладке Body выбрать raw. Указать данные в формате json.
Срок действия токена 30 минут, после чего необходимо пройти повторную аутентификацию.
Пример запроса:
```bash
{
"email": "example@example.com",
"password": "example_password"
}
```
Пример ответа:
```bash
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6Ik...",
"token_type": "bearer"
}
```
##### Получение списка доступных книг:
Метод GET к эндпоинту http://localhost:8000/books/
Во вкладке Auth в поле Type выбрать Bearer Token.
В поле Token скопировать значение access_token, полученного при аутентификации.
Пример ответа:
```bash
[
{
"title": "Война и Мир",
"description": "Роман, описывающий...",
"publication_date": "1869-01-01",
"genre": "Роман",
"available_copies": 5,
"id": 1,
"authors": [
"Лев Толстой"
]
},
...
]
```
##### Получение книги по ID:
Метод GET к эндпоинту http://localhost:8000/books/{book_id}/
Во вкладке Auth в поле Type выбрать Bearer Token.
В поле Token скопировать значение access_token, полученного при аутентификации.
Пример ответа:
```bash
{
"title": "Война и Мир",
"description": "Роман, описывающий...",
"publication_date": "1869-01-01",
"genre": "Роман",
"available_copies": 5,
"id": 1,
"authors": [
"Лев Толстой"
]
}
```
##### Выдача книги:
Метод POST к эндпоинту http://localhost:8000/rebooks/
Во вкладке Auth в поле Type выбрать Bearer Token.
В поле Token скопировать значение access_token, полученного при аутентификации.
Во вкладке Body выбрать raw. Указать данные в формате json.
Пример запроса:
```bash
{
"book_id": 1
}
```
Пример ответа:
```bash
{
"book_id": 1,
"id": 101,
"borrowed_at": "2025-02-02T10:00:00",
"due_date": "2025-02-16T10:00:00",
"returned_at": "2025-02-14T15:00:00",
"user_id": 42
}
```
##### Возврат книги:
Метод POST к эндпоинту http://localhost:8000/rebooks/return/
Во вкладке Auth в поле Type выбрать Bearer Token.
В поле Token скопировать значение access_token, полученного при аутентификации.
Во вкладке Body выбрать raw. Указать данные в формате json.
Пример запроса:
```bash
{
"book_id": 1
}
```
Пример ответа:
```bash
{
"book_id": 1,
"id": 101,
"borrowed_at": "2025-02-02T10:00:00",
"due_date": "2025-02-16T10:00:00",
"returned_at": "2025-02-14T15:00:00",
"user_id": 42
}
```
Подробную версию запросов можно посмотреть по адресу:
- Swagger: [http://localhost:8000/docs](http://localhost:8000/docs)
- ReDoc: [http://localhost:8000/redoc](http://localhost:8000/redoc)
Автор: [Горин Евгений](https://github.com/Excellent-84)