Skip to content

WIP-VK-Spring-2024/Try-On-Wardrobe-Backend

Repository files navigation

try_on-wardrobe-backend

Для запуска надо:

  • Иметь установленными docker compose, make, go 1.22 (версия go принципиальна)
  • docker network create shared-api-network
  • Создать .env файл аналогичный .env.example
  • Иметь поднятый инстанс RabbitMQ на хосте, указанном в .env (подразумевается деплой в паре с МЛ-сервером)
  • make docker

API Documentation

Все запросы, за исключением /hearbeat, /login и /register требуют токена в хэдере X-Session-ID.

Все POST/PUT/PATCH запросы требуют Content-Type=application/json, за исключением тех, где происходит загрузка картинок. Там требуется multipart/form

GET /heartbeat

Возвращает текущее состояние сервера, проверяет подключения к Postgres, Centrifugo, Redis

Ответы

Код Пример
200
{}
503
{
  "db": "error message",
  "centrifugo": "error message",
  "redis": "error message"
}

GET /users

Возвращает список пользователей

Параметры

Имя Тип данных Опциональный Описание
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"
  }
]

POST /users

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

Параметры

Имя Тип данных Опциональный Описание
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": ["Неподдерживаемые символы", "Неверный формат почты"]
  }
}

PUT /users/:id

Обновляет данные пользователя

Параметры

Имя Тип данных Опциональный Описание
gender 'male' | 'female' Да Пол пользователя
privacy 'private' | 'public' Да Приватность аккаунта
img image Да Аватарка пользователя

Ответы

Код Пример
200
{
  "avatar": "avatars/new-avatar-path"
}
403
{
  "msg": "Нельзя изменять параметры других пользователей"
}

POST /login

Вход в аккаунт

Параметры

Имя Тип данных Опциональный Описание
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": ["Неподдерживаемые символы", "Неверный формат почты"]
  }
}

POST /renew

Выдает новый 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": "Токен истёк или отсутствует в запросе"
}

GET /clothes

Список вещей текущего пользователя

Ответы

Код Пример
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": ["Для спорта", "Лёгкое"]
  }
]

POST /clothes

Загрузка новой вещи

Параметры

Имя Тип данных Опциональный Описание
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"
}

GET /clothes/: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": "Футболка в зал",
  "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": "Запрашиваемого ресурса не существует"
}

PUT /clothes/:id

Обновление полей вещи

Параметры

Имя Тип данных Опциональный Описание
img image Да Фотография вещи
name string Да Название вещи
tags string[] Да Теги вещи
seasons string[] Да Времена года вещи
style uuid Да Стиль вещи
type uuid Да Категория вещи
subtype uuid Да Подкатегория вещи

Ответы

Код Пример
200
{}
404
{
  "msg": "Запрашиваемого ресурса не существует"
}
403
{
  "msg": "Изменять этот ресурс может только его владелец"
}

DELETE /clothes/:id

Удаление вещи

Ответы

Код Пример
200
{}
404
{
  "msg": "Запрашиваемого ресурса не существует"
}
403
{
  "msg": "Удалять этот ресурс может только его владелец"
}

GET /types

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

Ответы

Код Пример
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"
      }
    ]
  }
]

GET /subtypes

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

Ответы

Код Пример
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"
  }
]

GET /styles

Получение списка стилей

Ответы

Код Пример
200
[
  {
    "uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
    "created_at": "2024-04-13T12:00:07.458144Z",
    "updated_at": "2024-04-13T12:00:07.458144Z",
    "name": "Спортивный"
  }
]

GET /tags

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

Параметры

Имя Тип данных Опциональный Описание
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": "В зал"
  }
]

GET /tags/favourite

Получение списка наиболее используемых тегов пользователя

Параметры

Имя Тип данных Опциональный Описание
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": "В зал"
  }
]

GET /photos

Получение списка загруженных фото пользователя

Ответы

Код Пример
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"
  }
]

GET /photos/:id

Получение фото пользователя по 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": "Запрашиваемого ресурса не существует"
}

POST /photos

Загрузка фото пользователя

Параметры

Имя Тип данных Опциональный Описание
img image Нет Фотография пользователя

Ответы

Код Пример
200
{
  "uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
  "image": "photos/2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
}

DELETE /photos/:id

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

Ответы

Код Пример
200
{}
404
{
  "msg": "Запрашиваемого ресурса не существует"
}
403
{
  "msg": "Удалять этот ресурс может только его владелец"
}

POST /try-on

Примерка одной или нескольких вещей

Параметры

Имя Тип данных Опциональный Описание
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": "Сервис примерки недоступен"
}

POST /try-on/outfit

Примерка образа

Параметры

Имя Тип данных Опциональный Описание
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": "Сервис примерки недоступен"
}

POST /try-on/post

Примерка образа из поста

Параметры

Имя Тип данных Опциональный Описание
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": "Сервис примерки недоступен"
}

GET /try-on

Получение списка результатов примерок текущего пользователя

Ответы

Код Пример
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"
  }
]

GET /try-on/:id

Получение результата примерки по 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": "Запрашиваемого ресурса не существует"
}

DELETE /try-on/:id

Удаление результата примерки

Ответы

