Микросервис cart-orchestration

В статье описываются функции, логика работы, конфигурация и методы микросервиса cart-orchestration.

Микросервис cart-orchestration предоставляет функционал по работе с корзиной: создание корзины, добавление/удаление товара в/из корзины, обновление корзины, листинг всех корзин.

Доступ к сервису предоставляется по запросу.

В работе микросервиса участвуют следующие сущности:

  • Корзина (Cart) - содержит данные конкретной корзине (id корзины, id пользователя, id валюты, список товаров в корзине)
  • Товар в корзине (CartItem) - содержит данные о товарах в конкретной корзине (id товара, количество товара в штуках, название товара, цена за одну штуку, цена со скидкой за 1 штуку, итоговая цена товара с учетом его количества, итоговая цена товара с учетом скидки, итоговая скидка и др.)

При обращении к микросервису через API в запросах необходимо в заголовке Authorization указать токен: Authorization: Bearer <токен>.

/api/cart-orchestration/

Параметры конфигурации указываются в Vault.

Vault используется на нашей платформе в качестве хранилища всех конфигураций развертывания. Инструмент может быть выбран другой.

По умолчанию

{
  "env": {
    "JAVA_XMS": "XXm",
    "JAVA_XMX": "YYYm"
  }
}


Copy-icon
Указываемые на каждом отдельном стенде

// пример взят с тестового стенда


{
  "env": {

    "OAUTH_ECOM_CLIENT_ID": "токен_приложения_ECOM_OAuth",
    "OAUTH_ZITADEL_CLIENT_ID": "токен_приложения_Zitadel",
    "OAUTH_ZITADEL_ISSUER_URI": "url_Zitadel"
  }
}



Copy-icon

Методы микросервиса Copy-icon

Работа с корзиной Copy-icon

  • Получение списка корзин (с пагинацией) - GET запрос, /
Request parameters (request body sample)

pageable object // обязательный параметр, разбивает результат на страницы, указывает, по какому свойству и порядок сортировки
{
    "page": 0, // номер страницы
    "size": 1, // количество показываемых элементов
    "sort": [  // параметр сортировки, по какому свойству идет сортировка и ее порядок
        "id,asc"
    ]
}

Copy-icon
Response sample

{
  "content": [ // содержит массив корзин (в соответствии с запросом показан 1 объект), отсортированных по id по возрастанию
     {
    "id": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
    "customerId": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
    "currencyId": "0d449436-2702-4051-8a85-e3ec5b645959",
    "items": [
        {
            "id": "2e5c9ba8-956e-476b-816a-49ee128a40c9",
            "articleId": "article1",
            "quantity": 4,
            "name": "Pencil",
            "unitPrice": 1050.25,
            "discountUnitPrice": 950.25,
            "totalPrice": 4201,
            "discountPrice": 999.9,
            "discountSum": 10.1
        }
    ]
     }
  ],
  "pageable": {
    "sort": {
      "unsorted": false,
      "sorted": true,
      "empty": false
    },
    "pageNumber": 0,
    "pageSize": 1,
    "offset": 0,
    "paged": true,
    "unpaged": false
  },
  "last": false,
  "totalPages": 51,
  "totalElements": 151,
  "first": true,
  "numberOfElements": 1,
  "sort": {
    "unsorted": false,
    "sorted": true,
    "empty": false
  },
  "size": 1,
  "number": 0,
  "empty": false
}

Copy-icon
Response codes

200 - Операция успешна. Отдает или массив объектов (если есть информация), или пустой массив (если информации по задаваемым параметрам нет).

  • Получение конкретной корзины (обновленная по данным корзина) - GET запрос, /api/cart-orchestration/v1/carts/{id}/repriced
Request parameters (request body sample)

id // обязательный параметр, идентификатор корзины
customerId // обязательный параметр, идентификатор пользователя корзины
currencyId // необязательный параметр, идентификатор валюты. Если указан, то возвращает цены по товарам только в указанной валюте.

Copy-icon
Response sample

{
  "id": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
  "customerId": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
  "currencyId": "0d449436-2702-4051-8a85-e3ec5b645959",
  "items": [
    {
      "id": "2e5c9ba8-956e-476b-816a-49ee128a40c9",
      "articleId": "article1",
      "quantity": 4,
      "name": "Pencil",
      "unitPrice": 1050.25,
      "discountUnitPrice": 950.25,
      "totalPrice": 4201,
      "discountPrice": 999.9,
      "discountSum": 10.1,
      "catalogInfo": {
        "asset": {
          "id": "string",
          "media": {
            "url": "string",
            "absoluteUrl": "string",
            "name": "string",
            "type": "string",
            "size": 0,
            "resolution": "string",
            "createdDate": "2023-11-22T11:05:51.162Z"
          },
          "title": "string",
          "altAttr": "string",
          "description": "string",
          "sign": "string",
          "tags": [
            "string"
          ]
        },
        "productId": "string",
        "status": 0,
        "availability": {
          "id": "5dc618af-af49-4adc-bccd-4d17aeff7526",
          "articleId": "123",
          "quantity": 10,
          "replenishmentTime": 14
        }
      },
      "orderable": true,
      "messages": "{level=ERROR, message=Price for this item does not exist}"
    }
  ],
  "total": 1050.75,
  "discountPrice": 1000,
  "discountSum": 50.75,
  "orderable": true,
  "messages": "{level=ERROR, message=Certain items in the cart cannot be ordered}"
}

