Esagila — это личная библиотека для отслеживания прочитанных книг пользователя. Пользователи могут искать книги, добавлять их в свою библиотеку, ставить оценки и оставлять отзывы. Администраторы управляют каталогом книг.
FastAPI, SQLAlchemy, Pydantic, PostgreSQL, JWT (python-jose), pwdlib (хэширование паролей), Docker
| Метод | Путь | Описание |
|---|---|---|
| POST | /auth/register |
Регистрация |
| POST | /auth/login |
Логин |
| POST | /auth/refresh |
Обновление токена |
| POST | /auth/logout |
Логаут (удаляет все refresh-токены пользователя) |
| Метод | Путь | Описание |
|---|---|---|
| GET | /books/ |
Список книг с поиском и пагинацией |
| GET | /books/{book_id} |
Книга по id со средним рейтингом |
| GET | /books/{book_id}/reviews |
Все отзывы на книгу |
| POST | /books/ |
Создать книгу (admin only) |
| PUT | /books/{book_id} |
Обновить книгу (admin only) |
| DELETE | /books/{book_id} |
Удалить книгу (admin only) |
| Метод | Путь | Описание |
|---|---|---|
| GET | /user_books/me |
Своя библиотека |
| GET | /user_books/users/{user_id} |
Библиотека другого пользователя |
| GET | /user_books/{book_id} |
Своя запись по книге |
| POST | /user_books/{book_id} |
Добавить книгу в библиотеку |
| PUT | /user_books/{book_id} |
Обновить оценку/отзыв |
| DELETE | /user_books/{book_id} |
Удалить книгу из библиотеки |
Refresh token — UUID, не автоинкрементируемый. UUID делает refresh token непредсказуемым.
Refresh token ротируется при каждом /refresh. Старый токен удаляется, выдаётся новый.
Составной primary key (user_id, book_id) на UserBook. Структура таблицы не позволяет одному пользователю иметь две записи на одну книгу. Это гарантия на уровне БД, а не только в коде.
Logout удаляет все refresh-токены пользователя. Простое решение без отдельного трекинга сессий по устройствам.
Средний рейтинг книги считается на лету через SQL AVG. Рейтинг не хранится отдельным полем.
- Клонировать репозиторий:
git clone https://github.com/doedalus/esagila.git
cd esagila- Установить зависимости:
pip install -r requirements.txt-
Создать
.envпо подобию.env.example. -
Запустить проект:
uvicorn app.main:app --reloadПри первом запуске таблицы в базе данных создаются автоматически.
Для запуска проекта в Docker необходим установленный Docker.
- Клонировать репозиторий:
git clone https://github.com/doedalus/esagila.git
cd esagila-
Создать
.envпо подобию.env.example. -
Собрать Docker image:
docker build -t esagila:1.0 .- Запустить контейнер:
docker run --name esagila -d --env-file .env -p 8000:8000 esagila:1.0После запуска API доступно на http://localhost:8000.