API Product Categories - rubyhat/fastyshop-backend GitHub Wiki
🧱 Категории товаров (ProductCategories API)
Контроллер: Api::V1::ProductCategoriesController
Версия: v1
Слой: Аутентифицированный API
Все действия доступны только авторизованным продавцам, работающим в рамках одного магазина.
Категории организованы в виде дерева (вложенность до 3 уровней, не более 20 подкатегорий на уровне).
📘 Общая логика
- Категории используются для организации каталога товаров и услуг в рамках конкретного магазина
- У каждой категории есть:
title
— названиеlevel
— уровень вложенности (0, 1, 2)parent_id
— родительская категория
- Максимальная глубина дерева — 3 уровня
- Максимум подкатегорий у родителя — 20 штук
- Категории нельзя переиспользовать между магазинами
📄 Методы
POST /api/v1/product_categories
🆕 Создание новой категории в магазине
🔹 Входные параметры
Поле | Тип | Обязательный | Пример |
---|---|---|---|
title | string | ✅ | Аксессуары |
parent_id | UUID | ❌ | (для вложенной) |
shop_id | UUID | ✅ | (ID магазина) |
✅ Ответ (201 Created)
{
"id": "b871...",
"title": "Аксессуары",
"level": 1,
"parent_id": "8f7d..."
}
✅ Чек-лист
Пункт | Значение |
---|---|
🔒 Требуется access token | ✅ Да |
🔐 Политики доступа | Только продавец-владелец магазина и суперадмины |
🔗 Зависимости | Магазин, родительская категория (если есть) |
📋 Валидации
- Уникальность
title
внутри магазина parent_id
должен принадлежать тому же магазину- Глубина дерева ≤ 3
- У родителя не более 20 дочерних категорий
📚 Кейсы использования
📦 Кейс 1: Продавец добавляет корневую категорию
Продавец указывает
title
иshop_id
, не указываяparent_id
. Категория создаётся на уровне 0.
🧲 Кейс 2: Добавление подкатегории
Продавец указывает
parent_id
на существующую категорию. Получается вложенная категория 1 уровня.
🚫 Кейс 3: Ошибка превышения уровня вложенности
При попытке создать подкатегорию 4 уровня сервер возвращает 422 с ошибкой: "Максимальный уровень вложенности — 3".
GET /api/v1/product_categories
📂 Получение дерева всех категорий для одного магазина
🔹 Параметры запроса
Параметр | Тип | Обязательный | Пример |
---|---|---|---|
shop_id | UUID | ✅ | shop-uuid-1 |
✅ Ответ
[
{
"id": "1",
"title": "Мебель",
"level": 0,
"children": [
{
"id": "2",
"title": "Диваны",
"level": 1,
"children": []
}
]
}
]
📚 Кейсы использования
🗺 Кейс 1: Отображение дерева категорий
Продавец открывает админ-панель и получает полное дерево категорий своего магазина для отображения в UI.
🔍 Кейс 2: Поиск категории при создании товара
Фронтенд использует дерево для выбора категории при создании или редактировании товара.
PATCH /api/v1/product_categories/:id
✏️ Редактирование названия категории
✅ Ответ
{
"id": "2",
"title": "Новая подкатегория"
}
📚 Кейсы использования
🖊 Кейс 1: Продавец переименовывает подкатегорию
Название подкатегории изменилось на более понятное, сервер возвращает обновлённые данные.
DELETE /api/v1/product_categories/:id
🗑 Удаление категории (если в ней нет товаров и подкатегорий)
✅ Ответ
{
"message": "Категория успешно удалена"
}
📚 Кейсы использования
🧹 Кейс 1: Удаление пустой категории
Продавец больше не использует категорию и удаляет её — в ней нет товаров или вложенных подкатегорий.
⚠️ Кейс 2: Ошибка при удалении
Сервер возвращает ошибку 422, если есть хотя бы один связанный товар или подкатегория.
🧩 Связанные сущности
Сущность | Назначение |
---|---|
ProductCategory |
Дерево категорий товаров |
Shop |
Владелец категорий |
Product |
Связан через product_category_id |
📄 TODO / Идеи
- Drag & drop сортировка
- Массовое удаление и перенос
- Отображение количества товаров в категории