Микросервис promo

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

Микросервис promo предоставляет функциональность по заведению и применению скидок.

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

Логика работы

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

  • Скидка (Promo) - содержит информацию о скидке (id, название, метод применения, клиенты, на которых распространяется скидка, статус, дата начала и окончания действия и др.)
  • Настройка (Setting) - содержит данные о настройке скидки (ключ, значение, описание)
  • Промо продукт (PromoProduct) - содержит информацию о продукте/варианте продукта и его скидке (артикул продукта/варианта продукта, количество товара в штуках, цена за единицу товара, цена со скидкой за единицу товара, стоимость общего количества товара с учетом скидки, величина скидки на весь товар и др.)

Аутентификация

При обращении к микросервису через API в запросах на создание, редактирование или удаление скидок и настроек аутентификация не требуется.

Service context path

/api/promo/

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

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

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

По умолчанию

{
  "env": {

    "GRPC_SERVER_PORT": "порт_сервера_grpc",
    "JAVA_XMS": "XXm",
    "JAVA_XMX": "YYYm",
    "LOGGING_LEVEL": "уровень_логирования",
    "SERVER_PORT": "порт_сервера",
    "SPRING_DATA_MONGODB_DATABASE": "название_бд",
    "SPRING_DATA_MONGODB_PORT": "порт_бд",
    "SPRING_DATA_MONGODB_USERNAME": "юзернейм_для_бд"
  }
}


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

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


{
  "env": {
    "SPRING_DATA_MONGODB_HOST": "хост_бд",
    "SPRING_DATA_MONGODB_PASSWORD": "пароль_для_бд",
    "SPRING_OAUTH_AUTHORITY": "домен_сервера_аутентификации",
    "SPRING_OAUTH_CLIENT_ID": "client_id"
  }
}


Copy-icon

Работа с настройками

Создание настройки - POST запрос, /v1/settings

Request body sample

{
  "key": "LIMIT",
  "value": "70.0",
  "description": "Limit of the maximum promotion percentage"
}

Copy-icon
Response sample

{
  "key": "LIMIT",
  "value": "70.0",
  "description": "Limit of the maximum promotion percentage"
}

Copy-icon
Response codes
  • 201 - операция прошла успешно, настройка создана
  • 409 - ошибка, настройка уже существует
  • 400 - ошибка, не удалось создать настройку
  • 404 - ошибка, не удалось найти настройку

Получение настройки по ее ключу - GET запрос, /v1/settings/{key}

Request parameters

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

Copy-icon
Response sample

{
    "key": "LIMIT",
    "value": "90",
    "description": null
}

Copy-icon
Response codes

200 - операция выполнена успешно, получены данные настройки

Редактирование настройки по ее ключу - PATCH запрос, /v1/settings/{key}

Request parameters

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

Copy-icon
Request body sample

{
  "key": "LIMIT",
  "value": "70.0",
  "description": "Limit of the maximum promotion percentage"
}

Copy-icon
Response sample

{
  "key": "LIMIT",
  "value": "70.0",
  "description": "Limit of the maximum promotion percentage"
}

Copy-icon
Response codes
  • 200 - операция прошла успешно, настройка отредактирована
  • 404 - ошибка, не удалось найти настройку

Удаление настройки по ее ключу - DELETE запрос, /v1/settings/{key}

Request parameters

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

Copy-icon
Response sample

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

Response codes
  • 204 - операция выполнена успешно, настройка удалена
  • 404 - ошибка, настройка не найдена

Работа со скидками

Получение списка всех скидок - GET запрос, /v1/promos

Request parameters

page - query-параметр: номер страницы
size - query-параметр: размер страницы
sort - query-параметр: сортировка скидок
status - query-параметр: статус скидок

Copy-icon
Response sample