Copy-icon
Response codes
  • 200 - Операция успешна. Возвращает объект корзины.
  • 403 - Ошибка. Корзина недоступна (например, принадлежит иному пользователю).
  • 404 - Ошибка. Корзина с таким ID не найдена.
Request body sample

{
  "customerId": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
  "currencyId": "0d449436-2702-4051-8a85-e3ec5b645959",
  "items": [
    {
      "id": "2e5c9ba8-956e-476b-816a-49ee128a40c9",
      "articleId": "article1",
      "quantity": 4,
      "name": "Pencil",
      "unitPrice": 1050.25,
      "discountUnitPrice": 950.25,
      "totalPrice": 4201,
      "discountPrice": 999.9,
      "discountSum": 10.1
    }
  ]
}

Copy-icon
Response sample

{
  "id": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
  "customerId": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
  "currencyId": "0d449436-2702-4051-8a85-e3ec5b645959",
  "items": [
    {
      "id": "2e5c9ba8-956e-476b-816a-49ee128a40c9",
      "articleId": "article1",
      "quantity": 4,
      "name": "Pencil",
      "unitPrice": 1050.25,
      "discountUnitPrice": 950.25,
      "totalPrice": 4201,
      "discountPrice": 999.9,
      "discountSum": 10.1
    }
  ]
}

Copy-icon
Response codes

201 - Операция выполнена успешно. Корзина создана.

  • Удаление корзины по ее ID - DELETE запрос, /v1/carts/{id}
Request parameters

id - path-параметр, обязательный: уникальный идентификатор корзины

Copy-icon
Response sample

Отсутствует. В ответе приходит только код операции, например, 204.

Response codes
  • 204 - Операция успешна. Корзина удалена.
  • 403 - Ошибка. Удаление запрещено (например, корзина принадлежит иному пользователю).
  • 404 - Ошибка. Корзина с указанным идентификатором не найдена.
Request parameters

id - path-параметр, обязательный: уникальный идентификатор корзины

Copy-icon
Request body sample

{
  "cartDto": {
    "id": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
    "customerId": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
    "currencyId": "0d449436-2702-4051-8a85-e3ec5b645959",
    "items": [
      {
        "id": "2e5c9ba8-956e-476b-816a-49ee128a40c9",
        "articleId": "article1",
        "quantity": 4,
        "name": "Pencil",
        "unitPrice": 1050.25,
        "discountUnitPrice": 950.25,
        "totalPrice": 4201,
        "discountPrice": 999.9,
        "discountSum": 10.1
      }
    ]
  },
  "customerId": "string"
}

Copy-icon
Response sample

Отсутствует.

Response codes
  • 200 - Операция успешна. Корзина обновлена.
  • 403 - Ошибка. Обновление запрещено (например, корзина принадлежит иному пользователю).
  • 404 - Ошибка. Корзина с указанным идентификатором не найдена.
  • 422 - Ошибка. Корзина не обновлена из-за невалидных данных.

Работа с товарами в корзине Copy-icon

Request parameters

id // обязательный параметр, идентификатор корзины

Copy-icon
Request body sample

{
    "articleId": "1000419DC",  // идентификатор товара для создания позиции
    "quantity": 1,
    "price": 300,
    "unitPrice": 300
}

Copy-icon
Response sample

Отсутствует.

Response codes
  • 201 - Операция успешна. Позиция создана. Возвращает объект всей корзине.
  • 404 - Ошибка. Корзина не найдена.
  • 409 - Ошибка. Позиция с данным articleId уже существует.
  • 422 - Ошибка. Отсутствует цена по данному товару.
  • 424 - Ошибка. Отсутствует информация по наличию данного товара.
Request parameters

id // обязательный параметр, идентификатор корзины

Copy-icon
Request body sample

{
    "articleId": "1000419DC",  // идентификатор товара для создания позиции
    "quantity": 1,
    "price": 300,
    "unitPrice": 300
}

Copy-icon
Response sample

Отсутствует.

Response codes
  • 200 - Операция успешна. Позиция создана. Возвращает общее количество товаров в корзине.
  • 422 - Ошибка. Отсутствует цена по данному товару.
  • 424 - Ошибка. Отсутствует информация по наличию данного товара.
Request parameters

id // обязательный параметр, идентификатор корзины

Copy-icon
Request body sample

{
    "id": "e93e3743-5cfb-4f7e-ad0a-36e0ffb4125d",
    "articleId": "1000419DC",
    "name": "Кроссы",
    "price": 300,
    "unitPrice": 300,
    "quantity": 2
}

Copy-icon
Response sample

Отсутствует.

Response codes
  • 200 - Операция успешна. Позиция обновлена. Возвращает общее количество товаров в корзине.
  • 404 - Ошибка. Позиция не найдена.
  • 422 - Ошибка. Отсутствует цена по данному товару.
  • 424 - Ошибка. Отсутствует информация по наличию данного товара.
Request parameters

id // обязательный параметр, идентификатор корзины
itemId // обязательный параметр, идентификатор позиции

Copy-icon
Response sample

Отсутствует. В ответе приходит только код операции, например, 204.

Response codes
  • 200 - Операция успешна. Позиция удалена. Возвращается общее количество товаров в корзине.
  • 404 - Ошибка. Позиция не найдена.