/api_yamdb

База отзывов о фильмах, книгах и музыке.

Primary LanguagePython

YaMDb API

Проект YaMDb собирает отзывы пользователей на различные произведения.

Как запустить проект:

Клонировать репозиторий и перейти в него в командной строке:

git clone https://github.com/esaviv/api_yamdb.git
cd api_yamdb

Cоздать и активировать виртуальное окружение:

python3 -m venv venv | python -m venv venv
source env/bin/activate | source venv/Scripts/activate
python3 -m pip install --upgrade pip | python -m pip install --upgrade pip

Установить зависимости из файла requirements.txt:

pip install -r requirements.txt

Выполнить миграции:

python3 api_yamdb/manage.py migrate | python api_yamdb/manage.py migrate

Запустить проект:

python3 api_yamdb/manage.py runserver | python api_yamdb/manage.py runserver

Авторы

  1. esaviv: система регистрации и аутентификации, права доступа, работа с токеном, система подтверждения через e-mail.
  2. RoutTufuch: модели, view и эндпойнты для произведений, категорий, жанров; реализация импорта данных из csv файлов.
  3. Zhenia1997: отзывы, комментарии, рейтинг произведений.

Алгоритм регистрации пользователей:

  1. Пользователь отправляет POST-запрос на добавление нового пользователя с параметрами email и username на эндпоинт /api/v1/auth/signup/.
  2. YaMDB отправляет письмо с кодом подтверждения (confirmation_code) на адрес email.
  3. Пользователь отправляет POST-запрос с параметрами username и confirmation_code на эндпоинт /api/v1/auth/token/, в ответе на запрос ему приходит token (JWT-токен).
  4. При желании пользователь отправляет PATCH-запрос на эндпоинт /api/v1/users/me/ и заполняет поля в своём профайле (описание полей — в документации).

Пользовательские роли:

  • Аноним — может просматривать описания произведений, читать отзывы и комментарии.
  • Аутентифицированный пользователь (user) — может, как и Аноним, читать всё, дополнительно он может публиковать отзывы и ставить оценку произведениям (фильмам/книгам/песенкам), может комментировать чужие отзывы; может редактировать и удалять свои отзывы и комментарии. Эта роль присваивается по умолчанию каждому новому пользователю.
  • Модератор (moderator) — те же права, что и у Аутентифицированного пользователя плюс право удалять любые отзывы и комментарии.
  • Администратор (admin) — полные права на управление всем контентом проекта. Может создавать и удалять произведения, категории и жанры. Может назначать роли пользователям.
  • Суперюзер Django — обладет правами администратора (admin).

Примеры запросов и ответов:

AUTH

Регистрация пользователей и выдача токенов.

Регистрация нового пользователя

Получить код подтверждения на переданный email. Права доступа: Доступно без токена. Использовать имя 'me' в качестве username запрещено. Поля email и username должны быть уникальными.

POST

/api/v1/auth/signup/
{
  "email": "user@example.com",
  "username": "string"
}

Ответ:

{
  "email": "string",
  "username": "string"
}

Получение JWT-токена

Получение JWT-токена в обмен на username и confirmation code. Права доступа: Доступно без токена.

POST

/api/v1/auth/token/
{
  "username": "string",
  "confirmation_code": "string"
}

Ответ:

{
  "token": "string"
}

USERS

Пользователи.

Получение списка всех пользователей

Получить список всех пользователей. Права доступа: Администратор

GET

/api/v1/users/

Ответ:

{
  "count": 0,
  "next": "string",
  "previous": "string",
  "results": [
    {
      "username": "string",
      "email": "user@example.com",
      "first_name": "string",
      "last_name": "string",
      "bio": "string",
      "role": "user"
    }
  ]
}

Добавление пользователя

Добавить нового пользователя. Права доступа: Администратор Поля email и username должны быть уникальными.

POST

/api/v1/users/
{
  "username": "string",
  "email": "user@example.com",
  "first_name": "string",
  "last_name": "string",
  "bio": "string",
  "role": "user"
}

Ответ:

{
  "username": "string",
  "email": "user@example.com",
  "first_name": "string",
  "last_name": "string",
  "bio": "string",
  "role": "user"
}

Получение пользователя по username

Получить пользователя по username. Права доступа: Администратор

GET

/api/v1/users/{username}/

Ответ:

{
  "username": "string",
  "email": "user@example.com",
  "first_name": "string",
  "last_name": "string",
  "bio": "string",
  "role": "user"
}

Изменение данных пользователя по username

Изменить данные пользователя по username. Права доступа: Администратор. Поля email и username должны быть уникальными.

PATCH

/api/v1/users/{username}/
{
  "username": "string",
  "email": "user@example.com",
  "first_name": "string",
  "last_name": "string",
  "bio": "string",
  "role": "user"
}

Ответ:

{
  "username": "string",
  "email": "user@example.com",
  "first_name": "string",
  "last_name": "string",
  "bio": "string",
  "role": "user"
}

Удаление пользователя по username

Удалить пользователя по username. Права доступа: Администратор.

DELETE

/api/v1/users/{username}/

Получение данных своей учетной записи

Получить данные своей учетной записи Права доступа: Любой авторизованный пользователь.

GET

/api/v1/users/me/

Ответ:

{
  "username": "string",
  "email": "user@example.com",
  "first_name": "string",
  "last_name": "string",
  "bio": "string",
  "role": "user"
}

Изменение данных своей учетной записи

Изменить данные своей учетной записи. Права доступа: Любой авторизованный пользователь. Поля email и username должны быть уникальными.

PATCH

/api/v1/users/me/
{
  "username": "string",
  "email": "user@example.com",
  "first_name": "string",
  "last_name": "string",
  "bio": "string"
}

Ответ:

{
  "username": "string",
  "email": "user@example.com",
  "first_name": "string",
  "last_name": "string",
  "bio": "string",
  "role": "user"
}

TITLES

Произведения, к которым пишут отзывы (определённый фильм, книга или песенка).

Получение списка всех произведений

Получить список всех объектов. Права доступа: Доступно без токена.

GET

/api/v1/titles/

Ответ:

{
  "count": 0,
  "next": "string",
  "previous": "string",
  "results": [
    {
      "id": 0,
      "name": "string",
      "year": 0,
      "rating": 0,
      "description": "string",
      "genre": [
        {
          "name": "string",
          "slug": "string"
        }
      ],
      "category": {
        "name": "string",
        "slug": "string"
      }
    }
  ]
}

Добавление произведения

Добавить новое произведение. Права доступа: Администратор. Нельзя добавлять произведения, которые еще не вышли (год выпуска не может быть больше текущего). При добавлении нового произведения требуется указать уже существующие категорию и жанр.

POST

/api/v1/titles/
{
  "name": "string",
  "year": 0,
  "description": "string",
  "genre": [
    "string"
  ],
  "category": "string"
}

Ответ:

{
  "id": 0,
  "name": "string",
  "year": 0,
  "rating": 0,
  "description": "string",
  "genre": [
    {
      "name": "string",
      "slug": "string"
    }
  ],
  "category": {
    "name": "string",
    "slug": "string"
  }
}

Получение информации о произведении

Информация о произведении. Права доступа: Доступно без токена.

GET

/api/v1/titles/{titles_id}/

Ответ:

{
  "id": 0,
  "name": "string",
  "year": 0,
  "rating": 0,
  "description": "string",
  "genre": [
    {
      "name": "string",
      "slug": "string"
    }
  ],
  "category": {
    "name": "string",
    "slug": "string"
  }
}

Частичное обновление информации о произведении

Обновить информацию о произведении. Права доступа: Администратор.

PATCH

/api/v1/titles/{titles_id}/
{
  "name": "string",
  "year": 0,
  "description": "string",
  "genre": [
    "string"
  ],
  "category": "string"
}

Ответ:

{
  "id": 0,
  "name": "string",
  "year": 0,
  "rating": 0,
  "description": "string",
  "genre": [
    {
      "name": "string",
      "slug": "string"
    }
  ],
  "category": {
    "name": "string",
    "slug": "string"
  }
}

Удаление произведения

Удалить произведение. Права доступа: Администратор.

DELETE

/api/v1/titles/{titles_id}/

GENRES

Категории жанров.

Получение списка всех жанров

Получить список всех жанров. Права доступа: Доступно без токена.

GET

/api/v1/genres/

Ответ:

{
  "count": 0,
  "next": "string",
  "previous": "string",
  "results": [
    {
      "name": "string",
      "slug": "string"
    }
  ]
}

Добавление жанра

Добавить жанр. Права доступа: Администратор. Поле slug каждой категории должно быть уникальным.

POST

/api/v1/genres/
{
  "name": "string",
  "slug": "string"
}

Ответ:

{
  "name": "string",
  "slug": "string"
}

Удаление жанра

Удалить жанр. Права доступа: Администратор.

DELETE

/api/v1/genres/{slug}/

