![logo](./logo.png)
# LibraryAPI

Это проект приложения на FastAPI - современном веб фреймворке для создания API на Python. Я использую Pydantic для валидации данных, SQLModel для взаимодействия с базой данных, Alembic для управления миграциями, PostgreSQL как систему базы данных и Docker Compose для легкого развертывания.

### **Ключевые элементы:**

1. FastAPI: Предоставляет высокопроизводительность и простоту для разработки RESTful API, поддерживает асинхронные операции и автоматическую генерацию документации.
2. Pydantic: Используется для валидации данных и сериализации, позволяет легко определить схемы данных.
3. SQLModel: Объединяет SQLAlchemy и Pydantic, включая операции с базой данных с помощью классов Python.
4. Alembic: Инструмент для управления миграциями базы данных, упрощающий отслеживание и применение изменений в схеме базы данных.
5. PostgreSQL: Надежная реляционная база данных для хранения данных.
6. Docker Compose: Упрощает развертывание приложения и его зависимостей в контейнерах.


### **Инструкция по установке**

1. Клонируйте репозиторий:
   ```bash
   git clone https://github.com/wowlikon/libraryapi.git
   ```

2. Перейдите в каталог проекта:
   ```bash
   cd libraryapi
   ```

3. Настройте переменные окружения:
   ```bash
   edit .env
   ```

4. Соберите контейнеры Docker:
   ```bash
   docker compose build
   ```

5. Запустите приложение:
   ```bash
   docker compose up api
   ```

Для создания новых миграций:
   ```bash
   docker compose run --rm -T api alembic revision --autogenerate -m "Migration name"
   ```

Для запуска тестов:
   ```bash
   docker compose up test
   ```

### **Эндпоинты API**

**Авторы**
| Метод | Эндпоинты              | Описание                        |
|--------|-----------------------|---------------------------------|
| POST   | `/authors`            | Создать нового автора           |
| GET    | `/authors`            | Получить список всех авторов    |
| GET    | `/authors/{id}`       | Получить автора по ID с книгами |
| PUT    | `/authors/{id}`       | Обновить автора по ID           |
| DELETE | `/authors/{id}`       | Удалить автора по ID            |

**Книги**
| Метод | Эндпоинты              | Описание                        |
|--------|-----------------------|---------------------------------|
| POST   | `/books`              | Создать новую книгу             |
| GET    | `/books`              | Получить список всех книг       |
| GET    | `/book/{id}`          | Получить книгу по ID с авторами |
| PUT    | `/books/{id}`         | Обновить книгу по ID            |
| DELETE | `/books/{id}`         | Удалить книгу по ID             |

**Жанры**
| Метод | Эндпоинты              | Описание                        |
|--------|-----------------------|---------------------------------|
| POST   | `/genres`              | Создать новый жанр             |
| GET    | `/genres`              | Получить список всех жанров    |
| GET    | `/genres/{id}`         | Получить жанр по ID            |
| PUT    | `/genres/{id}`         | Обновить жанр по ID            |
| DELETE | `/genres/{id}`         | Удалить жанр по ID             |

**Связи**
| Метод | Эндпоинты                     | Описание                          |
|--------|------------------------------|-----------------------------------|
| GET    | `/authors/{id}/books`        | Получить список книг для автора   |
| GET    | `/books/{id}/authors`        | Получить список авторов для книги |
| POST   | `/relationships/author-book` | Связать автор-книга               |
| DELETE | `/relationships/author-book` | Разделить автор-книга             |
| GET    | `/genres/{id}/books`         | Получить список книг для жанра    |
| GET    | `/books/{id}/genres`         | Получить список жанров для книги  |
| POST   | `/relationships/genre-book`  | Связать автор-книга               |
| DELETE | `/relationships/genre-book`  | Разделить автор-книга             |

**Другие**
| Метод | Эндпоинты    | Описание                      |
|--------|-------------|-------------------------------|
| GET    | `/api/info` | Получить информацию о сервисе |


```mermaid
erDiagram
    AUTHOR {
        int id PK "ID автора"
        string name "Имя автора"
    }

    BOOK {
        int id PK "ID книги"
        string title "Название книги"
        string description "Описание книги"
    }

    GENRE {
        int id PK "ID жанра"
        string name "Название жанра"
    }

    AUTHOR_BOOK {
        int author_id FK "ID автора"
        int book_id FK "ID книги"
    }

    GENRE_BOOK {
        int genre_id FK "ID жанра"
        int book_id FK "ID книги"
    }

    AUTHOR ||--o{ AUTHOR_BOOK : "писал"
    BOOK   ||--o{ AUTHOR_BOOK : "написан"

    BOOK   ||--o{ GENRE_BOOK : "принадлежит"
    GENRE  ||--o{ GENRE_BOOK : "содержит"
```


### **Используемые технологии**

- **FastAPI**: Современный web фреймворк для построения API с использованием Python, известный своей скоростью и простотой использования.
- **Pydantic**: Библиотека для валидации данных и управления настройками, использующая аннотации типов Python.
- **SQLModel**: Библиотека для взаимодействия с базами данных с использованием классов Python, объединяющая функции SQLAlchemy и Pydantic.
- **Alembic**: Легковесный инструмент для миграции базы данных на основе SQLAlchemy.
- **PostgreSQL**: Сильная, открытая реляционная система управления базами данных.
- **Docker**: Платформа для разработки, распространения и запуска приложений в контейнерах.
- **Docker Compose**: Инструмент для определения и запуска многоконтейнерных приложений Docker.
- **Tailwind**: CSS-фреймворк, позволяющий стилизовать веб-интерфейсы, применяя готовые низкоуровневые классы.
- **Cash**: Микро JavaScript-библиотека, созданная как очень быстрая и компактная альтернатива jQuery.