{
  "content": [
    {
      "id": "93929a1e-033c-4716-8cda-496e027a1a6c",
      "name": "filter test",
      "applying": "AUTO",
      "entity": "PRODUCT",
      "userIds": [],
      "combination": "SUMMARIZE",
      "startDate": "03-12-2023 21:00:00",
      "endDate": null,
      "status": "ACTIVE",
      "articleIds": [
        "1001523DC",
        "1001627DC"
      ],
      "discountType": "PERCENT",
      "discount": 71
    },
    {
      "id": "911fb1c8-c4fe-4a28-b305-f38f7117502f",
      "name": null,
      "applying": "AUTO",
      "entity": "PRODUCT",
      "userIds": [],
      "combination": "SUMMARIZE",
      "startDate": "10-03-2024 21:00:00",
      "endDate": null,
      "status": "ACTIVE",
      "articleIds": [
        "1001429DC",
        "1001457DC",
        "1001458DC"
      ],
      "discountType": "PERCENT",
      "discount": 55
    },
    {
      "id": "e6aefb70-a231-41b7-966c-7d48d3c5cf79",
      "name": null,
      "applying": "AUTO",
      "entity": "PRODUCT",
      "userIds": [],
      "combination": "EXCLUDE",
      "startDate": null,
      "endDate": null,
      "status": "ACTIVE",
      "articleIds": [
        "1009029DC"
      ],
      "discountType": "PERCENT",
      "discount": 44
    }
  ],
  "pageable": {
    "sort": {
      "sorted": false,
      "unsorted": true,
      "empty": true
    },
    "pageSize": 3,
    "pageNumber": 0,
    "offset": 0,
    "paged": true,
    "unpaged": false
  },
  "last": false,
  "totalPages": 6,
  "totalElements": 16,
  "first": true,
  "numberOfElements": 3,
  "sort": {
    "sorted": false,
    "unsorted": true,
    "empty": true
  },
  "size": 3,
  "number": 0,
  "empty": false
}

Copy-icon
Response codes

200 - операция выполнена успешно, получен список скидок

Получение скидки по ее ID - GET запрос, /v1/promos/{id}

Request parameters

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

Copy-icon
Response sample

{
  "id": "911fb1c8-c4fe-4a28-b305-f38f7117502f",
  "name": null,
  "applying": "AUTO",
  "entity": "PRODUCT",
  "userIds": [],
  "combination": "SUMMARIZE",
  "startDate": "10-03-2024 21:00:00",
  "endDate": null,
  "status": "ACTIVE",
  "articleIds": [
    "1001429DC",
    "1001457DC",
    "1001458DC"
  ],
  "discountType": "PERCENT",
  "discount": 55
}

Copy-icon
Response codes
  • 200 - операция выполнена успешно, получены данные скидки
  • 404 - ошибка, скидка не найдена

Получение страницы скидок с возможностью фильтрации - GET запрос, /v1/promos/page

Request parameters

page - query-параметр: номер страницы
size - query-параметр: размер страницы
sort - query-параметр: сортировка скидок
searchTerm - query-параметр: поисковый запрос пользователя
name - query-параметр: обозначение скидки
applyingSet - query-параметр: метод скидки
combinationSet - query-параметр: комбинации скидки
statusSet - query-параметр: статус скидки
discountFirstValue - query-параметр: первый числовой параметр фильтра "Скидка"
discountFirstOperator - query-параметр: первый числовой оператор фильтра "Скидка" (например, "меньше")
discountFilterConnectiveType - query-параметр: тип соединения числовых параметров фильтра "Скидка" (например, "AND" или "OR")
discountSecondValue - query-параметр: второй числовой параметр фильтра "Скидка"
discountSecondOperator - query-параметр: второй числовой оператор фильтра "Скидка" (например, "больше")
productArticleId - query-параметр: артикул продукта
variantsArticleId - query-параметр: артикул варианта продукта
userId - query-параметр: идентификатор клиента
productName - query-параметр: название продукта
variantsName - query-параметр: название варианта продукта
startDate - query-параметр: дата начала действия скидки
endDate - query-параметр: дата окончания действия скидки

