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 шт.
quantity = 0
❌ Кейс 2: Установка Товар удаляется из корзины.
DELETE /api/v1/carts/remove_item
🗑 Удаление товара из корзины
🔹 Входные параметры
Поле | Тип | Обязательный | Пример |
---|---|---|---|
product_id | UUID | ✅ | prod-1 |
✅ Ответ
{
"message": "Товар удалён из корзины"
}
📚 Кейсы использования
🗑 Кейс 1: Удаление по кнопке "удалить"
Пользователь удаляет товар, который ему больше не нужен.
🧩 Связанные сущности
Сущность | Назначение |
---|---|
Cart |
Корзина пользователя |
CartItem |
Строка в корзине |
Product |
Продукт, который добавляется |
User |
Владелец корзины |
📄 TODO / Идеи
- Гостевая корзина (в cookies)
- Сессия корзины через Redis
- Купоны и промокоды
- Мульти-магазинные корзины