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

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

Микросервис user-orchestration предоставляет функциональность для управления клиентами интернет-магазина (получение списка пользователей, а также их создание и редактирование).

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

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

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

  • User - возвращает информацию о пользователе WebShop (id пользователя, имя, фамилия, телефон, электронная почта, пол, дата и время регистрации, адрес)
  • Address - возвращает информацию о адресе доставки пользователя (id адреса, имя, фамилия, компания, улица, город, индекс и страна получателя заказа)
  • InitiateUserCreationRequest - используется для создания временного пользователя во время регистрации
  • UserAccount - модель, возвращающая информацию об аккаунте пользователя

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

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

Авторизация Copy-icon

Для работы с микросервисом у пользователя должна быть роль Admin или Admin_User. Подробнее о ролях пользователей можно узнать здесь.

Service context path Copy-icon

/api/user-orchestration/

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

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

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

По умолчанию

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

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


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

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


{
  "env": {
   "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",
    "OTP_VERIFIER_URL": "url_доступа_к_сервису_otp-verifier",
    "USER_URL": "url_доступа_к_сервису_user",
    "ZITADEL_SERVICE_USER_TOKEN": "url_доступа_к_Zitadel",
    "ZITADEL_SYNC_USER_ENABLED": "включение_синхроинзации_пользователей_Zitadel",
    "ZITADEL_URL": "url_доступа_к_Zitadel"
  }
}




Copy-icon

Получение страницы со списком пользователей (с возможностью пагинации и фильтрации) - GET запрос, /v1/users

Request parameters

searchTerm - query-параметр: поисковый запрос
id - query-параметр: ID пользователя
firstName - query-параметр: имя пользователя
lastName - query-параметр: фамилия пользователя
email - query-параметр: электронная почта пользователя
registrationTime - query-параметр: дата регистрации пользователя
phone - query-параметр: телефон пользователя
page - query-параметр: номер страницы
size - query-параметр: количество отображаемых на странице элементов
sort - query-параметр: сортировка элементов на странице


Copy-icon
Response sample

{
  "content": [
    {
      "id": "227475699168995079",
      "firstName": "Иван",
      "lastName": "Жуков",
      "email": "ivan@mail.ru",
      "gender": "ANONYMOUS",
      "registrationTime": "2023-08-15T06:54:59.407",
      "registrationCompleted": true,
      "addressDto": {
        "id": "69",
        "firstName": "Иван",
        "lastName": "Жуков",
        "company": "МКомпаниТест",
        "address": "ул. Большая Якиманка, 30",
        "city": "Москва",
        "zipCode": "110180",
        "poBox": "22",
        "country": "Россия"
      }
    },
    {
      "id": "227486618502588167",
      "firstName": "Мария",
      "lastName": "Иванова",
      "phone": "+375298088880",
      "email": "ivanova1@pochta.ru",
      "gender": "ANONYMOUS",
      "registrationTime": "2023-08-15T08:38:55.639",
      "registrationCompleted": true,
      "addressDto": {
        "id": "77",
        "firstName": "Мария",
        "lastName": "Иванова",
        "company": "ООО \"ТэкнолоджиСервис\"",
        "address": "Брестская",
        "city": "Минск",
        "zipCode": "220415",
        "poBox": "12345678",
        "country": "Беларусь"
      }
    }
  ],
  "pageable": {
    "sort": {
      "sorted": false,
      "unsorted": true,
      "empty": true
    },
    "pageNumber": 0,
    "pageSize": 10,
    "offset": 0,
    "paged": true,
    "unpaged": false
  },
  "last": false,
  "totalPages": 4,
  "totalElements": 35,
  "first": true,
  "numberOfElements": 2,
  "sort": {
    "sorted": false,
    "unsorted": true,
    "empty": true
  },
  "size": 10,
  "number": 0,
  "empty": false
}

Copy-icon
Response codes

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

Получение отфильтрованного/отсортированного списка пользователей интернет-магазина - POST запрос, /v1/users/list

Request body sample

{
    "page": 3,
    "size": 10,
    "sort": [
        {
            "sortBy": "id",
            "direction": "asc"
        }
    ],
    "filter": {}
}

Copy-icon
Response sample

