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

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

Микросервис checkout-orchestration предоставляет функциональность для управления заказами (оформление и сбор статистики).

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

Логика работы Copy-icon

В работе микросервиса используются следующие сущности:

  • Заказ (Order) - содержит данные конкретного заказа (id заказа, id покупателя, номер заказа, дата формирования заказа, товары в заказе, адрес доставки, данные получателя, итоговая сумма заказа, скидки, статус заказа и др.)
  • Статистика заказов пользователей (AggregatedCustomerStatistics) - содержит статистику количества заказов пользователей
  • Количество заказов пользователя (AccountOrderTotal) - содержит данные об итоговом количестве заказов конкретного пользователя

Аутентификация Copy-icon

При обращении к микросервису через API необходимо указать следующие параметры в заголовке:

  • Authorization - для указания токена: Authorization: Bearer <токен>
  • If-Match - для указания значения захешированного заказа при редактировании: If-Match: <хэш заказа>
  • If-None-Match - для указания значения захешированного заказа при получении: If-None-Match: <хэш заказа>

Service context path Copy-icon

/api/checkout-orchestration/

Настройки и параметры конфигурации Copy-icon

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

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

По умолчанию

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

    "LOGGING_LEVEL": "уровень_логирования",
    "SERVER_PORT": "порт_сервера"
  }
}


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

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


{

  "env": {
    "AVAILABILITY_URL": "url_доступа_к_сервису_availability",
    "CART_URL": "url_доступа_к_сервису_cart",
    "CATALOG_URL": "url_доступа_к_сервису_catalog",
    "DC_MAIL_ORDER_CONFIRMATION_SENDER": "адрес_почты_отправителя_письма",
    "DELIVERY_URL": "url_доступа_к_сервису_delivery-orchestration",
    "KAFKA_BROKER_ADDRESS": "сокет_для_брокера_kafka",
    "OAUTH_ECOM_CLIENT_ID": "токен_приложения_ECOM_OAuth",
    "OAUTH_ECOM_ISSUER_URI": "url_ECOM_OAuth",
    "OAUTH_ZITADEL_CLIENT_ID": "токен_приложения_Zitadel",
    "OAUTH_ZITADEL_ISSUER_URI": "url_Zitadel",
    "ORDER_URL": "url_доступа_к_сервису_order",
    "PRICE_URL": "url_доступа_к_сервису_price",
    "PROMO_URL": "url_доступа_к_сервису_promo",
    "USER_ORHESTRATION_URL": "url_доступа_к_сервису_user-orchestration",
    "USER_URL": "url_доступа_к_сервису_user",
    "ZITADEL_SERVICE_USER_TOKEN": "токен_пользователя_Zitadel",
    "ZITADEL_SYNC_USER_ENABLED": "включение_синхронизации_пользователей_Zitadel",
    "ZITADEL_URL": "url_доступа_к_Zitadel"
  }
}

Copy-icon

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

Заказы

Создание заказа - POST /v2/orders/{cartId}

Request parameters (body sample)

cartId - path-параметр: ID корзины, на основе которой создается заказ

Copy-icon
Response sample