Код Пример
200
{}
404
{
  "msg": "Запрашиваемого ресурса не существует"
}
403
{
  "msg": "Удалять этот ресурс может только его владелец"
}

PATCH /try-on/:id/rate

Оценка результата примерки (планировалось использовать оценки для сбора статистики качества модели)

Параметры

Имя Тип данных Опциональный Описание
rating -1 | 0 | 1 Нет Оценка результата примерки

Ответы

Код Пример
200
{}
404
{
  "msg": "Запрашиваемого ресурса не существует"
}
403
{
  "msg": "Изменять этот ресурс может только его владелец"
}

GET /outfits/purposes

Получение списка назначений образов. Используются в генерации образов

Ответы

Код Пример
200
[
  {
    "uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c",
    "created_at": "2024-04-13T12:00:07.458144Z",
    "updated_at": "2024-04-13T12:00:07.458144Z",
    "name": "Для активного отдыха"
  }
]

GET /outfits/gen

Получение сгенерированных образов

Параметры

Имя Тип данных Опциональный Описание
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": "Сервис генерации образов недоступен"
}

POST /outfits

Создание образа

Параметры

Имя Тип данных Опциональный Описание
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",
}

GET /outfits

Получение образов текущего пользователя

Ответы

Код Пример
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
      }
    }
  }
]

GET /outfits/:id

Получение образа по 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": "Запрашиваемого ресурса не существует"
}

DELETE /outfits/:id

Удаление образа

Ответы

Код Пример
200
{}
404
{
  "msg": "Запрашиваемого ресурса не существует"
}
403
{
  "msg": "Удалять этот ресурс может только его владелец"
}

PUT /outfits/:id

Обновление образа

Параметры

Имя Тип данных Опциональный Описание
transforms map[uuid]Transform Да Одежда образа
img image Да Изображение образа
tags string[] Да Теги образа
name string Да Название образа

Ответы

Код Пример
200
{}
404
{
  "msg": "Запрашиваемого ресурса не существует"
}
403
{
  "msg": "Изменять этот ресурс может только его владелец"
}

GET /posts

Получение новых постов. Каждый пост - это образ пользователя + примерка (при наличии). Любой образ попадает в ленту, если он публичный.

Параметры

Имя Тип данных Опциональный Описание
limit integer Да Макс. кол-во постов в ответе
since string Да Дата, начиная с которой возвращаются посты
genders string[] Да Пол пользователей, чьи посты возвращаем

Ответы

Код Пример
200
[
  {
    "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
  }
]

GET /posts/recommended

Рекомендованные посты. При первом запросе всегда возвращается пустой массив, т.к. отправляется запрос в рекомендательную систему. Далее ответы будут возвращать посты до тех пор, пока полученные от рекомендательной системы посты не кончатся. Следующий после этого запрос также вернёт пустой массив.

Имя Тип данных Опциональный Описание
limit integer Да Макс. кол-во постов в ответе
sample_amount integer Да Кол-во постов, которое запрашиваем у рекомендательной системы

Ответы

Код Пример
200
[
  {
    "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
  }
]
503
{
  "msg": "Рекомендательная система недоступна"
}

GET /users/:id/posts

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

Параметры

Имя Тип данных Опциональный Описание
limit integer Да Макс. кол-во постов в ответе
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",
    "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
  }
]

GET /posts/liked

Получение понравившихся постов

Параметры

Имя Тип данных Опциональный Описание
limit integer Да Макс. кол-во постов в ответе
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",
    "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
  }
]

GET /posts/subs

Получение постов от подписок

Параметры

Имя Тип данных Опциональный Описание
limit integer Да Макс. кол-во постов в ответе
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",
    "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
  }
]

GET /posts/:id/comments

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

Параметры

Имя Тип данных Опциональный Описание
limit integer Да Макс. кол-во комментов в ответе
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",
    "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",
    "body": "Отличный образ!",
    "level": 0, // для реализации комментов с ответами
    "parent_id": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c", // для реализации комментов с ответами
    "rating": 42,
    "user_rating": 1 // оценка текущего пользователя. 0, если не поставил лайк, 1 - если поставил
  }
]

POST /posts/:id/comments

Создание комментария к посту

Параметры

Имя Тип данных Опциональный Описание
body string Нет Тело комментария
parent_id uuid Да ID комментария, на который хотим ответить (не тестировалось)

Ответы

Код Пример
200
{
  "uuid": "2a78df8a-0277-4c72-a2d9-43fb8fef1d2c"
}
404
{
  "msg": "Такого поста не существует"
}

POST /posts/:id/rate

Оценка поста

Параметры

Имя Тип данных Опциональный Описание
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": "Удалять этот ресурс может только его владелец"
}

POST /users/:id/sub

Подписка на пользователя

Ответы

Код Пример
200
{}
404
{
  "msg": "Такого пользователя не существует"
}
400
{
  "msg": "Нельзя подписываться на себя"
}
409
{
  "msg": "Вы уже подписаны на этого пользователя"
}

DELETE /users/:id/sub

Отписка от пользователя

Ответы

Код Пример
200
{}
400
{
  "msg": "Нельзя отписаться от себя"
}

About

Go backend for TryOn Wardrobe app. Frontend interact directly with it. Responsible for interaction with ML backend through RabbitMQ.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages