Для запуска надо:
- Иметь установленными docker compose, make, go 1.22 (версия go принципиальна)
docker network create shared-api-network
- Создать .env файл аналогичный .env.example
- Иметь поднятый инстанс RabbitMQ на хосте, указанном в .env (подразумевается деплой в паре с МЛ-сервером)
make docker
Все запросы, за исключением /hearbeat, /login и /register требуют токена в хэдере X-Session-ID.
Все POST/PUT/PATCH запросы требуют Content-Type=application/json, за исключением тех, где происходит загрузка картинок. Там требуется multipart/form
Возвращает текущее состояние сервера, проверяет подключения к Postgres, Centrifugo, Redis
| Код |
Пример |
| 200 |
|
| 503 |
{
"db": "error message",
"centrifugo": "error message",
"redis": "error message"
} |
Возвращает список пользователей
| Имя |
Тип данных |
Опциональный |
Описание |
| name |
string |
Да |
Регистронезависимая строка для поиска пользователей |
| limit |
number |
Да |
Максимальное кол-во пользователей в ответе |
| since |
string |
Да |
Имя пользователя, начиная с которого искать (невключительно). Используется для пагинации |
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Nikita",
"email": "nikita@mail.ru",
"avatar": "/avatars/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"gender": "male",
"privacy": "private"
}
] |
GET /users/subbed
Возвращает список подписок текущего пользователя
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Nikita",
"email": "nikita@mail.ru",
"avatar": "/avatars/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"gender": "male",
"privacy": "private"
}
] |
Регистрирует пользователя
| Имя |
Тип данных |
Опциональный |
Описание |
| name |
string |
Нет |
Логин пользователя |
| email |
string |
Нет |
Почта пользователя |
| password |
string |
Нет |
Пароль пользователя |
| gender |
'male' | 'female' |
Нет |
Пол пользователя |
| Код |
Пример |
| 200 |
{
"token": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_name": "Nikita",
"email": "nikita@mail.ru",
"gender": "male",
"privacy": "private"
} |
| 409 |
{
"msg": "Такой пользователь уже существует"
} |
| 400 |
{
"msg": "Неправильный формат запроса",
"errors": {
"name": ["Неподдерживаемые символы"],
"email": ["Неподдерживаемые символы", "Неверный формат почты"]
}
} |
Обновляет данные пользователя
| Имя |
Тип данных |
Опциональный |
Описание |
| gender |
'male' | 'female' |
Да |
Пол пользователя |
| privacy |
'private' | 'public' |
Да |
Приватность аккаунта |
| img |
image |
Да |
Аватарка пользователя |
| Код |
Пример |
| 200 |
{
"avatar": "avatars/new-avatar-path"
} |
| 403 |
{
"msg": "Нельзя изменять параметры других пользователей"
} |
Вход в аккаунт
| Имя |
Тип данных |
Опциональный |
Описание |
| name |
string |
Нет |
Логин |
| password |
string |
Нет |
Пароль |
| Код |
Пример |
| 200 |
{
"token": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_name": "Nikita",
"email": "nikita@mail.ru",
"gender": "male",
"privacy": "private"
} |
| 404 |
{
"msg": "Такого пользователя не существует"
} |
| 403 |
{
"msg": "Неправильный логин или пароль"
} |
| 400 |
{
"msg": "Неправильный формат запроса",
"errors": {
"name": ["Неподдерживаемые символы"],
"email": ["Неподдерживаемые символы", "Неверный формат почты"]
}
} |
Выдает новый JWT-токен
| Код |
Пример |
| 200 |
{
"token": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_name": "Nikita",
"email": "nikita@mail.ru",
"gender": "male",
"privacy": "private"
} |
| 401 |
{
"msg": "Токен истёк или отсутствует в запросе"
} |
Список вещей текущего пользователя
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Футболка в зал",
"tryonable": "true",
"style_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"type_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"subtype_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"image": "/clothes/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"seasons": ["summer", "winter", "spring", "autumn"],
"tags": ["Для спорта", "Лёгкое"]
}
] |
Загрузка новой вещи
| Имя |
Тип данных |
Опциональный |
Описание |
| img |
image |
Нет |
Фотография вещи |
При получении ответа 200 путь к обрезанному фото и определённые категории, стиль, возвращаются через канал Centrifugo, указанный в config.json (по умолчанию - "processing#<user_id>")
Пример ответа из Centrifugo:
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"msg": "processed",
"image": "cut/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"tryonable": "true",
"classification": {
"type": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"subtype": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"style": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"seasons": ["autumn", "winter"],
"tags": ["Тёплое", "С мехом"]
}
}
| Код |
Пример |
| 200 |
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"msg": "created",
"image": "/clothes/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
} |
Получение вещи
| Код |
Пример |
| 200 |
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Футболка в зал",
"tryonable": "true",
"style_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"type_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"subtype_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"image": "/clothes/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"seasons": ["summer", "winter", "spring", "autumn"],
"tags": ["Для спорта", "Лёгкое"]
} |
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
Обновление полей вещи
| Имя |
Тип данных |
Опциональный |
Описание |
| img |
image |
Да |
Фотография вещи |
| name |
string |
Да |
Название вещи |
| tags |
string[] |
Да |
Теги вещи |
| seasons |
string[] |
Да |
Времена года вещи |
| style |
uuid |
Да |
Стиль вещи |
| type |
uuid |
Да |
Категория вещи |
| subtype |
uuid |
Да |
Подкатегория вещи |
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
| 403 |
{
"msg": "Изменять этот ресурс может только его владелец"
} |
Удаление вещи
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
| 403 |
{
"msg": "Удалять этот ресурс может только его владелец"
} |
Получение списка категорий
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Верх",
"tryonable": "true",
"subtypes": [
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Футболка",
"type_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
}
]
}
] |
Получение списка подкатегорий
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Футболка",
"type_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
}
] |
Получение списка стилей
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Спортивный"
}
] |
Получение списка тегов
| Имя |
Тип данных |
Опциональный |
Описание |
| limit |
int |
Да |
Максимальное кол-во тегов в ответе |
| from |
int |
Да |
Offset для пагинации |
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "В зал"
}
] |
Получение списка наиболее используемых тегов пользователя
| Имя |
Тип данных |
Опциональный |
Описание |
| limit |
int |
Да |
Максимальное кол-во тегов в ответе |
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "В зал"
}
] |
Получение списка загруженных фото пользователя
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"image": "photos/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
}
] |
Получение фото пользователя по id
| Код |
Пример |
| 200 |
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"image": "photos/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
} |
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
Загрузка фото пользователя
| Имя |
Тип данных |
Опциональный |
Описание |
| img |
image |
Нет |
Фотография пользователя |
| Код |
Пример |
| 200 |
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"image": "photos/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
} |
Удаление фото пользователя
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
| 403 |
{
"msg": "Удалять этот ресурс может только его владелец"
} |
Примерка одной или нескольких вещей
| Имя |
Тип данных |
Опциональный |
Описание |
| user_image_id |
uuid |
Нет |
ID фотографии пользователя |
| clothes_id |
uuid[] |
Нет |
Массив ID одежды для примерки |
При получении ответа 200 результат примерки возвращается через канал Centrifugo, указанный в config.json (по умолчанию - "try-on#<user_id>")
Пример ответа из Centrifugo:
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_image_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"clothes_id": ["2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"],
"image": "/try-on/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
}
| Код |
Пример |
| 200 |
|
| 400 |
{
"msg": "Невозможно примерить запрашиваемую одежду"
} |
| 404 |
{
"msg": "Указанной фотографии/вещей не существует"
} |
| 503 |
{
"msg": "Сервис примерки недоступен"
} |
Примерка образа
| Имя |
Тип данных |
Опциональный |
Описание |
| user_image_id |
uuid |
Нет |
ID фотографии пользователя |
| outfit_id |
uuid |
Нет |
ID образа для примерки |
При получении ответа 200 результат примерки возвращается через канал Centrifugo, указанный в config.json (по умолчанию - "try-on#<user_id>")
Пример ответа из Centrifugo:
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_image_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"outfit_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"clothes_id": ["2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"],
"image": "/try-on/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
}
| Код |
Пример |
| 200 |
|
| 400 |
{
"msg": "Невозможно примерить запрашиваемый образ"
} |
| 404 |
{
"msg": "Указанной фотографии/образа не существует"
} |
| 503 |
{
"msg": "Сервис примерки недоступен"
} |
Примерка образа из поста
| Имя |
Тип данных |
Опциональный |
Описание |
| user_image_id |
uuid |
Нет |
ID фотографии пользователя |
| post_id |
uuid |
Нет |
ID образа для примерки |
При получении ответа 200 результат примерки возвращается через канал Centrifugo, указанный в config.json (по умолчанию - "try-on#<user_id>")
Пример ответа из Centrifugo:
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_image_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"outfit_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"clothes_id": ["2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"],
"image": "/try-on/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
}
| Код |
Пример |
| 200 |
|
| 400 |
{
"msg": "Невозможно примерить запрашиваемый образ"
} |
| 404 |
{
"msg": "Указанной фотографии/образа не существует"
} |
| 503 |
{
"msg": "Сервис примерки недоступен"
} |
Получение списка результатов примерок текущего пользователя
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_image_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"outfit_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"clothes_id": ["2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"],
"image": "/try-on/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
}
] |
Получение результата примерки по ID
| Код |
Пример |
| 200 |
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"user_image_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"outfit_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"clothes_id": ["2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"],
"image": "/try-on/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
} |
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
Удаление результата примерки
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
| 403 |
{
"msg": "Удалять этот ресурс может только его владелец"
} |
Оценка результата примерки (планировалось использовать оценки для сбора статистики качества модели)
| Имя |
Тип данных |
Опциональный |
Описание |
| rating |
-1 | 0 | 1 |
Нет |
Оценка результата примерки |
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
| 403 |
{
"msg": "Изменять этот ресурс может только его владелец"
} |
Получение списка назначений образов. Используются в генерации образов
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Для активного отдыха"
}
] |
Получение сгенерированных образов
| Имя |
Тип данных |
Опциональный |
Описание |
| amount |
int |
Да |
Максимальное число образов в ответе |
| use_weather |
bool |
Да |
Учитывать ли погоду в генерации |
| prompt |
string |
Да |
Описание желаемого образа |
| purposes |
string[] |
Да |
Список назначений образа |
| pos |
{lat: float, lon: float} |
Да |
Координаты пользователя (будет использован IP, если не переданы) |
При получении ответа 200 результат примерки возвращается через канал Centrifugo, указанный в config.json (по умолчанию - "outfit-gen#<user_id>")
Пример ответа из Centrifugo:
{
"outfits": [
{
"clothes": [
{
"clothes_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
}
]
}
]
}
| Код |
Пример |
| 200 |
|
| 400 |
{
"msg": "Не хватает одежды для генерации"
} |
| 503 |
{
"msg": "Сервис генерации образов недоступен"
} |
Создание образа
| Имя |
Тип данных |
Опциональный |
Описание |
| transforms |
map[uuid]Transform |
Нет |
Одежда образа |
| img |
image |
Нет |
Изображение образа |
Transform = {
"x": 42,
"y": 42,
"width": 42,
"height": 42,
"angle": 42,
"scale": 42,
"zindex": 0
}
Transform не используется на бэкенде, служит для отрисовки одежды в редакторе
| Код |
Пример |
| 200 |
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"image": "outfits/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
} |
Получение образов текущего пользователя
| Код |
Пример |
| 200 |
[
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Образ для активного отдыха",
"image": "photos/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"tags": ["В поход", "Для спорта"],
"privacy": "private",
"user_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"transforms": {
"2a78df8a-0277-4c72-a2d9-43fb8fef1d2c": {
"x": 42,
"y": 42,
"width": 42,
"height": 42,
"angle": 42,
"scale": 42,
"zindex": 0
}
}
}
] |
Получение образа по ID
| Код |
Пример |
| 200 |
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"created_at": "2024-04-13T12:00:07.458144Z",
"updated_at": "2024-04-13T12:00:07.458144Z",
"name": "Образ для активного отдыха",
"image": "photos/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"tags": ["В поход", "Для спорта"],
"privacy": "private",
"user_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
"transforms": {
"2a78df8a-0277-4c72-a2d9-43fb8fef1d2c": {
"x": 42,
"y": 42,
"width": 42,
"height": 42,
"angle": 42,
"scale": 42,
"zindex": 0
}
}
} |
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
Удаление образа
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
| 403 |
{
"msg": "Удалять этот ресурс может только его владелец"
} |
Обновление образа
| Имя |
Тип данных |
Опциональный |
Описание |
| transforms |
map[uuid]Transform |
Да |
Одежда образа |
| img |
image |
Да |
Изображение образа |
| tags |
string[] |
Да |
Теги образа |
| name |
string |
Да |
Название образа |
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
| 403 |
{
"msg": "Изменять этот ресурс может только его владелец"
} |
Получение новых постов. Каждый пост - это образ пользователя + примерка (при наличии). Любой образ попадает в ленту, если он публичный.
| Имя |
Тип данных |
Опциональный |
Описание |
| limit |
integer |
Да |
Макс. кол-во постов в ответе |
| since |
string |
Да |
Дата, начиная с которой возвращаются посты |
| genders |
string[] |
Да |
Пол пользователей, чьи посты возвращаем |
Рекомендованные посты. При первом запросе всегда возвращается пустой массив, т.к. отправляется запрос в рекомендательную систему. Далее ответы будут возвращать посты до тех пор, пока полученные от рекомендательной системы посты не кончатся. Следующий после этого запрос также вернёт пустой массив.
| Имя |
Тип данных |
Опциональный |
Описание |
| limit |
integer |
Да |
Макс. кол-во постов в ответе |
| sample_amount |
integer |
Да |
Кол-во постов, которое запрашиваем у рекомендательной системы |
| Код |
Пример |
| 200 |
|
| 503 |
{
"msg": "Рекомендательная система недоступна"
} |
Получение постов пользователя
| Имя |
Тип данных |
Опциональный |
Описание |
| limit |
integer |
Да |
Макс. кол-во постов в ответе |
| since |
string |
Да |
Дата, начиная с которой возвращаются посты |
Получение понравившихся постов
| Имя |
Тип данных |
Опциональный |
Описание |
| limit |
integer |
Да |
Макс. кол-во постов в ответе |
| since |
string |
Да |
Дата, начиная с которой возвращаются посты |
Получение постов от подписок
| Имя |
Тип данных |
Опциональный |
Описание |
| limit |
integer |
Да |
Макс. кол-во постов в ответе |
| since |
string |
Да |
Дата, начиная с которой возвращаются посты |
GET /posts/:id/comments
Получение комментариев поста
| Имя |
Тип данных |
Опциональный |
Описание |
| limit |
integer |
Да |
Макс. кол-во комментов в ответе |
| since |
string |
Да |
Дата, начиная с которой возвращаются комменты |
POST /posts/:id/comments
Создание комментария к посту
| Имя |
Тип данных |
Опциональный |
Описание |
| body |
string |
Нет |
Тело комментария |
| parent_id |
uuid |
Да |
ID комментария, на который хотим ответить (не тестировалось) |
| Код |
Пример |
| 200 |
{
"uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
} |
| 404 |
{
"msg": "Такого поста не существует"
} |
Оценка поста
| Имя |
Тип данных |
Опциональный |
Описание |
| rating |
-1 | 0 | 1 |
Нет |
Оценка поста |
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Такого поста не существует"
} |
POST /comments/:id/rate
Оценка комментария
| Имя |
Тип данных |
Опциональный |
Описание |
| rating |
-1 | 0 | 1 |
Нет |
Оценка комментария |
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Такого комментария не существует"
} |
PUT /comments/:id
Изменение комментария
| Имя |
Тип данных |
Опциональный |
Описание |
| body |
string |
Нет |
Новое тело комментария |
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Такого комментария не существует"
} |
| 403 |
{
"msg": "Изменять этот ресурс может только владелец"
} |
DELETE /comments/:id
Удаление комментария
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Запрашиваемого ресурса не существует"
} |
| 403 |
{
"msg": "Удалять этот ресурс может только его владелец"
} |
Подписка на пользователя
| Код |
Пример |
| 200 |
|
| 404 |
{
"msg": "Такого пользователя не существует"
} |
| 400 |
{
"msg": "Нельзя подписываться на себя"
} |
| 409 |
{
"msg": "Вы уже подписаны на этого пользователя"
} |
Отписка от пользователя
| Код |
Пример |
| 200 |
|
| 400 |
{
"msg": "Нельзя отписаться от себя"
} |
[ { "uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c", "created_at": "2024-04-13T12:00:07.458144Z", "updated_at": "2024-04-13T12:00:07.458144Z", "outfit_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c", "outfit_image": "outfits/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c", "try_on_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c", "try_on_image": "photos/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c", "user_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c", "user_image": "avatar/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c", "user_name": "Nikita", "is_subbed": true, "rating": 42, "user_rating": 1, // оценка текущего пользователя. 0, если не поставил лайк, 1 - если поставил "tryonable": true } ]