API Carts - rubyhat/fastyshop-backend GitHub Wiki
🛒 Корзина пользователя (Carts API)
Контроллер: Api::V1::CartsController
Версия: v1
Слой: Аутентифицированный API
Корзина привязана к пользователю и содержит товары, которые он планирует заказать.
У каждого пользователя одна корзина на каждый магазин, автоматически создаваемая при первом использовании.
Пользователь может зайти в три магазина и добавить товары в корзину - всего у пользователя будет три корзины, но каждая корзина относится к конкретному магазину.
📘 Общая логика
- В корзине могут находиться товары из одного магазина
- Если пользователь добавляет товар из другого магазина — старая корзина очищается
- Каждый товар в корзине — это
CartItem, с полемquantityиprice_snapshot - Количество можно изменить, позицию — удалить
- Цена на момент добавления фиксируется. (Нужно подумать, нужно ли это покупателю? Только если показывать. что цена изменилась с момента добавления в корзину.)
- Пока товар(
Product) не оформлен в заказ(Order) стоимость должна изменяться в корзине(Cart), если была изменена в карточке товара (Product)
📄 Методы
🆕 POST /api/v1/carts/add_item
Добавление товара в корзину
🔹 Входные параметры
| Поле | Тип | Обязательный | Пример |
|---|---|---|---|
| product_id | UUID | ✅ | prod-uuid |
| quantity | number | ✅ | 2 |
✅ Ответ (200 OK)
{
"message": "Товар добавлен в корзину",
"cart": {
"id": "cart-uuid",
"items_count": 1,
"total_quantity": 2
}
}
✅ Чек-лист
| Пункт | Значение |
|---|---|
| 🔒 Требуется access token | ✅ Да |
| 🔐 Политики доступа | Только текущий пользователь |
| 🔗 Зависимости | Продукт должен существовать |
📋 Валидации
quantity> 0- Нельзя добавить более, чем есть на складе
- Все товары в корзине — из одного магазина
💼 Бизнес-логика
- Если товар уже в корзине — увеличивается количество
- Если товар из другого магазина — корзина очищается
- Цена фиксируется при добавлении
📚 Кейсы использования
➕ Кейс 1: Добавление нового товара
Пользователь выбирает товар и нажимает кнопку "Добавить в корзину".
🔁 Кейс 2: Повторное добавление того же товара
Количество увеличивается.
🧼 Кейс 3: Очистка при смене магазина
Пользователь переключается на другой магазин — корзина сбрасывается.
📂 GET /api/v1/carts
Получение текущей корзины пользователя
✅ Ответ
{
"id": "cart-uuid",
"items": [
{
"product": {
"id": "prod-1",
"title": "Кресло",
"price": 14900
},
"quantity": 2,
"price_snapshot": 14900
}
],
"total_quantity": 2,
"items_count": 1
}
📚 Кейсы использования
🛒 Кейс 1: Отображение корзины перед оформлением заказа
Пользователь открывает корзину и видит, что он выбрал.
✏️ PATCH /api/v1/carts/update_item
Изменение количества товара
🔹 Входные поля
| Поле | Тип | Обязательный | Пример |
|---|---|---|---|
| product_id | UUID | ✅ | prod-1 |
| quantity | number | ✅ | 3 |
✅ Ответ
{
"message": "Количество обновлено",
"cart": {
"total_quantity": 3
}
}
📚 Кейсы использования
🔢 Кейс 1: Изменение количества
Пользователь меняет 2 → 3 шт.
❌ Кейс 2: Установка quantity = 0
Товар удаляется из корзины.
🗑 DELETE /api/v1/carts/remove_item
Удаление товара из корзины
🔹 Входные параметры
| Поле | Тип | Обязательный | Пример |
|---|---|---|---|
| product_id | UUID | ✅ | prod-1 |
✅ Ответ
{
"message": "Товар удалён из корзины"
}
📚 Кейсы использования
🗑 Кейс 1: Удаление по кнопке "удалить"
Пользователь удаляет товар, который ему больше не нужен.
🧩 Связанные сущности
| Сущность | Назначение |
|---|---|
Cart |
Корзина пользователя |
CartItem |
Строка в корзине |
Product |
Продукт, который добавляется |
User |
Владелец корзины |
📄 TODO / Идеи
- Гостевая корзина (в cookies)
- Сессия корзины через Redis
- Купоны и промокоды
- Мульти-магазинные корзины