Copy-icon
Response sample

{
  "content": [
    {
      "id": "e6aefb70-a231-41b7-966c-7d48d3c5cf79",
      "name": null,
      "applying": "AUTO",
      "entity": "PRODUCT",
      "userIds": [],
      "combination": "EXCLUDE",
      "startDate": null,
      "endDate": null,
      "status": "ACTIVE",
      "articleIds": [
        "1009029DC"
      ],
      "discountType": "PERCENT",
      "discount": 44
    },
    {
      "id": "cea19eb6-58d0-4014-912c-0ac1ade70ddc",
      "name": null,
      "applying": "AUTO",
      "entity": "PRODUCT",
      "userIds": [],
      "combination": "EXCLUDE",
      "startDate": null,
      "endDate": null,
      "status": "ACTIVE",
      "articleIds": [],
      "discountType": "PERCENT",
      "discount": 43
    }
  ],
  "pageable": {
    "sort": {
      "sorted": true,
      "unsorted": false,
      "empty": false
    },
    "pageSize": 2,
    "pageNumber": 0,
    "offset": 0,
    "paged": true,
    "unpaged": false
  },
  "last": true,
  "totalPages": 1,
  "totalElements": 2,
  "first": true,
  "numberOfElements": 2,
  "sort": {
    "sorted": true,
    "unsorted": false,
    "empty": false
  },
  "size": 2,
  "number": 0,
  "empty": false
}

Copy-icon
Response codes

200 - операция выполнена успешно, получена отфильтрованная страница со скидками

Получение отфильтрованного списка скидок - GET запрос, /v1/promos/list

Request parameters

page - query-параметр: номер страницы
size - query-параметр: размер страницы
sort - query-параметр: сортировка скидок
searchTerm - query-параметр: поисковый запрос пользователя
name - query-параметр: обозначение скидки
applyingSet - query-параметр: метод скидки
combinationSet - query-параметр: комбинации скидки
statusSet - query-параметр: статус скидки
discountFirstValue - query-параметр: первый числовой параметр фильтра "Скидка"
discountFirstOperator - query-параметр: первый числовой оператор фильтра "Скидка" (например, "меньше")
discountFilterConnectiveType - query-параметр: тип соединения числовых параметров фильтра "Скидка" (например, "AND" или "OR")
discountSecondValue - query-параметр: второй числовой параметр фильтра "Скидка"
discountSecondOperator - query-параметр: второй числовой оператор фильтра "Скидка" (например, "больше")
productArticleId - query-параметр: артикул продукта
variantsArticleId - query-параметр: артикул варианта продукта
userId - query-параметр: идентификатор клиента
productName - query-параметр: название продукта
variantsName - query-параметр: название варианта продукта
startDate - query-параметр: дата начала действия скидки
endDate - query-параметр: дата окончания действия скидки

Copy-icon
Response sample

[
  {
    "id": "e6aefb70-a231-41b7-966c-7d48d3c5cf79",
    "name": null,
    "applying": "AUTO",
    "entity": "PRODUCT",
    "userIds": [],
    "combination": "EXCLUDE",
    "startDate": null,
    "endDate": null,
    "status": "ACTIVE",
    "articleIds": [
      "1009029DC"
    ],
    "discountType": "PERCENT",
    "discount": 44
  },
  {
    "id": "cea19eb6-58d0-4014-912c-0ac1ade70ddc",
    "name": null,
    "applying": "AUTO",
    "entity": "PRODUCT",
    "userIds": [],
    "combination": "EXCLUDE",
    "startDate": null,
    "endDate": null,
    "status": "ACTIVE",
    "articleIds": [],
    "discountType": "PERCENT",
    "discount": 43
  }
]

Copy-icon
Response codes

200 - операция выполнена успешно, получен отфильтрованный список скидок

