API Orders - rubyhat/fastyshop-backend GitHub Wiki

📦 Заказы (Orders API)

Контроллер: Api::V1::OrdersController
Версия: v1
Слой: Аутентифицированный API
Доступ для покупателей (создание, просмотр), продавцов (просмотр заказов своего магазина) и администраторов.

Заказ создаётся на основе корзины пользователя. Покупатели и продавцы могут просматривать свои заказы.


📘 Общая логика

  • Заказ создаётся на основе текущей корзины пользователя
  • Копируются товары (price_snapshot), адрес (UserAddress)
  • Один заказ — один магазин
  • После создания корзина очищается, а остатки на складе уменьшаются
  • Статус заказа изменяется по строгой последовательности
  • Пользователь может отменить заказ, если он еще не был отправлен на доставку, обязательно указать комментарий причины отмены
  • Продавец может отменить заказ, если он еще не был отправлен на доставку
  • Если товар был оплачен онлайн, но еще не доставлен - кто, когда и как может отменить заказ?

📄 Методы

🆕 POST /api/v1/orders/create_from_cart

Создание нового заказа из корзины

🔹 Входные параметры

Поле Тип Обязательный Пример
user_address_id UUID address-uuid-123

✅ Ответ

{
  "id": "order-uuid",
  "shop_id": "shop-uuid",
  "status": "new",
  "total_price": 19800,
  "products": [
    {
      "id": "prod-uuid",
      "title": "Кресло",
      "quantity": 1,
      "price_snapshot": 19800
    }
  ]
}

📚 Кейсы использования

  • Покупатель оформляет заказ на текущую корзину
  • Сервер копирует все данные и очищает корзину
  • При ошибке (нет корзины или адреса) — 422

📂 GET /api/v1/orders

Получение всех заказов текущего пользователя (или продавца)

🔹 Параметры

Параметр Тип Описание
role string buyer / seller (опц.)

✅ Ответ

[
  {
    "id": "order-uuid",
    "status": "new",
    "total_price": 25000,
    "shop": {
      "title": "Магазин"
    }
  }
]

📚 Кейсы использования

  • Покупатель видит историю своих заказов
  • Продавец просматривает заказы на свои товары

🔍 GET /api/v1/orders/:id

Получение одного заказа с деталями

✅ Ответ

{
  "id": "order-uuid",
  "status": "new",
  "user": {
    "id": "user-uuid",
    "phone": "+77001234567"
  },
  "products": [
    {
      "title": "Кресло",
      "quantity": 1,
      "price_snapshot": 19800
    }
  ]
}

📚 Кейсы использования

  • Покупатель проверяет состав и статус своего заказа
  • Продавец видит данные покупателя и список позиций

✏️ PATCH /api/v1/orders/:id/update_status

Обновление статуса заказа

🔹 Входные параметры

Поле Тип Обязательный Пример
status string confirmed

✅ Ответ

{
  "id": "order-uuid",
  "status": "accepted"
}

🧩 Бизнес-логика статусов

valid_transitions = {
  created: %i[accepted canceled_by_user canceled_by_seller],
  accepted: %i[delivery_in_progress ready_for_pickup canceled_by_user canceled_by_seller],
  delivery_in_progress: %i[completed canceled_by_seller],
  ready_for_pickup: %i[completed canceled_by_seller],
  completed: [],
  canceled_by_user: [],
  canceled_by_seller: []
}

В массиве i%[...] указаны статусы, которые доступны для смены для статуса, указанного в ключе объекта.

Например из created можно сменить на один из accepted canceled_by_user canceled_by_seller

  • Продавец может:
    • принять,
    • отправить на доставку,
    • отметить, что заказ готов к выдаче,
    • отметить, что заказ завершен
  • Покупатель может создать заказ и отменить

📚 Кейсы использования

  • Продавец обрабатывает заказ и обновляет статус
  • Покупатель отменяет заказ до отправки на доставку

✅ Чек-лист

Пункт Значение
🔒 Требуется access token ✅ Да
🔐 Политики доступа По роли: покупатель / продавец
🔗 Зависимости Корзина, адрес, статус, роли

🧩 Связанные сущности

Сущность Назначение
Order Модель заказа
OrderItem Позиции в заказе
User Покупатель
Shop Продавец
Product Привязка через OrderItem
UserAddress Адрес, копируется в заказ

📄 TODO / Идеи

  • История изменения статусов
  • Интеграция с оплатой
  • Email / Telegram уведомления
  • Отзывы на заказы
  • Если товар был оплачен онлайн, но еще не доставлен - кто, когда и как может отменить заказ?