{
    "content": [
        {
            "id": "209543151025677842",
            "firstName": "Петр",
            "lastName": "Фоменко",
            "phone": "1",
            "email": "al24@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-13T13:44:47.961",
            "registrationCompleted": true,
            "addressDto": {
                "id": "149",
                "firstName": "Петр",
                "lastName": "Фоменко",
                "company": "1",
                "address": "1",
                "city": "1",
                "zipCode": "1",
                "poBox": "1",
                "country": "1"
            }
        },
        {
            "id": "209543279992137234",
            "firstName": "Петр",
            "lastName": "Семенов",
            "phone": "1",
            "email": "al25@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-13T13:46:07.065",
            "registrationCompleted": true,
            "addressDto": {
                "id": "154",
                "firstName": "Петр",
                "lastName": "Семенов",
                "company": "1",
                "address": "1",
                "city": "1",
                "zipCode": "1",
                "poBox": "1",
                "country": "1"
            }
        },
        {
            "id": "209543410065892882",
            "firstName": "Василина",
            "lastName": "Фоменко",
            "phone": "+375291112233",
            "email": "al26@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-13T13:47:15.401",
            "registrationCompleted": true,
            "addressDto": {
                "id": "159",
                "firstName": "Василина",
                "lastName": "Фоменко",
                "company": "1",
                "address": "1",
                "city": "1",
                "zipCode": "1",
                "poBox": "1",
                "country": "1"
            }
        },
        {
            "id": "209543524218070546",
            "firstName": "Сергей",
            "lastName": "Фоменко",
            "phone": "1",
            "email": "al27@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-13T13:48:29.378",
            "registrationCompleted": true,
            "addressDto": {
                "id": "164",
                "firstName": "Сергей",
                "lastName": "Фоменко",
                "company": "1",
                "address": "1",
                "city": "1",
                "zipCode": "1",
                "poBox": "1",
                "country": "1"
            }
        },
        {
            "id": "209543658351912466",
            "firstName": "Николай",
            "lastName": "Макаров",
            "phone": "1",
            "email": "al28@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-13T13:49:52.897",
            "registrationCompleted": true,
            "addressDto": {
                "id": "169",
                "firstName": "Николай",
                "lastName": "Макаров",
                "company": "1",
                "address": "1",
                "city": "1",
                "zipCode": "1",
                "poBox": "1",
                "country": "1"
            }
        },
        {
            "id": "209543784315250194",
            "firstName": "Кирилл",
            "lastName": "Семенов",
            "phone": "1",
            "email": "al29@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-13T13:51:08.2",
            "registrationCompleted": true,
            "addressDto": {
                "id": "174",
                "firstName": "Кирилл",
                "lastName": "Семенов",
                "company": "1",
                "address": "1",
                "city": "1",
                "zipCode": "1",
                "poBox": "1",
                "country": "1"
            }
        },
        {
            "id": "209543914271565330",
            "firstName": "Олег",
            "lastName": "Никифоров",
            "phone": "1",
            "email": "al30@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-13T13:52:20.375",
            "registrationCompleted": true,
            "addressDto": {
                "id": "179",
                "firstName": "Олег",
                "lastName": "Никифоров",
                "company": "1",
                "address": "1",
                "city": "1",
                "zipCode": "1",
                "poBox": "1",
                "country": "1"
            }
        },
        {
            "id": "209546030029497874",
            "firstName": "Иван Жуков",
            "lastName": "Жуков",
            "phone": "+7 495 777-17-17",
            "email": "al40@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-13T14:15:27.325",
            "registrationCompleted": true,
            "addressDto": {
                "id": "184",
                "firstName": "Иван Жуков",
                "lastName": "Жуков",
                "company": "\"Доставка на дом\"",
                "address": "Новая",
                "city": "Москва",
                "zipCode": "158",
                "poBox": "15848",
                "country": "Россия"
            }
        },
        {
            "id": "210579427229197842",
            "firstName": "Иван",
            "lastName": "Жуков",
            "phone": "+74994033206",
            "email": "al5@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-20T17:21:12.82",
            "registrationCompleted": true,
            "addressDto": {
                "id": "198",
                "firstName": "Иван",
                "lastName": "Жуков",
                "company": "Макроторг",
                "address": "Лесная",
                "city": "Москва",
                "zipCode": "7896756",
                "poBox": "123456",
                "country": "РФ"
            }
        },
        {
            "id": "210682325971789330",
            "firstName": "Иван",
            "lastName": "Жуков",
            "phone": "+7 499 403 32 05",
            "email": "al5@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-21T10:22:54.565",
            "registrationCompleted": true,
            "addressDto": {
                "id": "203",
                "firstName": "Иван",
                "lastName": "Жуков",
                "company": "СДЕК",
                "address": "ЛЕсная",
                "city": "Москва",
                "zipCode": "76545",
                "poBox": "123456",
                "country": "Рф"
            }
        }
    ],
    "number": 3,
    "size": 10,
    "totalElements": 100,
    "pageable": {
        "sort": {
            "sorted": false,
            "unsorted": true,
            "empty": true
        },
        "pageNumber": 3,
        "pageSize": 10,
        "offset": 30,
        "paged": true,
        "unpaged": false
    },
    "last": false,
    "totalPages": 10,
    "sort": {
        "sorted": false,
        "unsorted": true,
        "empty": true
    },
    "first": false,
    "numberOfElements": 10,
    "empty": false
}

