Микросервис cart
Микросервис cart предоставляет функционал по работе с корзиной:
- создание корзины
- добавление/удаление товара в/из корзины
- обновление корзины
- отображение страницы со списком всех корзин
Доступ к сервису предоставляется по запросу.
Логика работы
В работе микросервиса участвуют следующие сущности:
- Корзина (Cart) - содержит данные конкретной корзине (id корзины, id пользователя, id валюты, список товаров в корзине)
- Товар в корзине (CartItem) - содержит данные о товарах в конкретной корзине (id товара, количество товара в штуках, название товара, цена за одну штуку, цена со скидкой за 1 штуку, итоговая цена товара с учетом его количества, итоговая цена товара с учетом скидки, итоговая скидка и др.)
Аутентификация
При обращении к микросервису cart через API в запросах на отображение страницы со списком корзин (GET /v1/carts) необходимо в заголовке Authorization указывать токен: Authorization: Bearer
<токен>
.
Для остальных запросов аутентификация не нужна.
Авторизация
Для работы с разделом “Корзины” в BackOffice у пользователя должна быть роль Admin и/или Admin_Cart.
Подробнее о ролях можно узнать здесь.
Service context path
/api/cart/
Настройки и параметры конфигурации
Параметры конфигурации указываются в Vault.
Vault используется на нашей платформе в качестве хранилища всех конфигураций развертывания.
{
"env": {
"JAVA_XMS": "XXm",
"JAVA_XMX": "YYYm",
"POSTGRES_DATABASE": "cart",
"POSTGRES_MIGRATION_USER": "cart_migration",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "cart_user"
}
}
// пример взят с тестового стенда
{
"env": {
"OAUTH_ECOM_CLIENT_ID": "токен_приложения_ECOM_OAuth",
"OAUTH_ZITADEL_CLIENT_ID": "токен_приложения_Zitadel",
"OAUTH_ZITADEL_ISSUER_URI": "url_Zitadel",
"POSTGRES_HOST": "адрес_хоста",
"POSTGRES_MIGRATION_PASSWORD": "пароль",
"POSTGRES_PASSWORD": "пароль"
}
}
Методы микросервиса
Работа с корзинами
- Получение списка корзин (с пагинацией) - GET запрос, /v1/carts
page - query-параметр: номер страницы
size
- query-параметр: количество отображаемых на странице элементов
sort - query-параметр: сортировка элементов на странице
{
"content": [
{
"id": "1-31102023000008",
"customerId": "202277231504942610",
"currencyId": "0a46630e-76d7-4eb3-b12a-79317dc871d7",
"items": []
},
{
"id": "1-31102023000009",
"customerId": "202277231504942610",
"currencyId":
"df76baa7-93a2-458a-9ae5-240d67eb427f",
"items": [
{
"id":
"5f635a37-013b-406d-bdbe-0b7576643c50",
"articleId": "1000002",
"quantity": 1.00,
"unitPrice":
25.00,
"discountUnitPrice":
25.00,
"totalPrice":
25.00,
"discountPrice":
25.00,
"discountSum":
0.00
}
]
},
{
"id":
"1-31102023000010",
"customerId": "202277231504942610",
"currencyId": "5947d0e8-550e-4b50-ab80-b165d03bacd0",
"items": [
{
"id":
"3bf2b2c5-d34b-4c62-8bd2-30a2e5826836",
"articleId": "1000005",
"quantity": 1.00,
"unitPrice":
20.00,
"discountUnitPrice":
9.40,
"totalPrice":
20.00,
"discountPrice":
9.40,
"discountSum":
10.60
}
]
},
{
"id":
"1-31102023000011",
"customerId": "202277231504942610",
"currencyId": "df76baa7-93a2-458a-9ae5-240d67eb427f",
"items": []
}
],
"pageable": {
"sort": {
"unsorted": true,
"sorted": false,
"empty": true
},
"pageNumber": 0,
"pageSize": 4,
"offset": 0,
"unpaged": false,
"paged": true
},
"last": false,
"totalPages": 1644,
"totalElements":
6574,
"first": true,
"numberOfElements": 4,
"sort":
{
"unsorted":
true,
"sorted":
false,
"empty":
true
},
"size": 4,
"number": 0,
"empty": false
}
200 - операция успешно выполнена, получена страница со списком корзин
- Получение корзины по ее ID - GET запрос, /v1/carts/{id}
id - path-параметр, обязательный: уникальный
идентификатор корзины
{
"id":
"1-31102023000010",
"customerId":
"202277231504942610",
"currencyId":
"5947d0e8-550e-4b50-ab80-b165d03bacd0",
"items": [
{
"id":
"3bf2b2c5-d34b-4c62-8bd2-30a2e5826836",
"articleId": "1000005",
"quantity": 1,
"unitPrice":
20,
"discountUnitPrice":
9.4,
"totalPrice": 20,
"discountPrice": 9.4,
"discountSum": 10.6
}
]
}
- 200 - операция успешно выполнена, получены данные корзины
- 404 - ошибка, корзина не найдена
- Создание корзины - POST запрос, /v1/carts
{
"customerId":
"4b7e6hjA-107b-476b-816a-51hh256a30d1",
"currencyId":
"0d449436-2702-4051-8a85-e3ec5b645959",
"items": [
{
"id":
"2e5c9ba8-956e-476b-816a-49ee128a40c9",
"articleId": "100340DC",
"quantity": 4,
"name":
"Футболка мужская",
"unitPrice":
1050.25,
"discountUnitPrice":
950.25,
"totalPrice": 4201,
"discountPrice": 999.9,
"discountSum": 10.1
}
]
}
{
"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": "100340DC",
"quantity": 4,
"name":
"Футболка мужская",
"unitPrice":
1050.25,
"discountUnitPrice":
950.25,
"totalPrice": 4201,
"discountPrice": 999.9,
"discountSum": 10.1
}
]
}
201 - операция успешно выполнена, корзина создана
- Удаление корзины по ее ID - DELETE запрос, /v1/carts/{id}
id - path-параметр, обязательный: уникальный
идентификатор корзины
Отсутствует. В ответе приходит только код операции, например, 204.
- 204 - операция успешно выполнена, корзина удалена
- 404 - ошибка, корзина с таким ID не найдена
- Обновление корзины - PATCH, запрос /v1/carts/{id}
id - path-параметр, обязательный: уникальный
идентификатор корзины
{
"cart": {
"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": "100340DC",
"quantity": 4,
"name": "Футболка мужская",
"unitPrice": 1050.25,
"discountUnitPrice":
950.25,
"totalPrice":
4201,
"discountPrice":
999.9,
"discountSum":
10.1
}
]
},
"customerId":
"4b7e6hjA-107b-476b-816a-51hh256a30d1"
}
{
"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": "100340DC",
"quantity": 4,
"name":
"Футболка мужская",
"unitPrice":
1050.25,
"discountUnitPrice":
950.25,
"totalPrice": 4201,
"discountPrice": 999.9,
"discountSum": 10.1
}
]
}
- 200 - операция выполнена успешно, корзина обновлена
- 403 - ошибка, обновление запрещено (например, корзина принадлежит иному пользователю)
- 404 - ошибка, корзина с указанным ID не найдена
Работа с товарами в корзине
- Получение данных конкретного товара в конкретной корзине (по ID корзины и товара) - GET запрос, /v1/carts/{id}/items/{itemId}
id - path-параметр, обязательный: уникальный
идентификатор корзины
itemId - path-параметр, обязательный:
уникальный идентификатор товара
{
"id":
"3bf2b2c5-d34b-4c62-8bd2-30a2e5826836",
"articleId":
"1000005",
"quantity": 1,
"unitPrice": 20,
"discountUnitPrice": 9.4,
"totalPrice": 20,
"discountPrice":
9.4,
"discountSum": 10.6
}
- 200 - операция успешно выполнена, получены данные товары
- 404 - ошибка, товар с таким itemId не найден
- Получение данных конкретного товара в конкретной корзине (по ID корзины и артикулу товара) - GET запрос, /v1/carts/{id}/items/by-article-id/{articleId}
id - path-параметр, обязательный: уникальный
идентификатор корзины
articleId - path-параметр, обязательный:
артикул товара
{
"id":
"3bf2b2c5-d34b-4c62-8bd2-30a2e5826836",
"articleId":
"1000005",
"quantity": 1,
"unitPrice": 20,
"discountUnitPrice": 9.4,
"totalPrice": 20,
"discountPrice":
9.4,
"discountSum": 10.6
}
- 200 - операция успешно выполнена, получены данные товары
- 404 - ошибка, товар не найден
- Создание позиции в корзине - POST запрос, /v1/carts/{id}/items
id - path-параметр, обязательный: уникальный
идентификатор корзины
{
"id":
"2e5c9ba8-956e-476b-816a-49ee128a40c9",
"articleId":
"100430DC",
"quantity": 4,
"name":
"Майка спортивная",
"unitPrice": 1050.25,
"discountUnitPrice": 950.25,
"totalPrice": 4201,
"discountPrice": 999.9,
"discountSum": 10.1
}
{
"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": "100430DC",
"quantity": 4,
"name":
"Майка спортивная",
"unitPrice":
1050.25,
"discountUnitPrice":
950.25,
"totalPrice": 4201,
"discountPrice": 999.9,
"discountSum": 10.1
}
]
}
- 200 - товар уже находился в корзине, было обновлено количество товара
- 201 - операция успешна, позиция добавлена в корзину
- 404 - ошибка, корзина не найдена.
- 409 - ошибка, позиция с данным articleId уже существует
- Обновление товара в корзине - PATCH запрос, /v1/carts/{id}/items
id - path-параметр, обязательный: уникальный
идентификатор корзины
{
"id": "2e5c9ba8-956e-476b-816a-49ee128a40c9",
"articleId": "100430DC",
"quantity": 4,
"name": "Майка спортивная",
"unitPrice": 1050.25,
"discountUnitPrice": 950.25,
"totalPrice": 4201,
"discountPrice": 999.9,
"discountSum": 10.1
}
{
"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": "100430DC",
"quantity": 4,
"name": "Майка спортивная",
"unitPrice": 1050.25,
"discountUnitPrice": 950.25,
"totalPrice": 4201,
"discountPrice": 999.9,
"discountSum": 10.1
}
]
}
- 200 - операция успешно выполнена, товар обновлен в корзине
- 404 - ошибка, товар не найден
- 422 - ошибка, отсутствуют обязательные данные
- Удаление товара из корзины - DELETE запрос, /v1/carts/{id}/items/{itemId}
id - path-параметр, обязательный: уникальный идентификатор корзины
itemId - path-параметр, обязательный: уникальный идентификатор товара
Отсутствует. В ответе приходит только код операции, например, 204.
- 204 - операция выполнена успешно, товар удален из корзины
- 404 - ошибка, товар или корзина не найдены