Создание новой скидки - POST запрос, /v1/promos

Request body sample

{
  "name": "Bestsellers 7%",
  "applying": "AUTO",
  "entity": "PRODUCT",
  "userIds": [
    "201539523727877663",
    "202010411006977567"
  ],
  "combination": "SUMMARIZE",
  "startDate": "17-08-2023 00:00:00",
  "endDate": "31-12-2023 23:59:59",
  "articleIds": [
    "1000009",
    "1000238DC"
  ],
  "discountType": "PERCENT",
  "discount": 4.99
}

Copy-icon
Response sample

{
  "id": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
  "name": "Bestsellers 7%",
  "applying": "AUTO",
  "entity": "PRODUCT",
  "userIds": [
    "201539523727877663",
    "202010411006977567"
  ],
  "combination": "SUMMARIZE",
  "startDate": "17-08-2023 00:00:00",
  "endDate": "31-12-2023 23:59:59",
  "articleIds": [
    "1000009",
    "1000238DC"
  ],
  "discountType": "PERCENT",
  "discount": 4.99
}

Copy-icon
Response codes

201 - операция выполнена успешно, скидка создана

Перезагрузка скидок из БД - POST запрос, /v1/promos/reload

Request parameters

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

Response sample

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

Response codes

201 - операция выполнена успешно

Редактирование скидки - PATCH запрос, /v1/promos/{id}

Request parameters

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

Copy-icon
Request body sample

{
  "id": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
  "name": "Bestsellers 7%",
  "applying": "AUTO",
  "entity": "PRODUCT",
  "userIds": [
    "201539523727877663",
    "202010411006977567"
  ],
  "combination": "SUMMARIZE",
  "startDate": "17-08-2023 00:00:00",
  "endDate": "31-12-2023 23:59:59",
  "articleIds": [
    "1000009",
    "1000238DC"
  ],
  "discountType": "PERCENT",
  "discount": 4.99
}

Copy-icon
Response sample

{
  "id": "4b7e6hjA-107b-476b-816a-51hh256a30d1",
  "name": "Bestsellers 7%",
  "applying": "AUTO",
  "entity": "PRODUCT",
  "userIds": [
    "201539523727877663",
    "202010411006977567"
  ],
  "combination": "SUMMARIZE",
  "startDate": "17-08-2023 00:00:00",
  "endDate": "31-12-2023 23:59:59",
  "articleIds": [
    "1000009",
    "1000238DC"
  ],
  "discountType": "PERCENT",
  "discount": 4.99
}

Copy-icon
Response codes

200 - операция выполнена успешно, скидка обновлена

Удаление скидки - DELETE запрос, /v1/promos/{id}

Request parameters

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

Copy-icon
Response sample

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

Response codes
  • 204 - операция выполнена успешно, скидка удалена
  • 404 - ошибка, скидка не найдена

Работа с калькулятором скидок

Расчет стоимости товаров с учетом скидки - POST запрос, /v1/promo-calculate/products

Request body sample

{
  "articleId": "1009029DC", // id товара
  "quantity": 10, // количество товара
  "unitPrice": 10, // цена на одну единицу товара
  "price": 100, // стоимость всего количества товара
  "currencyId": "b7843131-85ae-454b-a116-794b64435eca" // id валюты, в которой исчисляется цена
}

Copy-icon
Response sample

{
  "articleId": "1009029DC",
  "quantity": 10,
  "unitPrice": 10,
  "discountUnitPrice": 8, // цена со скидкой на единицу товара
  "price": 100,
  "discountPrice": 80, // стоимость всего количества товара с учетом скидки
  "discountSum": 20, // величина скидки на весь товар
  "currencyId": "b7843131-85ae-454b-a116-794b64435eca"
}

Copy-icon
Response codes

200 - операция выполнена успешно, скидка для продукта/варианта продукта рассчитана

Связанные статьи

 Микросервисы