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 сортировка
- Массовое удаление и перенос
- Отображение количества товаров в категории