Copy-icon
Response codes

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

Получение пользователя по его ID - GET запрос, /v1/users/{id}

Request parameters

id - path-параметр, обязательный: ID пользователя


Copy-icon
Response sample

{
    "id": "209543410065892882",
    "firstName": "Василина",
    "lastName": "Фоменко",
    "phone": "1",
    "email": "al26@digitalchief.ru",
    "gender": "ANONYMOUS",
    "registrationTime": "2023-04-13T13:47:15.401",
    "registrationCompleted": true,
    "addressDto": {
        "id": "159",
        "firstName": "Василина",
        "lastName": "Фоменко",
        "company": "1",
        "address": "1",
        "city": "1",
        "zipCode": "1",
        "poBox": "1",
        "country": "1"
    }
}

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

Получение данных аккаунта пользователя из e-com - GET запрос, /v1/users/account

Request parameters

userId - query-параметр: идентификатор пользователя

Copy-icon
Response sample

{
    "externalId": "227485734292973074",
    "email": "ivanova@pochta.ru",
    "firstName": "Ольга",
    "lastName": "Иванова",
    "phone": null,
    "gender": "ANONYMOUS"
}

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

Изменение данных пользователя - PATCH запрос, /v1/users/{id}

Request parameters

id - path-параметр, обязательный: ID пользователя


Copy-icon
Request body sample

{
    "id": "261852074277365266",
    "lastName": "Огуречкин",
    "addressDto": {
        "id": "769",
        "firstName": "Глеб",
        "lastName": "Огурцов",
        "company": "Крайнет",
        "address": "Центральная",
        "city": "Минск",
        "zipCode": "123456",
        "poBox": "11234",
        "country": "Беларусь"
    }
}

Copy-icon
Response sample

{
    "id": "261852074277365266",
    "firstName": "Глеб",
    "lastName": "Огуречкин",
    "phone": null,
    "email": "ogurcov@pochta.ru",
    "gender": "ANONYMOUS",
    "registrationTime": "2024-04-08T10:32:09.257",
    "registrationCompleted": true,
    "addressDto": {
        "id": "769",
        "firstName": "Глеб",
        "lastName": "Огурцов",
        "company": "Крайнет",
        "address": "Центральная",
        "city": "Минск",
        "zipCode": "123456",
        "poBox": "11234",
        "country": "Беларусь"
    }
}

Copy-icon

Response codes:

  • 200 - операция выполнена успешно, данные о клиенте обновлены
  • 404 - ошибка, клиент с таким ID не найден
  • 422 - ошибка, отсутствуют обязательные данные

Создание нового пользователя - POST запрос, /v1/users

Request body sample

{
            "id": "208084200379672082",
            "firstName": "Иван",
            "lastName": "Иванов",
            "phone": "123",
            "email": "al3@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-03T12:15:23.02",
            "registrationCompleted": true,
            "addressDto": {
                "id": "43",
                "firstName": "Иван",
                "lastName": "Иванов",
                "company": "CompanyCO",
                "address": "Длинная",
                "city": "Москва",
                "zipCode": "12",
                "poBox": "1235",
                "country": "Россия"
            }
        }

Copy-icon
Response sample

{
            "id": "208084200379672082",
            "firstName": "Иван",
            "lastName": "Иванов",
            "phone": "123",
            "email": "al3@digitalchief.ru",
            "gender": "ANONYMOUS",
            "registrationTime": "2023-04-03T12:15:23.02",
            "registrationCompleted": true,
            "addressDto": {
                "id": "43",
                "firstName": "Иван",
                "lastName": "Иванов",
                "company": "CompanyCO",
                "address": "Длинная",
                "city": "Москва",
                "zipCode": "12",
                "poBox": "1235",
                "country": "Россия"
            }
        }