CATEGORIES

Категории (типы) произведений.

Получение списка всех категорий

Получить список всех категорий Права доступа: Доступно без токена.

GET

/api/v1/categories/

Ответ:

{
  "count": 0,
  "next": "string",
  "previous": "string",
  "results": [
    {
      "name": "string",
      "slug": "string"
    }
  ]
}

Добавление новой категории

Создать категорию. Права доступа: Администратор. Поле slug каждой категории должно быть уникальным.

POST

/api/v1/users/
{
  "name": "string",
  "slug": "string"
}

Ответ:

{
  "name": "string",
  "slug": "string"
}

Удаление категории

Удалить категорию. Права доступа: Администратор.

DELETE

/api/v1/categories/{slug}/

REVIEWS

Отзывы.

Получение списка всех отзывов

Получить список всех отзывов. Права доступа: Доступно без токена.

GET

/api/v1/titles/{title_id}/reviews/

Ответ:

{
  "count": 0,
  "next": "string",
  "previous": "string",
  "results": [
    {
      "id": 0,
      "text": "string",
      "author": "string",
      "score": 1,
      "pub_date": "2019-08-24T14:15:22Z"
    }
  ]
}

Добавление нового отзыва

Добавить новый отзыв. Пользователь может оставить только один отзыв на произведение. Права доступа: Аутентифицированные пользователи.

POST

/api/v1/titles/{title_id}/reviews/
{
  "text": "string",
  "score": 1
}

Ответ:

{
  "id": 0,
  "text": "string",
  "author": "string",
  "score": 1,
  "pub_date": "2019-08-24T14:15:22Z"
}

Полуение отзыва по id

Получить отзыв по id для указанного произведения. Права доступа: Доступно без токена.

GET

/api/v1/titles/{title_id}/reviews/{review_id}/

Ответ:

{
  "id": 0,
  "text": "string",
  "author": "string",
  "score": 1,
  "pub_date": "2019-08-24T14:15:22Z"
}

Частичное обновление отзыва по id

Частично обновить отзыв по id. Права доступа: Автор отзыва, модератор или администратор.

PATCH

/api/v1/titles/{title_id}/reviews/{review_id}/
{
  "text": "string",
  "score": 1
}

Ответ:

{
  "id": 0,
  "text": "string",
  "author": "string",
  "score": 1,
  "pub_date": "2019-08-24T14:15:22Z"
}

Удаление отзыва по id

Удалить отзыв по id Права доступа: Автор отзыва, модератор или администратор.

DELETE

/api/v1/titles/{title_id}/reviews/{review_id}/

COMMENTS

Комментарии к отзывам.

Получение списка всех комментариев к отзыву

Получить список всех комментариев к отзыву по id. Права доступа: Доступно без токена.

GET

/api/v1/titles/{title_id}/reviews/{review_id}/comments/

Ответ:

{
  "count": 0,
  "next": "string",
  "previous": "string",
  "results": [
    {
      "id": 0,
      "text": "string",
      "author": "string",
      "pub_date": "2019-08-24T14:15:22Z"
    }
  ]
}

Добавление комментария к отзыву

Добавить новый комментарий для отзыва. Пользователь может оставить только один отзыв на произведение. Права доступа: Аутентифицированные пользователи.

POST

/api/v1/titles/{title_id}/reviews/{review_id}/comments/
{
  "text": "string"
}

Ответ:

{
  "id": 0,
  "text": "string",
  "author": "string",
  "pub_date": "2019-08-24T14:15:22Z"
}

Получение комментария к отзыву

Получить комментарий для отзыва по id. Права доступа: Доступно без токена.

GET

/api/v1/titles/{title_id}/reviews/{review_id}/comments/{comment_id}/

Ответ:

{
  "id": 0,
  "text": "string",
  "author": "string",
  "pub_date": "2019-08-24T14:15:22Z"
}

Частичное обновление комментария к отзыву

Частично обновить комментарий к отзыву по id. Права доступа: Автор отзыва, модератор или администратор.

PATCH

/api/v1/titles/{title_id}/reviews/{review_id}/comments/{comment_id}/
{
  "text": "string"
}

Ответ:

{
  "id": 0,
  "text": "string",
  "author": "string",
  "pub_date": "2019-08-24T14:15:22Z"
}

Удаление комментария к отзыву

Удалить комментарий к отзыву по id. Права доступа: Автор отзыва, модератор или администратор.

DELETE

/api/v1/titles/{title_id}/reviews/{review_id}/comments/{comment_id}/