{
    "id": "a6b5a5f7-70c6-4622-b008-2d66187f5eee",
    "customerId": "245615803066508818",
    "orderNum": "2-29122023000048",
    "createTime": "2023-12-29T12:35:28",
    "entries": [
        {
            "articleId": "1000419DC",
            "productId": "1000418DC",
            "articleName": "Кроссы",
            "asset": {
                "id": "ad021c5c-bd5b-431d-9b75-9bdc152b76fe",
                "media": {
                    "url": "master/catalog/images/1697179587383-1882559365.jpg",
                    "absoluteUrl": "https://test-ecom-media.digitalchief.tech/master/catalog/images/1697179587383-1882559365.jpg",
                    "name": "Кроссовки.jpg",
                    "type": "PHOTO",
                    "size": 120828,
                    "resolution": "800x600 px",
                    "createdDate": "2023-10-13T09:47:27.488"
                },
                "title": "Кроссовки1",
                "altAttr": "Обувь",
                "description": "",
                "sign": "",
                "tags": [
                    ""
                ]
            },
            "availability": {
                "id": "41e99a26-9a8b-4f60-b4a6-cefd359d0501",
                "articleId": "1000419DC",
                "quantity": 20.00,
                "replenishmentTime": 0
            },
            "quantity": 1.00,
            "unitPrice": 300.00,
            "discountUnitPrice": 6.00,
            "price": 300.00,
            "discountPrice": 6.00,
            "discountSum": 294.00
        }
    ],
    "shippingAddress": {
        "id": null,
        "company": null,
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "shippingRecipient": {
        "firstName": null,
        "lastName": null,
        "phone": null
    },
    "billingAddress": {
        "id": "642",
        "firstName": "Test",
        "lastName": "Zitadel",
        "company": "777",
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "charges": null,
    "totalPrice": 300.00,
    "discountPrice": 6.00,
    "discountSum": 294.00,
    "currencyId": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
    "cartId": "1-29122023000016",
    "orderStatus": "PENDING",
    "user": {
        "id": "245615803066508818",
        "firstName": "Test",
        "lastName": "Zitadel",
        "phone": null,
        "email": "test.zit.001@test.com",
        "registrationTime": null,
        "registrationCompleted": false,
        "addressDto": {
            "id": "642",
            "firstName": "Test",
            "lastName": "Zitadel",
            "company": "777",
            "address": null,
            "city": null,
            "zipCode": null,
            "poBox": null,
            "country": null
        }
    }
}

Copy-icon
Response header

// для дальнейшего редактирования заказа необходимо из заголовка ответа взять значение:


etag: "1478353428"
Copy-icon
Response codes
  • 201 - заказ успешно создан
  • 404 - не найдена указанная в запросе корзина, или пользователь, создавший корзину, уже не существует

Получение заказа - GET /v1/orders/{id}

Request parameters

id - path-параметр: ID заказа, по которому необходимо получить информацию

Copy-icon
Response sample

{
    "id": "a6b5a5f7-70c6-4622-b008-2d66187f5eee",
    "customerId": "245615803066508818",
    "orderNum": "2-29122023000048",
    "createTime": "2023-12-29T12:35:28",
    "entries": [
        {
            "articleId": "1000419DC",
            "productId": "1000418DC",
            "articleName": "Кроссы",
            "asset": {
                "id": "ad021c5c-bd5b-431d-9b75-9bdc152b76fe",
                "media": {
                    "url": "master/catalog/images/1697179587383-1882559365.jpg",
                    "absoluteUrl": "https://test-ecom-media.digitalchief.tech/master/catalog/images/1697179587383-1882559365.jpg",
                    "name": "Кроссовки.jpg",
                    "type": "PHOTO",
                    "size": 120828,
                    "resolution": "800x600 px",
                    "createdDate": "2023-10-13T09:47:27.488"
                },
                "title": "Кроссовки1",
                "altAttr": "Обувь",
                "description": "",
                "sign": "",
                "tags": [
                    ""
                ]
            },
            "availability": {
                "id": "41e99a26-9a8b-4f60-b4a6-cefd359d0501",
                "articleId": "1000419DC",
                "quantity": 20.00,
                "replenishmentTime": 0
            },
            "quantity": 1.00,
            "unitPrice": 300.00,
            "discountUnitPrice": 6.00,
            "price": 300.00,
            "discountPrice": 6.00,
            "discountSum": 294.00
        }
    ],
    "shippingAddress": {
        "id": null,
        "company": null,
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "shippingRecipient": {
        "firstName": null,
        "lastName": null,
        "phone": null
    },
    "billingAddress": {
        "id": "642",
        "firstName": "Test",
        "lastName": "Zitadel",
        "company": "777",
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "charges": null,
    "totalPrice": 300.00,
    "discountPrice": 6.00,
    "discountSum": 294.00,
    "currencyId": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
    "cartId": "1-29122023000016",
    "orderStatus": "PENDING",
    "user": {
        "id": "245615803066508818",
        "firstName": "Test",
        "lastName": "Zitadel",
        "phone": null,
        "email": "test.zit.001@test.com",
        "registrationTime": null,
        "registrationCompleted": false,
        "addressDto": {
            "id": "642",
            "firstName": "Test",
            "lastName": "Zitadel",
            "company": "777",
            "address": null,
            "city": null,
            "zipCode": null,
            "poBox": null,
            "country": null
        }
    }
}

Copy-icon
Response codes
  • 200 - заказ найден
  • 304 - заказ с указанным хешем не изменился (если указать хэш в заголовке запроса)
  • 404 - заказ не найден

Обновление заказа - PATCH /v2/orders/{orderId}

Request parameters

orderId - path-параметр: ID заказа, который необходимо обновить

Copy-icon
Request body sample

{
   "orderDto":{
      "id":"a6b5a5f7-70c6-4622-b008-2d66187f5eee",
      "customerId":"245615803066508818",
      "orderNum":"2-29122023000048",
      "createTime":"2023-12-29T12:35:28",
      "entries":[
         {
            "articleId":"1000419DC",
            "productId":"1000418DC",
            "articleName":"Кроссы",
            "asset":{
               "id":"ad021c5c-bd5b-431d-9b75-9bdc152b76fe",
               "media":{
                  "url":"master/catalog/images/1697179587383-1882559365.jpg",
                  "absoluteUrl":"https://test-ecom-media.digitalchief.tech/master/catalog/images/1697179587383-1882559365.jpg",
                  "name":"Кроссовки.jpg",
                  "type":"PHOTO",
                  "size":120828,
                  "resolution":"800x600 px",
                  "createdDate":"2023-10-13T09:47:27.488"
               },
               "title":"Кроссовки1",
               "altAttr":"Обувь",
               "description":"",
               "sign":"",
               "tags":[
                  ""
               ]
            },
            "availability":{
               "id":"41e99a26-9a8b-4f60-b4a6-cefd359d0501",
               "articleId":"1000419DC",
               "quantity":20,
               "replenishmentTime":0,
               "locationCode":"Строительный двор - Павловопосадский склад"
            },
            "quantity":1,
            "unitPrice":300,
            "discountUnitPrice":6,
            "price":300,
            "discountPrice":6,
            "discountSum":294
         }
      ],
      "shippingAddress":{
         "id":null,
         "company":null,
         "address":null,
         "city":null,
         "zipCode":null,
         "poBox":null,
         "country":null
      },
      "shippingRecipient":{
         "firstName":null,
         "lastName":null,
         "phone":null
      },
      "billingAddress":{
         "id":"642",
         "firstName":"Test",
         "lastName":"Zitadel",
         "company":"7777",
         "address":null,
         "city":null,
         "zipCode":null,
         "poBox":null,
         "country":null
      },
      "charges":null,
      "totalPrice":300,
      "discountPrice":6,
      "discountSum":294,
      "currencyId":"02d3eb94-8d0c-4e21-a952-db8684a1534d",
      "cartId":"1-29122023000016",
      "orderStatus":"PENDING",
      "user":{
         "id":"245615803066508818",
         "firstName":"Test",
         "lastName":"Zitadel",
         "phone":null,
         "email":"test.zit.001@test.com",
         "registrationTime":null,
         "registrationCompleted":false,
         "addressDto":{
            "id":"642",
            "firstName":"Test",
            "lastName":"Zitadel",
            "company":"7777",
            "address":null,
            "city":null,
            "zipCode":null,
            "poBox":null,
            "country":null
         }
      }
   },
   "cartToDelete":false
}

Copy-icon
Response sample

{
    "id": "a6b5a5f7-70c6-4622-b008-2d66187f5eee",
    "customerId": "245615803066508818",
    "orderNum": "2-29122023000048",
    "createTime": "2023-12-29T12:35:28",
    "entries": [
        {
            "articleId": "1000419DC",
            "productId": "1000418DC",
            "articleName": "Кроссы",
            "asset": {
                "id": "ad021c5c-bd5b-431d-9b75-9bdc152b76fe",
                "media": {
                    "url": "master/catalog/images/1697179587383-1882559365.jpg",
                    "absoluteUrl": "https://test-ecom-media.digitalchief.tech/master/catalog/images/1697179587383-1882559365.jpg",
                    "name": "Кроссовки.jpg",
                    "type": "PHOTO",
                    "size": 120828,
                    "resolution": "800x600 px",
                    "createdDate": "2023-10-13T09:47:27.488"
                },
                "title": "Кроссовки1",
                "altAttr": "Обувь",
                "description": "",
                "sign": "",
                "tags": [
                    ""
                ]
            },
            "availability": {
                "id": "41e99a26-9a8b-4f60-b4a6-cefd359d0501",
                "articleId": "1000419DC",
                "quantity": 20,
                "replenishmentTime": 0,
                "locationCode": "Строительный двор - Павловопосадский склад"
            },
            "quantity": 1,
            "unitPrice": 300,
            "discountUnitPrice": 6,
            "price": 300,
            "discountPrice": 6.00,
            "discountSum": 294.00
        }
    ],
    "shippingAddress": {
        "id": null,
        "company": null,
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "shippingRecipient": {
        "firstName": null,
        "lastName": null,
        "phone": null
    },
    "billingAddress": {
        "id": "642",
        "firstName": "Test",
        "lastName": "Zitadel",
        "company": "7777",
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "charges": null,
    "totalPrice": 300,
    "discountPrice": 6.00,
    "discountSum": 294.00,
    "currencyId": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
    "cartId": "1-29122023000016",
    "orderStatus": "PENDING",
    "user": {
        "id": "245615803066508818",
        "firstName": "Test",
        "lastName": "Zitadel",
        "phone": null,
        "email": "test.zit.001@test.com",
        "registrationTime": null,
        "registrationCompleted": false,
        "addressDto": {
            "id": "642",
            "firstName": "Test",
            "lastName": "Zitadel",
            "company": "7777",
            "address": null,
            "city": null,
            "zipCode": null,
            "poBox": null,
            "country": null
        }
    }
}

Copy-icon
Response codes
  • 200 - заказ обновлен
  • 400 - заказ не обновлен, общая ошибка
  • 404 - заказ не найден
  • 412 - заказ не обновлен, указанный хеш не соответствует текущему заказу
  • 428 - заказ не обновлен, не указан текущий хеш заказа

Получение списка заказов пользователя - GET /v1/orders/

Request parameters

customerId - query-параметр: ID пользователя, чьи заказы необходимо получить
page, size - query-параметр: номер и размер страницы заказов
statusFilter - query-параметр, необязательный: статус заказов

Copy-icon
Response sample

{
   "content":[
      // Список заказов
   ],
   "number":0,
   "size":5,
   "totalElements":5,
   "pageable":"INSTANCE",
   "last":true,
   "totalPages":1,
   "sort":{
      "unsorted":true,
      "sorted":false,
      "empty":true
   },
   "first":true,
   "numberOfElements":5,
   "empty":false
}

Copy-icon
Response codes

200 - получен список заказов пользователя

Статистика

Сбор статистики количества заказов пользователей - GET /v1/orders/statistics/aggregate-by-customers

Request parameters

customerIds - query-параметр: список ID пользователей, по которым нужно собрать статистику
statusFilter - query-параметр, необязательный: статус заказа, по которому фильтруется выборка

Copy-icon
Response sample

{
    "customerStatistics": [
        {
            "customerId": "245615803066508818",
            "ordersCount": 6
        },
        {
            "customerId": "238828852141385234",
            "ordersCount": 2
        }
    ]
}

Copy-icon
Response codes
  • 200 - запрос успешно выполнен
  • 403 - нет прав на получение данных

Отчет

Получение отчета по заказам - GET /v1/orders/report/download

Request parameters

statusFilter - query-параметр, необязательный: статус заказа, по которому фильтруется выборка

Copy-icon
Response sample

В ответе приходит Xlsx-файл с отчетом.

Response codes
  • 200 - запрос успешно выполнен
  • 403 -  нет прав на получение данных

Аккаунт Copy-icon

Получение заказов пользователя администратором - GET /v1/account/orders

Request parameters

customerId - query-параметр: ID пользователя, чьи заказы необходимо получить
page, size - query-параметр: номер и размер страницы заказов
statusFilter - query-параметр, необязательный: статус заказов

Copy-icon
Response sample

{
    "content": [
        // Список заказов
    ],
    "number": 0,
    "size": 10,
    "totalElements": 692,
    "pageable": "INSTANCE",
    "last": false,
    "totalPages": 70,
    "sort": {
        "unsorted": true,
        "sorted": false,
        "empty": true
    },
    "first": true,
    "numberOfElements": 10,
    "empty": false
}

Copy-icon
Response codes
  • 200 - запрос успешно выполнен
  • 403 - нет прав на получение данных

Получение заказа по ID администратором - GET /v1/account/orders/{id}

Request parameters

id - path-параметр: ID заказа, по которому необходимо получить информацию

Copy-icon
Response sample

{
    "id": "b56b3467-e605-45a4-8fb5-61a22e1af85b",
    "orderNum": "2-21042023000021",
    "createTime": "2023-04-21T16:49:53",
    "entries": [
        {
            "articleId": "1000009",
            "productId": null,
            "articleName": "Фонарик походный",
            "asset": null,
            "availability": {
                "id": "ca747831-3847-4062-ab00-e66e41131d9b",
                "articleId": "1000009",
                "quantity": 203,
                "replenishmentTime": 14,
                "locationCode": null
            },
            "quantity": 1,
            "unitPrice": 8,
            "discountUnitPrice": null,
            "price": 8,
            "discountPrice": null,
            "discountSum": null
        },
        {
            "articleId": "1000001",
            "productId": null,
            "articleName": "Смарт-часы",
            "asset": null,
            "availability": {
                "id": "a6475175-1240-4176-b220-917bc369f864",
                "articleId": "1000001",
                "quantity": 2000,
                "replenishmentTime": 14,
                "locationCode": null
            },
            "quantity": 1,
            "unitPrice": 50,
            "discountUnitPrice": null,
            "price": 50,
            "discountPrice": null,
            "discountSum": null
        }
    ],
    "shippingAddress": {
        "id": "60b94e61-892a-4b72-b3c1-28fb96253f88",
        "company": null,
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    },
    "shippingRecipient": {
        "firstName": null,
        "lastName": null,
        "phone": null
    },
    "orderStatus": "CONFIRMED",
    "totalPrice": 58,
    "discountPrice": null,
    "discountSum": null,
    "currency": {
        "id": "02d3eb94-8d0c-4e21-a952-db8684a1534d",
        "isoCode": "EUR",
        "name": "Euro",
        "symbol": "€"
    },
    "cartId": "1-21042023000062"
}

Copy-icon
Response codes
  • 200 - запрос успешно выполнен
  • 403 - нет прав на получение данных
  • 404 - заказ не найден

Получение количества заказов пользователя администратором - GET /v1/account/orders/total

Request parameters

customerId - query-параметр: ID пользователя, чьи заказы необходимо получить

Copy-icon
Response sample

{
    "orderTotal": 692
}

Copy-icon
Response codes
  • 200 - запрос успешно выполнен
  • 403 - нет прав на получение данных