Copy-icon
Response codes
  • 201 - операция выполнена успешно, пользователь создан
  • 409 - ошибка, пользователь с таким id уже существует
  • 422 - ошибка, отсутствует обязательная информация

Запуск регистрации пользователя - POST запрос, /v1/users/initiate

Request body sample

{
  "externalId": "261974313576457746",
  "email": "lenina@pochta.ru"
}

Copy-icon
Response sample

{
    "id": "261974313576457746",
    "firstName": null,
    "lastName": null,
    "phone": null,
    "email": "lenina@pochta.ru",
    "gender": "ANONYMOUS",
    "registrationTime": null,
    "registrationCompleted": false,
    "addressDto": {
        "id": "774",
        "firstName": null,
        "lastName": null,
        "company": null,
        "address": null,
        "city": null,
        "zipCode": null,
        "poBox": null,
        "country": null
    }
}

Copy-icon
Response codes
  • 201 - операция выполнена успешно, запущен процесс регистрации пользователя
  • 409 - ошибка, пользователь с таким id уже существует
  • 422 - ошибка, отсутствуют обязательные данные

Обновление данных пользователя во время регистрации - PATCH запрос, /v1/users/initiate/{id}

Request parameters

id - path-параметр, обязательный: ID пользователя


Copy-icon
Request body sample

{
    "id": "261849634668832274",
    "firstName": "",
    "lastName": "",
    "phone": "",
    "email": "belov@pochta.ru",
    "gender": "ANONYMOUS",
    "registrationTime": null,
    "registrationCompleted": false,
    "addressDto": {
        "id": "764",
        "firstName": "Геннадий",
        "lastName": "Белов",
        "company": "Крайнет",
        "address": "Центральная",
        "city": null,
        "zipCode": "220112",
        "poBox": "12345",
        "country": "Беларусь"
    }
}

Copy-icon
Response sample

{
    "id": "261849634668832274",
    "firstName": "Геннадий",
    "lastName": "Белов",
    "phone": null,
    "email": "belov@pochta.ru",
    "gender": "ANONYMOUS",
    "registrationTime": null,
    "registrationCompleted": false,
    "addressDto": {
        "id": "764",
        "firstName": "Геннадий",
        "lastName": "Белов",
        "company": "Крайнет",
        "address": "Центральная",
        "city": null,
        "zipCode": "220112",
        "poBox": "12345",
        "country": "Беларусь"
    }
}

Copy-icon

Response codes:

  • 200 - операция выполнена успешно, данные пользователяобновлены
  • 404 - ошибка, пользователь с таким ID не найден
  • 422- ошибка, отсутствуют обязательные данные

Завершение регистрации пользователя - POST запрос, /v1/users/{id}/finalize

Request parameters

id - path-параметр, обязательный: ID пользователя


Copy-icon
Request body sample

{
    "id": "261849634668832274",
    "firstName": "Геннадий",
    "lastName": "Белов",
    "phone": null,
    "email": "belov@pochta.ru",
    "gender": "ANONYMOUS",
    "registrationTime": "2024-04-08T10:02:51.765",
    "registrationCompleted": true,
    "addressDto": {
        "id": "764",
        "firstName": "Геннадий",
        "lastName": "Белов",
        "company": "Крайнет",
        "address": "Центральная",
        "city": "Минск",
        "zipCode": "220112",
        "poBox": "12345",
        "country": "Беларусь"
    }
}

Copy-icon
Response sample

{
    "id": "261849634668832274",
    "firstName": "Геннадий",
    "lastName": "Белов",
    "phone": null,
    "email": "belov@pochta.ru",
    "gender": "ANONYMOUS",
    "registrationTime": "2024-04-08T10:02:51.765",
    "registrationCompleted": true,
    "addressDto": {
        "id": "764",
        "firstName": "Геннадий",
        "lastName": "Белов",
        "company": "Крайнет",
        "address": "Центральная",
        "city": "Минск",
        "zipCode": "220112",
        "poBox": "12345",
        "country": "Беларусь"
    }
}

Copy-icon

Response codes:

  • 200 - операция выполнена успешно
  • 201 - операция выполнена успешно, создание пользователя завершено
  • 422 - ошибка, отсутствуют обязательные данные