REST-сервис meta-data-driven¶
Модуль предназначен для получения .JSON-файлов от других информационных систем в свободной структуре данных и загрузки данных в Юниверс MDM уже в требуемой для системы структуре. Иными словами, модуль помогает избегать этапа ручной переработки структуры JSON в структуру, используемую Юниверс MDM.
.JSON-файлы могут приходить от информационной системы любого вида. Структура данных .JSON может быть любой.
В результате работы запросов meta-data-driven структура данных JSON трансформируется в структуру, требуемую для корректной загрузки данных в Юниверс MDM.
Перечень запросов:
Схема данных:
Работа с данными:
Базовый URL запросов: http://localhost:9080/unidata-backend/api/
URL для Swagger: http://<хост>:<порт>/universe-backend/api/meta-data-driven/v1/api-docs?url=/universe-backend/api/meta-data-driven/v1/openapi.json#/Data%20schema/batchRequestSchema
Аутентификация¶
Все запросы требуют указания токена аутентификации. Для получения токена нужно выполнить следующий POST-запрос:
{
"userName": имя пользователя,
"password": пароль,
"locale": локализация
}
Путь запроса: http://localhost:9080/unidata-backend/api/v2/core/authentication/login
Пример запроса:
curl -X 'POST' \
'http://localhost:9080/unidata-backend/api/v2/core/authentication/login' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"userName": "admin",
"password": "admin",
"locale": "ru"
}'
Пример ответа:
{
"token": "b2682a43-010f-46eb-a82a-43010f66eb1f"
}
Схема данных¶
Данные имеют динамическую структуру, зависящую от модели данных. Для получения структуры данных сервис предоставляет JSON схемы входящих/исходящих записей.
Схема входящих записей¶
Метод: GET
Путь запроса: /meta-data-driven/v1/schema/input/COUNTRY
Пример запроса:
curl -X 'GET' \
'http://localhost:9081/unidata-backend/api/meta-data-driven/v1/schema/input/COUNTRY' \
-H 'accept: application/json' \
-H 'Authorization: fdff3b9d-87b3-4a57-bf3b-9d87b33a5783'
Пример ответа HTTP 200:
{
"$id": "/meta-data-driven/v1/schema/input/COUNTRY",
"$schema": "http://json-schema.org/draft-07/schema",
"description": "Страны",
"type": "object",
"properties": {
"externalId": {
"type": "string"
},
"sourceSystem": {
"type": "string"
},
"patch": {
"type": "boolean"
},
"attributes": {
"type": "object",
"description": "Страны",
"properties": {
"KOD": {
"type": "string",
"description": "Код страны ISO"
},
"NAME": {
"type": "string",
"description": "Краткое наименование"
},
"FULL_NAME": {
"type": "string",
"description": "Полное наименование"
},
"ENG_NAME": {
"type": "string",
"description": "Английское наименование"
}
},
"required": [
"KOD",
"NAME"
]
}
}
}
Схема исходящих записей¶
Метод: GET
Путь запроса: /meta-data-driven/v1/schema/output/COUNTRY
Пример запроса:
curl -X 'GET' \
'http://localhost:9081/unidata-backend/api/meta-data-driven/v1/schema/output/COUNTRY' \
-H 'accept: application/json' \
-H 'Authorization: fdff3b9d-87b3-4a57-bf3b-9d87b33a5783'
Пример ответа HTTP 200:
{
"$id": "/meta-data-driven/v1/schema/output/COUNTRY",
"$schema": "http://json-schema.org/draft-07/schema",
"type": "object",
"properties": {
"etalonId": {
"type": "string"
},
"entityName": {
"type": "string"
},
"externalKey": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"sourceSystem": {
"type": "string"
}
}
},
"attributes": {
"type": "object",
"description": "Страны",
"properties": {
"KOD": {
"type": "string",
"description": "Код страны ISO"
},
"NAME": {
"type": "string",
"description": "Краткое наименование"
},
"FULL_NAME": {
"type": "string",
"description": "Полное наименование"
},
"ENG_NAME": {
"type": "string",
"description": "Английское наименование"
}
},
"required": [
"KOD",
"NAME"
]
}
}
}
Схема batch-запроса¶
Batch-запрос реализует сохранение списка записей. Схема описывает структуру запроса для batch-запроса сохранения.
Метод: GET
Путь запроса: /meta-data-driven/v1/schema/batch-request
Пример запроса:
curl -X 'GET' \
'http://localhost:9081/unidata-backend/api/meta-data-driven/v1/schema/batch-request' \
-H 'accept: application/json' \
-H 'Authorization: fdff3b9d-87b3-4a57-bf3b-9d87b33a5783'
Пример ответа HTTP 200:
{
"$id": "/meta-data-driven/v1/schema/batch-request",
"$schema": "http://json-schema.org/draft-07/schema",
"type": "object",
"properties": {
"resolveResult": {
"type": "boolean"
},
"records": {
"type": "object",
"properties": {
"OKV_S": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/OKV_S"
}
},
"ContactType": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/ContactType"
}
},
"COUNTRY": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/COUNTRY"
}
},
"OKEI_S": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/OKEI_S"
}
},
"OKOPF": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/OKOPF"
}
},
"OKVED": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/OKVED"
}
},
"OKFS": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/OKFS"
}
},
"cars": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/cars"
}
},
"Legal_Entity": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/Legal_Entity"
}
},
"Person": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/Person"
}
},
"article": {
"type": "array",
"items": {
"$ref": "/meta-data-driven/v1/schema/input/article"
}
}
}
}
}
}
Схема batch-ответа¶
Метод: GET
Путь запроса: /meta-data-driven/v1/schema/batch-response
Пример ответа HTTP 200:
{
"$id": "/meta-data-driven/v1/schema/batch-response",
"$schema": "http://json-schema.org/draft-07/schema",
"type": "object",
"properties": {
"records": {
"type": "object",
"properties": {
"OKV_S": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/OKV_S"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"ContactType": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/ContactType"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"COUNTRY": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/COUNTRY"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"OKEI_S": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/OKEI_S"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"OKOPF": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/OKOPF"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"OKVED": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/OKVED"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"OKFS": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/OKFS"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"cars": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/cars"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"Legal_Entity": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/Legal_Entity"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"Person": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/Person"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"article": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"$ref": "/meta-data-driven/v1/schema/output/article"
},
"details": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
}
Работа с данными¶
Сохранение единичной записи¶
Метод: POST
Путь запроса: /meta-data-driven/v1/data/{entity-name}
Пример запроса:
curl -X 'POST' \
'http://localhost:9081/unidata-backend/api/meta-data-driven/v1/data/OKOPF' \
-H 'accept: application/json' \
-H 'Authorization: fae5b2f0-2b1c-42db-a5b2-f02b1c52dbcd' \
-H 'Content-Type: application/json' \
-d '{
"externalId": "my_unique_id_2",
"attributes": {
"KOD": 99998,
"IS_ACTUAL": true,
"NAME": "Наименование"
}
}'
Пример ответа HTTP 200:
{
"record": {
"etalonId": "40c8610a-755f-11ed-9fbd-73aae866f4c6",
"entityName": "OKOPF",
"externalKey": {
"id": "my_unique_id_2",
"sourceSystem": "unidata"
},
"attributes": {
"KOD": 99998,
"IS_ACTUAL": true,
"NAME": "Наименование"
},
"relations": null
},
"details": []
}
Batch сохранение¶
Метод: POST
Пример запроса:
curl -X 'POST' \
'http://localhost:9081/unidata-backend/api/meta-data-driven/v1/data/save-batch' \
-H 'accept: application/json' \
-H 'Authorization: fdff3b9d-87b3-4a57-bf3b-9d87b33a5783' \
-H 'Content-Type: application/json' \
-d '{
"records": {
"OKOPF": [
{
"externalId": "my_unique_id",
"attributes": {
"KOD": 99999,
"IS_ACTUAL": true,
"NAME": "Наименование"
}
}
]
},
"resolveResult": true
}'
Пример ответа HTTP 200:
{
"records": {
"OKOPF": [
{
"record": {
"etalonId": "1bc560e6-755a-11ed-be37-73aae866f4c6",
"entityName": "OKOPF",
"externalKey": {
"id": "my_unique_id",
"sourceSystem": "unidata"
},
"attributes": {
"KOD": 99999,
"IS_ACTUAL": true,
"NAME": "Наименование"
},
"relations": null
},
"details": []
}
]
}
}
Запрос записи по внешнему ключу¶
Метод: GET
Путь запроса: /meta-data-driven/v1/data/{entity-name}/{source-system}/{external-id}
Пример запроса:
curl -X 'GET' \
'http://localhost:9081/unidata-backend/api/meta-data-driven/v1/data/OKOPF/unidata/eid_1' \
-H 'accept: application/json' \
-H 'Authorization: fdff3b9d-87b3-4a57-bf3b-9d87b33a5783'
Пример ответа HTTP 200:
{
"etalonId": "dcb81331-7165-11ed-969f-73aae866f4c6",
"entityName": "OKOPF",
"externalKey": {
"id": "eid_1",
"sourceSystem": "unidata"
},
"attributes": {
"KOD": 10001,
"IS_ACTUAL": true,
"NAME": "Наименование"
},
"relations": null
}
Запрос записи по эталонному ключу¶
Метод: GET
Путь запроса: /meta-data-driven/v1/data/{entity-name}/{etalon-id}
Пример запроса:
curl -X 'GET' \
'http://localhost:9081/unidata-backend/api/meta-data-driven/v1/data/OKOPF/dcb81331-7165-11ed-969f-73aae866f4c6' \
-H 'accept: application/json' \
-H 'Authorization: fdff3b9d-87b3-4a57-bf3b-9d87b33a5783'
Пример ответа HTTP 200:
{
"etalonId": "dcb81331-7165-11ed-969f-73aae866f4c6",
"entityName": "OKOPF",
"externalKey": {
"id": "eid_1",
"sourceSystem": "unidata"
},
"attributes": {
"KOD": 10001,
"IS_ACTUAL": true,
"NAME": "Наименование"
},
"relations": null
}
Удаление записи¶
Метод: DELETE
Путь запроса: /meta-data-driven/v1/data/{entity-name}/{etalon-id}
Пример запроса:
curl -X 'DELETE' \
'http://localhost:9081/unidata-backend/api/meta-data-driven/v1/data/OKOPF/40c8610a-755f-11ed-9fbd-73aae866f4c6?wipe=false' \
-H 'accept: */*' \
-H 'Authorization: e555c773-c8e4-4698-95c7-73c8e4869865'
Обновление записи¶
Параметры запроса для patch = true
Формирование эталона записи в системе происходит в зависимости от весов систем-источников. В случае если веса равны, значения победившего атрибута становится равным значению самого свежего Origin. При обновлении записи, атрибуты обновляются информацией из системы bit.
В части интеграции, платформа предусматривает обновление только записи в целом. Указание значения по умолчанию в модели данных закладывает логику обработки входящих сообщений по интеграции. В таком случае, если логический атрибут не указан, то при расчете эталона будет выставлено значение по умолчанию.
Пример запроса:
curl -X 'POST' \
'http://10.21.0.176:8082/universe-backend/api/meta-data-driven/v1/data/test_check' \
-H 'accept: application/json' \
-H 'Authorization: ab605d3f-7110-48e9-a05d-3f7110c8e976' \
-H 'Content-Type: application/json' \
-d '{
"patch": true,
"sourceSystem": "bit",
"externalId": "test21214",
"attributes": {
"id": "test1111"
}
}'
Параметры запроса для patch = false
При patch = false атрибутам, которым не передалось значение в запросе - проставляется значение null. Значение установлено по умолчанию, из-за чего null меняется на него и становится самым новым атрибутом.
Если значение по умолчанию отсутствует, то передаваемый атрибут остается пустым и не участвует в консолидации. Таким образом, значение, которое вносили через UI остается самым новым и не заменяется на что-либо.
Пример запроса:
curl -X 'POST' \.
'http://10.21.0.176:8082/universe-backend/api/meta-data-driven/v1/data/test_check' \
-H 'accept: application/json' \
-H 'Authorization: ab605d3f-7110-48e9-a05d-3f7110c8e976' \
-H 'Content-Type: application/json' \
-d '{
"patch": false,
"sourceSystem": "bit",
"externalId": "test212",
"attributes": {
"id": "test111",
"id2": "test211"
}
}'