NAV
json

Cursor

Описание команд всех сервисов, которые входят в состав Cursor.

Список версий

v1.5

Версия от 06.06.2023. Список изменений:

v1.4.1

Версия от 03.05.2023. Список изменений:

v1.4

Версия от 22.03.2023. Список изменений:

Общие типы данных

Search - универсальный тип параметров списочного запроса. Он состоит из полей

Поле Тип Обязательное Описание Ограничения
query string да Строка с запросом, в котором указывается комбинация фильтров. Для запросов без фильтрации - пустая строка
context json object да Контекст фильтров запроса. Объект, в котором ключ - это название фильтра, а значение - это значение фильтра. Для запросов без фильтрации - пустой объект
sorting Sorting нет Параметры сортировки данных
paging Paging нет Параметры пейджинга

Sorting

Sorting - параметры сортировки

Поле Тип Обязательное Описание Ограничения
fieldName string да Название поля для сортировки
order string да Направление сортировки. Допустимые значения: asc и desc для сортировки по возрастанию и убыванию соответственно

Paging

Paging - параметры пейджинга

Поле Тип Обязательное Описание Ограничения
page integer да Номер запрашиваемой страницы. Страницы нумеруются с 1
count integer да Количество элементов на странице

Page

Страница списка элементов (часть списка с примененным пейджингом)

Поле Тип Описание Ограничения
items array of objects Список элементов на запрошенной странице
total integer Общее количество объектов в БД

PositionInList

Позиция объекта в списке

Поле Тип Обязательное Описание Ограничения
position number да Номер объекта в списке, начиная с 0
total number да Длина списка

EntityObjectIdentity

Поле Тип Обязательное Описание Ограничения
entityType EntityTypeId да Номер объекта в списке, начиная с 0
objectId ObjectId да Длина списка

EntityTypeId

Соответствует типу UUID.

ObjectId

Соответствует типу UUID.

Типы данных из verdi-libs

Описание типов данных дублирует документацию из Verdi. Добавлено для более удобной навигации.

FSConfigRep (FSClient)

Отображение FSConfig в "плоской форме", как он выглядит в конфиге приложения application.conf.

Поле Тип Обязательное Описание Ограничения
uri String Да Адрес файлового хранилища для подключения. Не пустое
uploadParallelism Int Да Параллелизм загрузки файлов в файловое хранилище. > 0
accessKeyId String Да, если authMode=Static ID для подключения (не зависит от бакета). Не пустое
secretAccessKey String Да, если authMode=Static Key для подключения (не зависит от бакета). Не пустое
authMode String Нет Режим аутентификации клиента: Static - данные для подключения не зависят от бакета, Mapping - данные зависят от бакета. По-умолчанию Static. "Static", "Mapping"
authConfig String Да, если authMode=Mapping Настройки для выбранного режима аутентификации. Если authMode=Mapping, то ожидается Seq[FSBucketConfig] в формате JSON.
clientsCache VerdiCacheConfig Нет Настройки кеша для клиентов файлового хранилища.

FSConfig (FSClient)

Конфигурация клиента файлового хранилища.

Поле Тип Обязательное Описание Ограничения
uri String Да Адрес файлового хранилища для подключения Не пустое
uploadParallelism Int Да Параллелизм загрузки файлов в файловое хранилище > 0
credentials Seq[FSBucketConfig] Да Список данных для учетных записей для подключения к бакетам
clientsCache VerdiCacheConfig Да Настройки кеша для клиентов файлового хранилища

FSBucketConfig (FSClient)

Данные для аутентификации, которые привязаны к конкретному бакету.

Поле Тип Обязательное Описание Ограничения
bucketName String Да Название бакета. Если значение пустое, то данные подходят для любого бакета.
bucketAlias String Нет Альтернативное название бакета. Не пустое
credentials FSCredentials Да Данные учетной записи для подключения к бакету.

FSCredentials (FSClient)

Данные для аутентификации.

Поле Тип Обязательное Описание Ограничения
accessKeyId String Да ID для подключения Не пустое
secretAccessKey String Да Key для подключения Не пустое

VerdiCacheConfig (Verdi-cache)

Настройки кеширования

Поле Тип Обязательное Описание Ограничения
maxSize int Нет Максимальное количество элементов в кеше, при превышении которого элементы начнут удаляться (LRU).
elementTTL duration string Нет Максимальное время жизни элемента.

Функционал фильтров и сортировки

Для некоторых команд можно передавать параметры запроса в виде объекта Search, который содержит информацию о том как нужно отфильтровать, отсортировать запрос и как разделить его на страницы.

Фильтрация

  {
     "query": "count && (created || modified)",
     "context": {
       "count": "1_1000",
       "created": "1630326000_",
       "modified": "_1630327000"
     }
   }

Фильтрация состоит из двух полей:

Query поддерживает операторы && и || + скобки.
В Context-е можно описать несколько видов проверок для полей:

1) Условие равенства переданному значению.
{ "context": { "fieldName": "какое-то значение" } }

2) Условие равенства какому-то одному значению из предоставленного списка.
{ "context": { "fieldName": "[первое значение, второе, другое]" } }

3) Условие соответствия паттерну
Значение поля обязательно должно начинаться со слова like.
{ "context": { "fieldName": "like какое%значен__" } }

4) Условие вхождения значения в заданный диапазон. В данный момент, поддерживаются только целые числа. Начало и конец диапазона разделяются знаком _. Оба конца диапазона опциональны и они включаются в диапазон. Если передать просто _, то результатом будет пустой диапазон, в который не входит ни один элемент и ответ тоже будет пустой.

Сортировка

{
  "sorting": {
    "fieldName": "number",
    "order": "desc"
  }
}

Сортировка определяется двумя полями:

Адаптер сетевой папки

Основное

Адаптер сетевой папки позволяет экспортировать в Cursor все содержимое указанной папки и в дальнейшем синхронизировать состояние (удалять из Cursor удаленные из папки файлы, доэкспортировать новые и обновлять измененные).

Экспорт осуществляется в виде Cursor-объекта указанного в конфигурации вида, который должен содержать обязательное поле бинарного файла (тип file), а также может содержать часть (или все) из нижеперечисленных полей:

Поддерживаются:

Экспорт происходит при старте адаптера, и далее перезапускается через указанный промежуток времени. Кроме того, адаптер предоставляет HTTP API для вызова внепланового экспорта и восстановления.

Конфигурирование адаптера сетевой папки

Требования к запуску адаптера сетевой папки

Для корректной минимальной работы адаптера требуется:

Список переменных окружения адаптера сетевой папки

Обязательные параметры выделены жирным

Настройки адаптера:

Переменная Описание Значение по умолчанию
ADAPTER_FOLDER_HTTP_HOST Хост для API адаптера "0.0.0.0"
ADAPTER_FOLDER_HTTP_PORT Порт для API адаптера 9515
ADAPTER_FOLDER_SOURCE_IDENTITY Любой (свой) ID адаптера. Если используется несколько адаптеров, их ID должны различаться -
ADAPTER_FOLDER_EXPORT_DELAY Время между окончанием предыдущей синхронизации и запуском следующей 24 hours
ADAPTER_FOLDER_RECOVER_ON_START Нужен ли запуск восстановления состояния; см. соответствующий раздел false

Настройки рабочей папки:

Переменная Описание Значение по умолчанию
ADAPTER_FOLDER_SOURCE_URI URI до рабочей папки. См формат ниже -
ADAPTER_FOLDER_SOURCE_LOGIN Логин для сетевой папки, если требуется -
ADAPTER_FOLDER_SOURCE_PASSWORD Пароль для сетевой папки, если требуется -
ADAPTER_FOLDER_SOURCE_DOMAIN Домен (WORKGROUP) для сетевой папки, если требуется -
ADAPTER_FOLDER_SOURCE_SMB_MIN_VER Минимальная версия используемого клиентом протокола SMB. См ниже SMB1
ADAPTER_FOLDER_SOURCE_SMB_MAX_VER Максимальная версия используемого клиентом протокола SMB. См ниже SMB210

Настройки обработки файлов:

Переменная Описание Значение по умолчанию
ADAPTER_FOLDER_SOURCE_FILE_ALLOW_HIDDEN Использовать ли скрытые файлы false
ADAPTER_FOLDER_SOURCE_FILE_PRESERVE_EXTENSION Оставлять ли расширение в имени файла false
ADAPTER_FOLDER_SOURCE_FILE_SIZE_LIMIT_KB Максимальный размер отправляемых файлов (не должен превышать INTEGRATION_FS_SIZE_LIMIT_KB сервиса импорта) -

Общие настройки взаимодействия с Cursor:

Переменная Описание Значение по умолчанию
ADAPTER_FOLDER_CURSOR_URI Полная ссылка на HTTP API интеграций Cursor (например https://cursorapp/integration/api/external) -
ADAPTER_FOLDER_CURSOR_AUTH_TOKEN Токен доступа клиента, от которого используется адаптер -
ADAPTER_FOLDER_CURSOR_MAXCON Максимальное количество одновременных запросов от адаптера к Cursor. Максимум - 64. 16
ADAPTER_FOLDER_CURSOR_RETRY_MAX_COUNT Максимальное количество ретраев одного запроса к Cursor в случае ошибки 10
ADAPTER_FOLDER_CURSOR_RETRY_DELAY Задержка между ретраями запросов к Cursor 10 second
ADAPTER_FOLDER_AKKA_HTTP_CLIENT_IDLE_TIMEOUT Время ожидания ответа от Cursor 5 minutes
ADAPTER_FOLDER_CURSOR_TEMP_BINARY_EXPIRATION Время жизни бинарных файлов, не связанных ни с одним объектом, в Cursor 24 hours

Настройки модели данных файла и взаимодействия с Cursor по данной модели (если код какого-либо поля не указан, и настройка этого кода является необязательной, поле не используется в объекте):

Переменная Описание Значение по умолчанию
ADAPTER_FOLDER_FILE_ENTITY_TYPE Код вида сущности, описывающей файл, из Cursor -
ADAPTER_FOLDER_FILE_SEND_PER_REQUEST Количество создаваемых (обновляемых, удаляемых) объектов за один запрос 10
ADAPTER_FOLDER_FILE_GET_PER_REQUEST Количество запрашиваемых объектов за раз (в режиме восстановления) 50
ADAPTER_FOLDER_FILE_MAPPING_BINARY_FILE Код поля бинарного файла в модели данных -
ADAPTER_FOLDER_FILE_MAPPING_PATH Код поля пути до файла в модели данных -
ADAPTER_FOLDER_FILE_MAPPING_NAME Код поля названия файла в модели данных -
ADAPTER_FOLDER_FILE_MAPPING_CREATED Код поля времени создания файла в модели данных -
ADAPTER_FOLDER_FILE_MAPPING_MODIFIED Код поля времени изменения файла в модели данных -
ADAPTER_FOLDER_FILE_MAPPING_OWNER Код поля владельца файла в модели данных -
ADAPTER_FOLDER_FILE_MAPPING_OWNER_UNKNOWN_PLACEHOLDER Значение "по умолчанию" для поля владельца файла; используется если владелец неизвестен -

Формат ADAPTER_FOLDER_SOURCE_URI

Для локальных папок используется формат File URI. Примеры:

Для папок, доступных по протоколу сетевых папок SMB, используется следующий формат: smb://server[:port]/share/[path/]. Примеры:

Версии SMB

При использовании протокола SMB, из-за разницы между используемыми клиентом и сервером версий протокола, может возникнуть ошибка подключения.
Переменные ADAPTER_FOLDER_SOURCE_SMB_MIN_VER (по умолчанию SMB1) и ADAPTER_FOLDER_SOURCE_SMB_MAX_VER (по умолчанию SMB2.1) позволяют изменить используемые версии протокола на стороне клиента. Поддерживаемые значения: SMB1, SMB202, SMB210, SMB300, SMB302, SMB311

Состояние и восстановление состояния

В целях оптимизации количества сетевых запросов, адаптер хранит текущее состояние экспорта по каждому из файлов в базе данных.
В случаях сбоев (отсутствия соединения с БД, неожиданный перезапуск адаптера, потери данных БД или хранилища временных файлов и пр.) состояние иногда может перестать соответствовать действительности, что, в свою очередь, может значительно замедлить последующий экспорт и/или привести к артефактам синхронизации (когда удаленный из рабочей папки файл не будет удален из Cursor автоматически).

Для восстановления состояния при перезапуске используется "режим восстановления". Если переменная ADAPTER_FOLDER_RECOVER_ON_START будет указана как true, то при запуске адаптера сначала (единоразово) будет выполнена синхронизация состояния файлов с Cursor, и только потом запущен плановый экспорт.
Кроме того, режим восстановления может быть запущен в любой момент (когда адаптер не выполняет других задач).

Внеплановый запуск

Адаптер предоставляет HTTP API для внепланового запуска задач (при условии, что в данный момент адаптер не занят другой задачей):

Хост и порт сервера API указываются в конфигурации (см. выше).

Каждый запрос может либо вернуть 423 Locked, если адаптер сейчас занят другой задачей, либо запустить задачу и сразу вернуть 202 Accepted.

Сервис ограниченных контекстов - ОК

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

Общее описание архитектуры сервиса ОК

Конфигурирование сервиса ОК

Требование к запуску сервиса ОК

Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm. Для корректной минимальной работы сервиса требуется обязательное подключение к Kafka, Consul, PostrgeSQL. Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus и ApiGateway.

Список переменных окружения сервиса ОК

Переменная Тип Обязательная Значение по умолчанию Описание
SERVER_PORT int нет 8080 Порт, на котором слушает HTTP-сервер
VERDI_CONSUL string да http://localhost:8500 Адрес Consul
VERDI_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
VERDI_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
VERDI_KAFKA_ADDRESS string да localhost:9092 Адрес брокера Kafka.
VERDI_KAFKA_TOPIC string нет eventStatus Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
VERDI_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
VERDI_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
VERDI_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
VERDI_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к харнилищу сертификатов.
VERDI_HOST string да localhost Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
VERDI_TTL duration string нет 30 seconds Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
VERDI_HEALTH_CHECK duration string нет 10 seconds Периодичность отправки health check в ServiceDiscovery
VERDI_COMMAND_STORAGE_UPDATE_PERIOD duration string нет 1 minutes Время кэширования данных по командам из CommandDiscovery
VERDI_SERVICE_DISCOVERY_UPDATE_PERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
VERDI_ALLOW_INTERNAL_COMMANDS bool нет true Можно ли сервису отправлять внутрисистемные команды
VERDI_CONSUL_CONNECTION_MAX_RETRY int нет 5 Максимальное количество попыток подключений к Consul
VERDI_CONSUL_CONNECTION_RETRY_DELAY duration string нет 1 seconds Таймаут между неудачными попытками подключения к Consul
VERDI_KAFKA_SYNC_POLLING_PERIOD duration string нет 1 seconds Периодичность запроса статуса verdi команд в sender-lib
VERDI_KAFKA_SYNC_POLLING_TIMEOUT duration string нет 1 seconds Максимальное время ожидания выполнения verdi команды в sender-lib
DB_JDBC_URL jdbc url string да jdbc:postgresql://127.0.0.1:5432/bushcraft JDBC-url для соединения с БД
DB_USER string да postgres Пользователь БД
DB_PASSWORD string да 12345 Пароль пользователя БД

Модель сервиса ОК

Bush

Ограниченный контекст

Название поля Тип Описание
id String Идентификатор контекста
relations Map[String, relations] Иерархия типов сущностей
version Int Версия контекста. Используется для optimistic lock

BushcraftSearchRequest

Форма агрегирующего поиска в ограниченном контексте

Название поля Тип Описание
bushId String Идентификатор контекста
query String Поисковая строка
paging Paging Пагинация

EntityObjectIdentity

Полный идентификатор объекта

Название поля Тип Описание
entityType String Тип объекта
objectId UUID Идентификатор объекта

BranchUnfoldRequest

Форма агрегирующего поиска в отдельной ветке ограниченного контекста

Название поля Тип Описание
bushId String Идентификатор контекста
query String Поисковая строка
paging Paging Пагинация
root EntityObjectIdentity Идентификатор корня ветки
branchType String Тип фильтруемых сущностей в корне

BushCreateDTO

Форма создание ограниченного контекста

Название поля Тип Описание
id String Идентификатор контекста
relations Map[String, relations] Иерархия типов сущностей

Команды сервиса ОК

bushSearch

Агрегирующий поиск в ограниченном контексте

На входе поисковый запрос

{
    "query": "электроконтактная",
    "paging": {
        "page": 1,
        "count": 40
    },
    "bushId": "fixedBush"
}

В результате куст объектов

{
  "status": "Completed",
  "timestamp": 1651387723970,
  "value": {
    "documents": [
      {
        "document": {
          "id": "508d1853-1648-4558-a9f9-e590876018b4",
          "entityType": "links",
          "highlight": {},
          "data": ... // doc data
        },
        "matchedChildren": {
          "Patent": 2
        }
      },
      {
        "document": {
          "id": "eaeda9a3-5454-4cc0-902a-a7f854a2bd96",
          "entityType": "1thesis",
          "highlight": {},
          "data": ... // doc data
        },
        "matchedChildren": {
          "RfbrDocument": 4
        }
      },
      ... // others docs
    ],
    "total": 25
  }
}

Поддерживается только синхронный вызов

branchUnfold

Поиск по ветке куста ограниченного контексте

На входе поисковый запрос

{
    "query": "электроконтактная",
    "paging": {
        "page": 1,
        "count": 40
    },
    "bushId": "fixedBush",
    "root": {
        "entityType": "Patent",
        "objectId": "c7feabde-09cd-463c-ab4e-968178e7ab37"
    },
    "branchType": "RfbrDocument"
}

В результате ветка куста объектов

{
  "status": "Completed",
  "timestamp": 1651388234581,
  "value": {
    "documents": [
      {
        "id": "975975bb-ece6-4aca-80fc-5f227e982582",
        "entityType": "RfbrDocument",
        "highlight": {
          "newFileContent": [
            "И, действительно, !!!HL!!электроконтактная!!HL!!! методика, о которой я здесь\nрассказываю, в скором времени сыграла",
            "Результаты\nизмерений, полученные с помощью !!!HL!!электроконтактной!!HL!!! методики (в\nсочетании с другими), позволили",
            "С помощью !!!HL!!электроконтактной!!HL!!! методики уже в 1948 году были\nполучены первые экспериментальные данные о",
            "моей сохранилось чувство признательности и даже\nгордости от того, что в этой нашей работе по созданию !!!HL!!электроконтактной!!HL!!!",
            "Опыты намечалось проводить с применением !!!HL!!электроконтактной!!HL!!! методики измерения скоростей."
          ]
        },
        "data": ... // doc data
      },
      {
        "id": "1f398276-efb3-41c9-994d-6680681d59f5",
        "entityType": "RfbrDocument",
        "highlight": {
          "newFileContent": [
            "камера; 2 — пьезокварцевый датчик давления; З капсюльвоспламенитель; 4 — метаемое тело с полостью; 5 !!!HL!!электроконтактное!!HL!!!"
          ]
        },
        "data": ... // doc data
      }
    ],
    "total": 2
  }
}

Поддерживается только синхронный вызов

createBush

Создание ограниченного контекста

На входе форма создания

{
  "id": "fixedBush",
  "relations": {
    "links": {"Patent": {"RfbrDocument": {}}},
    "1thesis": {"RfbrDocument": {}},
    "poems": {"kate": {}}
  }
}

В результате идентификатор успешно созданного контекста

"fixedBush"

Поддерживается только синхронный вызов

getBush

Получение ограниченного контекста

На входе идентификатор ограниченного контекста

"fixedBush"

В результате ограниченный контекст

{
  "id": "fixedBush",
  "relations": {
    "links": {"Patent": {"RfbrDocument": {}}},
    "1thesis": {"RfbrDocument": {}},
    "poems": {"kate": {}}
  }
}

Поддерживается только синхронный вызов

listBush

Получение списка ограниченных контекстов

Входных данных нет

В результате список ограниченных контекстов

[
  {
    "id": "fixedBush",
    "relations": {
      "links": {
        "Patent": {
          "RfbrDocument": {}
        }
      },
      "poems": {
        "kate": {}
      },
      "1thesis": {
        "RfbrDocument": {}
      }
    },
    "version": 1
  }
]

Поддерживается только синхронный вызов

deleteBush

Удаление ограниченного контекста

На входе идентификатор контекста

"fixedBush"

В результате кол-во удаленных записей

Поддерживается только синхронный вызов

updateBush

Обновление ограниченного контекста

На входе описание контекста

{
  "id": "fixedBush",
  "relations": {
    "links": {"Patent": {"RfbrDocument": {}}},
    "1thesis": {"RfbrDocument": {}},
    "newRoot": {"newLeaf": {}}
  },
  "version": 1
}

В результате кол-во обновленных записей

Поддерживается только синхронный вызов

Сервис модели данных

Сервис модели данных (Data Model Service) позволяет настроить какие сущности, с какими полями и отношениями будут храниться в системе Cursor. На основе данных о сущностях сервис будет формировать описание модели данных и возвращать его в формате JsonSchema. Также сервис управляет созданием/изменением/удалением объектов сущностей в реестрах.
Сущности, полученные из внешних источников (клиентов), таких как сетевая папка или 1С, называются внешними. Отличие от внутренних сущностей состоит в том, что помимо внутреннего ID, они имеют ID из внешнего источника, по которому этот источник может совершать запросы.

Общая документация по сервису находится в разделе Confluence: Cursor/Техническая документация/Сервис Модели данных

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

Конфигурирование сервиса модели данных

Требования к запуску сервиса модели данных

Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm.

Для корректной минимальной работы сервиса требуется обязательное подключение к PostgreSQL, Kafka, Consul. Для настройки подключения к ним нужно заполнить обязательные переменные окружения из раздела ниже.

Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus и ApiGateway. В этом случае нужно уделить внимание настройкам, связанным с ServiceDiscovery и CommandDiscovery.

Список переменных окружения сервиса модели данных

Все доступные переменные окружения для настройки сервиса модели данных.

Переменная Тип Обяза-тельная Значение по умолчанию Описание
DATA_MODEL_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
DATA_MODEL_HTTP_PORT int нет 8192 Порт, на котором слушает HTTP-сервер
DATA_MODEL_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
DATA_MODEL_KAFKA_TOPIC string нет "data_model _service_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
DATA_MODEL_KAFKA_CONSUMER_GROUP string нет "data-model-service" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
DATA_MODEL_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
DATA_MODEL_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
DATA_MODEL_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
DATA_MODEL_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
DATA_MODEL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах DATA_MODEL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
DATA_MODEL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который DATA_MODEL_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
DATA_MODEL_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
DATA_MODEL_KAFKA_FILE_EVENTS_TOPIC string нет "fileEvents" Название кафка-топика для отправке сообщений об удалении файлов
DATA_MODEL_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
DATA_MODEL_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
DATA_MODEL_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
DATA_MODEL_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к харнилищу сертификатов.
DATA_MODEL_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
DATA_MODEL_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
DATA_MODEL_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
DATA_MODEL_TRACE_DURATION boolean нет false Признак необходимости трассировки выполнения команд
DATA_MODEL_BATCH_PARALLELISM int нет 4 Параллелизм для батч-обработок (например обновление нескольких объектов в одном запросе)
DATA_MODEL_DISCOVERABLE_ID string нет "another_data_model _service_instance" ID сервиса в ServiceDiscovery
DATA_MODEL_DISCOVERABLE_NAME string нет "dataModel" Имя сервиса в ServiceDiscovery
DATA_MODEL_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
DATA_MODEL_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
DATA_MODEL_DISCOVERABLE_LIVETIME duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
DATA_MODEL_DISCOVERABLE_HEALTHPASS string нет 1 minute Периодичность отправки health check в ServiceDiscovery
DATA_MODEL_AKKA_HTTP_CLIENT_MAXCON int нет 512 Максимальное число одновременных исходящих HTTP-соединений
DATA_MODEL_AKKA_HTTP_CLIENT_MAXREQ int нет 1024 Максимальное число одновременных исходящих HTTP-запросов
DATA_MODEL_AKKA_HTTP_SERVER_MAXCON int нет 1024 Максимальное число одновременных входящих HTTP-соединений
DATA_MODEL_INTERNALCMD_ALLOW bool нет false Можно ли сервису отправлять внутрисистемные команды
DATA_MODEL_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
DATA_MODEL_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
DATA_MODEL_DB_HOST string да Хост БД
DATA_MODEL_DB_PORT int да Порт БД
DATA_MODEL_DB_NAME string да Имя базы в БД
DATA_MODEL_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
DATA_MODEL_DB_USER string да Пользователь БД
DATA_MODEL_DB_PASSWORD string да Пароль пользователя БД
DATA_MODEL_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
DATA_MODEL_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
DATA_MODEL_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
DATA_MODEL_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
DATA_MODEL_LOG_LEVEL_SLICK_STATEMENT string нет DEBUG Уровень логирования запросов, отправляемых slick в БД
DATA_MODEL_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирование бенчмарков выполнения запросов slick
DATA_MODEL_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
DATA_MODEL_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования конфига kafka-consumer
DATA_MODEL_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
DATA_MODEL_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
DATA_MODEL_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
DATA_MODEL_FS_REQUIRED boolean нет нет Обязательно ли использовать реальное файлохранилище. Можно отключать для локального использования (НЕЛЬЗЯ! НЕ РАБОТАЕТ)
DATA_MODEL_FS_URI url string нет http://localhost:9000 Адрес для подключения к Minio
DATA_MODEL_FS_ACCESS_KEY_ID string нет "minioadmin" Ключ доступа к хранилищу файлов Minio (aka пользователь)
DATA_MODEL_FS_SECRET_ACCESS_KEY string нет "minioadmin" Секретный код доступа к хранилищу файлов Minio (aka пароль)
DATA_MODEL_FS_UPLOAD_PARALLELISM int нет 4 Максимально возможный параллелизм при загрузке файлов в хранилище
DATA_MODEL_FS_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
DATA_MODEL_FS_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с маппингом учетных записей
DATA_MODEL_FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
DATA_MODEL_FS_CACHE_TTL duration string нет Время жизни клиента в кеше
DATA_MODEL_TEMP_BUCKET string нет "temp" Название бакета в Minio, в котором находятся временные файлы
DATA_MODEL_ENTITY_OBJECTS_BUCKET string нет "datamodel" Название бакета в Minio, в котором сохраняются на постоянной основе файлы объектов модели данных
DATA_MODEL_RELATION_SYSTEM_FIELDS_PREFIX string нет "_" Префикс для системных полей relation-объектов, используемые в результате RichGet команд

Команды для сервиса модели данных

Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
Не все поля EntityType доступны для использования в настройке авторизации.

Название команды EntityType Actions
saveObject Произвольный EntityType из ObjectStorage DataModel_SaveObject
saveObjectBatch - -
saveExternalObject - -
getObject Произвольный EntityType из ObjectStorage DataModel_GetObject
richGetObject Произвольный EntityType из ObjectStorage DataModel_GetObject
internalRichGetObject - -
richGetObjectsBatch Произвольный EntityType из ObjectStorage DataModel_GetObject
richListObjects Произвольный EntityType из ObjectStorage DataModel_GetObject
internalGetObject - -
getObjectsBatch - -
getExternalObject - -
updateObject Произвольный EntityType из ObjectStorage DataModel_UpdateObject
updateExternalObject - -
deleteObject Произвольный EntityType из ObjectStorage DataModel_DeleteObject
deleteObjectBatch Список произвольных EntityObjectId -
deleteObjectSearch Произвольный ListObjects -
deleteExternalObject - -
getFile Произвольный EntityType из ObjectStorage DataModel_GetObject

GetFieldTypes

Входных данных нет

На выходе

[
  {
    "id": "string",
    "description": "Строка",
    "databaseType": "Varchar(64)",
    "settings": {}
  },
  {
    "id": "dateTime",
    "description": "Дата/время",
    "databaseType": "DateTime",
    "settings": {}
  }
]

Получение списка доступных типов полей для сущностей модели данных.

Имя команды для вызова: getFieldTypes. Поддерживается только синхронный вызов.

GetRelationTypes

Входных данных нет

На выходе

[
  {
    "id": "one-to-one",
    "title": "1 к 1",
    "description": "Один к одному"
  },
  {
    "id": "many-to-one",
    "title": "Многие к 1",
    "description": "Многие к одному"
  },
  {
    "id": "many-to-many",
    "title": "Многие ко многим",
    "description": "Многие ко многим"
  }
]

Получение доступных типов отношений между сущностями в модели данных.

Имя команды для вызова: getRelationTypes. Поддерживается только синхронный вызов.

CreateDataModel

На входе MigrationDSL в виде списка операций

[
  {
    "operation": "CreateEntity",
    "entityType": "Order",
    "title": "Договор"
  },
  {
    "operation": "AddField",
    "entityType": "Order",
    "fieldId": "date",
    "fieldType": "dateTime",
    "title": "Дата договора",
    "description": "Дата заключения договора",
    "example": 1582966800,
    "nullable": false
  },
  {
    "operation": "AddField",
    "entityType": "Order",
    "fieldId": "number",
    "fieldType": "number",
    "title": "Номер договора",
    "example": 555,
    "nullable": false
  },
  {
    "operation": "AddField",
    "entityType": "Order",
    "fieldId": "title",
    "fieldType": "string",
    "title": "Название договора",
    "example": "Договор аренды",
    "nullable": false,
    "settings": {
      "maxLength": 200
    }
  },
  {
    "operation": "AddField",
    "entityType": "Order",
    "fieldId": "places",
    "fieldType": "catalog",
    "title": "Места заключения договора",
    "nullable": true,
    "settings": {
      "code": "city",
      "multiple": true
    }
  },
  {
    "operation": "CreateEntity",
    "entityType": "Person",
    "title": "Человек"
  },
  {
    "operation": "AddField",
    "entityType": "Person",
    "fieldId": "name",
    "fieldType": "string",
    "title": "ФИО",
    "nullable": false
  },
  {
    "operation": "AddRelation",
    "relationType": "many-to-one",
    "entity1": "Order",
    "entity2": "Person",
    "title": "Связь договор-автор",
    "entity1Field": "author",
    "entity2Field": "orders"
  }
]

На выходе признак успешного создания модели данных

true

Создание или изменение модели данных с использованием Migration DSL. Может использоваться для создания новых сущностей или для модификации уже существующих. Фактически, команда применяет переданную ей миграцию для модели данных, модифицируя текущую. Migration DSL позволяет описать создание или изменение модели данных в виде последовательности операций/шагов.

Доступные операции Migration DSL:

Каждой операции соответствует json-объект, список которых и образует MigrationDSL-запрос на создание модели данных. Объекты для операций указаны возле них в списке. Они различаются по коду операции, передаваемому в поле operation. Все объекты для описания шагов наследуются от общего типа MigrationDslOperation.

Порядок операций важен! Нельзя добавить поле перед созданием сущности.

Имя команды для вызова: createDataModel. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

GetDataModel

На входе код типа сущностей

"Order"

На выходе Json-schema

{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "definitions": {
    "date" : {
      "type" : "integer",
      "minimum" : 0
    },
    "relation" : {
      "type" : "string",
      "format" : "uuid"
    },
    "catalog" : {
      "type" : "string",
      "format" : "uuid"
    },
    "multi-catalog" : {
      "type" : "array",
      "items" : {
        "type" : "string",
        "format" : "uuid"
      }
    },
    "file": {
      "type": "object",
      "properties": {
        "fileId": {"type": "string", "format":  "uuid"},
        "name": {"type":  "string"},
        "extension": {"type":  "string"},
        "size": {"type": "integer", "minimum": 0},
        "url": {"type":  "string"},
        "additional": {"type": "object"},
        "created": {"type": "integer", "minimum": 0},
        "modified": {"type": "integer", "minimum": 0},
        "md5": {"type": "string", "pattern": "^[0-9a-fA-F]{32}$"}
      },
      "required": ["fileId"]
    }
  },
  "relations": [
    {
      "name": "Order_to_Person_on_author",
      "entity1": "Order",
      "entity2": "Person",
      "relationType": "many-to-one",
      "entity1Field": "author",
      "entity2Field": "orders"
    }
  ],
  "type": "object",
  "properties": {
    "author": {
      "$ref": "#/definitions/relation",
      "additional": false,
      "nullable": true,
      "readOnly": true,
      "multiple": false,
      "title": "Authorship",
      "to": "Person",
      "settings": {
        "to": "Person"
      }
    },
    "date": {
      "$ref": "#/definitions/date",
      "title": "Дата",
      "description": "Дата/время",
      "additional": false,
      "rawType": "dateTime"
    },
    "number": {
      "type": "number",
      "description": "Число",
      "additional": false,
      "rawType": "number"
    },
    "places" : {
      "$ref" : "#/definitions/multi-catalog",
      "code" : "city",
      "multiple" : true,
      "title" : "Места заключения договора",
      "additional" : false,
      "rawType": "catalog",
      "settings": {
        "code": "city",
        "multiple": true
      }
    },
    "title" : {
      "type" : "string",
      "maxLength" : 200,
      "title" : "Название договора",
      "additional" : false,
      "rawType": "string",
      "example": "Договор аренды",
      "exampleType": "string",
      "settings": {
        "maxLength": 200
      }
    }
  },
  "required": [
    "date",
    "number",
    "title"
  ]
}

Или ошибка, если такой модели данных не существует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Получение описания модели данных для конкретной сущности в виде JSON-Schema.

Имя команды для вызова: getDataModel. Поддерживается только синхронный вызов.

ListDataModels

Входных данных нет

На выходе

[
  {
    "id": "Order",
    "title": "Договор",
    "description": "Описывает договор между несколькими агентами",
    "settings": {
      "titleRule": "title"
    }
  },
  {
    "id": "Person",
    "title": "Человек",
    "description": "Дополнительные человеческие аттрибуты для пользователя",
    "settings": {}
  }
]

Получение созданных типов сущностей.

Имя команды для вызова: listDataModels. Поддерживается только синхронный вызов.

GetAllDataModels

Входных данных нет

На выходе

{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "definitions": {
    "date" : {
      "type" : "integer",
      "minimum" : 0
    },
    "relation" : {
      "type" : "string",
      "format" : "uuid"
    },
    "catalog" : {
      "type" : "string",
      "format" : "uuid"
    },
    "multi-catalog" : {
      "type" : "array",
      "items" : {
        "type" : "string",
        "format" : "uuid"
      }
    },
    "file": {
      "type": "object",
      "properties": {
        "fileId": {"type": "string", "format":  "uuid"},
        "name": {"type":  "string"},
        "extension": {"type":  "string"},
        "size": {"type": "integer", "minimum": 0},
        "url": {"type":  "string"},
        "additional": {"type": "object"},
        "created": {"type": "integer", "minimum": 0},
        "modified": {"type": "integer", "minimum": 0},
        "md5": {"type": "string", "pattern": "^[0-9a-fA-F]{32}$"}
      },
      "required": ["fileId"]
    },
    "Person": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 64,
          "description": "Строка",
          "additional": false,
          "rawType": "string"
        }
      },
      "required": [
        "name"
      ]
    },
    "Order": {
      "type": "object",
      "properties": {
        "number": {
          "type": "number",
          "description": "Число",
          "additional": false,
          "rawType": "number"
        },
        "date": {
          "$ref": "#/definitions/date",
          "description": "Дата/время",
          "additional": false,
          "rawType": "dateTime"
        },
        "author": {
          "$ref": "#/definitions/relation",
          "additional": false,
          "nullable": true,
          "readOnly": true,
          "multiple": false,
          "title": "Authorship",
          "to": "Person",
          "settings": {
            "to": "Person"
          }
        }
      },
      "required": [
        "number",
        "date"
      ]
    }
  },
  "relations": [
    {
      "name": "Order_to_Person_on_author",
      "entity1": "Order",
      "entity2": "Person",
      "relationType": "many-to-one",
      "entity1Field": "author",
      "entity2Field": "orders"
    }
  ],
  "oneOf": [
    {
      "$ref": "#/definitions/Order"
    },
    {
      "$ref": "#/definitions/Person"
    }
  ]
}

Получение JSON-Schema для всех модели данных.

Имя команды для вызова: getAllDataModels. Поддерживается только синхронный вызов.

GetExampleObject

На входе тип сущности

"Order"

На выходе пример объекта данной сущности

{
  "id": "d4db2633-62c7-4b61-956d-cb5461fe2a3e",
  "externalId": "0000000000000000",
  "entityType": "Order",
  "title": "Order d4db2633-62c7-4b61-956d-cb5461fe2a3e",
  "source": "example",
  "created": 1630326492,
  "modified": 1630326492,
  "data": {
    "date": 1577869200,
    "number": 555,
    "author": "00000000-0000-0000-0000-000000000000"
  },
  "additionalData": {},
  "version": 1
}

Получение примера объекта сущности. Объект собирается из примеров полей (example), которые указываются при добавлении поля сущности (AddField)

Генерация полей:

Поле Значение
id Случайный UUID
externalId 0000000000000000
entityType Равен значению на входе
title См. ниже
source example
created Текущий timestamp
modified Текущий timestamp
data Поля этого типа объекта
additionalData Дополнительные поля этого типа объекта
version 1

Поле title зависит от поля data.titleRule. Если этого поля нет, то title имеет вид <entityType> <id>

Значения полей в data зависят от параметра example при создании поля (AddField). Если не указано, то см. Значения по умолчанию

Имя команды для вызова: getExampleObject. Поддерживается только синхронный вызов

SaveObject

На входе общие свойства сохраняемого объекта и основные атрибуты

{
  "entityType": "Order",
  "source": "manual",
  "attributes": {
    "date": 1577869200,
    "number": 514
  }
}

На выходе ID созданного объекта

"18b1011b-9db3-4186-a53c-971016030068"

Сохранение объекта сущности.

Имя команды для вызова: saveObject. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

SaveObjectBatch

На входе общие свойства сохраняемых объектов и основные атрибуты

{
  "entityType": "Order",
  "source": "manual",
  "attributes": [
    {
      "date": 1577869200,
      "number": 512
    },
    {
      "date": 1577869200,
      "number": 513
    },{
      "date": 1577869200,
      "number": 514
    }
  ]
}

На выходе список ID созданных объектов

[
  "18b1011b-9db3-4186-a53c-971016030068",
  "20f95899-cd42-4afc-9903-84269db53543",
  "370a9981-ea0a-4830-93fe-e4e27ece167f"
]

Сохранение списка объектов сущности. Порядок в списке возвращаемых идентификаторов соответствует порядку в списке атрибутов attributes.

Имя команды для вызова: saveObjectBatch. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.
Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

SaveExternalObject

На входе общие свойства сохраняемого объекта и основные атрибуты

{
  "entityType": "Order", 
  "externalId": "ExternalOrder",
  "source": "order-client",
  "attributes": {
    "date": 1577869200,
    "number": 514,
    "title": "External Order"
  }
}

На выходе внутренний ID созданного объекта

"18b1011b-9db3-4186-a53c-971016030068"

Сохранение объекта сущности, полученного из внешнего источника.

Имя команды для вызова: saveExternalObject. Поддерживается асинхронный и синхронный вызов.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации. Результат выполнения команды журналируется.

GetObject

На входе ID получаемого объекта и его тип сущности

{
  "entityType": "Order",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068"
}

На выходе данные запрашиваемого объекта

{
  "id": "18b1011b-9db3-4186-a53c-971016030068",
  "externalId": "ExternalOrder",
  "entityType": "Order",
  "title": "Аренда лошади",
  "source": "manual",
  "created": 1630326492,
  "modified": 1630326492,
  "data": {
    "date": 1577869200,
    "number": 514,
    "title": "Аренда лошади"
  },
  "additionalData": {},
  "version": 1
}

Или ошибка, если объект отсутствует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Получение данных объекта сущности.

Имя команды для вызова: getObject. Поддерживается только синхронный вызов

InternalGetObject

На входе ID получаемого объекта и его тип сущности

{
  "entityType": "Order",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068"
}

На выходе данные запрашиваемого объекта

{
  "id": "18b1011b-9db3-4186-a53c-971016030068",
  "externalId": "ExternalOrder",
  "entityType": "Order",
  "title": "Аренда лошади",
  "source": "manual",
  "created": 1630326492,
  "modified": 1630326492,
  "data": {
    "date": 1577869200,
    "number": 514,
    "title": "Аренда лошади"
  },
  "additionalData": {},
  "version": 1
}

Или ошибка, если объект отсутствует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Получение данных объекта сущности. В отличии от команды getObject, в этой команде не проверяется авторизация.

Имя команды для вызова: internalGetObject. Поддерживается только синхронный вызов

Команда только внутренняя (нельзя вызвать через Api Gateway) и отличается от внешней getObject только отсутствием аутентификации.

GetObjectsBatch

На входе список из ID и типов сущности получаемых объектов

[
  {
    "entityType": "Order",
    "objectId": "18b1011b-9db3-4186-a53c-971016030068"
  },
  {
    "entityType": "Person",
    "objectId": "c11df8f6-e8be-4e8e-a815-40e0d0a0cfb6"
  }
]

На выходе список объектов

[
  {
    "id": "18b1011b-9db3-4186-a53c-971016030068",
    "externalId": "ExternalOrder",
    "entityType": "Order",
    "title": "Аренда лошади",
    "source": "manual",
    "created": 1630326492,
    "modified": 1630326492,
    "data": {
      "date": 1577869200,
      "number": 514,
      "title": "Аренда лошади"
    },
    "additionalData": {},
    "version": 1
  },
  {
    "id": "c11df8f6-e8be-4e8e-a815-40e0d0a0cfb6",
    "externalId": null,
    "entityType": "Person",
    "title": "Person c11df8f6-e8be-4e8e-a815-40e0d0a0cfb6",
    "source": "manual",
    "created": 1645526774115,
    "modified": 1645526774115,
    "data": {
      "name": "Строка длиной не больше 64"
    },
    "additionalData": {},
    "version": 1,
    "orders": ["18b1011b-9db3-4186-a53c-971016030068"]
  }
]

Получение данных объектов по их ID и типу сущности.

Имя команды для вызова: getObjectsBatch. Поддерживается только синхронный вызов

RichGetObject

На входе ID получаемого объекта, тип его сущности и необходимые поля

{
  "id": {
    "entityType": "Order",
    "objectId": "18b1011b-9db3-4186-a53c-971016030068"
  },
  "fields": [
    "number",
    "date"
  ]
}

На выходе данные запрашиваемого объекта

{
  "id": "18b1011b-9db3-4186-a53c-971016030068",
  "externalId": "ExternalOrder",
  "entityType": "Order",
  "title": "Аренда лошади",
  "source": "manual",
  "created": 1630326492,
  "modified": 1630326492,
  "data": {
    "number": 514,
    "date": 1577869200
  },
  "additionalData": {},
  "version": 1
}

Или ошибка, если объект отсутствует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Или ошибка, если какое-либо из запрашиваемых полей отсутствует в json schema

{
    "businessError": null,
    "message": "ERROR: fields [first_field,second_field] for entityType 'Order' not found",
    "stackTrace": null,
    "data": null
}

Получение данных объекта сущности.

Для указания списка допустимых полей см. Методы Rich*.

Имя команды для вызова: richGetObject. Поддерживается только синхронный вызов

InternalRichGetObject

На входе ID получаемого объекта, тип его сущности и необходимые поля

{
  "id": {
    "entityType": "Order",
    "objectId": "18b1011b-9db3-4186-a53c-971016030068"
  },
  "fields": [
    "number",
    "date"
  ]
}

На выходе данные запрашиваемого объекта

{
  "id": "18b1011b-9db3-4186-a53c-971016030068",
  "externalId": "ExternalOrder",
  "entityType": "Order",
  "title": "Аренда лошади",
  "source": "manual",
  "created": 1630326492,
  "modified": 1630326492,
  "data": {
    "number": 514,
    "date": 1577869200
  },
  "additionalData": {},
  "version": 1
}

Или ошибка, если объект отсутствует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Или ошибка, если какое-либо из запрашиваемых полей отсутствует в json schema

{
    "businessError": null,
    "message": "ERROR: fields [first_field,second_field] for entityType 'Order' not found",
    "stackTrace": null,
    "data": null
}

Получение данных объекта сущности.

Для указания списка допустимых полей см. Методы Rich*.

Имя команды для вызова: internalRichGetObject. Поддерживается только синхронный вызов.

Команда только внутренняя (нельзя вызвать через Api Gateway) и отличается от внешней richGetObject только отсутствием аутентификации.

RichGetObjectsBatch

На входе список из типов сущностей, идентификаторов и требуемых полей у получаемых объектов

[
  {
    "entityType": "Order",
    "ids": [
      "18b1011b-9db3-4186-a53c-971016030068"
    ],
    "fields": [
      "date",
      "number"
    ]
  },
  {
    "entityType": "Person",
    "ids": [
      "c11df8f6-e8be-4e8e-a815-40e0d0a0cfb6"
    ],
    "fields": [
      "name",
      "orders"
    ]
  }
]

На выходе список объектов, сгруппированный по типам сущностей

{
  "Order": [
    {
      "id": "18b1011b-9db3-4186-a53c-971016030068",
      "externalId": "ExternalOrder",
      "entityType": "Order",
      "title": "Аренда лошади",
      "source": "manual",
      "created": 1630326492,
      "modified": 1630326492,
      "data": {
        "date": 1577869200,
        "number": 514
      },
      "additionalData": {},
      "version": 1
    }
  ],
  "Person": [
    {
      "id": "c11df8f6-e8be-4e8e-a815-40e0d0a0cfb6",
      "externalId": null,
      "entityType": "Person",
      "title": "Person c11df8f6-e8be-4e8e-a815-40e0d0a0cfb6",
      "source": "manual",
      "created": 1645526774115,
      "modified": 1645526774115,
      "data": {
        "orders": [
          "18b1011b-9db3-4186-a53c-971016030068"
        ],
        "name": "Строка длиной не больше 64"
      },
      "additionalData": {},
      "version": 1
    }
  ]
}

Получение данных объектов по их ID, типу сущности и списку требуемых полей.

Для указания списка допустимых полей см. Методы Rich*.

Имя команды для вызова: richGetObjectsBatch. Поддерживается только синхронный вызов

GetExternalObject

На входе внешний ID получаемого объекта и его тип сущности

{
  "entityType": "Order",
  "externalId": "ExternalOrder"
}

На выходе данные запрашиваемого объекта

{
  "id": "982fa393-423b-4e6b-8e7d-d2b65ff061c8",
  "externalId": "ExternalOrder", 
  "entityType": "Order",
  "title": "External Order",
  "source": "order-client",
  "created": 1639748410280,
  "modified": 1639748410280,
  "data": {
    "date": 1577869200,
    "title": "External Order",
    "number": 514
  },
  "additionalData": {},
  "version": 1
}

Получение данных объекта сущности.

Имя команды для вызова: getExternalObject. Поддерживается только синхронный вызов.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

UpdateObject

На входе общие свойства сохраняемого объекта и основные атрибуты

{
  "entityType": "Order",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068",
  "version": 2,
  "attributes": {
    "date": 1577869200,
    "number": 514
  }
}

На выходе признак успешного сохранения

true

Или ошибка, если объект не существует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Или ошибка, если объект был обновлен из другого места

{
    "businessError": null,
    "message": "ERROR: object version is not actual (Optimistic Lock)",
    "stackTrace": null,
    "data": null
}

Изменение объекта сущности. Использует оптимистичную блокировку. Если изменяемый объект был изменен параллельно (например, из другой формы другим пользователем), тогда вернется ошибка ERROR: object version is not actual (Optimistic Lock), показывающая, что не произошло обновления из-за некорректной версии.

Имя команды для вызова: updateObject. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

UpdateObjectFields

На входе общие свойства обновляемого объекта, а также json-объект, где ключ - это изменяемое поле, а значение - новое значение этого поля

{
  "entityType": "Order",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068",
  "version": 2,
  "updates": {"date": 1577869200, "title": "External Order"}
}

На выходе признак успешного сохранения

true

Или ошибка, если объект не существует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Или ошибка, если объект был обновлен из другого места

{
    "businessError": null,
    "message": "ERROR: object version is not actual (Optimistic Lock)",
    "stackTrace": null,
    "data": null
}

Изменение полей в объекте сущности. Если поле нужно удалить, то его значение указывается как null.
Использует оптимистичную блокировку. Если изменяемый объект был изменен параллельно (например, из другой формы другим пользователем), тогда вернется ошибка ERROR: object version is not actual (Optimistic Lock), показывающая, что не произошло обновления из-за некорректной версии.

Имя команды для вызова: updateObjectFields. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

UpdateObjectFieldsList

На входе параметры списочного запроса, а также json-объект, где ключ - это изменяемое поле, а значение - новое значение этого поля

{
  "entityType": "Order",
  "search": {
    "query": "title",
    "context": {"title": "External Order"}
  },
  "updates": {"date": 1577869200, "title": "Updated External Order"}
}

На выходе количество измененных объектов

42

Массовое изменение полей в объектах сущности, попадающих под списочный запрос.

Имя команды для вызова: updateObjectFieldsList. Поддерживается асинхронный и синхронный вызов.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

UpdateObjectFieldsBatch

На входе перечень ID обновляемых объектов, а также json-объект, где ключ - это изменяемое поле, а значение - новое значение этого поля

{
  "entityType": "Order",
  "objectIds": ["0808bb23-3e32-4fea-b682-a8287b5f7d05", "6895b246-ecb5-4a9b-8094-ed4aeabf2c46"],
  "updates": {"date": 1577869200, "title": "Updated External Order"}
}

На выходе результаты обновления по каждому отдельному объекту

[
  {
    "entityId": "Order",
    "objectId": "0808bb23-3e32-4fea-b682-a8287b5f7d05",
    "result": true
  },
  {
    "entityId": "Order",
    "objectId": "6895b246-ecb5-4a9b-8094-ed4aeabf2c46",
    "result": false,
    "error": "ERROR: Entity object not found",
    "errorCode": 404
  }
]

Массовое изменение полей в объектах сущности по ID объектов.

Имя команды для вызова: updateObjectFieldsBatch. Поддерживается асинхронный и синхронный вызов.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

UpdateExternalObject

На входе общие свойства сохраняемого объекта и основные атрибуты

{
  "entityType": "Order",
  "externalId": "ExternalOrder",
  "attributes": {
    "date": 1577869200,
    "number": 514, 
    "title": "External Order v2"
  }
}

На выходе признак успешного сохранения

true

Изменение внешнего объекта

Имя команды для вызова: updateExternalObject. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

DeleteObject

На входе ID получаемого объекта и его тип сущности

{
  "entityType": "Order",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068"
}

На выходе признак успешного удаления

true

Или ошибка, если объекта не существует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Удаление объекта сущности. Если у объекта есть связи, они тоже будут удалены.

Имя команды для вызова: deleteObject. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

DeleteObjectBatch

На входе список EntityObjectIdentity удаляемых объектов

[
  {
    "entityType": "Patent",
    "objectId": "7cba68ef-10fe-4629-9680-3346e73756bd"
  },
  {
    "entityType": "Document",
    "objectId": "b7bb4a5a-dc0f-4bfc-b7e3-f2258700b47b"
  }
]

На выходе количество успешно удаленных объектов

2

Или ошибка, если объекта (объектов) не существует

{
    "businessError": null,
    "message": "ERROR: 'Entity object' not found",
    "stackTrace": null,
    "data": null
}

Удаление объектов сущностей по списку. Если у объектов есть связи, они тоже будут удалены.

Имя команды для вызова: deleteObjectBatch. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

DeleteObjectSearch

На входе EntityTypeId и Search для поиска удаляемых объектов. Если во входных данных есть пейджинг или сортировка, то они будут проигнорированы

{
  "entityType": "Patent",
  "search": {
    "query": "title",
    "context": {
      "title": "like %48588d61-6c76-48d0-9318-e9dcfcbe688d%"
    }
  }
}

На выходе количество успешно удаленных объектов

2

Или ошибка, если объекта (объектов) не существует

{
    "businessError": null,
    "message": "ERROR: 'Entity object' not found",
    "stackTrace": null,
    "data": null
}

Удаление объектов сущности поиском по реестру.

Имя команды для вызова: deleteObjectSearch. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

DeleteExternalObject

На входе внешний ID удаляемого объекта и его тип сущности

{
  "entityType": "Order",
  "externalId": "ExternalOrder"
}

На выходе признак успешного удаления

true

Удаление внешнего объекта сущности. Если у объекта есть связи, они тоже будут удалены.

Имя команды для вызова: deleteExternalObject. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

SaveAdditionalInfo

На входе дополнительные свойства сохраняемого объекта и его ID

{
  "entityType": "Order",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068",
  "additionalData": {
    "keywords": "Договор, аренда, лошадь"
  }
}

На выходе признак успешного сохранения

true

Сохранение дополнительных полей объекта сущности. Дополняет текущий список дополнительных полей новым. Если поле уже есть, тогда перезаписывает. Передавать полный список не нужно.

Имя команды для вызова: saveAdditionalInfo. Поддерживается асинхронный и синхронный вызов.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

SaveFilesAdditionalInfo command

На входе информация о дополнительных файлах файловых полей

{
  "entityType": "Order",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068",
  "data": [
    {
      "field": "documentFile",
      "key": "documentFileContent",
      "files": {
        "2155c943-5c30-49aa-bc43-28c7447b26eb": "datamodel/Order/47fdb0ce-4b1b-4338-ad9b-31ad5c9e2550"
      }
    }
  ]
}

На выходе количество обновленных файлов

1

Имя команды для вызова: saveFilesAdditionalInfo. Поддерживается асинхронный и синхронный вызов.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

ListObjects command

На входе тип сущности объектов и параметры спискового запроса

{
  "entityType": "Order",
  "search": {
    "query": "",
    "context": {},
    "paging": {
      "page": 1,
      "count": 2
    }
  }
}

На выходе странца со списком объектов запрашиваемой сущности с учетом параметров и общее количество элементов

{
  "items": [
    {
      "id": "18b1011b-9db3-4186-a53c-971016030068",
      "externalId": "ExternalOrder",
      "entityType": "Order",
      "title": "Аренда лошади",
      "source": "manual",
      "created": 1630326492,
      "modified": 1630326492,
      "data": {
        "date": 1577869200,
        "number": 514,
        "title": "Аренда лошади"
      },
      "additionalData": {
        "keywords": "Договор, аренда, лошадь"
      },
      "version": 1
    },
    {
      "id": "cbf73923-e043-481e-97b2-8ec5968a10ca",
      "externalId": null,
      "entityType": "Order",
      "title": "",
      "source": "import",
      "created": 1630567604, 
      "modified": 1630326492,
      "data": {
        "date": 1567330200,
        "number": 321
      },
      "additionalData": {
        "keywords": "Договор, вагон, паровоз"
      },
      "version": 1
    }
  ],
  "total": 3
}

Получение списка объектов запрашиваемой сущности. Запрос принимает параметры сортировки, фильтров и пейджинга в параметре Search.

Имя команды для вызова: listObjects. Поддерживается только синхронный вызов

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
id или objectid InSetQuery
externalid InSetQuery
title InSetQuery, LikeQuery
source InSetQuery
created InSetQuery, RangeQuery
modified InSetQuery, RangeQuery

Если поле для фильтрации имеет вид data.something или additionaldata.something, то фильтрация идет по соответствующим полям в data или additionalData. Для этих фильтров поддерживаются виды InSetQuery, LikeQuery и RangeQuery.

Доступные поля для сортировки:

Поле Примечание
id или objectid -
externalid -
title -
modified -
created -
source При сортировке по возрастанию сначала идут Manual, потом Auto

Если поле sorting отсутствует, то список сортируется по полю created в порядке возрастания

Если fieldName не совпадает с вышеперечисленными, то список сортируется по этому полю в data

RichListObjects command

На входе тип сущности объектов, список необходимых полей и параметры спискового запроса

{
  "entityType": "Order",
  "fields": [
    "number"
  ],
  "search": {
    "query": "",
    "context": {},
    "paging": {
      "page": 1,
      "count": 2
    }
  }
}

На выходе странца со списком объектов запрашиваемой сущности с учетом параметров и общее количество элементов.

{
  "items": [
    {
      "id": "18b1011b-9db3-4186-a53c-971016030068",
      "externalId": "ExternalOrder",
      "entityType": "Order",
      "title": "Аренда лошади",
      "source": "manual",
      "created": 1630326492,
      "modified": 1630326492,
      "data": {
        "number": 514
      },
      "additionalData": {
        "keywords": "Договор, аренда, лошадь"
      },
      "version": 1
    },
    {
      "id": "cbf73923-e043-481e-97b2-8ec5968a10ca",
      "externalId": null,
      "entityType": "Order",
      "title": "",
      "source": "import",
      "created": 1630567604, 
      "modified": 1630326492,
      "data": {
        "number": 321
      },
      "additionalData": {
        "keywords": "Договор, вагон, паровоз"
      },
      "version": 1
    }
  ],
  "total": 3
}

Получение списка объектов запрашиваемой сущности. В JSON-объекте "data", для каждого объекта содержатся только указанные в запросе поля.
Запрос принимает параметры сортировки, фильтров и пейджинга в параметре Search.

Для фильтрации/сортировки по relation полям см. Relation поля.
Для указания списка допустимых полей см. Методы Rich*.

Имя команды для вызова: richListObjects. Поддерживается только синхронный вызов

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
id или objectid InSetQuery
externalid InSetQuery
title InSetQuery, LikeQuery
source InSetQuery
created InSetQuery, RangeQuery
modified InSetQuery, RangeQuery

Если поле для фильтрации имеет вид data.something или additionaldata.something, то фильтрация идет по соответствующим полям в data или additionalData. Для этих фильтров поддерживаются виды InSetQuery, LikeQuery и RangeQuery.

Доступные поля для сортировки:

Поле Примечание
id или objectid -
externalid -
title -
modified -
created -
source При сортировке по возрастанию сначала идут Manual, потом Auto

Если поле sorting отсутствует, то список сортируется по полю created в порядке возрастания

ListObjectsMeta

На входе тип сущности объектов и параметры спискового запроса

{
  "entityType": "Order",
  "search": {
    "query": "",
    "context": {},
    "paging": {
      "page": 1,
      "count": 2
    }
  }
}

На выходе странца со списком объектов запрашиваемой сущности с учетом параметров и общее количество элементов

{
  "items": [
    {
      "id": "18b1011b-9db3-4186-a53c-971016030068",
      "entityType": "Order",
      "title": "Аренда лошади",
      "source": "manual",
      "created": 1630326492,
      "modified": 1630326492,
      "version": 1
    },
    {
      "id": "cbf73923-e043-481e-97b2-8ec5968a10ca",
      "entityType": "Order",
      "title": "",
      "source": "import",
      "created": 1630567604,
      "modified": 1630326492,
      "version": 1
    }
  ],
  "total": 3
}

Получение списка метаданных объектов запрашиваемой сущности. Запрос принимает параметры сортировки, фильтров и пейджинга в параметре Search.

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
id или objectid InSetQuery
externalid InSetQuery
title InSetQuery, LikeQuery
source InSetQuery
created InSetQuery, RangeQuery
modified InSetQuery, RangeQuery

Если поле для фильтрации имеет вид data.something или additionaldata.something, то фильтрация идет по соответствующим полям в data или additionalData. Для этих фильтров поддерживаются виды InSetQuery, LikeQuery и RangeQuery

Доступные поля для сортировки:

Поле Примечание
id или objectid -
externalid -
title -
modified -
created -
source При сортировке по возрастанию сначала идут Manual, потом Auto

Если поле sorting отсутствует, то список сортируется по полю created в порядке возрастания

Если fieldName не совпадает с вышеперечисленными, то список сортируется по этому полю в data

Имя команды для вызова: listObjectsMeta. Поддерживается только синхронный вызов

ListObjectTitles

На входе тип сущности объектов и параметры спискового запроса

{
  "entityType": "Order",
  "search": {
    "query": "",
    "context": {},
    "paging": {
      "page": 1,
      "count": 2
    }
  }
}

На выходе страница со списком объектов запрашиваемой сущности с учетом параметров и общее количество элементов

{
  "items": [
    {
      "entityType": "Order",
      "objectId": "18b1011b-9db3-4186-a53c-971016030068",
      "title": "Аренда лошади"
    },
    {
      "entityType": "Order",
      "objectId": "cbf73923-e043-481e-97b2-8ec5968a10ca",
      "title": ""
    }
  ],
  "total": 3
}

Получение списка наименований объектов с учетом параметров сортировки, фильтров и пейджинга.

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
id или objectid InSetQuery
externalid InSetQuery
title InSetQuery, LikeQuery
source InSetQuery
created InSetQuery, RangeQuery
modified InSetQuery, RangeQuery

Если поле для фильтрации имеет вид data.something или additionaldata.something, то фильтрация идет по соответствующим полям в data или additionalData. Для этих фильтров поддерживаются виды InSetQuery, LikeQuery и RangeQuery

Доступные поля для сортировки:

Поле Примечание
id или objectid -
externalid -
title -
modified -
created -
source При сортировке по возрастанию сначала идут Manual, потом Auto

Если поле sorting отсутствует, то список сортируется по полю created в порядке возрастания

Если fieldName не совпадает с вышеперечисленными, то список сортируется по этому полю в data

Имя команды для вызова: listObjectTitlesV2. Поддерживается только синхронный вызов

GetObjectPosition command

На входе тип сущности объекта, ID искомого объекта и параметры спискового запроса

{
  "entityType": "Order",
  "objectId": "cbf73923-e043-481e-97b2-8ec5968a10ca",
  "search": {
    "query": "",
    "context": {},
    "sorting": "title"
  }
}

На выходе позиция объекта в отфильтрованном и отсортированном списке, начиная с 0:

{
  "position": 1,
  "total": 3
}

Получение позиции объекта в списке объектов, с учетом фильтрации и сортировки.

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
id или objectid InSetQuery
externalid InSetQuery
title InSetQuery, LikeQuery
source InSetQuery
created InSetQuery, RangeQuery
modified InSetQuery, RangeQuery

Если поле для фильтрации имеет вид data.something или additionaldata.something, то фильтрация идет по соответствующим полям в data или additionalData. Для этих фильтров поддерживаются виды InSetQuery, LikeQuery и RangeQuery

Доступные поля для сортировки:

Поле Примечание
id или objectid -
externalid -
title -
modified -
created -
source При сортировке по возрастанию сначала идут Manual, потом Auto

Если поле sorting отсутствует, то список сортируется по полю created в порядке возрастания

Если fieldName не совпадает с вышеперечисленными, то список сортируется по этому полю в data

Имя команды для вызова: getObjectPosition. Поддерживается только синхронный вызов

GetEntityFieldAggregation Command

На входе тип сущности, параметры фильтрации, и перечень полей по которым требуется агрегация

{
  "entityType": "Order",
  "search": {
    "query": "",
    "context": {}
  },
  "fields": ["title"]
}

На выходе статистика значений указанных полей с учетом фильтрации

{
  "title": [
    {"value": "Договор", "count": 5},
    {"value": "Заявление", "count": 10}
  ]
}

Получение статистики полей модели данных.

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
id или objectid InSetQuery
externalid InSetQuery
title InSetQuery, LikeQuery
source InSetQuery
created InSetQuery, RangeQuery
modified InSetQuery, RangeQuery

Если поле для фильтрации имеет вид data.something или additionaldata.something, то фильтрация идет по соответствующим полям в data или additionalData. Для этих фильтров поддерживаются виды InSetQuery, LikeQuery и RangeQuery

Имя команды для вызова: getEntityFieldAggregation. Поддерживается только синхронный вызов

SaveRelation

На входе параметры сущности, отношение между которыми сохраняется, а также ID конкретных объектов, входящих в отношение

{
  "entity1Type": "Order",
  "entity2Type": "Item",
  "entity1Field": "items", 
  "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
  "object2Id": "48911128-39a1-418c-93f1-c9773cda224e",
  "source": "manual"
}

На выходе признак успешного сохранения

true

Сохранение отношения между объектами двух сущностей.

Имя команды для вызова: saveRelation. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

SaveRelationBatch

На входе массив параметров сущностей, отношение между которыми сохраняется, а также ID конкретных объектов, входящих в отношение

[
  {
    "entity1Type": "Order",
    "entity2Type": "Item",
    "entity1Field": "items",
    "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
    "object2Id": "48911128-39a1-418c-93f1-c9773cda224e",
    "source": "manual"
  },
  {
    "entity1Type": "Person",
    "entity2Type": "Item",
    "entity1Field": "items",
    "object1Id": "d1d70690-d972-4ee3-9ec1-ccd972979e72",
    "object2Id": "05c989a2-74cc-4888-a49c-c160bf7f918a",
    "source": "manual"
  }
]

На выходе перечень результатов сохранения для каждого отдельного отношения

[
  {
    "relation": {
      "entity1Type": "Order",
      "entity2Type": "Item",
      "entity1Field": "items",
      "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
      "object2Id": "48911128-39a1-418c-93f1-c9773cda224e",
      "source": "manual"
    },
    "result": true
  },
  {
    "relation": {
      "entity1Type": "Person",
      "entity2Type": "Item",
      "entity1Field": "items",
      "object1Id": "d1d70690-d972-4ee3-9ec1-ccd972979e72",
      "object2Id": "05c989a2-74cc-4888-a49c-c160bf7f918a",
      "source": "manual"
    },
    "result": false,
    "error": "Relation between Person and Item does not exist "
  }
]

Сохранение нескольких отношений между объектами двух сущностей.

Имя команды для вызова: saveRelationBatch. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

GetRelation

На входе параметры сущности, а также ID конкретных объектов, входящих в отношение

{
  "entity1Type": "Order",
  "entity2Type": "Item",
  "entity1Field": "items",
  "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
  "object2Id": "48911128-39a1-418c-93f1-c9773cda224e"
}

На выходе найденное отношение

{
  "entity1Type": "Order",
  "entity2Type": "Item",
  "entity1Field": "items",
  "entity2Field": "order",
  "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
  "object2Id": "48911128-39a1-418c-93f1-c9773cda224e",
  "source": "test"
}

Или ошибка, если отношения не существует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Получение отношения между объектами двух сущностей.

Имя команды для вызова: getRelation. Поддерживается только синхронный вызов

ListRelations

На входе параметры объекта и сущности, для которых нужно получить отношения

{
  "entityType": "Order",
  "objectId": "48911128-39a1-418c-93f1-c9773cda224e",
  "relatedEntityType": "Person",
  "fieldName": "Author",
  "reversed": false,
  "paging": null
}

На выходе список отношений объекта с указанной сущностью

[
  {
      "id": "134b960a-922d-4bca-b1e8-072de5a5efc1",
      "entityType1": "Order",
      "entityType2": "Person",
      "entity1Field": "author",
      "entity2Field": "orders",
      "object1Id": "48911128-39a1-418c-93f1-c9773cda224e",
      "object2Id": "83a7a3e9-ab24-4e83-b8e9-7470136aeb57",
      "source": "manual"
    }
]

Получение всех отношений объекта с указанной сущностью

Имя команды для вызова: listRelations. Поддерживается только синхронный вызов.

ListRelationsBatch

На входе перечень параметров объекта и сущности, для которых нужно получить отношения

[{
  "entityType": "Order",
  "objectId": "48911128-39a1-418c-93f1-c9773cda224e",
  "relatedEntityType": "Person",
  "fieldName": "Author",
  "reversed": false,
  "paging": null
}]

На выходе список отношений указанных объектов с указанными для них сущностями

[
  {
      "id": "134b960a-922d-4bca-b1e8-072de5a5efc1",
      "entityType1": "Order",
      "entityType2": "Person",
      "entity1Field": "author",
      "entity2Field": "orders",
      "object1Id": "48911128-39a1-418c-93f1-c9773cda224e",
      "object2Id": "83a7a3e9-ab24-4e83-b8e9-7470136aeb57",
      "source": "manual"
    }
]

Аналогично ListRelations, но массовое.

Имя команды для вызова: listRelationsBatch. Поддерживается только синхронный вызов.

ListAllRelations

На входе параметры объекта, для которого нужно получить все отношения

{
  "entityType": "Order",
  "objectId": "48911128-39a1-418c-93f1-c9773cda224e"
}

На выходе список отношений объекта

[
  {
      "id": "134b960a-922d-4bca-b1e8-072de5a5efc1",
      "entityType1": "Order",
      "entityType2": "Person",
      "entity1Field": "author",
      "entity2Field": "orders",
      "object1Id": "48911128-39a1-418c-93f1-c9773cda224e",
      "object2Id": "83a7a3e9-ab24-4e83-b8e9-7470136aeb57",
      "source": "manual"
    }
]

Получение всех отношений объекта

Имя команды для вызова: listAllRelations. Поддерживается только синхронный вызов.

DeleteRelation

На входе параметры сущности, отношение между которыми удаляется, а также ID конкретных объектов, входящих в отношение

{
  "entity1Type": "Order",
  "entity2Type": "Item",
  "entity1Field": "items",
  "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
  "object2Id": "48911128-39a1-418c-93f1-c9773cda224e"
}

На выходе признак успешного удаления отношения

true

Или ошибка, если отношения не существует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Удаление отношения между объектами двух сущностей.

Имя команды для вызова: deleteRelation. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

DeleteRelations

На входе параметры объекта, для которого нужно удалить отношения, и перечень связных сущностей

{
  "entityType": "Order",
  "objectId": "48911128-39a1-418c-93f1-c9773cda224e",
  "relatedEntityTypes": ["Person"]
}

На выходе список удаленных отношений

[
  {
      "id": "134b960a-922d-4bca-b1e8-072de5a5efc1",
      "entityType1": "Order",
      "entityType2": "Person",
      "entity1Field": "author",
      "entity2Field": "orders",
      "object1Id": "48911128-39a1-418c-93f1-c9773cda224e",
      "object2Id": "83a7a3e9-ab24-4e83-b8e9-7470136aeb57",
      "source": "manual"
    }
]

Удаление отношений объекта с перечисленными сущностями

Имя команды для вызова: deleteRelations. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

DeleteAllRelations

На входе параметры объекта, для которого нужно удалить все отношения

{
  "entityType": "Order",
  "objectId": "48911128-39a1-418c-93f1-c9773cda224e"
}

На выходе список удаленных отношений

[
  {
      "id": "134b960a-922d-4bca-b1e8-072de5a5efc1",
      "entityType1": "Order",
      "entityType2": "Person",
      "entity1Field": "author",
      "entity2Field": "orders",
      "object1Id": "48911128-39a1-418c-93f1-c9773cda224e",
      "object2Id": "83a7a3e9-ab24-4e83-b8e9-7470136aeb57",
      "source": "manual"
    }
]

Удаление всех отношений объекта

Имя команды для вызова: deleteAllRelations. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

UpdateExternalRelations (command)

На входе поля для идентификации связи, и ID объектов, между которыми устанавливается связь

{
  "entity1Type": "Order",
  "entity2Type": "Item",
  "entity1Field": "items",
  "objectId": "Order1",
  "reversed": false,
  "relatedObjectIds": ["Item1", "Item2"],
  "source": "manual"
}

На выходе перечень результатов сохранения для каждого отдельного отношения

[
  {
    "relatedObjectId": "Item1",
    "success": true
  },
  {
    "relatedObjectId": "Item2",
    "success": false,
    "error": "Not found object with entity type Item and id Item2"
  }
]

Обновление списка отношений одного объекта с указанной сущностью.
Команда полностью заменяет список отношений объекта; таким образом, указанные в теле команды отношения будут созданы, а не указанные — удалены.

Имя команды для вызова: updateExternalRelations. Поддерживается асинхронный и синхронный вызов. Результат выполнения команды журналируется.

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

ReindexObject

На входе ID объекта и его тип сущности

{
  "entityType": "Order",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068"
}

На выходе признак успешной отправки события переиндексации

true

Имя команды для вызова: reindexObject. Поддерживается асинхронный и синхронный вызов

На входе ID получаемой связи

"4faf020e-d0f6-4cb7-ab54-8412d50a28f4"

На выходе данные запрашиваемой связи между объектами

{
  "id": "4faf020e-d0f6-4cb7-ab54-8412d50a28f4",
  "entityType1": "Order",
  "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
  "entityType2": "Act",
  "object2Id": "e776d20e-28ec-4e90-87d2-35962d7ca60e",
  "linkType": "plagiarism",
  "source": "auto",
  "owner": "plagiarism_mapper",
  "additional": {
    "intersections": 0.85
  }
}

Получение связи между объектами по ID.

Имя команды для вызова: getObjectLink. Поддерживается только синхронный вызов

На входе объект, связи которого нужно получить, список типов связей, и признак прямой или обратной связи

{
  "entityType": "Document",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068",
  "forwardLinks": true
}

На выходе список связей запрашиваемого объекта

[
  {
    "id": "4faf020e-d0f6-4cb7-ab54-8412d50a28f4",
    "entityType1": "Order",
    "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
    "entityType2": "Act",
    "object2Id": "e776d20e-28ec-4e90-87d2-35962d7ca60e",
    "linkType": "plagiarism",
    "source": "auto",
    "owner": "plagiarism_mapper",
    "additional": {
      "intersections": 0.85
    }
  },
  {
    "id": "b9841e89-1e05-4519-8b0e-f15804410039",
    "entityType1": "Order",
    "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
    "entityType2": "Act",
    "object2Id": "e776d20e-28ec-4e90-87d2-35962d7ca60e",
    "linkType": "similarity",
    "source": "auto",
    "owner": "faiss_similarity",
    "additional": {
      "similarity": 0.33
    }
  }
]

Получение всех связей объекта. Объект идентифицируется его ID и типом сущности. Можно указать список типов связи, тогда вернутся связи только указанных типов. Если этот список пустой или отсутствует, тогда вернутся все связи. Обязательно указывать направление связи (все связи всегда направленные). Прямое направление показывает, что искомый объект ищется среди первого узла связи (entity1), а обратное - среди второго (entity2).

Имя команды для вызова: getObjectLinks. Поддерживается только синхронный вызов

ListRelationsByType

На входе название поля связи и типы объектов, между которыми нужно получить связи

{
  "entityFrom": "ProjectParticipant",
  "entityTo": "Project",
  "field": "project"
}

На выходе список всех связей для указанных типов с данными об объектах

{
  "items": [
    {
      "id": "4faf020e-d0f6-4cb7-ab54-8412d50a28f4",
      "entityType1": "ProjectParticipant",
      "object1": {
        "id": "d4db2633-62c7-4b61-956d-cb5461fe2a3e",
        "externalId": "0000000000000000",
        "entityType": "ProjectParticipant",
        "title": "Order d4db2633-62c7-4b61-956d-cb5461fe2a3e",
        "source": "example",
        "created": 1630326492,
        "modified": 1630326492,
        "data": {
          "date": 1577869200,
          "number": 555,
          "author": "00000000-0000-0000-0000-000000000000"
        },
        "additionalData": {},
        "version": 1
      },
      "entityType2": "Project",
      "object2": {
        "id": "d4db2633-62c7-4b61-956d-cb5461fe2a3e",
        "externalId": "0000000000000000",
        "entityType": "Project",
        "title": "Order d4db2633-62c7-4b61-956d-cb5461fe2a3e",
        "source": "example",
        "created": 1630326492,
        "modified": 1630326492,
        "data": {
          "date": 1577869200,
          "number": 555,
          "author": "00000000-0000-0000-0000-000000000000"
        },
        "additionalData": {},
        "version": 1
      },
      "linkType": "plagiarism",
      "source": "auto"
    }
  ],
  "total": 1
}

Получение всех связей между указанными типами.

Имя команды для вызова: listRelationsByType. Поддерживается только синхронный вызов

На входе параметры создаваемой связи

{
  "entityType1": "Order",
  "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
  "entityType2": "Act",
  "object2Id": "e776d20e-28ec-4e90-87d2-35962d7ca60e",
  "linkType": "plagiarism",
  "source": "auto",
  "owner": "plagiarism_mapper",
  "additional": {
    "intersections": 0.85
  }
}

На выходе ID созданной связи

"4faf020e-d0f6-4cb7-ab54-8412d50a28f4"

Получение связи между объектами по ID.

Имя команды для вызова: createObjectLink. Поддерживается асинхронный и синхронный вызов

На входе список создаваемых связей

[
  {
    "entityType1": "Order",
    "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
    "entityType2": "Act",
    "object2Id": "e776d20e-28ec-4e90-87d2-35962d7ca60e",
    "linkType": "plagiarism",
    "source": "auto",
    "owner": "plagiarism_mapper",
    "additional": {
      "intersections": 0.85
    }
  },
  {
    "entityType1": "Order",
    "object1Id": "18b1011b-9db3-4186-a53c-971016030068",
    "entityType2": "Act",
    "object2Id": "da2cf038-973a-4202-a4ac-0bab6960c30c",
    "linkType": "plagiarism",
    "source": "auto",
    "owner": "plagiarism_mapper",
    "additional": {
      "intersections": 0.85
    }
  }
]

На выходе количество созданных связей

2

Создание связей между объектами

Имя команды для вызова: createObjectsLinks. Поддерживается асинхронный и синхронный вызов

Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.

На входе ID удаляемой связи

"4faf020e-d0f6-4cb7-ab54-8412d50a28f4"

На выходе признак успешного удаления

true

Или ошибка, если связи не существует не существует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Удаление связи между объектами по ID.

Имя команды для вызова: deleteObjectLink. Поддерживается асинхронный и синхронный вызов

На входе параметры объекта и его связей для удаления (тип сущности, ID объекта, необязательный тип связей и признак прямых или обратных связей)

{
  "entityType": "Document",
  "objectId": "18b1011b-9db3-4186-a53c-971016030068",
  "linkType": "plagiarism",
  "forwardLinks": true
}

На выходе количество удаленных ссылок

3

Или ошибка, если объекта не существует не существует

{
    "businessError": null,
    "message": "ERROR: Entity object not found",
    "stackTrace": null,
    "data": null
}

Удаление связей объекта. Объект идентифицируется его ID и типом сущности. Можно опционально выбрать только связи определенного типа. Обязательно указывать направление связи (все связи всегда направленные). Прямое направление показывает, что искомый объект ищется среди первого узла связи (entity1), а обратное - среди второго (entity2).

Имя команды для вызова: deleteAllObjectLinks. Поддерживается асинхронный и синхронный вызов

ListFilesInfoWithTags

На входе параметры для поиска файлов (фильтры, сортировка, номер страницы)

{
  "query": "name",
  "context": {
    "code": "like Doc1%"
  },
  "sorting": null,
  "paging": null
}

На выходе результат поиска файлов по переданным параметрам

{
  "items": [
    {
      "objectIdentity":  {
        "entityType": "Document",
        "objectId": "18b1011b-9db3-4186-a53c-971016030068"
      },
      "entityTypeTitle": "Документ",
      "objectTitle": "Document 54a4da2d-05da-448e-88af-b44757ceef40",
      "fileInfo": {
        "fileId": "54a4da2d-05da-448e-88af-b44757ceef40",
        "size": 11830,
        "name": "Doc1.docx",
        "extension": "docx",
        "url": "datamodel/Document/54a4da2d-05da-448e-88af-b44757ceef40",
        "additional": {},
        "created": 1636378607649,
        "modified": 1636378607649,
        "md5": "7EF292CD265BC138C92F069CCF08D32C"
      },
      "tags": ["TextFile", "DocxFile"]
    }
  ],
  "total": 1
}

Возвращает список файлов с подрорбной информацией о файле, тегах данного файла и родительском объекте.

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
fileId InSetQuery
size InSetQuery
name InSetQuery, LikeQuery
extension InSetQuery, LikeQuery
url InSetQuery, LikeQuery
created InSetQuery, RangeQuery
modified InSetQuery, RangeQuery
md5 InSetQuery

Доступные поля для сортировки:

Поле Примечание
size -
name -
extension -
url -
modified -

Если поле sorting отсутствует, то список сортируется по полю created в порядке возрастания

Имя команды для вызова: listFilesInfoWithTags. Поддерживается только синхронный вызов

ListTagsWithFilesCount

На входе параметры для поиска файлов (фильтры, сортировка, номер страницы)

{
  "query": "name",
  "context": {
    "code": "like Doc1%"
  },
  "sorting": null,
  "paging": null
}

На выходе список тегов с количеством привязанных файлов, которые были найдены по переданным параметрам

{
  "TextFile": 1,
  "NULL": 10
}

Возвращает список тегов с количеством файлов. Если есть файлы, которые не привязаны ни к одному тегу, будет добавлен тег "NULL" с количеством таких файлов.

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
fileId InSetQuery
size InSetQuery
name InSetQuery, LikeQuery
extension InSetQuery, LikeQuery
url InSetQuery, LikeQuery
created InSetQuery, RangeQuery
modified InSetQuery, RangeQuery
md5 InSetQuery

Сортировка и пагинация для данной команды не применяются.

Имя команды для вызова: listTagsWithFilesCount. Поддерживается только синхронный вызов

ListFileExtensions

На входе никаких параметры не требуется

null

На выходе список уникальных расширений загруженных в систему файлов

[
  "docx",
  "txt",
  "pdf"
]

Возваращает список уникальных расширений загруженных в систему файлов.

Имя команды для вызова: listFileExtensions. Поддерживается только синхронный вызов

WriteFileTags

На входе список идентификаторов файла с новыми тегами

[
  {
    "fileId": "54a4da2d-05da-448e-88af-b44757ceef40",
    "tags": ["TextFile", "DocxFile"]
  } 
]

На выходе количество успешно записаных тегов

2

Перезаписывает текущие теги файла, новым списком полученным в параметрах команды.

Имя команды для вызова: writeFileTags. Поддерживается асинхронный и синхронный вызов

RemoveFileTags

На входе список идентификаторов файла с тегами, которые нужно удалить

[
  {
    "fileId": "54a4da2d-05da-448e-88af-b44757ceef40",
    "tags": ["DocxFile"]
  } 
]

На выходе количество успешно удаленных тегов

1

Удаляет из текущего набора тегов для файла те теги, которые переданы в параметрах команды.

Имя команды для вызова: removeFileTags. Поддерживается асинхронный и синхронный вызов

RemoveAllFileTags

На входе список идентификаторов файла

[
  "54a4da2d-05da-448e-88af-b44757ceef40"
]

На выходе количество успешно удаленных тегов

2

Удаляет все теги для указанных файлов

Имя команды для вызова: removeAllFileTags. Поддерживается асинхронный и синхронный вызов

GetEntityParents

На входе код типа сущностей

"RfbrDocument"

На выходе все родительские сущности

[
  {
    "entityType": "Patent",
    "fieldId": "patent",
    "nested": [
      {
        "entityType": "links",
        "fieldId": "links",
        "nested": []
      }
    ]
  },
  {
    "entityType": "1thesis",
    "fieldId": "thesis",
    "nested": []
  }
]

Имя команды для вызова: getEntityParents. Поддерживается только синхронный вызов

GetFile

На входе полный идентификатор файла

{
  "fileId": "54a4da2d-05da-448e-88af-b44757ceef40",
  "entityType": "1thesis",
  "objectId": "54a4da2d-05da-448e-88af-b44757ceef40"
}

На выходе информация о файле (предназначена только для сервиса api-gateway)

{
  "id": "1c689788-9617-4c93-bcee-6eae8909a0ba",
  "path": "temp/1c689788-9617-4c93-bcee-6eae8909a0ba",
  "bucket": "temp"
}

Данная команда предназначена для скачивания файла после проверки прав.

Имя команды для вызова: getFile. Поддерживается только синхронный вызов.

Скачивание файла

Эта команда имеет тип возвращаемого значения "файл". Она все еще возвращает json, но с помощью информации в этом json сервис apigateway вернет содержимое файла при успешном выполнении (но при ошибке будет возвращен json). В итоге чтобы скачать файл надо просто вызвать эту команду через apigateway

Объекты сервиса модели данных

Типы данных, которые принимает на вход команд сервис модели данных или возвращает в результате работы команды.

FieldType

Тип поля сущности

Поле Тип Описание
id string Строковый код типа поля
description string Название типа поля для вывода в UI
databaseType string Тип поля в БД
settings Json Произвольные настройки, применяемые для данного типа поля

RelationType

Тип отношения между сущностями

Поле Тип Описание
id string Строковый код типа отношения
title string Название типа отношения
description string Развернутое описание типа отношения

MigrationDslOperation

Базовый тип операции Migration DSL для создания модели данных. Реализации:

CreateEntity

{
  "operation": "CreateEntity",
  "entityType": "Order",
  "title": "Договор",
  "description": "Описывает договор между несколькими агентами"
}

Операция создания типа сущности

Поле Тип Обязательное Описание
operation string да Должно быть CreateEntity
entityType string да Строковый код создаваемого типа сущности
title string да Название типа сущности для вывода в UI
description string нет Развернутое описание типа сущности

UpdateEntity

{
  "operation": "UpdateEntity",
  "entityType": "Order",
  "title": "Договор",
  "description": "Представляет собой соглашение между несколькими агентами",
  "settings": {
    "titleRule": "otherFieldWithTitle"
  }
}

Операция изменения типа сущности

Поле Тип Обязательное Описание
operation string да Должно быть UpdateEntity
entityType string да Строковый код изменяемого типа сущности
title string да Название типа сущности для вывода в UI
description string нет Развернутое описание типа сущности
settings Json нет Настройки типа сущности

DeleteEntity

{
  "operation": "DeleteEntity",
  "entityType": "Test"
}

Операция удаления типа сущности

Поле Тип Обязательное Описание
operation string да Должно быть DeleteEntity
entityType string да Строковый код удаляемого типа сущности

AddField

{
  "operation": "AddField",
  "entityType": "Order",
  "fieldId": "number",
  "fieldType": "number",
  "title": "Номер договора",
  "description": "Номер, под которым регистрируется договор",
  "example": 555,
  "nullable": false,
  "settings": {}
}

Операция добавления поля к типу сущности. Для разных типов полей предусмотрены разные допустимые настройки.

Поле Тип Обязательное Описание
operation string да Должно быть AddField
entityType string да Строковый код типа сущности, которому добавляется поле
fieldId string да Строковый код (название) добавляемого поля
fieldType string да Строковый код типа добавляемого поля
title string да Название добавляемого поля для вывода в UI
description string нет Развернутое описание добавляемого поля
example требуемый тип нет Пример значения поля, см. ниже.
nullable boolean нет Необязательное или обязательное. Необязательное, когда указано true
settings Json нет Произвольные настройки

Параметр example

AddAdditionalField

{
  "operation": "AddAdditionalField",
  "entityType": "Order",
  "fieldId": "additionalFiles",
  "fieldType": "file",
  "title": "Дополнительные файлы",
  "description": "Дополнительные файлы документов, связанных с этим договором (акты, счета, итп)",
  "settings": {
    "multiple": true
  }
}

Операция добавления дополнительного поля к типу сущности. Для разных типов полей предусмотрены разные допустимые настройки.

Поле Тип Обязательное Описание
operation string да Должно быть AddAdditionalField
entityType string да Строковый код типа сущности, которому добавляется поле
fieldId string да Строковый код (название) добавляемого поля
fieldType string да Строковый код типа добавляемого поля
title string да Название добавляемого поля для вывода в UI
description string нет Развернутое описание добавляемого поля
example требуемый тип нет Пример значения поля. Применяется в конструкторе UI. Заполняется значением нужного типа. Если строка, тогда строка. Если чисто или дата - тогда число. Будет в таком же виде возвращено в конструктор.
settings Json нет Произвольные настройки

DeleteField

{
  "operation": "DeleteField",
  "entityType": "Order",
  "fieldId": "files"
}

Операция удаления поля у типа сущности. Поддерживает как простые, так и дополнительные поля.

Поле Тип Обязательное Описание
operation string да Должно быть DeleteField
entityType string да Строковый код типа сущности, у которой удаляется поле
fieldId string да Строковый код (название) удаляемого поля

UpdateField

{
  "operation": "UpdateField",
  "entityType": "Order",
  "fieldId": "number",
  "title": "Номер договора",
  "description": "Номер, под которым регистрируется договор",
  "example": 555,
  "nullable": false,
  "settings": {},
  "fieldType": "text"
}

Операция изменения поля у типа сущности.

Поле Тип Обязательное Описание
operation string да Должно быть UpdateField
entityType string да Строковый код типа сущности, которому добавляется поле
fieldId string да Строковый код (название) добавляемого поля
title string да Название добавляемого поля для вывода в UI
description string нет Развернутое описание добавляемого поля
example требуемый тип нет Пример значения поля. Применяется в конструкторе UI. Заполняется значением нужного типа. Если строка, тогда строка. Если чисто или дата - тогда число. Будет в таком же виде возвращено в конструктор.
nullable boolean нет Необязательное или обязательное. Необязательное, когда указано true
settings Json нет Произвольные настройки
fieldType string нет Строковый код нового типа поля

EntityType Settings

Типы сущностей могут содержать различные настройки, которые будут влиять на создаваемые объекты. Настройки задаются в виде JSON объекта, у которого название поля является названием опции, а значение поля используемым значением. Тип поля зависит от конкретной опции. Ниже представленна таблица с доступными настройками.

Название Тип Описание Пример
titleRule string Правило указания наименования объекта, которое будет выводиться в UI. В качестве значения передается название поля, которое содержит наименование конкретного объекта. Если правило не задано, то наименование будет считаться как "{entityType} {objectId}" "titleRule": "title"

Field Settings

Создаваемые поля поддерживают различные настройки. Их набор и формат зависит от типа поля. Эти настройки в дальнейшем влияют на обработку поля и отражаются в Json-схеме

На текущий момент поддерживаются настройки для следующих типов полей:

StringFieldSettings

Настройки для строкового поля

Поле Тип Обязательное Описание
maxLength integer нет Максимальная длина для вводимой строки. Используется для валидации. Если значение не указано, используется 64 по умолчанию
multiple boolean да Признак множественного выбора.

TextFieldSettings

Настройки для текстового поля

Поле Тип Обязательное Описание
multiple boolean да Признак множественного выбора.

CatalogFieldSettings

Настройки для поля с элементами справочника

Поле Тип Обязательное Описание
code string да Код справочника, элементы которого можно сохранить в этом поле
multiple boolean да Признак множественного выбора. Если выбрано true, тогда для поля будет использоваться multiselect, а также значение будет передаваться массивом id, а не просто одиночным значением.

FileFieldSettings

Настройки для поля с файлами

Поле Тип Обязательное Описание Ограничения
multiple boolean да Признак множественного выбора. Если выбрано true, тогда в поле будет храниться несколько файлов. Как и в случае одиночного поля данные передаются массивом
maxItems Integer нет Признак максимального количества файлов. Используется только если multiple=true, иначе считается равным 1. По умолчанию 10 - Не может быть больше 100
- Не может быть меньше 1

AddRelation

{
  "operation": "AddRelation",
  "relationType": "many-to-one",
  "entity1": "Order",
  "entity2": "Person",
  "title": "Связь договор-автор",
  "entity1Field": "author",
  "entity2Field": "orders"
}

Операция добавления отношения между типами сущностей. В дальнейшем отношение однозначно идентифицируется по комбинации entity1+entity2+entity1Field.

Поле Тип Обязательное Описание
operation string да Должно быть AddRelation
relationType string да Тип отношения между сущностями
entity1 string да Строковый код первого типа сущности
entity2 string да Строковый код второго типа сущности
title string да Название добавляемого отношения для вывода в UI
entity1Field string да Строковый код нового виртуального поля первой сущности
entity2Field string нет Строковый код нового виртуального поля второй сущности

DeleteRelation (migration)

{
  "operation": "DeleteRelation",
  "entity1": "Order",
  "entity2": "Person",
  "entity1Field": "author"
}

Операция удаления отношения между типами сущностей.

Поле Тип Обязательное Описание
operation string да Должно быть DeleteRelation
entity1 string да Строковый код первого типа сущности
entity2 string да Строковый код второго типа сущности
entity1Field string да Строковый код виртуального поля первой сущности

PrefixMigration

{
  "entityPrefix": "TaskFor",
  "operation": "PrefixMigration",
  "migration": {
    "UpdateField": {
      "entityType": "NotUsed",
      "fieldId": "number",
      "title": "Номер договора",
      "description": "Номер, под которым регистрируется договор",
      "example": "555",
      "nullable": false,
      "settings": {},
      "fieldType": "text"
    }
  }
}

Операция, применяемая для всех сущностей с указанным префиксом.

Поле Тип Обязательное Описание
entityPrefix string да Префикс сущностей
migration object да Сама миграция (см. ниже)

Миграции, которые можно указывать в поле migration:

EntityType

Тип сущности в модели данных

Поле Тип Описание
id string Строковый код типа сущности
title string Название типа сущности для вывода в UI
description string Развернутое описание типа сущности
settings Json Настройки типа сущности

AddEntityObject

Создание объекта сущности

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
source string да Источник данных для объекта. Для введенных вручную - manual
attributes Json object да Json с полями добавляемого объекта

AddEntityObjectBatch

Создание списка объектов сущности

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
source string да Источник данных для объекта. Для введенных вручную - manual
attributes Seq[Json object] да Список Json-ов с полями добавляемых объектов

AddExternalEntityObject

Создание объекта сущности, полученного из внешнего клиента

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
externalId string да Внешний ID объекта
source string да Источник данных
attributes Json object да Json с полями добавляемого объекта

UpdateEntityObject

Изменение объекта сущности

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
objectId uuid да ID объекта
version integer да Версия объекта. Нужна для оптимистичных блокировок
attributes Json object да Json с полями объекта. Должен содержать все поля объекта.

UpdateEntityObjectFields

Изменение части полей объекта

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
objectId uuid да ID объекта
version integer да Версия объекта. Нужна для оптимистичных блокировок
updates Json object да Json с изменяемыми полями объекта и их новыми значениями.

UpdateEntityObjectFieldsList

Изменение части полей объектов (по поисковому запросу)

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
search Search да Параметры списочного запроса
updates Json object да Json с изменяемыми полями объекта и их новыми значениями.

UpdateEntityObjectFieldsBatch

Изменение части полей объектов (по ID)

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
objectIds uuid[] да ID объектов
updates Json object да Json с изменяемыми полями объекта и их новыми значениями.

UpdateExternalEntityObject

Изменение объекта сущности

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
external string да Внешний ID объекта
attributes Json object да Json с полями объекта. Должен содержать все поля объекта.

EntityObjectIdentity (Data Model)

Полный идентификатор объекта сущности

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
objectId uuid да ID объекта

EntityObjectExternalIdentity

Полный идентификатор внешнего объекта сущности

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
externalId string да Внешний ID объекта

TitledEntityObjectIdentity

Полный идентификатор и наименование объекта сущности

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
objectId uuid да ID объекта
title string да Наименование объекта

EntityObjectFields

Идентификатор объекта сущности и список полей данного объекта

Поле Тип Обязательное Описание
id EntityObjectIdentity да Идентификатор объекта сущности
fields List[string] да Список необходимых полей

EntityObjectsBatchWithFields

Идентификаторы объектов сущности и список полей для данного набора объектов

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
ids List[uuid] да Идентификаторы объектов заданного типа сущности
fields List[string] да Список необходимых полей

SaveObjectAdditionalInfo

Сохранение дополнительных атрибутов объекта сущности. Дополнительные атрибуты

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
objectId uuid да ID объекта
additionalData Json object да Json с дополнительными полями. Поля добавляются к существующим. Не обязательно передавать все

SaveFilesAdditionalInfo

Сохранение дополнительных файлов для файловых полей объекта сущности

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
objectId uuid да ID объекта
data array[FileAdditionalInfo] да Информация по файловым полям

FileAdditionalInfo

Сохранение дополнительных файлов для отдельного файлового поля объекта сущности

Поле Тип Обязательное Описание
field string да Строковый код файлового поля
key string да Код атрибута
data Map[uuid, file] да Существующие файлы ассоциированные с новыми дополнительными файлами

EntityObject

Данные объекта сущности

Поле Тип Описание
id uuid ID объекта
externalId string Внешний ID объекта
entityType string Тип сущности объекта
title string Название объекта. Может быть пустой строкой, если нет необходимых полей в "data".
source string Источник данных для объекта
created timestamp Дата и время создания объекта
modified timestamp Дата и время последнего изменения объекта
data Json object Json с полями объекта
additionalData Json object Json с дополнительными полями объекта
version integer Версия объекта для оптимистичных блокировок. Передается назад на бэкэнд при модификации данных

EntityObjectMeta

Метаданные объекта сущности

Поле Тип Описание
id uuid ID объекта
externalId string Внешний ID объекта
entityType string Тип сущности объекта
title string Название объекта. Может быть пустой строкой, если нет необходимых полей в "data".
source string Источник данных для объекта
created timestamp Дата и время создания объекта
modified timestamp Дата и время последнего изменения объекта
version integer Версия объекта для оптимистичных блокировок. Передается назад на бэкэнд при модификации данных

ListObjects type

{
  "entityType": "Order",
  "search": {
    "query": "number || date",
    "context": {
      "number": 321,
      "date": "1577869200_1630567604"
    },
    "sorting": {
      "fieldName": "number",
      "order": "desc"
    },
    "paging": {
      "page": 1,
      "count": 2
    }    
  }
}

Получение списка объектов сущности

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
search Search да Параметры списочного запроса

RichListObjects type

{
  "entityType": "Order",
  "fields": [
    "date",
    "number"
  ],
  "search": {
    "query": "number || date",
    "context": {
      "number": 321,
      "date": "1577869200_1630567604"
    },
    "sorting": {
      "fieldName": "number",
      "order": "desc"
    },
    "paging": {
      "page": 1,
      "count": 2
    }    
  }
}

Получение списка объектов сущности только с указанными полями

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
fields List[string] да Список строк с названиями полей сущности
search Search да Параметры списочного запроса

GetObjectPosition Type

Запрос позиции объекта в отфильтрованном и отсортированном списке

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
objectId uuid string да ID искомого объекта
search Search да Параметры списочного запроса

GetEntityFieldAggregation Type

Параметры запроса на агрегацию значений полей

Поле Тип Обязательное Описание
entityType string да Строковый код типа сущности
search Search да Параметры списочного запроса. Параметры sorting и paging не учитываются.
fields string[] да Перечень полей, для которых нужна агрегация

FieldAggregatedValue

Статистика значения поля

Поле Тип Обязательное Описание
value произвольный да Значение поля
count number да Количество записей с таким значением поля

AddObjectRelation

Добавление отношения между объектами сущностей. Название отношения соответствует комбинации типов сущностей ${entity1Type}_to_${entity2Type}_on_${entity1Field}.

Поле Тип Обязательное Описание
entity1Type string да Тип первой сущности из отношения
entity2Type string да Тип второй сущности из отношения
entity1Field string да Виртуальное поле отношения из первой сущности
object1Id uuid string да ID объекта первой сущности
object2Id uuid string да ID объекта второй сущности
source string да Источник данных для отношений. Для введенных вручную - manual

Тип отношения и возможность сохранения проверяются на бэке в процессе вызова команды.

AddObjectRelationResult

Результат добавления отношения между объектами сущностей.

Поле Тип Обязательное Описание
relation AddObjectRelation да Описание запроса
result boolean да Признак успешности
error string нет Описание ошибки, если произошла

ObjectProcessingResult

Результат обработки (например изменения) объекта

Поле Тип Обязательное Описание
entityType string да Тип сущности обработанного объекта
objectId uuid да ID обработанного объекта
result boolean да Признак успешности
error string нет Описание ошибки, если произошла
errorCode int нет HTTP-код ошибки, если произошла

ObjectRelation

Описание сохраненного отношения между объектами сущностей.

Поле Тип Обязательное Описание
entity1Type string да Тип первой сущности из отношения
entity2Type string да Тип второй сущности из отношения
entity1Field string да Виртуальное поле отношения из первой сущности
entity2Field string нет Виртуальное поле отношения из первой сущности
object1Id uuid string да ID объекта первой сущности
object2Id uuid string да ID объекта второй сущности
source string да Источник данных для отношений. Для введенных вручную - manual

GetObjectRelation

Получение отношения между объектами сущностей.

Поле Тип Обязательное Описание
entity1Type string да Тип первой сущности из отношения
entity2Type string да Тип второй сущности из отношения
entity1Field string да Виртуальное поле отношения из первой сущности
entity2Field string нет Виртуальное поле отношения из второй сущности
object1Id uuid string да ID объекта первой сущности
object2Id uuid string да ID объекта второй сущности

ListObjectRelations

Получение списка всех отношений между объектов и указанной сущностью

Поле Тип Обязательное Описание
entityType string да Тип сущности объекта
objectId uuid string да ID объекта
relatedEntityType uuid string да Тип связанной сущности
fieldName string да Поле, по которому построена связь
reversed boolean да В каком направлении связь
paging Paging нет Параметры пейджинга

DeleteObjectRelation

Удаление отношения между объектами сущностей. Название отнощения соответствует комбинации типов сущностей ${entity1Type}_to_${entity2Type}_on_${entity1Field}.

Поле Тип Обязательное Описание
entity1Type string да Тип первой сущности из отношения
entity2Type string да Тип второй сущности из отношения
entity1Field string да Виртуальное поле отношения из первой сущности
object1Id uuid string да ID объекта первой сущности
object2Id uuid string да ID объекта второй сущности

DeleteObjectRelations

Удаление отношения между объектами сущностей.

Поле Тип Обязательное Описание
entityType string да Тип сущности
objectId uuid string да ID объекта сущности
relatedEntityTypes uuid string[] да Перечень связанных типов сущностей

UpdateExternalObjectRelations

Обновление списка отношений объекта с сущностью

Поле Тип Обязательное Описание
entity1Type string да Тип первой сущности из отношения
entity2Type string да Тип второй сущности из отношения
entity1Field string да Виртуальное поле отношения из первой сущности
reversed boolean нет (по умолчанию false) Направление отношения. Если false, то objectId - объект сущности entity1Type, иначе - entity2Type
objectId string да Внешний ID объекта, для которого обновляются отношения
relationObjectIds string[] да Внешний ID объектов, связанных отношением с обновляемым объектом
source string да Источник данных для отношений

UpdateExternalObjectRelationResult

Результат добавления отношения между внешними объектами.

Поле Тип Обязательное Описание
relationObjectId string да ID связанного объекта
success boolean да Признак успешности создания связи
error string нет Описание ошибки, если произошла

Связь между двумя объектами сущностей. Связь устанавливается на основе интеллектуализации (содержательные пересечения, близкие по смыслу) или вручную.

Поле Тип Описание
id uuid ID связи
entityType1 string Тип сущности первого объекта из связи
object1Id uuid ID первого объекта из связи
entityType2 string Тип сущности второго объекта из связи
object2Id uuid ID второго объекта из связи
linkType string Тип связи, строковый код
source string Источник связи. Для введенных вручную - manual, для созданных в сервисах интеллектуализации - auto
owner string Создатель связи. Это может быть id пользователя, создавшего связь вручную, код или ID сервиса, создавшего связь автоматически
additional json object Произвольный Json-объект с дополнительными данными, специфичными для конкретного типа связи

ObjectLinkWithObjects

Связь между двумя объектами сущностей. Включает информацию об объектах

Поле Тип Описание
id uuid ID связи
entityType1 string Тип сущности первого объекта из связи
object1 EntityObject Первый объект
entityType2 string Тип сущности второго объекта из связи
object2 EntityObject Второй объект
linkType string Тип связи, строковый код
source string Источник связи. Для введенных вручную - manual, для созданных в сервисах интеллектуализации - auto
owner string Создатель связи. Это может быть id пользователя, создавшего связь вручную, код или ID сервиса, создавшего связь автоматически
additional json object Произвольный Json-объект с дополнительными данными, специфичными для конкретного типа связи

Получение списка связей объекта

Поле Тип Обязательное Описание
entityType string да Тип сущности объекта, для которого запрашиваются связи
objectId uuid да ID объекта, для которого запрашиваются связи
linkTypes array[string] нет Типы запрашиваемых связей. Может содержать несколько значений. Может быть пустым, тогда вернутся все доступные связи.
forwardLinks boolean да Признак получения прямых или обратных связей. Если true, тогда связи прямые, тогда искомый объект - это первый объект из связи (object1). Если false, тогда искомый объект - это второй объект из связи (object2)

GetObjectRelationsByType

Получение списка связей для типов объектов

Поле Тип Обязательное Описание
entityFrom string да Тип сущности объекта, от которого идут запрашиваемые связи
entityTo string да Тип сущности объекта, к которому идут запрашиваемые связи
field string да Название поля, по которому идет связь

Создание связи между объектами сущностей

Поле Тип Обязательное Описание
entityType1 string да Тип сущности первого объекта из связи
object1Id uuid да ID первого объекта из связи
entityType2 string да Тип сущности второго объекта из связи
object2Id uuid да ID второго объекта из связи
linkType string да Тип связи, строковый код
source string да Источник связи. Для введенных вручную - manual, для созданных в сервисах интеллектуализации - auto
owner string нет Создатель связи. Это может быть id пользователя, создавшего связь вручную, код или ID сервиса, создавшего связь автоматически
additional json object нет Произвольный Json-объект с дополнительными данными, специфичными для конкретного типа связи
fileId1 uuid нет Идентификатор файла из первого объекта, если связь строится на основании файла
fileId1 uuid нет Идентификатор файла из второго объекта, если связь строится на основании файла

Удаление связей объекта

Поле Тип Обязательное Описание
entityType string да Тип сущности объекта, для которого удаляются связи
objectId uuid да ID объекта, для которого удаляются связи
linkType string нет Тип удаляемых связей. Может быть пустым, тогда удалятся все имеющиеся связи
forwardLinks boolean да Признак удаления прямых или обратных связей. Если true, тогда связи прямые, тогда искомый объект - это первый объект из связи (object1). Если false, тогда искомый объект - это второй объект из связи (object2)

ObjectFileWithTags

Получение списка связей объекта

Поле Тип Обязательное Описание
fileId uuid да ID файла
tags List[String] да Список ID тегов

FileInfoWithTags

Получение списка связей объекта

Поле Тип Обязательное Описание
objectIdentity EntityObjectIdentity да ID объекта
entityTypeTitle string да Наименование типа объекта
objectTitle string да Наименование объекта
fileInfo ObjectFile да Информация о файле
tags List[String] да Список ID тегов

ObjectFile

Полная информация о файле

Поле Тип Обязательное Описание
fileId string да ID файла
name string нет Имя файла с расширением
extension string нет Расширение файла
size long нет Размер файла в байтах
url string нет Ссылка на скачивание файла из файлового хранилища
additional json нет Объект с дополнительными параметрами
created string нет Время загрузки файла
modified string нет Время редактирования данной записи
md5 string нет Хеш файла

FileIdentity

Полный идентификатор файла

Поле Тип Обязательное Описание
fileId string да ID файла
entityType string да Наименование типа объекта
objectId string да ID объекта

StoredFile

Информация о файле

Поле Тип Обязательное Описание
id string да ID файла
path string да Путь по папкам до файла внутри бакета
bucket string да Бакет для хранения файла

ParentRelation

Родительская модель

Поле Тип Обязательное Описание
entityType string да Наименование типа объекта
fieldId string да Строковый код (название) поля
nested Seq[ParentRelation] да Все вышележащие родители

Relation поля

Для указания фильтров или сортировки по определенному полю, можно использовать названия как полей конкретного типа сущности EntityObject, так и relation-полей для данного типа сущности.
Для фильтра/сортировки указывается полное название поля, относительно структуры EntityObject.

Примеры:
1. Фильтр/сортировка по полю "number" объекта EntityObject с типом сущности "Order"
задается как "data.number", т.к. поля сущности лежат в JSON-объекте "data".
2. Фильтр по полю "author.name" (author - relation поле типа "Person" для типа "Order")
объекта EntityObject с типом сущности "Order" задается как "author.data.number",
т.к. relation объект также имеет структуру EntityObject
3. Можно фильтровать (но не сортировать) по полям структуры EntityObject в рамках relation объекта.
Например, можно назвать фильтр как "author.id". Данные поля назваются "системными" (полный список в Методы Rich*), т.к. создаются для каждой сущности.

Методы Rich*

При получении объектов с помощью Rich* методов, помимо основных параметров, передаются требуемые поля объектов.
Эти поля содержатся в JSON-поле "data", т.е. для каждого возвращенного объекта JSON будет содержать только указанные в запросе поля.

Для указания списка допустимых полей для корневого объекта (не relation), используются "короткие" варианты названия полей (без указания поля "data"), т.к. все поля всегда находятся в JSON-объекте поля "data".

При запросе полей relation-объекта, также происходит фильтрация его полей по списку "fields", но системные поля добавляются всегда (с префиксом, указанным в DATA_MODEL_RELATION_SYSTEM_FIELDS_PREFIX).

Список системных полей из объекта EntityObject, которые добавляются всегда:
id, externalId, entityType, title, created, modified.

Для указания полей для relation-объектов, можно использовать все поля, которые есть в EntityObject (кроме version, т.к. оно не добавляется в ответ).

Пример полей для связки Order(number: String, name: String) -> Person(name: String) по полю "authors: Person[]":

fields: [
  "name",              // Order.name
  "authors.data.name", // Полный путь к Person.name
  "authors.name",      // Короткая запись Person.name
  "authors.id",        // Системное поле EntityObject
]

В результате получим объект EntityObject с полем "data": "data": { "name": "Test order", "authors": [ { "_id": "505e7939-94e4-4c1a-b175-b622258d00fc", "_externalId": null, "_entityType": "Person", "_title": "First author", "_source": "manual", "_created": 1634553248859, "_modified": 1634553248859, "name": "First author" }, { "_id": "66806625-ea74-4c9e-8fca-ccf1e1366e8b", "_externalId": null, "_entityType": "Person", "_title": "Second author", "_source": "manual", "_created": 1634553248859, "_modified": 1634553248859, "name": "Second author" } ] }

Клиент модели данных

client.saveObject(EntityTypeId("test"), TestClass("kek", 123), "manual")
client.getObject[TestClass](EntityTypeId("test"), objectId)

Предоставляет удобный способ общения с моделью данных и механизм для применения миграций к модели данных.

Регистрация в distage

make[DataModelClient].from {
  (dispatcher: Dispatcher, ec: ExecutionContext@Id("ec-services")) =>
    new DataModelClientImpl(dispatcher)(ec)
}

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

Использование мигратора

make[DataModelMigrator].from {
  (
    client: DataModelClient,
    migrations: Seq[Migration],
    ec: ExecutionContext@Id("ec-services")
  ) =>
    new DataModelMigrator(client, migrations)(ec)
}

Мигратор можно подключить следующим образом:

Далее, чтобы запустить миграции можно получить DataModelMigrator из контейнера и выполнить migrator.migrate.

Метод migrate получает текущее состояние схемы МД, проверяет, какие из MigrationDslOperation нужно применить и пробует их применить. В случае каких-то проблем из метода возвращается ошибка, повторная отправка запросов не производится.

Сервис полнотекстового поиска - ПП

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

Общее описание архитектуры сервиса ПП

Сервис делает доступными для полнотекстового поиска объекты сервиса модели данных. Для каждого типа объектов должно существовать правило индексации в ES. Все поля объекта разделяются на 3 категории:

Конфигурирование сервиса ПП

Требования к запуску сервиса ПП

Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm. Для корректной минимальной работы сервиса требуется обязательное подключение к Kafka, Consul, ElasticSearch. Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus и ApiGateway.

Список переменных окружения сервиса ПП

Переменная Тип Обязательная Значение по умолчанию Описание
SERVER_PORT int нет 8080 Порт, на котором слушает HTTP-сервер
CONSUMER_INDEXATION_TOPIC string нет document Название кафка-топика для команд индексации объектов
CONSUMER_EVENT_TOPIC string нет entityObjectEvent Название кафка-топика для ожидания событий по объектам. ОБЯЗАТЕЛЬНО должно соответствовать названиям в сервисе моделей данных и в сервисе индексаций
CONSUMER_COMPLETION_TOPIC string нет completion Название кафка-топика для команд работы с индексом автодополнений
CONSUMER_GROUP string нет document Имя группы-консьюмеров сервиса ПП
ELASTIC_HOST string да localhost Адрес ES
ELASTIC_PORT int да 9200 Порт ES
ELASTIC_USER string нет "" Пользователь Elasticsearch для basic-аутентификации
ELASTIC_PASSWORD string нет "" Пароль пользователя Elasticsearch для basic-аутентификации
ELASTIC_USE_SSL boolean нет false Использовать ssl при подключении к Elasticsearch. Если используется корректный сертификат, подписанный УЦ, тогда одного этого флага должно хватить для настройки ssl. Если используется самоподписанный сертификат, тогда нужно добавить корневые сертификаты в ELASTIC_TRUST_STORE_LOCATION
ELASTIC_TRUST_STORE_TYPE string нет pem Тип хранилища сертификата. Настраивается при подключении к Elasticsearch через ssl с использованием самоподписанного сертификата. Пока поддерживается только pem.
ELASTIC_TRUST_STORE_LOCATION string нет "" Место хранения сертификата. Используется для самоподписанных сертифкатов при подключении через ssl.
ELASTIC_TRUST_STORE_PASSWORD string нет "" Пароль от сертификата и/или ключа. Используется для самоподписанных сертифкатов при подключении через ssl. В текущей реализации с pem-сертификатами не используется.
VERDI_CONSUL string да http://localhost:8500 Адрес Consul
VERDI_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
VERDI_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
VERDI_KAFKA_ADDRESS string да localhost:9092 Адрес брокера Kafka.
VERDI_KAFKA_TOPIC string нет eventStatus Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
VERDI_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
VERDI_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
VERDI_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
VERDI_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к харнилищу сертификатов.
VERDI_HOST string да localhost Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
VERDI_TTL duration string нет 30 seconds Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
VERDI_HEALTH_CHECK duration string нет 10 seconds Периодичность отправки health check в ServiceDiscovery
VERDI_COMMAND_STORAGE_UPDATE_PERIOD duration string нет 1 minutes Время кэширования данных по командам из CommandDiscovery
VERDI_SERVICE_DISCOVERY_UPDATE_PERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
VERDI_ALLOW_INTERNAL_COMMANDS bool нет true Можно ли сервису отправлять внутрисистемные команды
VERDI_CONSUL_CONNECTION_MAX_RETRY int нет 5 Максимальное количество попыток подключений к Consul
VERDI_CONSUL_CONNECTION_RETRY_DELAY duration string нет 1 seconds Таймаут между неудачными попытками подключения к Consul
AUTOCOMPLETE_SIZE int нет 10 Максимальное количество выдаваемых подсказок для автодополнения поисковой строки
AUTOCOMPLETE_FUZZINESS string нет AUTO На сколько искомая строка для автодополнения может отличаться от выдаваемых подсказок. Допустимые значения: AUTO, 0, 1 или 2. Значение AUTO подбирает количество опечаток под длину исправляемой строки: 0-2 символа - без опечаток, 3-5 символов - 1 опечатка, >5 символов - 2 опечатки.
FTS_READABLE_NAME string нет AUTO Читаемое название сервиса
FTS_DESCRIPTION string нет AUTO Читаемое описание сервиса
FTS_AUTHZFORCE_ADDR url string нет http://localhost:8080/authzforce-ce Адрес сервиса authzforce
FTS_AUTHZFORCE_DOMAIN string нет "" Доступный DomainID в Authzforce server
FTS_AUTHZFORCE_CONNECT_TIMEOUT duration string нет 5 seconds Максимальное время ожидания ответа от Authzforce
DM_SCHEMA_CACHE_SIZE int нет 128 Максимальный размер кэша для json schema
DM_SCHEMA_CACHE_TTL duration string нет 5 minutes Время жизни элементов в кэше для json schema
FS_URI url string нет http://localhost:9002 Адрес S3 файлового хранилища minio
FS_ACCESS_KEY_ID string нет admin Идентификатор доступа к minio
FS_SECRET_ACCESS_KEY string нет admin Секретный ключ доступа к minio
FS_UPLOAD_PARALLELISM int нет 1 Параллелизм загрузки файлов в minio
FS_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
FS_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с маппингом учетных записей
FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
FS_CACHE_TTL duration string нет Время жизни клиента в кеше

Команды для сервиса полнотекстового поиска

Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.

Название команды EntityType Actions
fullTextSearchIndexDocument - -
getMappingFullTextSearch System full-text-search_System_GetMappingFullTextSearch
createMappingFullTextSearch System full-text-search_System_CreateMappingFullTextSearch
deleteMappingFullTextSearch System full-text-search_System_DeleteMappingFullTextSearch
updateMappingFullTextSearch System full-text-search_System_UpdateMappingFullTextSearch
listMappingFullTextSearch System full-text-search_System_ListMappingFullTextSearch
fullTextSearchDSLV2 Произвольный EntityType full-text-search_RequestDependent_FullTextSearchDSLV2
fullTextSearchDSLGraphV2 Произвольный EntityType full-text-search_RequestDependent_FullTextSearchDSLGraphV2
identificationSearch Произвольный EntityType full-text-search_RequestDependent_IdentificationSearch
plagiarismSearch Произвольный EntityType full-text-search_RequestDependent_PlagiarismSearch
similaritySearchV2 Произвольный EntityType full-text-search_RequestDependent_SimilaritySearch, search_RequestDependent_IdentificationSearch
plagiarismSearchV2 Произвольный EntityType full-text-search_RequestDependent_PlagiarismSearch
fullTextSearchAnalyzers System full-text-search_System_FullTextSearchAnalyzers
fullTextAutocomplete Произвольный EntityType full-text-search_RequestDependent_FullTextAutocomplete
fullTextSearchIndexCompletionPhrase - -
fullTextAggregationSearch Произвольный EntityType full-text-search_RequestDependent_FullTextAggregationSearch
searchByParent Произвольный EntityType full-text-search_RequestDependent_SearchByParent

Модели сервиса ПП

StringFacet

Описание фасетного фильтра со строками

Название поля Тип Обязательное Описание
facetName String да Имя фильтра. Записывается в формате $entityType:$fieldName
facetValue List[String] да Список значений фильтра

NumberFacet

Описание фасетного фильтра с числовыми значениями

Название поля Тип Описание
facetName String Имя фильтра
facetValue List[Double] Список значений фильтра

FullTextMapping

Правило хранения и поиска полей для полнотекстового поиска

Название поля Тип Описание
name String Имя Поля
analyzer Option[String] ES анализатор
boost Option[Double] Коэффициент влияющий на ранжирование в поисковой выдаче
sourceExclude Boolean Исключить поле из вывода при поисковых запросах

Mapping

Правило индексации определенного типа

Название поля Тип Описание
entityType String Тип объекта
fullText Seq[FullTextMapping] Правила для полнотекстового поиска
stringFacets Seq[String] Правила для строкового фасетного поиска
numberFacets Seq[String] Правила для числового фасетного поиска
seqNo Long Версия правила. Необходима для версионирования, которое используется для optimistic lock
primaryTerm Long Идентификатор шарды в которую записано правило. Необходим для версионирования, которое используется для optimistic lock

MappingDTO

Создание правила индексации определенного типа

Название поля Тип Описание
entityType String Тип объекта
fullText Seq[FullTextMapping] Правила для полнотекстового поиска
stringFacets Seq[String] Правила для строкового фасетного поиска
numberFacets Seq[String] Правила для числового фасетного поиска

SearchRequestDSLV1

Поисковый запрос

Название поля Тип Описание
query String Поисковая строка. Может быть записана с помощью языка запросов
originQuery String Оригинальный поисковый запрос от пользователя
facetsQuery String Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов
stringFacets Seq[StringFacet] Список строковых фасетов
paging Paging Пагинация
entityTypes Seq[String] Список типов

Сервис поддерживает язык запросов для полнотекстового и фасетного поиска. Язык запросов стандартен для verdi (см. например документацию к сервису журналирования). Поддерживаются операции конъюнкции &&, дизъюнкции || и скобки. Полнотекстовый поиск дополнительно поддерживает бустинг через оператор ^. Например как может выглядет поисковая строка: (бензин^0.1 || керосин^0.2) && нефть. Здесь предполагается что "бензин^0.1 || керосин^0.2" это контекстные расширения.

SearchRequestDSLV2

Поисковый запрос

Название поля Тип Обязательное Описание
query String да Поисковая строка.
searchType String да Тип запроса. Words - по словам, Phrase - по всей фразе целиком.
extensions Seq[SearchExtension] да Контекстное расширение
facetsQuery String да Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов
stringFacets Seq[StringFacet] да Список строковых фасетов
numberFacets JsonObject да Объект с числовыми фасетами. Объект, в котором ключ - это название фильтра, а значение - это значение фильтра (в виде строки). Если числовых фасетов в запросе нет - пустой объект.
paging Paging да Пагинация
entityTypes Seq[String] да Список типов

Возможные форматы значений фильтров числовых фасетов:

Точное значение - "39"

Список значений - "[25,39]"

Range - "25_39" или "39" или "25"

Отрицание - "not [39]" или "not [25,39]" или "not 25_39"

SearchExtension

Контекстное расширение

Название поля Тип Обязательное Описание
item String да Текст расширения
boost Double да Коэффициент расширения, влияющий на его важность: чем выше коэффициент, тем выше элемент, включающий данное расширение, среди всех результатов поиска. Стандартное значение = 1.

SearchByLampResultRequest

Запрос на поиск по идентификаторам, полученным от LAMP

Название поля Тип Обязательное Описание
storedFile URI StoredFile да Ссылка на файл в FileStorage, который содержит список идентификаторов объектов в поисковом индексе (формат файла - FaissMessage)
entityTypes Seq[String] да Фильтр по типам объектов (пустой список = нет фильтрации)
facetsQuery String да Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов
percentageRange Seq[Float] нет Фильтр по процентам целевой метрики. Обязательно должен содержать 2 значения: [начало диапазона, конец диапазона]. "Начало" и "конец" включаются в результирующую выборку. Значения меньше "0.0" не будут участвовать в фильтрации. Если необходим полуоткрытый диапазон, его можно задать как [10.0, -1.0].
stringFacets Seq[StringFacet] да Список строковых фасетов
numberFacets JsonObject да Объект с числовыми фасетами. Объект, в котором ключ - это название фильтра, а значение - это значение фильтра (в виде строки). Если числовых фасетов в запросе нет - пустой объект.
paging Paging да Пагинация
query String нет Поисковая строка. Используется только если указан searchType
searchType String нет Тип поиска по поисковой строке. Words - по словам, Phrase - по всей фразе целиком.

Возможные форматы значений фильтров числовых фасетов:

Точное значение - "39"

Список значений - "[25,39]"

Range - "25_39" или "39" или "25"

Отрицание - "not [39]" или "not [25,39]" или "not 25_39"

SearchByLampResultRequest V2

Запрос на поиск по идентификаторам, полученным от LAMP

Название поля Тип Обязательное Описание
storedFiles Seq[URI StoredFile] да Список ссылок на файлы в FileStorage, который содержит список идентификаторов объектов в поисковом индексе (формат файла - JSON с FaissMessage или PlagiarismMessage)
requiredIds Option[Map[String, Option[Seq[String]]]] нет Фильтр по типам и идентификаторам объектов (подробное описание под таблицей)
mergeOps Option[String] нет Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов
facetsQuery String да Поисковый запрос для фасетных фильтров. Может быть записан с помощью языка запросов
percentageRange Seq[Float] нет Фильтр по процентам целевой метрики. Обязательно должен содержать 2 значения: [начало диапазона, конец диапазона]. "Начало" и "конец" включаются в результирующую выборку. Значения меньше "0.0" не будут участвовать в фильтрации. Если необходим полуоткрытый диапазон, его можно задать как [10.0, -1.0].
stringFacets Seq[StringFacet] да Список строковых фасетов
numberFacets JsonObject да Объект с числовыми фасетами. Объект, в котором ключ - это название фильтра, а значение - это значение фильтра (в виде строки). Если числовых фасетов в запросе нет - пустой объект.
paging Paging да Пагинация
query String нет Поисковая строка. Используется только если указан searchType
searchType String нет Тип поиска по поисковой строке. Words - по словам, Phrase - по всей фразе целиком.

Возможные форматы значений фильтров числовых фасетов:

Точное значение - "39"

Список значений - "[25,39]"

Range - "25_39" или "39" или "25"

Отрицание - "not [39]" или "not [25,39]" или "not 25_39"

Варианты значений поля requiredIds:

FTAggregation

Модель для представления агрегации из ES

Название поля Тип Описание
key String Название агрегации
count Long Общее кол-во документов по данной агрегации
nested Seq[FTAggregation] Вложенные агрегации

SuggestionItem

{
  "sourceText": "foo",
  "offset": 0,
  "length": 3,
  "newText": "for"
}

Предложение исправления ошибки в поисковом запросе. Содержит исходное слово из поисковой строки или его лемму, местонахождение этого слова в исходной строке, а также предлагаемое исправление для этого слова или леммы. Нужно в исходной строке по указанной в offset позиции убрать length символов и вставить предлагаемую замену. Тогда мы получим исправленный вариант. При вставке исправленного варианта также можно вставить теги для подсвечивания исправлений (учесть только, что при вставке тегов поедут последующие offset).

Может быть предложено исправление не самого слова, а его леммы, например, для прилагательных. Для них не будет анализироваться окончание. Соответственно, заменяться будет только основная часть слова без окончания.

Название поля Тип Описание
sourceText String Слово или лемма от слова в исходной поисковой строке, для которой предложено исправление
offset Int Позиция слова или леммы в исходной поисковой строке
length Int Длина исправляемого слова или леммы
newText String Новое значение слова или леммы

FTResultDocument

Найденный через поиск документ

Название поля Тип Описание
id String Идентификатор документа
entityType String Тип документа
highlight JsonObject Подсветка
data JsonObject Данные документа

FTResultDocumentGraph

Найденный через поиск в графе документ

Название поля Тип Описание
id String Идентификатор документа
entityType String Тип документа

FTSearchResult

Результаты поиска

Название поля Тип Описание
documents Seq[FTResultDocument] Документы
facetsAggregations Seq[FTAggregation] Агрегация для фасетных фильтров
total Long Общее кол-в документов по поиску
statistics Seq[FTAggregation] Агрегация для статистики
suggestions Seq[SuggestionItem] Список исправлений ошибок в поисковой строке. Если команда не подразумевает поисковую строку, то значение всегда пустое.

FTSearchResultShort

Результаты поиска без исправлений

Название поля Тип Описание
documents Seq[FTResultDocument] Документы
facetsAggregations Seq[FTAggregation] Агрегация для фасетных фильтров
total Long Общее кол-в документов по поиску
statistics Seq[FTAggregation] Агрегация для статистики

FTSearchResultGraph

Результаты поиска в графе

Название поля Тип Описание
documents Seq[FTResultDocumentGraph] Документы
facetsAggregations Seq[FTAggregation] Агрегация для фасетных фильтров
statistics Seq[FTAggregation] Агрегация для статистики
total Long Общее кол-в документов по поиску

EventType (FT)

Типы событий объекта. Доступные типы: Create, Delete, Update.

EntityWithFiles

Объект и связанные с ним файлы.

Название поля Тип Описание
entityObject EntityObject Объект из модели данных
files Map[String, Seq[StoredFile]] Ассоциативный массив, из имен ключей и ссылок на файлы

FaissMessage

Сообщение с результатом LAMP по поиску похожих объектов (similarity)

Название поля Тип Описание
ids Seq[EntityIdentifier-Encoded] Список идентификаторов похожих объектов
similarities Seq[Float] Список значений similarity. Порядок в списке соответствует порядку в ids

PlagiarismMessage

Сообщение с результатом LAMP по поиску плагиата (plagiarism)

Название поля Тип Описание
ids Seq[EntityIdentifier-Encoded] Список идентификаторов похожих объектов
originalities Seq[Float] Список значений originality (= 1 - plagiarism). Порядок в списке соответствует порядку в ids
originality Float Среднее значение originality для списка объектов

IdWithSimilarity

Связь идентификатора объекта и процента похожести

Название поля Тип Описание
id EntityIdentifier Идентификатор объекта, хранящийся в faiss
similarity Float Процент похожести

EntityIdentifier-Encoded

Соответствует типу String. Закодированная информация о файле, который был анализирован в LAMP. Формат - "EntityTypeId;ObjectId;FieldName;FileId", где ; разделитель для значений полей.

После декодирования, преобразуется в EntityIdentifier.

EntityIdentifier

Идентификатор объекта, полученный из LAMP

Название поля Тип Описание
entityType String Тип объекта
entityId String Идентификатор объекта (используется для поиска в elasticsearch)
fieldName String Название поля объекта, которое содержит файл
fileId String Идентификатор файла

CompletionPhrases

Набор фраз для добавления в индекс автодополнения

Название поля Тип Описание
input String Индексируемая фраза
weight Int Вес индексируемой фразы. Нужен для дополнительного ранжирования результатов. По умолчанию равно 1

AutocompleteRequest

Запрос на получение автодополнений поисковой строки.

Название поля Тип Описание
query String Поисковая строка для автодополнения

AutocompleteResult

Результат автодополнений поисковой строки.

Название поля Тип Описание
text String Предлагаемый текст для дополнения
score Double Оценка предложенного результата

AggregatedDocument

Найденный через агрегированный поиск документ

Название поля Тип Описание
document FTResultDocument Документ
matchedChildren Map[String, Int] Информация о дочерних документах в виде "тип_документов":"количество"

AggregationSearchResult

Результат агрегированного поиска

Название поля Тип Описание
documents Seq[AggregatedDocument] Найденные документа
total Long Общее кол-во документов по запросу поиска

ByParentSearchResult

Результат поиска дочерних элементов

Название поля Тип Описание
documents Seq[FTResultDocument] Найденные документа
total Long Общее кол-во документов по запросу поиска

AggregationSearchRequest

Форма агрегированного запроса

Название поля Тип Описание
query String Поисковая строка
paging Paging Пагинация
relations Map[String, relations] Иерархия типов сущностей
entity EntityObjectIdentity Опциональный идентификатор родительской ветки

ByParentSearchRequest

Форма поиска дочерних элементов

Название поля Тип Описание
query String Поисковая строка
paging Paging Пагинация
entity EntityObjectIdentity Идентификатор родительского документа
leafType String Тип дочерних элементов

DocumentsToAggregate

Список документов одного типа для агрегации по выбранному полю

Название поля Тип Обязательное Описание Ограничения
ids List[UUID] Да Идентификаторы документов в поисковом индексе
entityType String Да Тип документа Не пустое
aggregationField String Да Поле, которое содержит значение для агрегации Не пустое

AggregateDocumentsResult

Результат агрегации документов по полям

Название поля Тип Обязательное Описание
buckets Map[String, AggregateBucketValue] Да Список бакетов, которые появляются в результате агрегации объектов по определенному значению (key в Map). В JSON тип Map[Key, Value] представлен в виде объекта, где Key - поле объекта, Value - значение поля. В случае пустой Map, поле buckets будет содержать пустой объект.

AggregateBucketValue

Информация о бакете в агрегации

Название поля Тип Обязательное Описание
total Long Да Общее кол-во объектов, попадающие в данный бакет
entities Seq[EntityInBucket] Да Информация о сущностях объектов, попадающие в данный бакет

EntityInBucket

Информация о сущности объектов из бакета агрегации

Название поля Тип Обязательное Описание
code EntityTypeId Да Идентификатор типа сущности
count Long Да Кол-во объектов

Команды сервиса ПП

fullTextSearchIndexDocument

Индексация объекта

На входе объект и связанные файлы

{
  "entityObject": {
    "id": "62b5b85f-5962-407d-89f1-adbdb49cca85",
    "entityType": "Document",
    "title": "Документ",
    "source": "test",
    "created": 1674060753,
    "modified": 1674060753,
    "data": {
      "content": "someContent",
      "title": "someTitle",
      "author": "someAuthor",
      "city": "someCity"
    },
    "additionalData": {
      "extracted": "someAdditionalContent"
    },
    "version": 1
  },
  "files": {
    "file1": [
      "/temp/55497df9-bf03-4364-bada-881bbd5531f8"
    ]
  }
}

Команда не возвращает никаких данных после выполнения

Поддерживается асинхронный и синхронный вызов.

getMappingFullTextSearch

Получение правила индексации

На входе идентификатор правила, по сути тип объекта

"Document"

В результате описания индексации

{
  "entityType": "Document",
  "fullText": [
    {
      "name": "content"
    },
    {
      "name": "title"
    }
  ],
  "stringFacets": [
    "author",
    "city"
  ],
  "numberFacets": [],
  "seqNo": 31,
  "primaryTerm": 1
}

Поддерживается только синхронный вызов. При пустом entityType в теле вернет Bad Request

createMappingFullTextSearch

Создание правила индексации

На входе описание индексации

{
  "entityType": "Document",
  "fullText": [
    {
      "name": "content"
    },
    {
      "name": "title"
    }
  ],
  "stringFacets": [
    "author",
    "city"
  ],
  "numberFacets": []
}

В результате идентификатор правила, по сути тип объекта

"Document"

Или ошибка, если правило для такого entityType уже существует

{
    "businessError": null,
    "message": "ERROR: duplicate value - entityType=Document already exists",
    "stackTrace": null,
    "data": null
}

Или ошибка, если указанный entityType не зарегистрирован в системе

{
    "businessError": null,
    "message": "ERROR: entityType should be present in datamodel",
    "stackTrace": null,
    "data": null
}

Поддерживается только синхронный вызов. При пустом entityType в [MappingDTO] вернет Bad Request

deleteMappingFullTextSearch

Удаление правила индексации. Пока команда существует только для отладки, после удаления правила не будет работать поиск по удаленному типу. При пустом entityType в теле вернет Bad Request

На входе идентификатор правила

"Document"

В результате кол-во удаленных записей

Поддерживается только синхронный вызов

updateMappingFullTextSearch

Обновление правила индексации. Пока команда существует только для отладки, после обновления правила уже проиндексированные записи никак не будут обновляться, поэтому на них новый поиск может работать некорректно.

На входе описание индексации

{
  "entityType": "Document",
  "fullText": [
    {
      "name": "content"
    },
    {
      "name": "title"
    }
  ],
  "stringFacets": [
    "author",
    "city"
  ],
  "numberFacets": [],
  "seqNo": 14,
  "primaryTerm": 1
}

В результате кол-во обновленных записей

Поддерживается только синхронный вызов. При пустом entityType в [Mapping] вернет Bad Request

listMappingFullTextSearch

Список всех правил индексации

Входных данных нет

В результате список правил индексаций

[
  {
    "entityType": "Document",
    "fullText": [
      {
        "name": "content",
        "analyzer": null,
        "boost": null
      }
    ],
    "stringFacets": [],
    "numberFacets": [],
    "seqNo": 0,
    "primaryTerm": 0
  },
  {
    "entityType": "agreement",
    "fullText": [
      {
        "name": "content",
        "analyzer": null,
        "boost": null
      },
      {
        "name": "title",
        "analyzer": null,
        "boost": null
      }
    ],
    "stringFacets": [
      "author",
      "city"
    ],
    "numberFacets": [],
    "seqNo": 0,
    "primaryTerm": 0
  }
]

Поддерживается только синхронный вызов

fullTextSearchDSL (FT) V1

Полнотекстовый поиск

На входе поисковый запрос

{
  "query": "(бензин^0.1 || керосин^0.2) && нефть",
  "originQuery": "нефть",
  "facetsQuery": "agreement:author && agreement:city",
  "stringFacets": [
    {
      "facetName": "agreement:author",
      "facetValue": [
        "someAuthor"
      ]
    },
    {
      "facetName": "agreement:city",
      "facetValue": [
        "someCity"
      ]
    }
  ],
  "paging": {
    "page": 1,
    "count": 10
  },
  "entityTypes": [
    "agreement"
  ]
}

В результате найденные документы приведенные к плоскому объекту

{
  "documents": [
    {
      "author": [
        "someAuthor"
      ],
      "city": [
        "someCity"
      ],
      "entityType": "agreement",
      "content": "someContent",
      "title": "someTitle",
      "id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
    },
    {
      "author": [
        "someAuthor"
      ],
      "city": [
        "someCity1"
      ],
      "entityType": "agreement",
      "content": "someContent",
      "title": "someTitle",
      "id": "02a193f7-07cf-4d84-aa10-059a89836955"
    }
  ],
  "facetsAggregations": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    }
  ],
  "statistics": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    }
  ],
  "total": 2
}

Имя команды для вызова: fullTextSearchDSL. Поддерживается только синхронный вызов

fullTextSearchDSL (FT) V2

Полнотекстовый поиск

На входе поисковый запрос

{
  "query": "нефть",
  "searchType": "Words",
  "extensions": [
    {
      "item": "керосин",
      "boost": 0.2
    },
    {
      "item": "бензин",
      "boost": 0.1
    }
  ],
  "facetsQuery": "agreement:author && agreement:city && agreement:year",
  "stringFacets": [
    {
      "facetName": "agreement:author",
      "facetValue": [
        "someAuthor"
      ]
    },
    {
      "facetName": "agreement:city",
      "facetValue": [
        "someCity"
      ]
    }
  ],
  "numberFacets": {
    "agreement:year": "2020"
  },
  "paging": {
    "page": 1,
    "count": 10
  },
  "entityTypes": [
    "agreement"
  ]
}

В результате найденные документы приведенные к плоскому объекту

{
  "documents": [
    {
      "author": [
        "someAuthor"
      ],
      "city": [
        "someCity"
      ],
      "entityType": "agreement",
      "content": "someContent",
      "title": "someTitle",
      "id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
    },
    {
      "author": [
        "someAuthor"
      ],
      "city": [
        "someCity1"
      ],
      "entityType": "agreement",
      "content": "someContent",
      "title": "someTitle",
      "id": "02a193f7-07cf-4d84-aa10-059a89836955"
    }
  ],
  "facetsAggregations": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "statistics": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "total": 2
}

Имя команды для вызова: fullTextSearchDSLV2. Поддерживается только синхронный вызов

fullTextSearchDSL Graph (FT) V1

На входе поисковый запрос

{
  "query": "нефть",
  "originQuery": "нефть",
  "facetsQuery": "",
  "stringFacets": [
  ],
  "paging": {
    "page": 1,
    "count": 10
  },
  "entityTypes": [
    "RfbrDocument"
  ]
}

В результате найденные документы в упрощенной форме

{
    "status": "Completed",
    "timestamp": 1648043225394,
    "value": {
        "documents": [
            {
                "id": "2c8fd498-4f28-4af5-a55e-fa3810daca35",
                "entityType": "RfbrDocument"
            },
            {
                "id": "a51bd74a-ad9d-47d5-a077-86b6e7fb71b0",
                "entityType": "RfbrDocument"
            }
        ],
        "facetsAggregations": [
            {
                "key": "RfbrDocument:documentType",
                "count": 605,
                "nested": [
                    {
                        "key": "f31ed82c-9fb2-4eb4-973c-70b09b24bcda",
                        "count": 549,
                        "nested": []
                    },
                    {
                        "key": "b4b6e695-9fcb-4f38-a5c6-1ff8e0ab8002",
                        "count": 34,
                        "nested": []
                    }
                ]
            }
        ],
        "statistics": [
            {
                "key": "RfbrDocument:documentType",
                "count": 605,
                "nested": [
                    {
                        "key": "f31ed82c-9fb2-4eb4-973c-70b09b24bcda",
                        "count": 549,
                        "nested": []
                    },
                    {
                        "key": "b4b6e695-9fcb-4f38-a5c6-1ff8e0ab8002",
                        "count": 34,
                        "nested": []
                    }
                ]
            }
        ],
        "total": 605
    }
}

Имя команды для вызова: fullTextSearchDSLGraph. Поддерживается только синхронный вызов

fullTextSearchDSL Graph (FT) V2

На входе поисковый запрос

{
  "query": "нефть",
  "searchType": "Words",
  "extensions": [
    {
      "item": "керосин",
      "boost": 0.2
    },
    {
      "item": "бензин",
      "boost": 0.1
    }
  ],
  "facetsQuery": "",
  "stringFacets": [
  ],
  "numberFacets": {},
  "paging": {
    "page": 1,
    "count": 10
  },
  "entityTypes": [
    "RfbrDocument"
  ]
}

В результате найденные документы в упрощенной форме

{
    "status": "Completed",
    "timestamp": 1648043225394,
    "value": {
        "documents": [
            {
                "id": "2c8fd498-4f28-4af5-a55e-fa3810daca35",
                "entityType": "RfbrDocument"
            },
            {
                "id": "a51bd74a-ad9d-47d5-a077-86b6e7fb71b0",
                "entityType": "RfbrDocument"
            }
        ],
        "facetsAggregations": [
            {
                "key": "RfbrDocument:documentType",
                "count": 605,
                "nested": [
                    {
                        "key": "f31ed82c-9fb2-4eb4-973c-70b09b24bcda",
                        "count": 549,
                        "nested": []
                    },
                    {
                        "key": "b4b6e695-9fcb-4f38-a5c6-1ff8e0ab8002",
                        "count": 34,
                        "nested": []
                    }
                ]
            }
        ],
        "statistics": [
            {
                "key": "RfbrDocument:documentType",
                "count": 605,
                "nested": [
                    {
                        "key": "f31ed82c-9fb2-4eb4-973c-70b09b24bcda",
                        "count": 549,
                        "nested": []
                    },
                    {
                        "key": "b4b6e695-9fcb-4f38-a5c6-1ff8e0ab8002",
                        "count": 34,
                        "nested": []
                    }
                ]
            }
        ],
        "total": 605
    }
}

Имя команды для вызова: fullTextSearchDSLGraphV2. Поддерживается только синхронный вызов

identificationSearch

Поиск документов в поисковом индексе по идентификаторам из результата Lamp-Similarity

На входе поисковый запрос

{
  "storedFile": "processing/9ddcc29f-31e1-4001-beeb-f0708594850b",
  "entityTypes": [
    "agreement"
  ],
  "facetsQuery": "agreement:author && agreement:year",
  "percentageRange": [
    60.3,
    90.5
  ],
  "stringFacets": [
    {
      "facetName": "agreement:author",
      "facetValue": [
        "someAuthor"
      ]
    }
  ],
  "numberFacets": {
    "agreement:year": "2010_2022"
  },
  "paging": {
    "page": 1,
    "count": 10
  }
}

В результате найденные документы приведенные к плоскому объекту

{
  "documents": [
    {
      "author": [
        "someAuthor"
      ],
      "city": [
        "someCity"
      ],
      "similarity": 0.8102,
      "entityType": "agreement",
      "content": "someContent",
      "title": "someTitle",
      "id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
    }
  ],
  "facetsAggregations": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "statistics": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "total": 1
}

Поддерживается только синхронный вызов

plagiarismSearch

Поиск документов в поисковом индексе по идентификаторам из результата Lamp-Plagiarism

На входе поисковый запрос

{
  "storedFile": "processing/9ddcc29f-31e1-4001-beeb-f0708594850b",
  "entityTypes": [
    "agreement"
  ],
  "facetsQuery": "agreement:author && agreement:year",
  "percentageRange": [
    60.3,
    90.5
  ],
  "stringFacets": [
    {
      "facetName": "agreement:author",
      "facetValue": [
        "someAuthor"
      ]
    }
  ],
  "numberFacets": {
    "agreement:year": "2010_2022"
  },
  "paging": {
    "page": 1,
    "count": 10
  }
}

В результате найденные документы приведенные к плоскому объекту

{
  "documents": [
    {
      "author": [
        "someAuthor"
      ],
      "city": [
        "someCity"
      ],
      "originality": 0.8102,
      "entityType": "agreement",
      "content": "someContent",
      "title": "someTitle",
      "id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
    }
  ],
  "facetsAggregations": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "statistics": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "total": 1
}

Поддерживается только синхронный вызов

similaritySearch v2

Вторая версия поиска документов в поисковом индексе по идентификаторам из результата Lamp-Similarity

На входе поисковый запрос

{
  "storedFiles": ["processing/9ddcc29f-31e1-4001-beeb-f0708594850b"],
  "requiredIds": {
    "agreement": null
  },
  "mergeOps": "max",
  "facetsQuery": "agreement:author && agreement:year",
  "percentageRange": [
    60.3,
    90.5
  ],
  "stringFacets": [
    {
      "facetName": "agreement:author",
      "facetValue": [
        "someAuthor"
      ]
    }
  ],
  "numberFacets": {
    "agreement:year": "2010_2022"
  },
  "paging": {
    "page": 1,
    "count": 10
  }
}

В результате найденные документы приведенные к плоскому объекту

{
  "documents": [
    {
      "author": [
        "someAuthor"
      ],
      "city": [
        "someCity"
      ],
      "similarity": 0.8102,
      "entityType": "agreement",
      "content": "someContent",
      "title": "someTitle",
      "id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
    }
  ],
  "facetsAggregations": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "statistics": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "total": 1
}

Поддерживается только синхронный вызов

plagiarismSearch v2

Вторая версия поиска документов в поисковом индексе по идентификаторам из результата Lamp-Plagiarism

На входе поисковый запрос

{
  "storedFiles": ["processing/9ddcc29f-31e1-4001-beeb-f0708594850b"],
  "requiredIds": {
    "agreement": null
  },
  "mergeOps": "max",
  "facetsQuery": "agreement:author && agreement:year",
  "percentageRange": [
    60.3,
    90.5
  ],
  "stringFacets": [
    {
      "facetName": "agreement:author",
      "facetValue": [
        "someAuthor"
      ]
    }
  ],
  "numberFacets": {
    "agreement:year": "2010_2022"
  },
  "paging": {
    "page": 1,
    "count": 10
  }
}

В результате найденные документы приведенные к плоскому объекту

{
  "documents": [
    {
      "author": [
        "someAuthor"
      ],
      "city": [
        "someCity"
      ],
      "originality": 0.8102,
      "entityType": "agreement",
      "content": "someContent",
      "title": "someTitle",
      "id": "62b5b85f-5962-407d-89f1-adbdb49cca85"
    }
  ],
  "facetsAggregations": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "statistics": [
    {
      "key": "agreement:author",
      "count": 2,
      "nested": [
        {
          "key": "someAuthor",
          "count": 2,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:city",
      "count": 2,
      "nested": [
        {
          "key": "someCity",
          "count": 1,
          "nested": []
        },
        {
          "key": "someCity1",
          "count": 1,
          "nested": []
        }
      ]
    },
    {
      "key": "agreement:year",
      "count": 2,
      "nested": [
        {
          "key": "2020.0",
          "count": 2,
          "nested": []
        }
      ]
    }
  ],
  "total": 1
}

Поддерживается только синхронный вызов

fullTextSearchAnalyzers

Список всех ES анализаторов

Входных данных нет

В результате список ES анализаторов

[
  "my_custom_analyzer",
  "standard",
  "simple",
  "whitespace",
  "stop",
  "keyword",
  "pattern",
  "fingerprint",
  "russian",
  "english"
]

Поддерживается только синхронный вызов

fullTextAutocomplete

На входе запрос с поисковой строкой

{
  "query": "sol"
}

На выходе результаты с предложениями автодополнений по исходной строке

[
  {
    "text": "Solution Architect",
    "score": 1
  },
  {
    "text": "Software Developer",
    "score": 1
  }
]

Получение дополнений для поисковой строки. Ищет дополнения в специально сформированном индексе. Учитывает возможные опечатки в исходной строке (до 2), см. пример.

Поддерживается только синхронный вызов.

fullTextSearchIndexCompletionPhrase

На входе набор фраз для сохранения в индексе для автодополнения

{
  "entityType": "Document",
  "objectId": "ba03990e-58d5-40dd-9316-c3257109dc06",
  "phrases": [
    "Software Architect",
    "Software Developer"
  ]
}

Команда не возвращает данных на выходе

Индексирование фраз для получения их при автодополнении. Фразы привязываются к некоторому объекту, из которого они извлекаются. При удалении этого объекта фразы также будут удалены.

Поддерживается синхронный и асинхронный вызов.

fullTextAggregationSearch

Агрегированный полнотекстовый поиск. Важно: это команда для взаимодействия между сервисами, в будущем ее нельзя будет вызвать через apiGW

На входе форма агрегирующего поиска

{
  "query": "электроконтактная",
  "paging": {
    "page": 1,
    "count": 40
  },
  "relations": {
    "Patent": {
      "RfbrDocument": {}
    }
  },
  "entity": {
    "entityType": "links",
    "objectId": "c62b976e-71f9-4d31-b6ab-45997ba84023"
  }
}

На выходе результат агрегированного поиска

{
  "documents": [
    {
      "document": {
        "id": "c7feabde-09cd-463c-ab4e-968178e7ab37",
        "entityType": "Patent",
        "highlight": {},
        "data": // doc data
      },
      "matchedChildren": {
        "RfbrDocument": 2
      }
    },
    {
      "document": {
        "id": "9489f188-d925-4e0f-99a6-7ff4a7f859e7",
        "entityType": "Patent",
        "highlight": {
          "patentFileContent": [
            "(57) Формула изобретения\nКонвейерная хлебопекарная !!!HL!!электроконтактная!!HL!!! печь, характеризующаяся тем, что"
          ]
        },
        "data": // doc data
      },
      "matchedChildren": {
        "RfbrDocument": 0
      }
    }
  ],
  "total": 2
}

Поддерживается только синхронный вызов.

searchByParent

Полнотекстовый поиск внутри родительского документа. Важно: это команда для взаимодействия между сервисами, в будущем ее нельзя будет вызвать через apiGW

На входе форма поиска внутри родительского документа

{
  "query": "электроконтактная",
  "paging": {
    "page": 1,
    "count": 10
  },
  "leafType": "RfbrDocument",
  "entity": {
    "entityType": "Patent",
    "objectId": "c7feabde-09cd-463c-ab4e-968178e7ab37"
  }
}

На выходе результат поиска

{
  "documents": [
    {
      "id": "975975bb-ece6-4aca-80fc-5f227e982582",
      "entityType": "RfbrDocument",
      "highlight": {
        "newFileContent": [
          "И, действительно, !!!HL!!электроконтактная!!HL!!! методика, о которой я здесь\nрассказываю, в скором времени сыграла",
          "Результаты\nизмерений, полученные с помощью !!!HL!!электроконтактной!!HL!!! методики (в\nсочетании с другими), позволили",
          "С помощью !!!HL!!электроконтактной!!HL!!! методики уже в 1948 году были\nполучены первые экспериментальные данные о",
          "моей сохранилось чувство признательности и даже\nгордости от того, что в этой нашей работе по созданию !!!HL!!электроконтактной!!HL!!!",
          "Опыты намечалось проводить с применением !!!HL!!электроконтактной!!HL!!! методики измерения скоростей."
        ]
      },
      "data": // doc data
    },
    {
      "id": "1f398276-efb3-41c9-994d-6680681d59f5",
      "entityType": "RfbrDocument",
      "highlight": {
        "newFileContent": [
          "камера; 2 — пьезокварцевый датчик давления; З капсюльвоспламенитель; 4 — метаемое тело с полостью; 5 !!!HL!!электроконтактное!!HL!!!"
        ]
      },
      "data": // doc data
    }
  ],
  "total": 2
}

Поддерживается только синхронный вызов.

aggregateDocuments

Агрегация документов (объектов) из индекса полнотекстового поиска по значениям из переданных полей.

На входе список типов сущностей с полями для агрегации и идентификаторы объектов

[
  {
    "entityType": "type1",
    "aggregationField": "identity",
    "ids": [
      "00000000-0000-0000-0000-000000000001",
      "00000000-0000-0000-0000-000000000002",
      "00000000-0000-0000-0000-000000000003"
    ]
  },
  {
    "entityType": "type2",
    "aggregationField": "identity",
    "ids": [
      "00000000-0000-0000-0000-000000000004"
    ]
  },
  {
    "entityType": "type3",
    "aggregationField": "identity",
    "ids": [
      "00000000-0000-0000-0000-000000000005"
    ]
  },
  {
    "entityType": "type4",
    "aggregationField": "identity",
    "ids": [
      "00000000-0000-0000-0000-000000000006"
    ]
  }
]

В результате значения полей с количеством документов

{
  "buckets": {
    "cb4ca441-8710-4eff-9e4f-746b3d0017be": {
      "total": 1,
      "entities": [
        {
          "code": "type1",
          "count": 1
        }
      ]
    },
    "8f9b0cc2-d060-4a2d-9421-c4bc4de1fea3": {
      "total": 1,
      "entities": [
        {
          "code": "type4",
          "count": 1
        }
      ]
    },
    "0141f31e-33d8-4218-98f4-a26a19237172": {
      "total": 1,
      "entities": [
        {
          "code": "type2",
          "count": 1
        }
      ]
    },
    "ef08cfd6-2c61-4a91-97cb-e59af923260c": {
      "total": 1,
      "entities": [
        {
          "code": "type1",
          "count": 1
        }
      ]
    }
  }
}

Команда только внутренняя (нельзя вызвать через Api Gateway). Поддерживается только синхронный вызов. Если поле отсутствует, то этот документ не учитывается в результате.

checkIdsInIndex

Проверка, проиндексированы ли документы (объекты) с указанными ID

На входе список ID

[
  "fef5409d-5dad-431d-928e-ed1fe984aaad",
  "def5409d-5dad-431d-928e-ed1fe984aaaa"
]

В результате - JSON-объект, где ключом является ID документа, а значением - признак наличия документа с таким ID в индексе

{
  "fef5409d-5dad-431d-928e-ed1fe984aaad": true,
  "def5409d-5dad-431d-928e-ed1fe984aaaa": false
}

Команда только внутренняя (нельзя вызвать через Api Gateway). Поддерживается только синхронный вызов.

Сервис индексации

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

Общее описание архитектуры сервиса индексаций

Сервис индексирует объекты из модели данных. Индексирование может изменять состояние объекта в сервисах курсора, например обновлять объект в модели данных или делать объект доступным для полнотекстового поиска, возможно индексирование без изменения состояния - например наполнение индексов LAMP для последующего использования. Индексаций определенного типа описывается как последовательность шагов Step. Шаги могут зависеть друг от друга. Зависимость может быть 2 типов: шаг Б использует результаты шага А для определенной сущности, шаг Б полагается на выполнение шага А для всех сущностей. Некоторые шаги (сейчас только Lamp) после выполнения работы над определенной сущностью возвращают словарь вида: имяполя->результатработы. Зависящие от них шаги, могут использовать эти результаты в свой работе. Если дочерний шаг должен дождаться завершения индексации всех сущностей на родительском шаге - то при описании дочернего шага нужно указывать флаг oneLevel = false.

Сервис индексаций содержит следующие таблицы:

Конфигурирование сервиса индексаций

Требования к запуску сервиса индексаций

Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm. Для корректной минимальной работы сервиса требуется обязательное подключение к PostgreSQL, Kafka, Consul, MinIO и Remote Lamp Client Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus и ApiGateway.

Список переменных окружения сервиса индексаций

Переменная Тип Обязательная Значение по умолчанию Описание
SERVER_PORT int нет 8080 Порт, на котором слушает HTTP-сервер
CONSUMER_TOPIC string нет entityObjectEvents Название кафка-топика для событий по объектам
CONSUMER_GROUP string нет indexation Имя группы-консьюмеров сервиса индексаций
FIXED_CONSUMER_GROUP string нет indexationFixed Имя группы-консьюмеров без перебалансировки
CONSUMER_STEP_TOPIC string нет step Название кафка-топика для шагов индексации
CONSUMER_PROGRESS_TOPIC string нет progress Название кафка-топика для прогресса по плагинам
CONSUMER_STEP_FINISH_TOPIC string нет stepFinish Название кафка-топика для отслеживания завершения выполнения всех шагов по определенной сущности. Топик должен иметь только 1 партицию. Топик для внутреннего использования
CONSUMER_INDEXATION_TOPIC string нет indexationInner Название кафка-топика для выполнения массовой индексации сущностей определенного типа. Топик должен иметь только 1 партицию
CONSUMER_INDEXATION_INTERRUPT_TOPIC string нет indexationInterrupt Название кафка-топика для принудительного прерывания индексации. Топик должен иметь только 1 партицию. Топик для внутреннего использования
CONSUMER_STEP_PARTITION_PARALLELISM int нет 10 Параллелизм чтения из step партиции. Значение > 1 нарушают at-most-once семантику, но значительно ускоряют массовую индексацию
CONSUMER_FILE_EVENTS_TOPIC string нет fileEvents Название кафка-топика для событий с файлами из dataModel
VERDI_CONSUL url string да http://localhost:8500 Адрес Consul
VERDI_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
VERDI_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
VERDI_KAFKA_ADDRESS string да localhost:9092 Адрес брокера Kafka.
VERDI_KAFKA_TOPIC string нет eventStatus Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
VERDI_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
VERDI_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
VERDI_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
VERDI_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к харнилищу сертификатов.
VERDI_HOST string да localhost Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
VERDI_TTL duration string нет 30 seconds Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
VERDI_HEALTH_CHECK duration string нет 10 seconds Периодичность отправки health check в ServiceDiscovery
VERDI_COMMAND_STORAGE_UPDATE_PERIOD duration string нет 1 minutes Время кэширования данных по командам из CommandDiscovery
VERDI_SERVICE_DISCOVERY_UPDATE_PERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
VERDI_ALLOW_INTERNAL_COMMANDS bool нет true Можно ли сервису отправлять внутрисистемные команды
VERDI_CONSUL_CONNECTION_MAX_RETRY int нет 5 Максимальное количество попыток подключений к Consul
VERDI_CONSUL_CONNECTION_RETRY_DELAY duration string нет 1 seconds Таймаут между неудачными попытками подключения к Consul
VERDI_KAFKA_SYNC_POLLING_PERIOD duration string нет 1 seconds Периодичность запроса статуса verdi команд в sender-lib
VERDI_KAFKA_SYNC_POLLING_TIMEOUT duration string нет 1 seconds Максимальное время ожидания выполнения verdi команды в sender-lib
DB_JDBC_URL jdbc url string да jdbc:postgresql://127.0.0.1:5432/indexation JDBC-url для соединения с БД
DB_USER string да postgres Пользователь БД
DB_PASSWORD string да 12345 Пароль пользователя БД
FS_URI url string да http://localhost:9002 Адрес S3 файлового хранилища minio
FS_ACCESS_KEY_ID string да admin Идентификатор доступа к minio
FS_SECRET_ACCESS_KEY string да admin Секретный ключ доступа к minio
FS_UPLOAD_PARALLELISM int нет 10 Параллелизм загрузки файлов в minio
FS_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
FS_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с маппингом учетных записей
FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
FS_CACHE_TTL duration string нет Время жизни клиента в кеше
LAMP_BUFFER_SIZE int нет 10 Буфер на отправку сообщений в клиент LAMP
LAMP_RECONNECT_SCHEDULE schedule string нет I(2 seconds) Стратегия переподключения клиента LAMP (формат см. lamp.transport.model.Schedule)
LAMP_HOST url string да lamp-dev.dev.embedika.ru Адрес клиента LAMP
LAMP_PORT int да 443 Порт клиента LAMP
LAMP_TLS bool нет true Признак защищенного подключения к LAMP
LAMP_TLS_CERTIFICATE string нет "" Путь файла с сертификатом для подключения к LAMP
LAMP_TLS_PRIVATE_KEY string нет "" Путь файла с приватным ключем для подключения к LAMP
LAMP_TLS_ROOT_TRUSTED_CERTS string нет "" Путь файла с центром сертификации (Certification Authority, CA) для подключения к LAMP
LAMP_TIMEOUT duration string нет 1 minute Таймаут отправки сообщения и получения результатов через клиент LAMP
LAMP_MAX_MESSAGE_SIZE int нет 524288000 Максимальный допустимый размер сообщений в LAMP
LAMP_QUERY_PARALLELISM int нет 10 Параллелизм обработки в LAMP файлов одного объекта
APP_FILE_BUCKET string нет document S3 bucket в котором следует искать файлы объектов
APP_ROUTE_MAPPING string нет Extraction:extraction_route;Keyword:cursor_v0.1_keyword;Plagiarism:cursor_v0.1_plagiarism;Similarity:cursor_v0.1_similarity Маппинг сервисных имен LAMP роутов с реальными LAMP роутами. Формат indexation1:route1;indexation2:route2. Список сервисные роуты см. LampRoute
APP_CLEAN_ROUTE_MAPPING string нет Plagiarism:cursor_v0.1_plagiarism_clean;Similarity:cursor_v0.1_similarity_clean Маппинг имен LAMP индексаций с LAMP роутами для удаления документов
APP_COMMAND_COMPLETION_TIMEOUT duration string нет 20 seconds Максимальное время ожидания команд после выполнения шага индексации
APP_COMMAND_PROCESSING_PARALLELISM int нет 5 Параллелизм обработки событий verdi
APP_MAX_STEP_ATTEMPTS int нет 10 Максимальное кол-во попыток выполнения шага индексации
APP_ASYNC_COMMAND_POLL_INTERVAL duration string нет 1 second Периодичность запроса статуса verdi команд
APP_ASYNC_COMMAND_TIMEOUT duration string нет 10 seconds Максимальное время ожидания выполнения verdi команды
APP_INDEXATION_DATA_BATCH int нет 100 Размер данных получаемых за 1 раз из сервиса МД для индексации. С увеличением параметра увеличится время ожидания для принудительного прерывания, с уменьшением - увеличится нагрузка на МД
APP_INDEXATION_ENTITY_TIMEOUT duration string нет 5 minutes Время ожидания завершения всех шагов по сущности TODO Возможно стоит скалировать это время пропорционально кол-ву шагов, ведь оно может быть сильно разным
APP_INDEXATION_PARALLELISM int нет 4 Параллелизм массового индексирования
APP_VERDI_PARALLELISM int нет 4 Размер пула потоков для sender-lib
APP_VERDI_MAX_RETRY int нет 10 Максимальное число ретраев для verdi команд
APP_VERDI_RETRY_DELAY duration string нет 5 seconds Таймаут между неудачными вызовами verdi команд
APP_DEFAULT_WHITE_LISTS string нет Erika:doc,docx;PDFView:pdf Дефолтные фильтры файлов по расширениям
APP_FILE_PARALLELISM int нет 10 Лимит на одновременное число запросов к minio
PDF_VIEW_HOST string нет http://localhost:3333 Адрес сервиса для извлечения json из pdf
PDF_VIEW_TIMEOUT duration string нет 5 minutes Таймат для запрос в сервис извлечения json из pdf
PDF_VIEW_ADDITIONAL_FIELD_NAME string нет pdfJson Ключ под которым сохраняются результаты извлечения json из pdf
PDF_VIEW_EXTRACT_PART_NAME string нет file Ключ под которым нужно передавать pdf для извлечения json
INDEXATION_AUTHZFORCE_ADDR url string нет http://localhost:8080/authzforce-ce Адрес сервиса authzforce
INDEXATION_AUTHZFORCE_DOMAIN string нет "" Доступный DomainID в Authzforce server
INDEXATION_AUTHZFORCE_CONNECT_TIMEOUT duration string нет 5 seconds Максимальное время ожидания ответа от Authzforce
INDEXATION_READABLE_NAME string нет "Сервис индексаций" Читаемое название этого сервиса
INDEXATION_DESCRIPTION string нет "Предназначен для индексации" Читаемое описание этого сервиса

Команды для сервиса индексации

Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.

Название команды EntityType Actions
createIndexationDescription indexationDescription indexation_indexationDescription_CreateIndexationDescription
getIndexationDescription indexationDescription indexation_indexationDescription_GetIndexationDescription
deleteIndexationDescription indexationDescription indexation_indexationDescription_DeleteIndexationDescription
updateIndexationDescription indexationDescription indexation_indexationDescription_UpdateIndexationDescription
listIndexationDescription indexationDescription indexation_indexationDescription_ListIndexationDescription
listIndexationDescriptionPages indexationDescription indexation_indexationDescription_ListIndexationDescriptionPages
indexationRowsList row indexation_row_row
indexationRestartStep row indexation_row_row
startIndexation indexation indexation_indexation_StartIndexation
fixIndexation indexation indexation_indexation_FixIndexation
indexationStatistics indexation indexation_indexation_IndexationStatistics
getIndexation indexation indexation_indexation_GetIndexation
getIndexations indexation indexation_indexation_GetIndexations

Модели сервиса индексаций

IndexationDescription

Описание индексации определенного типа объекта

Название поля Тип Описание
id String Идентификатор описания, соответствует типу объекта
steps Seq[Step] Шаги индексации
version Int Версия описания. Используется для optimistic lock

IndexationDescriptionDTO

Создание описание индексации определенного типа объекта

Название поля Тип Описание
id String Идентификатор описания, соответствует типу объекта
steps Seq[Step] Шаги индексации

Шаги индексации

Отдельный элемент индексации описывающий взаимодействие с сервисами интеллектуализации, конвертации или полнотекстового поиска

ExtensionFilter

Фильтр файлов по расширениям для шагов

AllowedAll

Разрешены любые расширения

WhiteList

Название поля Тип Описание
allowed Seq[String] Допустимые расширения
default boolean Флаг для дефолтных настроек

StepChild

Описание дочерний шага

Название поля Тип Описание
step Step Описание шага
oneLevel boolean Располагается ли дочерний шаг на одном уровне с родительским шагом

Step

Описание шага. Шаг после своего выполнения может вернуть результаты в виде ключ:ссылканафайлсрезультатами. Эти результаты можно использовать в дочерних шагах. Шаг может фиксировать свои результаты в дополнительных полях файлов через сервис модели данных

Название поля Тип Описание
children Seq[StepChild] Зависящие шаги
payload StepPayload Описание самого шага
extensionFilter Option[ExtensionFilter] Опциональный фильтр файлов по расширениям
label String Опциональный лейбл шага, может быть полезен при отладке

StepPayload

Тип-сумма для описания шагов индексации. При десериализации нужно дополнительное поле type, где указывается имя типа-произведения. Аналогичное поле будет при сериализации.

Lamp (indexation)

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

Название поля Тип Описание
filesRoutes Seq[FileRoutes] Индексация отдельных файловых полей сущности

FileRoutes

Индексация в сервисах LAMP отдельно взятого файлового поля сущности. Модель формирует ключи для сохранения результатов работы шага Lamp из saveContentTo и actions.

Название поля Тип Описание
field String Имя поля
saveContentTo Option[String] Опциональный ключ для сохранения контента
actions Seq[FileRoute] Список конкретных индексаций в LAMP

FileRoute

Конкретная индексация в LAMP

Название поля Тип Описание
lampRoute LampRoute Lamp роут
routeResult Option[RouteResult] Опциональная обработка результатов от LAMP

RouteResult

Обработка результатов от LAMP

Название поля Тип Описание
resultName String Ключ для результата, по которому следующие шаги могу получить этот результат
saveToDM Boolean Флаг указывающий нужно ли сохранить результат в сервис модели данных. По умолчанию false

FullTextSearch

Индексация в сервисе полнотекстового поиска. Часть типов-произведений StepPayload

Название поля Тип Описание
fields Seq[String] Поля, значение которых нужно сохранить в поисковом индексе

FullTextCompletion

Индексация автодополнений в сервисе полнотекстового поиска. Содержит список названий полей, которые сохраняются в индексе. Среди полей могут быть поля из исходного объекта модели данных, или же полученные с помощью Lamp через сервис ключевых слов. В таком случае нужно передать поле с результатом соответствующего шага. Часть типов-произведений StepPayload

Название поля Тип Описание
fields Seq[String] Поля, значение которых нужно сохранить в индексе для автодополнений

Erika

Индексация конвертирующая файлы объекта в pdf-представление. Обновляет состояние в сервисе МД. Часть типов-произведений StepPayload. Может иметь дочернии шаги. Сохраняет результаты в сервисе модели данных в дополнительных полях файлов под ключем pdf

Название поля Тип Описание
fields Seq[String] Список полей для конвертации.

Plugin

Индексация в плагинах интеллектуализации. Часть типов-произведений StepPayload. В поле topic указывается кафка-топик, по которому произойдет связь с конкретным плагином. Доступные на данный момент:

Название поля Тип Описание
topic String Кафка топик целевого сервиса
fields Seq[String] Список файловых полей для индексации

PDFView

Индексация для предварительного рендеринга pdf. Часть типов-произведений StepPayload. Сохраняет результаты в сервисе модели данных в дополнительных полях файлов под ключем из настройки PDF_VIEW_ADDITIONAL_FIELD_NAME

Название поля Тип Описание
fields Seq[String] Список файловых полей для индексации

LampRoute (indexation)

Имена сервисных LAMP роутов Доступные на данный момент роуты: Extraction, Keyword, Plagiarism, Similarity, ExtractionPdfium

EventType

Типы событий объектов: Create, Delete, Update

IndexationRow

Статус шага индексации

Название поля Тип Описание
id UUID Идентификатор шага
entityId UUID Идентификатор объекта
entityType String Тип объекта
status IndexationRowStatus Статус шага
eventType EventType Тип события
created LocalDateTime Дата создания статуса шага
step Step Шаг индексации
message Option[String] Опциональный текст ошибки выполнения шага
stackTrace Option[String] Опциональное подробное описание ошибки выполнения шага
correlation_id String Тэг. Используется в частности для объединения статусов по одной индексации
additional Option[Json] Опицональная дополнительная информация о шаге

IndexationRowStatus

Типы статусов шагов индексации: Success, Error

Page

Страница списка элементов (часть списка с примененным пейджингом) типа T

Название поля Тип Описание
items Seq[T] Список элементов на запрошенной странице
total Long Общее количество объектов

IndexationStatistics

Статистика результатов индексации

Название поля Тип Описание
completed Seq[UUID] Список сущностей по которым все шаги были успешно выполнены
typesErrors Map[String, Int] Сводная информация об ошибках, в формате "Тип шага:кол-во провалившихся шагов"
entitiesErrors Map[UUID, Seq[String]] Сводная информация об ошибках, в формате "идентификатор сущности:типы провалившихся шагов"
status IndexationStatus Статус индексации

IndexationStatus

Типы статусов индексации: InProgress, Done, Interrupted

Indexation

Индексация определенного типа сущностей

Название поля Тип Описание
id UUID Идентификатор, по которому можно получить модель, статистику, и сделаные шаги
entityType String Тип сущности
status IndexationStatus Статус индексации
created LocalDateTime Дата создания
updated LocalDateTime Дата обновления
description IndexationDescription Зафиксированное на момент запуска описание индексации

Команды сервиса индексаций

createIndexationDescription

Создание описания индексации

На входе описание индексации

{
  "id": "NewEntityType",
  "steps": [
    {
      "children": [],
      "payload": {
        "type": "Erika",
        "fields": [
          "files"
        ]
      },
      "extensionFilter": {
        "type": "WhiteList",
        "allowed": [
          "docx"
        ]
      }
    }
  ]
}

В результате возвращается идентификатор описания

Поддерживается только синхронный вызов

getIndexationDescription

Получение описания индексации по идентификатору (по сути по типу объекта)

На входе идентификатор описания

"Document"

В результате описание индексации

{
  "id": "NewEntityType",
  "steps": [
    {
      "children": [],
      "payload": {
        "fields": [
          "files"
        ],
        "type": "Erika"
      },
      "extensionFilter": {
        "type": "WhiteList",
        "allowed": [
          "docx"
        ],
        "default": false
      }
    }
  ],
  "version": 1
}

Поддерживается только синхронный вызов

deleteIndexationDescription

Удаление описания индексации и истории запусков данной индексации.

На входе идентификатор описания

"Document"

В результате количество удаленных записей

Поддерживается только синхронный вызов

updateIndexationDescription

Обновление описания индексации

На входе описание индексации

{
  "id": "NewEntityType",
  "steps": [
    {
      "children": [],
      "payload": {
        "fields": [
          "files"
        ],
        "type": "Erika"
      }
    },
    {
      "children": [],
      "payload": {
        "filesRoutes": [
          {
            "field": "files",
            "actions": [
              {
                "lampRoute": "Plagiarism"
              }
            ]
          }
        ],
        "type": "Lamp"
      }
    }
  ],
  "version": 1
}

В результате количество обновленных записей

Поддерживается только синхронный вызов

listIndexationDescription

Получение списка описаний индексаций

Входных данных нет

В результате список описаний индексаций

[
  {
    "id": "Document",
    "steps": [
      {
        "children": [
          {
            "step": {
              "fields": [
                "documentFileContent"
              ],
              "type": "FullTextSearch"
            },
            "oneLevel": false
          }
        ],
        "payload": {
          "filesRoutes": [
            {
              "field": "documentFile",
              "saveContentTo": "documentFileContent",
              "actions": [
                {
                  "lampRoute": "Extraction"
                }
              ]
            }
          ],
          "type": "Lamp"
        },
        "extensionFilter": null
      },
      {
        "children": [],
        "payload": {
          "fields": [
            "documentFile"
          ],
          "type": "Erika"
        },
        "extensionFilter": null
      }
    ],
    "version": 1
  },
  {
    "id": "agreement",
    "steps": [
      {
        "children": [],
        "payload": {
          "filesRoutes": {
            "field": "files",
            "actions": [
              {
                "lampRoute": "Plagiarism"
              }
            ]
          },
          "type": "Lamp"
        },
        "extensionFilter": null
      }
    ],
    "version": 1
  }
]

Поддерживается только синхронный вызов

listIndexationDescriptionPages

На входе Search запрос (пока поддерживается только Paging)

{
    "query": "",
    "paging": {
        "page": 2,
        "count": 2
    },
    "context": {}
}

На выходе список описаний индексаций обернутый в Page

{
  "items": [
    {
      "id": "NewEntityType",
      "steps": [
        {
          "children": [],
          "payload": {
            "fields": [
              "files"
            ],
            "type": "Erika"
          }
        }
      ],
      "whiteList": [
        "docx"
      ],
      "version": 1
    },
    {
      "id": "NewEntityType1",
      "steps": [
        {
          "children": [],
          "payload": {
            "fields": [
              "files"
            ],
            "type": "Erika"
          }
        }
      ],
      "whiteList": [
        "docx"
      ],
      "version": 1
    }
  ],
  "total": 5
}

Поддерживается только синхронный вызов

indexationRowsList

Получение списка статусов шагов

На входе поисковый запрос

{
  "query": "entityId",
  "context": {
    "entityId": "d81eed64-3449-4bf1-a668-13f69cbaefc4"
  },
  "paging": {
    "page": 1,
    "count": 2
  },
  "sorting": {
    "fieldName": "created",
    "order": "asc"
  }
}

Запрос принимает параметры сортировки, фильтров и пейджинга в параметре Search. Сортировка доступна только по дате создания Доступные фильтры

Ключ Формат контекста Описание
entityId UUID-ы разделенные запятыми Фильтрация по объекту
status Строка Фильтрация по статусу шага
entityType Строки разделенные запятыми Фильтрация по типу объекта
correlationId Строка Фильтрация по тэгу. Например чтобы получить все шаги определенной индексации
stepType Строки разделенные запятыми Фильтрация по типу шага

В результате список статусов шагов с пагинацией

{
  "items": [
    {
      "id": "be54b09d-c655-41f6-a87e-1c5b1ed021cd",
      "entityId": "d81eed64-3449-4bf1-a668-13f69cbaefc4",
      "entityType": "Document",
      "status": "Success",
      "eventType": "Create",
      "created": "1629964032194",
      "step": {
        "children": [],
        "payload": {
          "fields": [
            "files"
          ],
          "type": "Erika"
        },
        "extensionFilter": {"type":  "WhiteList", "allowed":  ["docx", "doc"], "default":  true}
      },
      "message": null,
      "stackTrace": null,
      "additional": {
        "skipped": {
          "fileId": "be54b09d-c655-41f6-a87e-1c5b1ed021cd",
          "additional": null,
          "name": "file.txt",
          "url": "temp/be54b09d-c655-41f6-a87e-1c5b1ed021cd"
        }
      }
    },
    {
      "id": "a4be56be-b5f0-4ff7-8a8e-a514a68b546e",
      "entityId": "d81eed64-3449-4bf1-a668-13f69cbaefc4",
      "entityType": "Document",
      "status": "Error",
      "eventType": "Create",
      "created": "1629964032194",
      "step": {
        "children": [],
        "payload": {
          "fields": [
            "files"
          ],
          "type": "Erika"
        },
        "extensionFilter": null
      },
      "message": "CommandService timeout",
      "stackTrace": null,
      "additional": null
    }
  ],
  "total": 3
}

Поддерживается только синхронный вызов

indexationRestartStep

Перезапуск шага

На входе идентификатор статуса шага

"be54b09d-c655-41f6-a87e-1c5b1ed021cd"

В результате признак успешного перезапуска

Поддерживается только синхронный вызов

startIndexation

Запуск индексации всех сущностей определенного типа

На вход тип сущности

"RfbrDocument"

В результате идентификатор индексации

"be54b09d-c655-41f6-a87e-1c5b1ed021cd"

Поддерживает только синхронный вызов

fixIndexation

Перезапуск индексации. Будут заново проиндексированы объекты, у которых имеется хотя-бы 1 провалившейся шаг по данной индексации, а так же будут проиндексированы новые, не индексировавшиеся до этого объекты

На вход идентификатор завершившейся индексации

"be54b09d-c655-41f6-a87e-1c5b1ed021cd"

Поддерживает только синхронный вызов

interruptIndexation

Прерывание индексации. Индексация будет прервана только после завершения индексации текущей страницы данных (см. параметр INDEXATION_DATA_BATCH)

На вход идентификатор индексации

"be54b09d-c655-41f6-a87e-1c5b1ed021cd"

Поддерживает только асинхронный вызов

indexationStatistics command

Получение статистики по индексации

На вход идентификатор индексации

"be54b09d-c655-41f6-a87e-1c5b1ed021cd"

В результате полная статистика о прохождении индексации

{
  "completed": [
    "be54b09d-c655-41f6-a87e-1c5b1ed021cd",
    "d81eed64-3449-4bf1-a668-13f69cbaefc4"
  ],
  "typesErrors": {
    "Erika": 3
  },
  "entitiesErrors": {
    "372c7c3d-21dd-4568-8cf7-6c31b36b771d": [
      "Erika"
    ]
  },
  "status": "Done"
}

Поддерживает только синхронный вызов

getIndexation

Получение индексации

На вход идентификатор индексации

"282484ae-3c53-4176-af0b-dba62e50e606"

В результате модель индексации

{
  "id": "282484ae-3c53-4176-af0b-dba62e50e606",
  "entityType": "RfbrDocument",
  "status": "InProgress",
  "created": "2022-02-04T12:37:28.997818",
  "updated": "2022-02-04T12:37:28.997818",
  "description": {
    "id": "RfbrDocument",
    "steps": [
      {
        "children": [],
        "payload": {
          "filesRoutes": [
            {
              "field": "file",
              "saveContentTo": "fileContent",
              "actions": []
            }
          ],
          "type": "Lamp"
        },
        "extensionFilter": null
      }
    ],
    "version": 1
  }
}

Поддерживает только синхронный вызов

getIndexations

Получение списка индексаций

Входных данных нет

В результате список индексаций

[
  {
    "id": "245d6b04-40aa-4139-8c4d-a25ae2f57a55",
    "entityType": "RfbrDocument",
    "status": "InProgress",
    "created": "2022-01-31T14:49:06.834771",
    "updated": "2022-01-31T14:49:06.834771",
    "description": {
      "id": "RfbrDocument",
      "steps": [
        {
          "children": [],
          "payload": {
            "filesRoutes": [
              {
                "field": "file",
                "saveContentTo": "fileContent",
                "actions": []
              }
            ],
            "type": "Lamp"
          },
          "extensionFilter": null
        }
      ],
      "version": 1
    }
  },
  {
    "id": "5436a8e7-1ba2-40ca-93cd-96e318d76b3d",
    "entityType": "RfbrDocument",
    "status": "Interrupted",
    "created": "2022-01-31T14:52:12.495104",
    "updated": "2022-01-31T14:53:08.142893",
    "description": {
      "id": "RfbrDocument",
      "steps": [
        {
          "children": [],
          "payload": {
            "filesRoutes": [
              {
                "field": "file",
                "saveContentTo": "fileContent",
                "actions": []
              }
            ],
            "type": "Lamp"
          },
          "extensionFilter": null
        }
      ],
      "version": 1
    }
  }
]

Поддерживает только синхронный вызов

Внешний интерфейс сервиса интеграций

Внешний API сервиса интеграций позволяет импортировать данные в Cursor, получать описание и пример данных для импорта.
Доступен по HTTP.

Сервис оперирует понятием сущности (entity). Он позволяет загрузить любые объекты с любым набором полей. Для отделения таких объектов с разным набором атрибутов друг от друга вводится понятие сущности. Сущность - это описание группы объектов, имеющих общий набор полей (например: договор, сотрудник или патент). Каждая сущность идентифицируется определенным типом entityType. Все операции с ней должны сопровождаться передачей соответствующего entityType в строке запроса.

Между двумя объектами могут устанавливаться отношения (relation).
Понятием "Вид отношения" называется комбинация двух сущностей и "виртуального" поля первой сущности. Например: отношение авторства может быть представлено комбинацией сущностей Book и Person, и полем author. Виртуальные поля отношений фактически не являются частью объекта и не могут быть напрямую указаны при создании или обновлении объекта; но при этом возвращаются при получении объекта из Cursor. Например: если у книги указан автор, его id вернется в поле author при получении данных этой книги.
Отношение между двумя объектами может быть установлено только в рамках какого-либо вида отношений сущностей этих объектов. Между двумя сущностями может быть установлено несколько видов отношений; кроме того может быть установлено отношение сущности с самой собой (например: отношение родительства или отношение связи элементов графа). Вид отношений считается доступным для текущего клиента, если ему доступны обе входящие в него сущности
(см. Список сущностей, доступных для текущего клиента).

Для работы с файлами нужно использовать отдельный вызов UploadFile. По нему в систему можно загрузить некоторый файл. На выходе метода - id файла. Этот id необходимо передать при сохранении или обновлении объекта в соответствующем поле типа file. Тип поля можно узнать с помощью вызова GetEntityTypeSchema.

Каждый запрос требует указать заголовок X-Client-Token: [token], где [token] - это токен зарегистрированного, незаблокированного клиента.
Если запрос связан с какой-либо сущностью, данный клиент также должен иметь доступ к ней.

Во внешнем API реализовано получение документации по доступным для клиента типам данных:

В свою очередь, OpenAPI-документация содержит описание команд для работы с указанным типом данных, а также вспомогательных команд (загрузка файла для последующего использования в объектах, выгрузка элементов используемых справочников и т.д.).

Получение документации внешнего интерфейса сервиса интеграций

ListEntityTypesForCurrent

На входе ничего

На выходе список доступных типов данных для текущего клиента

[
  {
    "id": "paper",
    "title": "Научная статья",
    "description": "Документ, представляющий научную статью"
  }
]

Возвращает перечень доступных для клиента типов данных

Путь: HTTP GET /external/v1/help/entityType

GetEntityTypeSchema

На входе ничего

На выходе JSON-Schema сущности

{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "definitions": {
    "date": {
      "type": "integer"
    },
    "relation": {
      "type": "string"
    },
    "catalog": {
      "type": "string"
    },
    "multi-catalog": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid"
      }
    },
    "file": {
      "type": "object",
      "properties": {
        "fileId": {
          "type": "string",
          "format": "uuid"
        },
        "name": {
          "type": "string"
        },
        "size": {
          "type": "integer",
          "minimum": 0
        },
        "url": {
          "type": "string"
        },
        "additional": {
          "type": "object"
        },
        "created": {
          "type": "integer",
          "minimum": 0
        },
        "modified": {
          "type": "integer",
          "minimum": 0
        },
        "md5": {
          "type": "string",
          "pattern": "^[0-9a-fA-F]{32}$"
        }
      },
      "required": [
        "fileId"
      ]
    }
  },
  "type": "object",
  "properties": {
    "modified": {
      "$ref": "#/definitions/date",
      "title": "Дата обновления файла",
      "additional": false,
      "rawType": "dateTime",
      "description": "Дата обновления файла",
      "example": 1582966800,
      "exampleType": "number"
    },
    "created": {
      "$ref": "#/definitions/date",
      "title": "Дата создания файла",
      "additional": false,
      "rawType": "dateTime",
      "description": "Дата создания файла",
      "example": 1582966800,
      "exampleType": "number"
    },
    "path": {
      "type": "string",
      "maxLength": 5000,
      "title": "Путь в папке до файла",
      "additional": false,
      "rawType": "string",
      "settings": {
        "maxLength": 5000
      },
      "example": "/docs/dogovor.docx",
      "exampleType": "string"
    },
    "name": {
      "type": "string",
      "maxLength": 1000,
      "title": "Название файла",
      "additional": false,
      "rawType": "string",
      "settings": {
        "maxLength": 1000
      },
      "example": "Договор",
      "exampleType": "string"
    },
    "file": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/file"
      },
      "multiple": false,
      "maxItems": 1,
      "title": "ID файла",
      "additional": false,
      "rawType": "file"
    },
    "author": {
      "title": "Автор документа",
      "$ref": "#/definitions/relation",
      "multiple": false,
      "additional": false,
      "readOnly": true,
      "nullable": true,
      "to": "Author",
      "settings": {
        "to": "Author"
      }
    }
  },
  "required": [
    "created",
    "path",
    "name",
    "file"
  ],
  "relations": [
    {
      "name": "Document_To_Author",
      "entity1": "Document",
      "entity2": "Author",
      "entity1Field": "author",
      "entity2Field": "documents",
      "relationType": "many-to-one"
    }
  ]
}

Получение описания модели данных для конкретной сущности в виде JSON-Schema.

Путь: HTTP GET /external/v1/help/entityType/:entityTypeId/schema

GetObjectExample

На входе ничего

На выходе пример данных объекта

{
  "id": "64f1e728-7fe7-4886-9d5c-e72452dbc3ce",
  "internalId": "933d8db6-fddc-475e-8366-652c8d0a0f32",
  "entityType": "FolderFile",
  "source": "example",
  "created": 1644839076580,
  "modified": 1644839076580,
  "data": {
    "created": 1582966800,
    "file": [
      {
        "fileId": "00000000-0000-0000-0000-000000000000",
        "name": "Пример_файла.txt",
        "extension": "txt",
        "size": 1,
        "url": "datamodel/00000000-0000-0000-0000-000000000000",
        "additional": {},
        "created": 0,
        "modified": 0,
        "md5": "D41D8CD98F00B204E9800998ECF8427E"
      }
    ],
    "modified": 1582966800,
    "name": "Договор",
    "path": "/docs/dogovor.docx",
    "author": "author1Id"
  },
  "additionalData": {},
  "version": 1
}

Получение примера объекта указанной сущности

Путь: HTTP GET /external/v1/help/entityType/:entityTypeId/example

GetOpenAPI

Генерирует описание внешнего API для указанной сущности (в формате OpenAPI v3.0.3)

Путь: HTTP GET /external/v1/help/entityType/:entityTypeId/openAPI

Работа с файлами (внешний интерфейс сервиса интеграций)

UploadFile

На входе POST-запрос с Content-Type: multipart/form-data и файлом в бинарном виде в поле file

На выходе ID загруженного файла

{
  "fileId": "1c689788-9617-4c93-bcee-6eae8909a0ba"
}

Загрузить файл в систему.

Путь: HTTP POST /external/v1/file/upload

Работа со справочниками (внешний интерфейс сервиса интеграций)

ListCatalogItems

На входе номер и размер страницы, и, опционально, фильтр по названию элемента

{
  "paging": {
    "page": 1,
    "count": 10
  },
  "titleLike": "%файл%"
}

На выходе искомый список элементов запрашиваемого справочника и их общее количество на всех страницах

{
  "items": [
    {
      "id": "2247fbe6-1f78-47d3-af28-e71f75535a84",
      "catalogId": "fbf859d2-30db-4789-9fdd-71add0832772",
      "code": "FileTags-3",
      "title": "Файл кода",
      "archived": false,
      "metadata": {},
      "created": 1642749153188,
      "modified": 1664290811956,
      "version": 10
    },
    {
      "id": "a4f1b0e5-0c47-4d82-bbd7-2c1f2164765a",
      "catalogId": "fbf859d2-30db-4789-9fdd-71add0832772",
      "code": "FileTags-5",
      "title": "Музыкальный файл",
      "archived": false,
      "metadata": {},
      "created": 1642749350176,
      "modified": 1642758418413,
      "version": 3
    },
    {
      "id": "6d2aa5c7-b0b8-455f-82c2-da90ff074a95",
      "catalogId": "fbf859d2-30db-4789-9fdd-71add0832772",
      "code": "FileTags-6",
      "title": "Видеофайл",
      "archived": false,
      "metadata": {},
      "created": 1642757894740,
      "modified": 1643197192686,
      "version": 2
    }
  ],
  "total": 3
}

Получение данных справочника в системе.

Путь: HTTP POST /external/v1/catalog/:catalogCode/listItems

Работа с объектами (внешний интерфейс сервиса интеграций)

CreateEntity (Integration)

На входе список создаваемых объектов

{
  "items": [
    {
      "id": "first",
      "data": {
        "number": 1,
        "file": [
          {
            "fileId": "dfca1cac-0df2-454a-b57a-4a2c360b09db"
          }
        ]
      }
    },
    {
      "id": "second",
      "data": {
        "number": 2,
        "file": [
          {
            "fileId": "724d8b05-6992-4d3c-ac0b-501ef02cb74e"
          }
        ]
      }
    }
  ]
}

На выходе данные по статусу создания каждого объекта и дополнительные данные о загрузке

{
  "items": [
    {
      "id": "first",
      "statusCode": 201,
      "payload": null
    },
    {
      "id": "second",
      "statusCode": 409,
      "payload": null
    }
  ]
}

Создание объектов в системе (импорт).

Для каждого объекта передается id и его атрибуты в виде произвольного json. Набор атрибутов должен соответствовать json-схеме сущности, которую можно получить с помощью вызова GetEntityTypeSchema

Путь: HTTP POST /external/v1/entity/:entityTypeId

UpdateEntity (Integration)

На входе список обновляемых объектов

{
  "items": [
    {
      "id": "first",
      "data": {
        "number": 101,
        "file": [
          {
            "fileId": "0cae7ea7-a6eb-4492-b72f-7a3d8187a17c"
          }
        ]
      }
    },
    {
      "id": "second",
      "data": {
        "number": 102,
        "file": [
          {
            "fileId": "22b9e63e-c0b6-43a6-9ce3-6540d5731c2b"
          }
        ]
      }
    }
  ]
}

На выходе данные по статусу обновления каждого объекта и дополнительные данные об обновлении

{
  "items": [
    {
      "id": "first",
      "statusCode": 200,
      "payload": null
    },
    {
      "id": "second",
      "statusCode": 404,
      "payload": {
        "message": "Processing error: ERROR: Entity object not found",
        "data": null
      }
    }
  ]
}

Обновление данных объектов в системе. Обновление данных происходит путем поиска подходящих объектов по переданному id. Переданные данные по объекту перезаписывают имеющиеся.

Для каждого объекта передается id и его атрибуты в виде произвольного json. Набор атрибутов должен соответствовать json-схеме сущности, которую можно получить с помощью вызова GetEntityTypeSchema

Путь: HTTP PUT /external/v1/entity/:entityTypeId

DeleteEntity (Integration)

На входе перечень ID удаляемых объектов

{
  "items": [
    {
      "id": "second"
    }
  ]
}

На выходе данные по статусу удаления каждого объекта и дополнительные данные об удалении

{
  "items": [
    {
      "id": "second",
      "statusCode": 200,
      "payload": null
    }
  ]
}

Удаление объектов в системе.

Путь: HTTP POST /external/v1/entity/:entityTypeId/deleteByIds

GetEntity (Integration)

На входе перечень ID объектов

{
  "items": [
    {
      "id": "first"
    }
  ]
}

На выходе данные по каждому запрошенному объекту

{
  "items": [
    {
      "id": "first", 
      "statusCode": 200,
      "payload": {
        "id": "first",
        "internalId": "21c30f14-6671-4c3d-b238-d7bb7f738ee5",
        "entityType": "document",
        "source": "IntegrationClient",
        "created": 1651821345542,
        "modified": 1651821345542,
        "data": {
          "number": 101,
          "file": [
            {
              "fileId": "0cae7ea7-a6eb-4492-b72f-7a3d8187a17c",
              "name": "Договор.pdf",
              "extension": "pdf",
              "size": 254873,
              "url": "datamodel/document/0cae7ea7-a6eb-4492-b72f-7a3d8187a17c",
              "additional": {},
              "created": 1651821345718,
              "modified": 1651821345718,
              "md5": "C4BA149A18155BF6E74AA55AA79776D6"
            }
          ]
        },
        "additionalData": {}, 
        "version": 2
      }
    }
  ]
}

Получение данных объектов.

Путь: HTTP POST /external/v1/entity/:entityTypeId/getByIds

UpdateEntityRelations (Integration)

На входе перечень связываемых отношениями объектов с указанием виртуальных полей отношений

{
  "items": [
    {
      "id": "firstArticle",
      "relations": {
        "fromBook": ["myFirstBook"],
        "authors": ["me"]
      }
    },
    {
      "id": "secondArticle",
      "relations": {
        "fromBook": ["mySecondBook"],
        "authors": ["me", "anotherGuy"]
      }
    }
  ]
}

На выходе статус сохранения каждого отношения

{
  "items": [
    {
      "id": "firstArticle",
      "relation": "fromBook",
      "relatedId": "myFirstBook",
      "error": null
    },
    {
      "id": "firstArticle",
      "relation": "authors",
      "relatedId": "me",
      "error": null
    },
    {
      "id": "secondArticle",
      "relation": "fromBook",
      "relatedId": "mySecondBook",
      "error": null
    },
    {
      "id": "secondArticle",
      "relation": "authors",
      "relatedId": "me",
      "error": null
    },
    {
      "id": "secondArticle",
      "relation": "authors",
      "relatedId": "anotherGuy",
      "error": null
    }
  ]
}

Обновление списка отношений для объектов сущности entityTypeId.
Команда полностью обновляет список отношений каждого из объектов сущности; таким образом, указанные в теле команды отношения будут созданы, а не указанные — удалены. Например: если у объекта first были ранее созданы отношения с объектами A и B по полю field, а при вызове команды в теле был указан элемент {"id": "first", "relations": {"field": ["A", "C"]}}, то отношение с объектом B удалится, а с объектом C — создастся.

Список доступных для обновления отношений для конкретной сущности можно узнать, получив OpenApi по этой сущности. В схеме формата тела данной команды будут указаны все поля, которые можно использовать текущему клиенту; а в описании конкретного поля будет указана сущность, с которой по этому полю устанавливается связь.
Если какие-то из указанных полей не будут переданы в теле команды, соответствующие отношения не будут обновлены.

Путь: HTTP POST /external/v1/entity/:entityTypeId/updateRelations

ListEntityMeta (Integration)

На входе данные для получения определенной страницы

{
  "paging": {
    "page": 2,
    "count": 10
  }
}

На выходе страница со списком объектов

{
  "items": [
    {
      "id": "first",
      "internalId": "21c30f14-6671-4c3d-b238-d7bb7f738ee5",
      "entityType": "document",
      "source": "IntegrationClient",
      "created": 1651821345542,
      "modified": 1651821345542,
      "version": 2
    }
  ],
  "total": 11
}

Получение метаданных объектов в системе: идентификаторов и прочих служебных аттрибутов.

Путь: HTTP POST /external/v1/entity/:entityTypeId/listMeta

Объекты документации внешнего интерфейса сервиса интеграций

AvailableEntityType

Описание доступной текущему клиенту сущности

Поле Тип Обязательное Описание
id string Да Код сущности
title string Да Название сущности
description string Да Описание сущности

EntityObject (Integration)

Данные объекта сущности

Поле Тип Обязательное Описание
id string Нет Идентификатор объекта, с которым он был загружен. Будет пустым, если объект создан внутри системы
internalId uuid Да Внутренний идентификатор объекта в формате UUID
entityType string Да Тип сущности объекта
source string Да Источник, откуда был получен объект (импорт, интерфейс, итп)
created timestamp Да Дата и время создания объекта в виде timestamp
modified timestamp Да Дата и время последнего изменения объекта в виде timestamp
data json object Да Исходные данные объекта. Могут быть изменены пользователем
additionalData json object Да Дополнительные данные по объекту, полученные системой из сервисов интеллектуализации
version integer Да Версия изменений

ListEntityMetaDTO (Integration)

Запрос списка метаданных объектов

Поле Тип Обязательное Описание
paging Paging Да Данные для получения определенной страницы

EntityMeta (Integration)

Метаданные объекта сущности

Поле Тип Обязательное Описание
id string Нет Идентификатор объекта, с которым он был загружен. Будет пустым, если объект создан внутри системы
internalId uuid Да Внутренний идентификатор объекта в формате UUID
entityType string Да Тип сущности объекта
source string Да Источник, откуда был получен объект (импорт, интерфейс, итп)
created timestamp Да Дата и время создания объекта в виде timestamp
modified timestamp Да Дата и время последнего изменения объекта в виде timestamp
version integer Да Версия изменений

FileUploadResult

Результат загрузки файла

Поле Тип Обязательное Описание
fileId string Да Идентификатор загруженного файла в формате UUID

ListCatalogItemsDTO

Запрос элементов справочника

Поле Тип Обязательное Описание
paging Paging Да Данные для получения определенной страницы
titleLike string Нет Поиск по названию элемента справочника. Если поле пустое, тогда возвращаются все элементы

CatalogItem

Данные элемента справочника

Поле Тип Обязательное Описание
id uuid Да Идентификатор элемента справочника в формате UUID
catalogId uuid Да Идентификатор справочника в формате UUID
code string Да Код элемента справочника
title string Да Название элемента справочника
archived boolean Да Признак архивности элемента
metadata json object Да Произвольные дополнительные данные в виде json-объекта
created timestamp Да Дата и время создания элемента в виде timestamp
modified timestamp Да Дата и время последнего изменения элемента в виде timestamp
version integer Да Версия изменений

ObjectCrudDTO

Список объектов для выполнения CRUD-операции с ними

Поле Тип Обязательное Описание
items List[ObjectCrudDTOItem] Да Список объектов для выполнения операции с ними

ObjectCrudDTOItem

Данные объекта для выполнения CRUD-команды с ним

Поле Тип Обязательное Описание
id string Да Идентификатор объекта в исходной системе
data json object Нет Опциональные данные объекта в произвольном json-формате ключ-значение. Актуально в командах Create и Update.

ObjectCrudResponse

Ответ на CRUD-операцию (команду) со списком объектов

Поле Тип Обязательное Описание
items List[ObjectCrudResponseItem] Да Список результатов выполнения команд над объектами

ObjectCrudResponseItem

Результат выполнения CRUD-команды над объектом

Поле Тип Обязательное Описание
id string Да Идентификатор объекта в исходной системе
statusCode integer Да Код результата операции с объектом в формате кода HTTP-ответа
payload json object Нет Данные ответа в произвольном json-формате

UpdateRelationsDTO

Запрос на обновление списка отношений объектов

Поле Тип Обязательное Описание
items List[UpdateRelationsDTOItem] Да Список объектов для выполнения операции с ними

UpdateRelationsDTOItem

Данные объектов для установления отношений между ними

Поле Тип Обязательное Описание
id string Да ID объекта, для которого обновляется список отношений
relations json object Да Объект, где ключ - это название поля отношения, а значение — ID объектов, которые должны быть связаны отношением с объектом id

UpdateRelationsResponse

Ответ на операцию (команду) обновления перечня отношений

Поле Тип Обязательное Описание
items List[UpdateRelationsResponseItem] Да Список результатов сохранения указанных отношений

UpdateRelationsResponseItem

Результат сохранения отношения между объектами

Поле Тип Обязательное Описание
id string Да ID объекта, для которого обновлялся список отношений
relatedId string Да ID объекта, связываемого отношением с объектом id
relation string Да Название поля, по которому устанавливается отношение
error string Нет Ошибка сохранения отношения, если сохранение прошло неуспешно; иначе null

Сервис интеграций

Сервис интеграций, он же сервис импорта, включает в себя внутренний и внешний API:

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

Локальный запуск сервиса интеграций

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Кроме того, конфигурация стенда должна подразумевать доступ к внешней части API (т.е. той части, путь которой начинается с /external) по HTTP, минуя apigateway.
Например, на сервере может быть настроено перенаправление с http://cursor-host.org/integration/api/external/path на /external/path.

Запуск из консоли с помощью SBT

INTEGRATION_DB_HOST=localhost INTEGRATION_DB_PORT=5432 INTEGRATION_DB_NAME=integration_db INTEGRATION_DB_USER=postgres INTEGRATION_DB_PASSWORD=12345 sbt boot/run

Список переменных окружения сервиса интеграций

Переменная Тип Обязательная Значение по умолчанию Описание
INTEGRATION_HTTP_HOST string нет "0.0.0.0" Хост для HttpListener.
INTEGRATION_HTTP_PORT int нет 8192 Порт для HttpListener.
INTEGRATION_KAFKA_SERVERS string нет "localhost:9092" Адрес Kafka.
INTEGRATION_KAFKA_TOPIC string нет "integration_commands" Название топика для команд.
INTEGRATION_KAFKA_CONSUMER_GROUP string нет "integration_consumer_group" Название consumer-группы для чтения команд.
INTEGRATION_KAFKA_COMMANDEVENT_TOPIC string нет "commandevents" Название топика для отправки сообщений со статусом команд.
INTEGRATION_KAFKA_PARTITIONS int нет 10 Количество партиций в топике команд.
INTEGRATION_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Минимальная задержка перед перезапуском.
INTEGRATION_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимально возможная задержка перед перезапуском.
INTEGRATION_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR float нет 0.2 Величина дополнительной случайной задержки: 0.0 - без случайно задержки, 1.0 - до 100% задержки.
INTEGRATION_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное количество перезапусков в заданный период времени.
INTEGRATION_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Период времени для ограничения перезапусков.
INTEGRATION_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
INTEGRATION_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
INTEGRATION_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
INTEGRATION_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к хранилищу сертификатов.
INTEGRATION_CONSUL_ADDR string нет "http://localhost:8500" Адрес Сonsul.
INTEGRATION_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
INTEGRATION_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
INTEGRATION_TRACE_DURATION bool нет false Признак необходимости трассировки выполнения команд.
INTEGRATION_DISCOVERABLE_ID string нет "another_integration_instance" Id сервиса в ServiceDiscovery.
INTEGRATION_DISCOVERABLE_NAME string нет "integration" Имя сервиса в ServiceDiscovery.
INTEGRATION_DISCOVERABLE_HOST string нет "localhost" Хост, публикуемый в ServiceDiscovery.
INTEGRATION_DISCOVERABLE_PORT int нет 8192 Порт, публикуемый в ServiceDiscovery.
INTEGRATION_DISCOVERABLE_LIVETIME duration string нет 2 minutes Период после отправки health check, в течение которого ServiceDiscovery считает сервис живым.
INTEGRATION_DISCOVERABLE_HEALTHPASS duration string нет 1 minute Периодичность отправки health check в ServiceDiscovery.
INTEGRATION_AKKA_HTTP_CLIENT_MAXCON int нет 512 Максимальное число одновременных исходящих HTTP-соединений.
INTEGRATION_AKKA_HTTP_CLIENT_MAXREQ int нет 1024 Максимальное число одновременных исходящих HTTP-запросов.
INTEGRATION_AKKA_HTTP_SERVER_MAXCON int нет 1024 Максимальное число одновременных входящих HTTP-соединений.
INTEGRATION_AKKA_HTTP_SERVER_REQUEST_TIMEOUT duration string нет 2 minutes Таймаут запросов к сервису по умолчанию.
INTEGRATION_AKKA_HTTP_SERVER_IDLE_TIMEOUT duration string нет 3 minutes Таймаут, по истечению которого бездействующее соединение закрывается.
INTEGRATION_INTERNALCMD_ALLOW bool нет true Можно ли сервису отправлять внутрисистемные команды.
INTEGRATION_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery.
INTEGRATION_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery.
INTEGRATION_DB_URL string да Адрес базы данных. Можно использовать вместо DB_HOST, DB_PORT и DB_NAME.
INTEGRATION_DB_HOST string да Хост сервера базы данных.
INTEGRATION_DB_PORT int да Порт сервера базы данных.
INTEGRATION_DB_NAME string да Название базы данных.
INTEGRATION_DB_USER string да Пользователь базы данных.
INTEGRATION_DB_PASSWORD string да Пароль для пользователя базы данных.
INTEGRATION_PROCESSING_MULTIPLE_COMMAND_TIMEOUT duration string нет 1 minute Таймаут батч-команд (команд над несколькими объектами).
INTEGRATION_PROCESSING_MAX_TOTAL_ENTITIES_IN_PROCESS int нет 1000 Максимальный размер очереди выполняемых единичных команд (среди всех клиентов).
INTEGRATION_PROCESSING_COMMAND_PROCESSING_PARALLELISM int нет 32 Максимальное число одновременно выполняемых команд (среди всех клиентов).
INTEGRATION_FS_URI string нет http://localhost:9000 Адрес для подключения к Minio.
INTEGRATION_FS_ACCESS_KEY_ID string нет "minioadmin" Ключ доступа к хранилищу файлов Minio (aka пользователь).
INTEGRATION_FS_SECRET_ACCESS_KEY string нет "minioadmin" Секретный код доступа к хранилищу файлов Minio (aka пароль).
INTEGRATION_FS_UPLOAD_PARALLELISM int нет 4 Максимально возможный параллелизм при загрузке файлов в хранилище.
INTEGRATION_FS_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
INTEGRATION_FS_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с маппингом учетных записей
INTEGRATION_FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
INTEGRATION_FS_CACHE_TTL duration string нет Время жизни клиента в кеше
INTEGRATION_FS_SIZE_LIMIT_KB int нет 102400 Максимальный размер загружаемого файла в килобайтах.
INTEGRATION_FS_BUCKETS_TEMP string нет temp Временный бакет, куда сохраняются файлы для дальнейшей отправки в составе полей объекта.
INTEGRATION_ENTITY_TYPES_REFRESH_RATE duration string нет 5 minutes Периодичность обновления перечня доступных типов данных из модели данных

Команды внутреннего интерфейса сервиса интеграций

CreateClient

На входе свойства регистрируемого клиента

{
  "id": "network-folder-papers",
  "title": "Сетевая папка - научные статьи",
  "allowFiles": true,
  "data": null
}

На выходе Boolean (признак успешности исполнения)

true

Регистрирует новый клиент.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
integration_CreateClient Kafka Topic "integration_commands"

ListClients

Входные данные отсутствуют

На выходе перечень зарегистрированных клиентов

[
  {
    "id": "network-folder-papers",
    "title": "Сетевая папка - научные статьи",
    "token": "mK8XoAb3GwICWZ4inj00Ax?lO_ZFRzshyTKQyH8j?COulcQFLnzcj6RczsSvBUYn",
    "allowFiles": true,
    "data": null,
    "blocked": false
  }
]

Возвращает полный перечень зарегистрированных клиентов.

Поддерживается только синхронный вызов.

Команда Путь
integration_ListClients HTTP POST /v1/client/list

UpdateClient

На входе ID обновляемого клиента и новые свойства

{
  "id": "network-folder-papers",
  "title": "Сетевая папка (научные статьи)",
  "allowFiles": true,
  "data": null,
  "blocked": false
}

На выходе Boolean (признак успешности исполнения)

true

Обновляет данные клиента.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
integration_UpdateClient Kafka Topic "integration_commands"

RefreshClientToken

На входе ID клиента, для которого требуется перегенерировать токен

"network-folder-papers"

На выходе Boolean (признак успешности исполнения)

true

Повторно генерирует токен клиента.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
integration_RefreshClientToken Kafka Topic "integration_commands"

AllowEntityType

На входе ID клиента и ID типа данных, которые требуется связать

{
  "clientId": "network-folder-papers",
  "entityTypeId": "paper"
}

На выходе Boolean (признак успешности исполнения)

true

Дает указанному клиенту право создавать, редактировать и удалять данные указанного типа.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
integration_AllowEntityType Kafka Topic "integration_commands"

DisallowEntityType

На входе ID клиента и ID типа данных, для которых требуется удалить связь

{
  "clientId": "network-folder-papers",
  "entityTypeId": "paper"
}

На выходе Boolean (признак успешности исполнения)

true

Запрещает указанному клиенту создавать, редактировать и удалять данные указанного типа.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
integration_DisallowEntityType Kafka Topic "integration_commands"

ListEntityTypes

Входные данные отсутствуют

На выходе список доступных типов данных

[
  {
    "id": "paper",
    "title": "Бумага",
    "description": ""
  },
  {
    "id": "document",
    "title": "Документ",
    "description": ""
  }
]

Возвращает полный перечень доступных типов данных.
Сервис запрашивает список типов данных из сервиса модели данных с определенной периодичностью, указанной в конфиге INTEGRATION_ENTITY_TYPES_REFRESH_RATE, поэтому при добавлении нового типа в сервис модели данных, в сервисе интеграций он может появиться не сразу. В случае необходимости, список доступных типов данных можно обновить принудительно при помощи соответствующей команды.

Поддерживается только синхронный вызов.

Команда Путь
integration_ListEntityTypes HTTP POST /v1/entityType/list

RefreshEntityTypes

Входные данные отсутствуют

На выходе Boolean (признак успешности исполнения)

true

Вызывает принудительное обновление списка доступных типов данных (обычно список обновляется по расписанию в указанные в INTEGRATION_ENTITY_TYPES_REFRESH_RATE промежутки времени).

Поддерживается асинхронный и синхронный вызов.

Команда Путь
integration_RefreshEntityTypes Kafka Topic "integration_commands"

ListEntityTypesForClient

На входе ID клиента

"MarkerExternalClient"

На выходе список доступных типов данных для указанного клиента

[
  {
    "id": "DocForOwTkexzNTZeyY995aWgmAg",
    "title": "Документ для проекта с ID 3b04e47b-1ccd-4d97-b263-df7969682602",
    "description": ""
  },
  {
    "id": "DocForv0xczPbGTPiWaP_U8P1uBg",
    "title": "Документ для проекта с ID bf4c5ccc-f6c6-4cf8-9668-ffd4f0fd6e06",
    "description": ""
  }
]

Возвращает перечень доступных для клиента типов данных.

Поддерживается только синхронный вызов.

Команда Путь
integration_ListEntityTypesForClient HTTP POST /v1/entityType/listForClient

Объекты внутреннего интерфейса сервиса интеграций

Client

Описание зарегистрированного клиента

Поле Тип Обязательное Описание
id string Да Код клиента
title string Да Наименование клиента
token string Да Токен доступа для внешнего апи
allowFiles boolean Да Разрешено ли клиенту загружать файлы
data json Нет Дополнительные данные в свободном формате
blocked boolean Да Признак полной блокировки клиента

CreateClientDTO

Поле Тип Обязательное Описание
id string Да Код клиента
title string Да Наименование клиента
allowFiles boolean Да Разрешено ли клиенту загружать файлы
data json Нет Дополнительные данные в свободном формате

UpdateClientDTO

Поле Тип Обязательное Описание
id string Да Код клиента
title string Да Наименование клиента
allowFiles boolean Да Разрешено ли клиенту загружать файлы
data json Нет Дополнительные данные в свободном формате
blocked boolean Да Признак блокировки клиента

EntityType (Integration)

Описание известного типа данных

Поле Тип Обязательное Описание
id string Да Код типа данных
title string Да Название типа данных
description string Да Описание типа данных

ClientToEntityTypeIds

Описание связи клиентов и типов данных для использования в командах

Поле Тип Обязательное Описание
clientId string Да Код клиента
entityTypeId string Да Код типа данных

Сервис клиента LAMP

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

Общее описание архитектуры сервиса клиента LAMP

Сервис позволяет общаться с LAMP через Verdi команду, ответы LAMP упаковываются в файлы, и в качестве результата выполнения команды создается ссылка на файл с ответом LAMP

Конфигурирование сервиса клиента LAMP

Требования к запуску сервиса клиента LAMP

Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm. Для корректной минимальной работы сервиса требуется обязательное подключение к Kafka, Consul, MinIO и Remote Lamp Client Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus и ApiGateway.

Список переменных окружения сервиса клиента LAMP

Переменная Тип Обязательная Значение по умолчанию Описание
CONSUMER_TOPIC string нет lampClient Название кафка-топика для запросов в LAMP
CONSUMER_GROUP string нет lampClient Имя группы-консьюмеров сервиса клиента LAMP
VERDI_CONSUL url string да http://localhost:8500 Адрес Consul
VERDI_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
VERDI_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
VERDI_KAFKA_ADDRESS string да localhost:9092 Адрес брокера Kafka.
VERDI_KAFKA_TOPIC string нет commandStatus Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
VERDI_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
VERDI_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
VERDI_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
VERDI_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к харнилищу сертификатов.
VERDI_HOST string да localhost Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
VERDI_TTL duration string нет 30 seconds Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
VERDI_HEALTH_CHECK duration string нет 10 seconds Периодичность отправки health check в ServiceDiscovery
VERDI_COMMAND_STORAGE_UPDATE_PERIOD duration string нет 1 minutes Время кэширования данных по командам из CommandDiscovery
VERDI_SERVICE_DISCOVERY_UPDATE_PERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
VERDI_ALLOW_INTERNAL_COMMANDS bool нет true Можно ли сервису отправлять внутрисистемные команды
VERDI_CONSUL_CONNECTION_MAX_RETRY int нет 5 Максимальное количество попыток подключений к Consul
VERDI_CONSUL_CONNECTION_RETRY_DELAY duration string нет 1 seconds Таймаут между неудачными попытками подключения к Consul
FS_URI url string да http://localhost:9002 Адрес S3 файлового хранилища minio
FS_ACCESS_KEY_ID string да admin Идентификатор доступа к minio
FS_SECRET_ACCESS_KEY string да admin Секретный ключ доступа к minio
FS_UPLOAD_PARALLELISM int нет 10 Параллелизм загрузки файлов в minio
FS_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
FS_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с маппингом учетных записей
FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
FS_CACHE_TTL duration string нет Время жизни клиента в кеше
LAMP_BUFFER_SIZE int нет 10 Буфер на отправку сообщений в клиент LAMP
LAMP_RECONNECT_SCHEDULE schedule string нет I(2 seconds) Стратегия переподключения клиента LAMP (формат см. lamp.transport.model.Schedule)
LAMP_HOST url string да lamp-dev.dev.embedika.ru Адрес клиента LAMP
LAMP_PORT int да 443 Порт клиента LAMP
LAMP_TLS bool да true Признак защищенного подключения к LAMP
LAMP_TLS_CERTIFICATE string нет "" Путь файла с сертификатом для подключения к LAMP
LAMP_TLS_PRIVATE_KEY string нет "" Путь файла с приватным ключем для подключения к LAMP
LAMP_TLS_ROOT_TRUSTED_CERTS string нет "" Путь файла с центром сертификации (Certification Authority, CA) для подключения к LAMP
LAMP_TIMEOUT duration string нет 1 minute Таймаут отправки сообщения и получения результатов через клиент LAMP
APP_RESULT_BUCKET string нет processing S3 bucket в который сохраняются ответы LAMP
APP_ROUTE_MAPPING string нет Plagiarism:plagiarism_route;Similarity:faiss_route Маппинг сервисных имен LAMP роутов с реальными LAMP роутами. Формат indexation1:route1;indexation2:route2. Список роутов см. LampRoute

Модели сервиса клиента LAMP

StoredFile

Описание файла в S3 хранилище

Название поля Тип Описание
id String Идентификатор файла
path java.nio.file.Path Путь по папкам до файла внутри бакета
bucket String Бакет для хранения файла (раздел внутри хранилища)

LampQuery

Описание запроса к LAMP с файлами

Название поля Тип Описание
data Either[String, StoredFile] Данные запроса - это либо ссылка на файл, либо строка
route String LAMP роут
parameters Option[JsonObject] Опциональные параметры для запроса

LampQueryJson

Описание запроса к LAMP с json

Название поля Тип Описание
data String Строковые данные запроса
route String LAMP роут
parameters Option[JsonObject] Опциональные параметры для запроса

Имена сервисных LAMP роутов

Доступные на данный момент роуты: Plagiarism, Similarity, Extend

Команды сервиса клиента LAMP

lampQuery-command

Запрос в LAMP для больших данных

На входе ссылка на файл с данными и роут

{
  "data": "temp/8df98571-bb81-4ca6-8fef-0776ea18da50",
  "route": "Plagiarism"
}

В результате ссылка на файл с ответом от LAMP

"processing/8df98571-bb81-4ca6-8fef-0776ea18da50"

Поддерживается асинхронный и синхронный вызов.

lampQueryJson-command

Запрос в LAMP

На входе строковые данные, роут и параметры запроса в Lamp

{
  "data":"nacl",
  "route":"Extend",
  "parameters": {
    "k_nearest": "100",
    "pos_accept": "noun,adj,verb"
  }
}

В результате json с ответом от Lamp

{"synonyms":[{"lemma":"толуол","pos":"NOUN","weight":0.6470648050308228},{"lemma":"mgcl","pos":"NOUN","weight":0.6426058411598206}]}

Поддерживается асинхронный и синхронный вызов.

Сервис разметчика

Сервис разметчика (Marker) - это система для подготовки обучающей выборки.
Marker позволяет пользователям размечать данные документов и проверять корректность разметки других пользователей, после чего результаты разметки могут использоваться для машинного обучения.

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

Конфигурирование сервиса разметчика

Требования к запуску сервиса разметчика

Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm.

Для корректной минимальной работы сервиса требуется обязательное подключение к PostgreSQL, Kafka, Consul. Для настройки подключения к ним нужно заполнить обязательные переменные окружения из раздела ниже.

Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus и ApiGateway. В этом случае нужно уделить внимание настройкам, связанным с ServiceDiscovery и CommandDiscovery.

Список переменных окружения сервиса разметчика

Все доступные переменные окружения для настройки сервиса разметчика.

Переменная Тип Обяза-тельная Значение по умолчанию Описание
MARKER_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
MARKER_HTTP_PORT int нет 8192 Порт, на котором слушает HTTP-сервер
MARKER_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
MARKER_KAFKA_TOPIC string нет "marker_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
MARKER_KAFKA_CONSUMER_GROUP string нет "marker_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
MARKER_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
MARKER_KAFKA_ENTITY_OBJECT_EVENT_TOPIC string нет "entityObjectEvent" Название кафка-топика, с событиями об объектах в модели данных
MARKER_KAFKA_PARTITIONS int да 10 Количество партиций в топике команд.
MARKER_ENTITY_OBJECT_EVENT_KAFKA_PARTITIONS int нет 10 Количество партиций в топике с событиями об объектах в модели данных
MARKER_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string да 1 second Минимальная задержка перед перезапуском.
MARKER_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string да 30 seconds Максимально возможная задержка перед перезапуском.
MARKER_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double да 0.2 Величина дополнительной случайной задержки: 0.0 - без случайно задержки, 1.0 - до 100% задрежки.
MARKER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int да 5 Максимальное количество перезапусков в заданный период времени.
MARKER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string да 5 minutes Период времени для ограничения перезапусков.
MARKER_KAFKA_AUTH_USER string да "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
MARKER_KAFKA_AUTH_PASSWORD string да "" Пароль учетной записи Kafka.
MARKER_KAFKA_AUTH_TRUSTSTORE_LOCATION string да "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
MARKER_KAFKA_AUTH_TRUSTSTORE_PASSWORD string да "" Пароль к харнилищу сертификатов.
MARKER_CONSUL_ADDR url string да "http://localhost:8500" Адрес Сonsul.
MARKER_CONSUL_AUTH_USER string да "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
MARKER_CONSUL_AUTH_PASSWORD string да "" Пароль учетной записи Сonsul.
MARKER_TRACE_DURATION boolean нет false Признак необходимости трассировки выполнения команд
MARKER_DISCOVERABLE_ID string нет "another_marker_instance" ID сервиса в ServiceDiscovery
MARKER_DISCOVERABLE_NAME string нет "marker" Имя сервиса в ServiceDiscovery
MARKER_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
MARKER_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
MARKER_DISCOVERABLE_LIVETIME duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
MARKER_DISCOVERABLE_HEALTHPASS string нет 1 minute Периодичность отправки health check в ServiceDiscovery
MARKER_AKKA_HTTP_CLIENT_MAXCON int нет 512 Максимальное число одновременных исходящих HTTP-соединений
MARKER_AKKA_HTTP_CLIENT_MAXREQ int нет 1024 Максимальное число одновременных исходящих HTTP-запросов
MARKER_AKKA_HTTP_SERVER_MAXCON int нет 1024 Максимальное число одновременных входящих HTTP-соединений
MARKER_INTERNALCMD_ALLOW bool нет true Можно ли сервису отправлять внутрисистемные команды
MARKER_HEALTH_TIMEOUT duration string нет 5 seconds Максимальное время ожидания ответа health check
MARKER_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
MARKER_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
MARKER_DB_HOST string да Хост БД
MARKER_DB_PORT int да Порт БД
MARKER_DB_NAME string да Имя базы в БД
MARKER_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
MARKER_DB_USER string да Пользователь БД
MARKER_DB_PASSWORD string да Пароль пользователя БД
MARKER_FS_URI url string нет http://localhost:9000 Адрес для подключения к Minio
MARKER_FS_ACCESS_KEY_ID string нет "minioadmin" Ключ доступа к хранилищу файлов Minio (aka пользователь)
MARKER_FS_SECRET_ACCESS_KEY string нет "minioadmin" Секретный код доступа к хранилищу файлов Minio (aka пароль)
MARKER_FS_UPLOAD_PARALLELISM int нет 4 Максимально возможный параллелизм при загрузке файлов в хранилище
MARKER_FS_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
MARKER_FS_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с маппингом учетных записей
MARKER_FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
MARKER_FS_CACHE_TTL duration string нет Время жизни клиента в кеше
MARKER_LABELING_BUCKET string нет "labeling" Название бакета в Minio, в котором сохраняются файлы экспорта разметки
MARKER_ENTITY_OBJECTS_BUCKET string нет "datamodel" Название бакета в Minio, в котором сохраняются файлы документов
MARKER_ADDITIONAL_FIELDS_PDF_VIEW string нет "pdfJson" Ключ, под которым сервис индексации сохраняет результаты извлечения json из pdf

Команды сервиса разметчика

CreateProject

На входе свойства и перечень настроек создаваемого проекта

{
  "title": "Проект Пандора",
  "startDate": 1648114231,
  "endDate": 1648114231,
  "instruction": "Берешь и размечаешь, чего думать-то",
  "instructionFile": [],
  "labelingType": "f8a90fc7-d2a9-4203-b723-5b1ba7d3e530",
  "nerSettings": [
    {
      "title": "Город",
      "selectionColor": "#783f13",
      "showInDocList": true,
      "nerHint": "размечай обдумывая",
      "minLabelingCount": 10,
      "attributes": [
        {
          "title": "Тип",
          "classificationAction": "52201975-3940-4754-9ae5-e6f8ab5c4fb4",
          "optionsList": ["райцентр", "поселок", "деревня"],
          "showInDocList": true
        }
      ],
      "subNers": [
        {
          "title": "Город",
          "selectionColor": "#783f13",
          "attributes": [
            {
              "title": "Тип",
              "classificationAction": "52201975-3940-4754-9ae5-e6f8ab5c4fb4",
              "optionsList": ["райцентр", "поселок", "деревня"],
              "showInDocList": true
            },
            {
              "title": "Описание города",
              "classificationAction": "dd50441d-a829-4648-be9c-afe5547a7da0",
              "maxLength": 250,
              "classificationHint": "описывайте тезисно, без фанатизма",
              "showInDocList": true
            }
          ]
        }
      ]
    },
    {
      "title": "Телефон",
      "selectionColor": "#8b10ad"
    }
  ],
  "classificationSettings": [
    {
      "title": "Город",
      "classificationAction": "52201975-3940-4754-9ae5-e6f8ab5c4fb4",
      "optionsList": [
        "Москва",
        "Казань",
        "Омск"
      ],
      "classificationHint": "Выбирайте правильно!",
      "minLabelingCount": 10,
      "showInDocList": true
    }
  ],
  "docsPerTask": 10,
  "markupSuggesters": ["41b3f3ad-cf79-4290-8caa-766a8c9c54c3", "4c5b18b7-5bd6-496c-b50d-51cd571bde8b"]
}

На выходе ID созданного проекта

"db77be48-6ffb-4d8f-983a-c20411043e10"

Создание нового проекта. Подсущности подсущностей не обрабатываются текущей реализацией сервиса.

Имя команды для вызова: marker_createProject. Поддерживается асинхронный и синхронный вызов.

GetProject

На входе ID проекта

"db77be48-6ffb-4d8f-983a-c20411043e10"

На выходе свойства и перечень настроек проекта

{
  "id": "0a25b8ad-0734-4b6b-a1b7-5005db0cb813",
  "title": "Проект Пандора",
  "created": 1653305248400,
  "startDate": 1648114231,
  "endDate": 1648114231,
  "instruction": "Берешь и размечаешь, чего думать-то",
  "labelingType": "f8a90fc7-d2a9-4203-b723-5b1ba7d3e530",
  "projectStatus": "1ae23fa9-d5d4-4dc7-bcd7-2e4f7761c79f",
  "documentEntityType": "DocForbWpsVi-iTNSTHn7ZRzJYlQ",
  "nerSettings": [
    {
      "field": "nerField1",
      "title": "Город",
      "selectionColor": "#783f13",
      "showInDocList": true,
      "nerHint": "размечай обдумывая",
      "minLabelingCount": 10,
      "attributes": [
        {
          "field": "nerField1_Attribute1",
          "title": "Тип",
          "classificationAction": "52201975-3940-4754-9ae5-e6f8ab5c4fb4",
          "optionsList": [
            "райцентр",
            "поселок",
            "деревня"
          ],
          "showInDocList": true
        }
      ],
      "subNers": [
        {
          "field": "nerField1SubNer3",
          "title": "Город",
          "selectionColor": "#783f13",
          "showInDocList": true,
          "nerHint": "размечай обдумывая",
          "minLabelingCount": 10,
          "attributes": [
            {
              "field": "nerField1SubNer3Attribute1",
              "title": "Тип",
              "classificationAction": "52201975-3940-4754-9ae5-e6f8ab5c4fb4",
              "optionsList": [
                "райцентр",
                "поселок",
                "деревня"
              ],
              "showInDocList": true
            },
            {
              "field": "nerField1SubNer3Attribute2",
              "title": "Описание города",
              "classificationAction": "dd50441d-a829-4648-be9c-afe5547a7da0",
              "maxLength": 250,
              "classificationHint": "описывайте тезисно, без фанатизма",
              "showInDocList": true
            }
          ],
          "subNers": []
        }
      ]
    },
    {
      "field": "nerField2",
      "title": "Телефон",
      "selectionColor": "#8b10ad",
      "attributes": []
    }
  ],
  "classificationSettings": [
    {
      "field": "classificationField1",
      "title": "Город",
      "classificationAction": "52201975-3940-4754-9ae5-e6f8ab5c4fb4",
      "optionsList": [
        "Москва",
        "Казань",
        "Омск"
      ],
      "classificationHint": "Выбирайте правильно!",
      "minLabelingCount": 10,
      "showInDocList": true
    }
  ],
  "version": 1,
  "docsPerTask": 10,
  "markupSuggesters": ["41b3f3ad-cf79-4290-8caa-766a8c9c54c3", "4c5b18b7-5bd6-496c-b50d-51cd571bde8b"]
}

Или ошибка, если проект отсутствует

{
    "businessError": null,
    "message": "ERROR: Object not found",
    "stackTrace": null,
    "data": null
}

Получение проекта по ID

Имя команды для вызова: marker_getProject. Поддерживается только синхронный вызов.

UpdateProject

На входе свойства обновляемого объекта, включая ID и версию

{
  "id": "662d697d-c037-474e-8f18-5736f992f7ff",
  "version": 2,
  "title": "Проект Пандора",
  "startDate": 1648114231,
  "endDate": 1648114231,
  "instruction": "Берешь и размечаешь, чего думать-то",
  "instructionFile": [],
  "labelingType": "f8a90fc7-d2a9-4203-b723-5b1ba7d3e530",
  "nerSettings": [
    {
      "title": "Город",
      "selectionColor": "#8b10ad",
      "showInDocList": true,
      "nerHint": "размечай обдумывая",
      "minLabelingCount": 10,
      "attributes": [
        {
          "title": "Тип",
          "classificationAction": "52201975-3940-4754-9ae5-e6f8ab5c4fb4",
          "optionsList": ["столица", "райцентр", "поселок", "деревня"],
          "showInDocList": true,
          "minLabelingCount": 10
        }
      ],
      "subNers": [
        {
          "title": "Город",
          "selectionColor": "#783f13",
          "showInDocList": true,
          "nerHint": "размечай обдумывая",
          "minLabelingCount": 10,
          "attributes": [
            {
              "title": "Тип",
              "classificationAction": "52201975-3940-4754-9ae5-e6f8ab5c4fb4",
              "optionsList": ["райцентр", "поселок", "деревня"],
              "showInDocList": true
            },
            {
              "title": "Описание города",
              "classificationAction": "dd50441d-a829-4648-be9c-afe5547a7da0",
              "maxLength": 250,
              "classificationHint": "описывайте тезисно, без фанатизма",
              "showInDocList": true
            }
          ]
        }
      ]
    }
  ],
  "docsPerTask": 10,
  "markupSuggesters": ["41b3f3ad-cf79-4290-8caa-766a8c9c54c3", "4c5b18b7-5bd6-496c-b50d-51cd571bde8b"]
}

На выходе признак успешности

true

Или ошибка, если проект отсутствует

{
    "businessError": null,
    "message": "ERROR: Object not found",
    "stackTrace": null,
    "data": null
}

Или ошибка, если проект был обновлен из другого места

{
    "businessError": null,
    "message": "ERROR: Object version is not actual (Optimistic Lock)",
    "stackTrace": null,
    "data": null
}

Обновление проекта. Подсущности подсущностей не обрабатываются текущей реализацией сервиса.

Имя команды для вызова: marker_updateProject. Поддерживается асинхронный и синхронный вызов.

UpdateProjectStatus

На входе новый статус проекта, а также его ID и версия

{
  "id": "db77be48-6ffb-4d8f-983a-c20411043e10",
  "projectStatus": "6fae306e-9120-4b84-a79e-530a0be5617c",
  "version": 2
}

На выходе признак успешности

true

Или ошибка, если проект отсутствует

{
    "businessError": null,
    "message": "ERROR: Object not found",
    "stackTrace": null,
    "data": null
}

Или ошибка, если проект был обновлен из другого места

{
    "businessError": null,
    "message": "ERROR: Object version is not actual (Optimistic Lock)",
    "stackTrace": null,
    "data": null
}

Обновление статуса проекта

Имя команды для вызова: marker_updateProjectStatus. Поддерживается асинхронный и синхронный вызов.

DeleteProject

На входе ID проекта

"db77be48-6ffb-4d8f-983a-c20411043e10"

На выходе результат удаления

true

Или ошибка, если проект отсутствует

{
    "businessError": null,
    "message": "ERROR: Object not found",
    "stackTrace": null,
    "data": null
}

Удаление проекта по ID

Имя команды для вызова: marker_deleteProject. Поддерживается асинхронный и синхронный вызов.

AddFilesToProject

На входе ID проекта и ID файлов

{
  "projectId": "db77be48-6ffb-4d8f-983a-c20411043e10",
  "fileIds": [
    "f11614f5-0c78-4408-84a9-a1e68aac6dca",
    "24aff3d7-200b-4b1b-b70e-8e9e19a519a0"
  ]
}

На выходе ссылки для скачивания добавленных файлов

[
  "temp/5192b9e8-8b67-4cba-b6b0-6317d4d5863c",
  "temp/1cf4fd4b-f33a-4c0f-be0e-5f9ea65bcbf9"
]

Или ошибка, если проекта с указанным ID нет

{
    "businessError": null,
    "message": "ERROR: Object not found",
    "stackTrace": null,
    "data": null
}

Добавление указанных файлов в проект

Имя команды для вызова: marker_addFilesToProject. Поддерживается асинхронный и синхронный вызов.

GetDocument

На входе ID проекта и документа этого проекта

{
  "projectId": "c187a081-87aa-4962-bcfb-3d02de66aee4",
  "documentId": "24330347-d7e6-4ad0-b153-a299e04612d2"
}

На выходе искомый документ

{
  "id": "24330347-d7e6-4ad0-b153-a299e04612d2",
  "projectId": "c187a081-87aa-4962-bcfb-3d02de66aee4",
  "title": "TestDoc.pdf",
  "created": 1649146493990,
  "entityType": "wYeggYeqSWK8-wAAPQLeZg",
  "data": {
    "file": [{
      "fileId": "545828dd-7b6a-40e3-b9b3-317eb52b4c71",
      "name": "TestDoc.pdf",
      "extension": "pdf",
      "size": 1025,
      "url": "datamodel/545828dd-7b6a-40e3-b9b3-317eb52b4c71",
      "additional": {},
      "created": 0,
      "modified": 0,
      "md5": "D41D8CD98F00B204E9800998ECF8427E"
    }],
    "name": "TestDoc.pdf",
    "path": "/docs/TestDoc.pdf",
    "created": 1649146493990,
    "modified": 1649146493990,
    "owner": "IvanovII"          
  }
}

Или ошибка, если проект отсутствует

{
    "businessError": null,
    "message": "ERROR: Object not found",
    "stackTrace": null,
    "data": null
}

Получение документа определенного проекта по их ID.

Имя команды для вызова: marker_getDocument. Поддерживается только синхронный вызов.

ListProjectDocuments

На входе ID проекта и параметры поиска

{
  "projectId": "c187a081-87aa-4962-bcfb-3d02de66aee4",
  "search": {
    "query": "",
    "context": {},
    "sorting": null,
    "paging": null
  }
}

На выходе перечень документов по страницам

{
  "items": [
    {
      "id": "24330347-d7e6-4ad0-b153-a299e04612d2",
      "projectId": "c187a081-87aa-4962-bcfb-3d02de66aee4",
      "title": "TestDoc.pdf",
      "created": 1649146493990,
      "data": {
        "file": [{
          "fileId": "545828dd-7b6a-40e3-b9b3-317eb52b4c71",
          "name": "TestDoc.pdf",
          "extension": "pdf",
          "size": 1025,
          "url": "datamodel/545828dd-7b6a-40e3-b9b3-317eb52b4c71",
          "additional": {},
          "created": 0,
          "modified": 0,
          "md5": "D41D8CD98F00B204E9800998ECF8427E"
        }],
        "name": "TestDoc.pdf",
        "path": "/docs/TestDoc.pdf",
        "created": 1649146493990,
        "modified": 1649146493990,
        "owner": "IvanovII",
        "entityType": "wYeggYeqSWK8-wAAPQLeZg"
      }
    }
  ],
  "total": 5
}

Получение документов проекта.

Имя команды для вызова: marker_listProjectDocuments. Поддерживается только синхронный вызов.

ListProjectTasks

На входе ID проекта и параметры поиска

{
  "projectId": "c187a081-87aa-4962-bcfb-3d02de66aee4",
  "batchTaskId": "c187a081-87aa-4962-bcfb-3d02de66aee4"
  "search": {
    "query": "",
    "context": {},
    "sorting": null,
    "paging": null
  }
}

На выходе перечень заданий по страницам

{
  "items": [
    {
      "id": "24330347-d7e6-4ad0-b153-a299e04612d2",
      "projectId": "c187a081-87aa-4962-bcfb-3d02de66aee4",
      "title": "TestDoc.pdf",
      "created": 1649146493990,
      "status": "cd17be48-6fdb-5d8f-183a-c20411043d20",
      "documentId": "24330347-d7e6-4ad0-b153-a299e04612d2",
      "skipReason": "Document not valid",
      "skipDate": 1649146493990,
      "ner": {
        "data": {
          "nerField1": [
            {
              "start": 54,
              "length": 10
            },
            {
              "start": 1976,
              "length": 10
            }
          ]
        },
        "version": 4
      }
    }
  ],
  "total": 5
}

Получение заданий проекта (для текущего пользователя).

Имя команды для вызова: marker_listProjectTasks. Поддерживается только синхронный вызов.

GetTaskPositionInProject

На входе ID проекта и задания и параметры поиска

{
  "projectId": "c187a081-87aa-4962-bcfb-3d02de66aee4",
  "taskId": "24330347-d7e6-4ad0-b153-a299e04612d2",
  "search": {
    "query": "",
    "context": {}
  }
}

На выходе позиция задания среди всех найденных (в соответствии с поисковым запросом)

{
  "position": 1,
  "total": 5
}

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

Имя команды для вызова: marker_getTaskPositionInProject. Поддерживается только синхронный вызов.

ListProjects

На входе параметры поиска и пагинации проектов (Search)

{
  "query": "",
  "context": {},
  "paging": {"page": 1, "count": 5}
}

На выходе свойства проектов

{
  "items": [
    {
      "id": "9bc7e8c6-f71c-4a53-abc6-222a8a431e84",
      "title": "Test Classification",
      "created": 1649847357350,
      "startDate": 1649146493990,
      "endDate": 1649146493990,
      "labelingType": "9d08b328-9882-4ea2-bbc9-c44d341e028c",
      "projectStatus": "6fae306e-9120-4b84-a79e-530a0be5617c",
      "version": 1,
      "documentsTotal": 5,
      "participantsTotal": 10
    }
  ],
  "total": 1
}

Получение списка проектов

Имя команды для вызова: marker_listProjects. Поддерживается только синхронный вызов.

AssignProjectToUser

На входе ID проекта

"1879aa41-10d9-4ae5-89a6-aeeff005b345"

На выходе количество новых назначенных заданий

42

Назначение всех документов проекта на текущего пользователя

Имя команды для вызова: marker_assignProjectToUser. Поддерживается асинхронный и синхронный вызов.

LabelDocument

На входе ID задания на разметку документа, версия разметки и новая разметка

{
  "projectId": "1879aa41-10d9-4ae5-89a6-aeeff005b345",
  "taskId": "3c6a450e-bbce-442c-905e-8108ed8c5a05",
  "ner": {
    "nerField1": [
      {
        "start": 150,
        "length": 34
      },
      {
        "start": 498,
        "length": 187
      }
    ]
  },
  "version": 5
}

На выходе новая версия разметки

6

Обновление разметки документа

Имя команды для вызова: marker_labelDocument. Поддерживается асинхронный и синхронный вызов.

CommitTask

На входе ID проекта и задания

{
  "projectId": "1879aa41-10d9-4ae5-89a6-aeeff005b345",
  "taskId": "3c6a450e-bbce-442c-905e-8108ed8c5a05"
}

На выходе результат

true

Сохранение окончательного варианта разметки (перевод в статус "Завершенный")

Имя команды для вызова: marker_commitTask. Поддерживается асинхронный и синхронный вызов.

SkipTask

На входе ID проекта, ID задания и причина пропуска

{
  "projectId": "1879aa41-10d9-4ae5-89a6-aeeff005b345",
  "taskId": "3c6a450e-bbce-442c-905e-8108ed8c5a05",
  "reason": "I'm too tired"
}

На выходе результат

true

Пропуск задания на разметку документа. Удаляет существующую разметку.

Имя команды для вызова: marker_skipTask. Поддерживается асинхронный и синхронный вызов.

ReturnTaskToWork

На входе ID проекта и задания

{
  "projectId": "1879aa41-10d9-4ae5-89a6-aeeff005b345",
  "taskId": "3c6a450e-bbce-442c-905e-8108ed8c5a05"
}

На выходе результат

true

Вернуть задание в работу.

Имя команды для вызова: marker_returnTaskToWork. Поддерживается асинхронный и синхронный вызов.

ReturnTaskToDraft

На входе ID проекта и задания

{
  "projectId": "1879aa41-10d9-4ae5-89a6-aeeff005b345",
  "taskId": "3c6a450e-bbce-442c-905e-8108ed8c5a05"
}

На выходе результат

true

Вернуть задание в необработанные.

Имя команды для вызова: marker_returnTaskToDraft. Поддерживается асинхронный и синхронный вызов.

ListDocumentAssessors

На входе ID проекта и его документов

{
  "projectId": "1879aa41-10d9-4ae5-89a6-aeeff005b345",
  "documents": [
    "3c6a450e-bbce-442c-905e-8108ed8c5a05",
    "294146d9-ed05-4251-b34f-2192d4e83f05"
  ]
}

На выходе результат

{
  "documentUsers": [
    {
      "documentId": "3c6a450e-bbce-442c-905e-8108ed8c5a05",
      "assessors": [
        {
          "status": "9cc444a8-f6c9-4c5f-b6b6-13a27d958209",
          "users": [
            {
              "id": "4324bf49-e556-4058-ba5a-ccdc02199f79",
              "modified": 1651234477
            },{
              "id": "17f41b3b-100b-492e-a17d-4c6ea60d21ed",
              "modified": 1651234477
            }
          ]
        },{
          "status": "9cc444a8-f6c9-4c5f-b6b6-13a27d958209",
          "users":[
            {
              "id": "9e89421b-bfb6-40f8-bcc6-833aeb2bd676",
              "modified": 1651234477
            }
          ]
        },{
          "status": "9cc444a8-f6c9-4c5f-b6b6-13a27d958209",
          "users": [
            {
              "id": "c6d98e14-b2ef-4fbe-9bf1-6170cc8785f1",
              "modified": 1651234477
            }, {
              "id": "6d3d80b1-332f-41f2-837b-cccd5bc0b74c",
              "modified": 1651234477
            }
          ]
        },{
          "status": "9cc444a8-f6c9-4c5f-b6b6-13a27d958209",
          "users": [
            {
              "id": "4fcd63d6-db92-4d5b-93c6-bb78e4a59656",
              "modified": 1651234477
            }
          ]
        }
      ]
    },
    {
      "documentId": "294146d9-ed05-4251-b34f-2192d4e83f05",
      "assessors": [
        {
          "status": "9cc444a8-f6c9-4c5f-b6b6-13a27d958209",
          "users": [
          ]
        },{
          "status": "9cc444a8-f6c9-4c5f-b6b6-13a27d958209",
          "users":[
            {
              "id": "4fcd63d6-db92-4d5b-93c6-bb78e4a59656",
              "modified": 1651234477
            }, {
              "id": "9e89421b-bfb6-40f8-bcc6-833aeb2bd676",
              "modified": 1651234477
            }
          ]
        },{
          "status": "9cc444a8-f6c9-4c5f-b6b6-13a27d958209",
          "users": [
            {
              "id": "c6d98e14-b2ef-4fbe-9bf1-6170cc8785f1",
              "modified": 1651234477
            }, {
              "id": "6d3d80b1-332f-41f2-837b-cccd5bc0b74c",
              "modified": 1651234477
            }, {
              "id": "4324bf49-e556-4058-ba5a-ccdc02199f79",
              "modified": 1651234477
            }
          ]
        },{
          "status": "9cc444a8-f6c9-4c5f-b6b6-13a27d958209",
          "users": [
            {
              "id": "17f41b3b-100b-492e-a17d-4c6ea60d21ed",
              "modified": 1651234477
            }
          ]
        }
      ]
    }
  ]
}

Получить список пользователей, назначенных на разметку документов.

Имя команды для вызова: marker_listDocumentAssessors. Поддерживается асинхронный и синхронный вызов.

AddUsersToProject

На входе Id проекта, роли и пользователей

{
  "projectId": "b2993663-8dd4-435d-b14d-a1cf18a4ddae",
  "roleId": "2620a83a-361d-4b27-b37e-828c2e9e1941",
  "userIds": ["4eb15e5a-f388-4e85-9b35-cc025e784249"]
}

На выходе признак успешного выполнения команды

true

Добавляет пользователeй в проект, устанавливая им роль.

Имя команды для вызова: marker_addUsersToProject. Поддерживается асинхронный и синхронный вызов.

DeleteUsersFromProject

На входе Id проекта, пользователя

{
  "projectId": "b2993663-8dd4-435d-b14d-a1cf18a4ddae",
  "userIds": ["4eb15e5a-f388-4e85-9b35-cc025e784249"]
}

На выходе признак успешного выполнения команды

true

Удаляет пользователя из проекта.

Имя команды для вызова: marker_deleteUsersFromProject. Поддерживается асинхронный и синхронный вызов.

ListProjectsForUsers

На входе список Id пользователей, для которых нужна информация

[
  "022b1185-c0cd-4c7b-87b5-0dc35c430a76",
  "b42d0857-1128-44af-b876-bec33f028326",
  "a62cc9e4-2ca1-40f4-98e9-d0c189b9c731",
  "f57143ef-c129-4500-8e2e-97db93bd0c1b"
]

На выходе информация о проектах пользователей

[
  {
    "userId": "022b1185-c0cd-4c7b-87b5-0dc35c430a76",
    "projects": [
      {
        "projectId": "8af0fcbe-4b95-4b06-afb3-b77b4a3e1200",
        "roleId": "2620a83a-361d-4b27-b37e-828c2e9e1941",
        "addedToProject": 1651234477
      }
    ]
  }
]

Для заданного списка пользователей возвращает информацию о проектах.

Имя команды для вызова: marker_listProjectsForUsers. Поддерживается только синхронный вызов.

ExportLabeling

На входе объект с Id проекта

{
  "projectId": "9bc7e8c6-f71c-4a53-abc6-222a8a431e84"
}

На выходе url файла с результатом экспорта

"temp/8755c6dd-4655-45cc-a472-c65235542cf8"

Пример элемента выходного файла (здесь приведен с форматированием для читаемости; в файле представлен в одну строку) json { "nerField1": [ { "type": "nerField1", "start": 1602, "length": 9, "fragment": "Заказчику" } ], "nerField2": [ { "type": "nerField2", "start": 3578, "length": 25, "fragment": "Если иное не предсмотрено" } ], "documentId": "5d8ad20e-59c8-45a6-bdb7-14a9fee3c43f", "documentUrl": "datamodel/Document/988bea95-a646-4f49-883e-bbbf1f3523ac", "pdfJsonUrl": "datamodel/Document/46c2f52b-a831-4531-bedb-b0fcf8d7e94e" }

Генерирует выгрузку разметки по проекту.
На выходе выдает файл в формате JSON Lines, где каждая строка имеет формат ExportLabelingItem

Имя команды для вызова: marker_exportLabeling. Поддерживается асинхронный и синхронный вызов.

ListBatchTaskDocuments

На входе ID задания и Search объект

{
  "id": "728e3d69-374a-40ac-8e18-725ff9950c12",
  "projectId": "8af0fcbe-4b95-4b06-afb3-b77b4a3e1200",
  "status": "aaf0fcbe-4b95-4b06-afb3-b77b4a3e1200",
  "search": {
    "query": "",
    "context": {},
    "sorting": null,
    "paging": {
      "page": 1,
      "count": 1
    }
  }
}

На выходе страница с документами

{
  "total": 300,
  "items": [
    {
      "id": "b8031f65-6995-469c-b0e5-03653ae792f5",
      "title": "Document",
      "created": 1667207480,
      "markerTaskStatus": "ad74bcdb-02a5-4750-9a28-aba5ef1bdad1",
      "expertTaskStatus": "395c8c75-2e5a-406c-8d10-e9d0511a48e2"
    }
  ]
}

Возвращает документы соответствующие заданию.

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
id InSetQuery
title InSetQuery, LikeQuery
created InSetQuery, RangeQuery

Доступные поля для сортировки

Поле
created
title

ListTaskWithFragment

На входе Id проекта, название поля, Search объект (поддерживается только пагинация)

{
  "projectId": "f41d1d65-6530-40b8-b601-43be45d3f195",
  "field": "nerField1",
  "search": {
    "query": "",
    "context": {},
    "sorting": null,
    "paging": {
      "page": 1,
      "count": 1
    }
  }
}

На выходе данные по соответствующим заданиям

{
  "total": 300,
  "items": [
    {
      "id": "6a0559e5-0ce6-4a7a-8046-732e3cb010d7",
      "projectId": "4486145d-e3d6-4d9a-9e7d-c27f54c2cf17",
      "taskId": "1cb3e56e-580a-4651-927b-e33068060c6f",
      "status": "8a7dabaa-da2c-4b8a-85ff-b7a70e0c71ab",
      "fragments": [
        {
          "created": 1668083991767,
          "fragment": "Политика определяет основные подходы к организации страхования рисков\r\nОАО «Газпром нефть» и ее ДЗО (далее - группы компаний ГПН)",
          "attributes": [
            {
              "key": "Ненужный атрибут для тестов",
              "value": "ппшашнломащ78"
            }
          ],
          "subNer": [
            {
              "title": "Месяц",
              "fragments": [
                {
                  "created": 1668083991767,
                  "fragment": "ром нефть» и ее ДЗО",
                  "attributes": [],
                  "subNer": []
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

Возвращает разметку документов из указанного проекта, содержащие указанную сущность.

DistributeBatchTasks

На входе Id проекта и параметры распределения

{
  "projectId": "f41d1d65-6530-40b8-b601-43be45d3f195",
  "docsPerTask": 10
}

На выходе количество созданных BatchTask

5

Создает задания и распределяет их по разметчикам и экспертам. Имя команды для вызова: marker_distributeBatchTasks

DeleteBatchTask

На входе Id задания

{
  "projectId": "f41d1d65-6530-40b8-b601-43be45d3f195",
  "batchTaskId": "6780dcac-63a0-4f2d-9b9f-e6fc8d671b23"
}

На выходе ничего

{}

Удаляет задание. Имя команды для вызова: marker_deleteBatchTask

ListSettingsByField

На входе поле настроек

"nerField1"

На выходе настройки с данным полем

[
  {
    "id": "b0d79c75-82be-4b4d-893e-55f995455e3e",
    "field": "nerField1",
    "title": "Животное",
    "projectId": "b0d79c75-82be-4b4d-893e-55f995455e3e"
  },
  {
    "id": "bc31b57c-cf33-44b4-8eb2-f34011178019",
    "field": "nerField1",
    "title": "Тех. задание",
    "projectId": "b0d79c75-82be-4b4d-893e-55f995455e3e"
  }
]

Возвращает список настроек (NerSetting и ClassificationSetting) в обобщенном виде с запрошенным полем (кодом).

Имя команды для вызова: marker_listSettingsByField. Поддерживается только синхронный вызов.

ListCompletedLabelings

На входе пагинация

{
  "page": 1,
  "count": 10
}

На выходе список разметок

{
  "items": [
    {
      "id": "f41d1d65-6530-40b8-b601-43be45d3f195",
      "projectId": "f41d1d65-6530-40b8-b601-43be45d3f195",
      "userId": "f41d1d65-6530-40b8-b601-43be45d3f195",
      "created": 1668083991767,
      "modified": 1668083991767,
      "data": {
        "nerField1": []
      },
      "version": 1
    }
  ],
  "total": 10
}

Возвращает список разметок в статусе 'Завершено'. Имя команды для вызова: marker_listCompletedLabelings

Объекты сервиса разметчика

CreateProjectReq

Поле Тип Обязательное Описание
title string да Наименование проекта
startDate timestamp нет Дата и время начала проекта
endDate timestamp нет Дата и время окончания проекта
instruction string нет Инструкция
instructionFile object нет Файл инструкции, формат аналогичен формату файла в data-model
labelingType uuid string да ID вида разметки (из справочника)
nerSettings object[] нет Настройки выделения сущностей
classificationSettings object[] нет Настройки классификации
docsPerTask number нет Количество документов в одной задаче (исключает параметр ниже)
tasksPerParticipant number нет Количество задач на участника (исключает параметр выше)
markupSuggesters uuid string[] да Список Id ролей, которые могу предлагать разметку

UpdateProjectReq

Поле Тип Обязательное Описание
id uuid string да ID обновляемого проекта
version number да Версия обновляемого проекта для оптимистичных блокировок
title string да Наименование проекта
startDate timestamp нет Дата и время начала проекта
endDate timestamp нет Дата и время окончания проекта
instruction string нет Инструкция
instructionFile object нет Файл инструкции, формат аналогичен формату файла в data-model
labelingType uuid string да ID вида разметки (из справочника)
nerSettings object[] нет Настройки выделения сущностей
classificationSettings object[] нет Настройки классификации
docsPerTask number нет Количество документов в одной задаче (исключает параметр ниже)
tasksPerParticipant number нет Количество задач на участника (исключает параметр выше)
markupSuggesters uuid string[] да Список Id ролей, которые могу предлагать разметку

UpdateProjectStatusReq

Поле Тип Обязательное Описание
id uuid string да ID обновляемого проекта
version number да Версия обновляемого проекта для оптимистичных блокировок
projectStatus uuid string да ID статуса проекта (из справочника)

AddFilesToProject (dto)

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
fileIds uuid string[] да Список ID файлов

UpsertNerSetting

Поле Тип Обязательное Описание
title string да Наименование настройки
selectionColor string да Цвет выделения
attributes object[] нет Атрибуты сущности
subNers object[] нет Подсущности
showInDocList boolean да Показывать в списке документов
nerHint string нет Подсказка
minLabelingCount string нет Минимальное количество разметки для обучения

UpsertClassificationSetting

Поле Тип Обязательное Описание
title string да Наименование настройки
classificationAction uuid string да ID действия при классификации
optionsList string[] нет Перечень вариантов
maxLength number нет Ограничение длины
classificationHint string нет Подсказка для настройки
showInDocList boolean да Показывать в списке документов
minLabelingCount string нет Минимальное количество разметки для обучения

Project

Поле Тип Обязательное Описание
id uuid string да ID проекта
created timestamp да Дата создания проекта
title string да Наименование проекта
startDate timestamp нет Дата и время начала проекта
endDate timestamp нет Дата и время окончания проекта
instruction string нет Инструкция
instructionFile object нет Файл инструкции
labelingType uuid string да ID вида разметки (из справочника)
projectStatus uuid string да ID статуса проекта (из справочника)
documentEntityType string да Тип сущности в модели данных, с которым сохраняются документы для этого проекта
nerSettings object[] нет Настройки выделения сущностей
classificationSettings object[] нет Настройки классификации
version number да Версия проекта для оптимистичных блокировок
docsPerTask number нет Количество документов в одной задаче (исключает параметр ниже)
tasksPerParticipant number нет Количество задач на участника (исключает параметр выше)
markupSuggesters uuid string[] да Список Id ролей, которые могу предлагать разметку

NerSetting

Поле Тип Обязательное Описание
field string да Код поля настройки
title string да Наименование настройки
selectionColor string да Цвет выделения
attributes object[] нет Атрибуты сущности
subNers object[] нет Подсущности
showInDocList boolean да Показывать в списке документов
nerHint string нет Подсказка
minLabelingCount string нет Минимальное количество разметки для обучения

ClassificationSetting

Поле Тип Обязательное Описание
field string да Код поля настройки
title string да Наименование настройки
classificationAction uuid string да ID действия при классификации
optionsList string[] нет Перечень вариантов
maxLength number нет Ограничение длины
classificationHint string нет Подсказка для настройки
showInDocList boolean да Показывать в списке документов
minLabelingCount string нет Минимальное количество разметки для обучения

ListProjectDocumentsReq

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
search Search да Фильтры, сортировка, пагинация

GetDocumentReq

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
documentId uuid string да ID документа в проекте

Document

Поле Тип Обязательное Описание
id uuid string да ID документа
projectId uuid string да ID проекта
title string да Наименование документа
created timestamp да Дата и время создания объекта документа (не путать с датой создания файла)
entityType string да Тип сущности соответствующей этому документу в модели данных
data object да Метаданные документа. В этом поле будут возвращены все поля документа, хранящиеся в модели данных. По умолчанию как пример всем документам разметчика создается модель DocumentData.

DocumentData

Поле Тип Обязательное Описание
file file object да Файл документа
name string да Наименование документа
path string нет Путь до файла в источнике
created timestamp да Дата и время создания файла (в источнике)
modified timestamp нет Дата и время изменения файла (в источнике)
owner object нет Владелец документа (в источнике файла)

ListProjectTasksReq

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
batchTaskId uuid string нет ID batchTask
search Search да Фильтры, сортировка, пагинация

GetTaskPositionInProjectReq

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
taskId uuid string да ID задания в проекте
search Search да Фильтры, сортировка, пагинация

Task

Поле Тип Обязательное Описание
id uuid string да ID задания
projectId uuid string да ID проекта
documentId uuid string да ID документа задания
title string да Наименование задания
created timestamp да Дата и время создания задания
status uuid string да ID Статус задания (из справочника)
skipReason string нет Причина пропуска задания
skipDate timestamp нет Дата и время пропуска
ner object нет Выделенные сущности
classification object нет Классификация

TaskLabeling

Поле Тип Обязательное Описание
version number да Версия разметки
data object да Данные (в зависимости от вида разметки, см. примеры в Confluence)

ProjectListItem

Поле Тип Обязательное Описание
id uuid string да ID проекта
created timestamp да Дата создания проекта
title string да Наименование проекта
startDate timestamp нет Дата и время начала проекта
endDate timestamp нет Дата и время окончания проекта
instruction string нет Инструкция
instructionFile object нет Файл инструкции
labelingType uuid string да ID вида разметки (из справочника)
projectStatus uuid string да ID статуса проекта (из справочника)
version number да Версия проекта для оптимистичных блокировок
documentsTotal number да Число документов в проекте

ProjectStatistics

Поле Тип Обязательное Описание
id uuid string да ID проекта
created timestamp да Дата создания проекта
title string да Наименование проекта
startDate timestamp нет Дата и время начала проекта
endDate timestamp нет Дата и время окончания проекта
instruction string нет Инструкция
instructionFile object нет Файл инструкции
labelingType uuid string да ID вида разметки (из справочника)
projectStatus uuid string да ID статуса проекта (из справочника)
version number да Версия проекта для оптимистичных блокировок
statistics object да Статистика проекта

ProjectStatisticsData

Поле Тип Обязательное Описание
taskStatuses object да Статистика статусов заданий запросившего статистику пользователя

ProjectTaskStatusStatItem

Поле Тип Обязательное Описание
status uuid string да ID Статус задания (из справочника)
count number да Количество заданий в данном статусе

LabelDocumentReq

Поле Тип Обязательное Описание
projectId uuid string да ID проекта задания
taskId uuid string да ID задания на разметку
ner object нет Новое выделение сущностей
classification object нет Новая классификация
version number да Версия разметки

ProjectTaskIdentity

Поле Тип Обязательное Описание
projectId uuid string да ID проекта, к которому относится задание
taskId uuid string да ID задания на разметку
reason string да Причина пропуска

SkipTaskReq

Поле Тип Обязательное Описание
projectId uuid string да ID проекта, к которому относится задание
taskId uuid string да ID задания на разметку

ListDocumentAssessorsReq

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
documents uuid string[] да ID документов проекта

ListDocumentAssessorsResult

Поле Тип Обязательное Описание
documentUsers object[] да Разметчики документов

SingleDocumentAssessors

Поле Тип Обязательное Описание
documentId uuid string да ID документа
assessors object[] да Разметчики документа, разбитые по статусу разметки

TaskStatusAssessors

Поле Тип Обязательное Описание
status uuid string да ID статуса из справочника
assessors object[] да Данные пользователей-разметчиков

TaskAssessor

Поле Тип Обязательное Описание
id uuid string да ID пользователя
modified timestamp да Последнее время изменения статуса задания на разметку
skipReason string нет Причина пропуска задания
skipDate timestamp нет Дата и время пропуска задания

ListProjectUsers (dto)

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
roleId uuid string нет ID роли, пользователей с которой нужно вернуть. Если не указан, вернет всех пользователей
search Search Да Объект поиска аналогичный другим сервисам

ProjectUser

Поле Тип Обязательное Описание
userId uuid string да ID пользователя
roleId uuid string да ID роли в справочнике
taskStatuses object[] да Статистика статусов заданий запросившего статистику пользователя

AddUsersToProject (dto)

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
userIds uuid string[] да ID пользователей
roleId uuid string нет ID роли в справочнике

DeleteUsersFromProject (dto)

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
userId uuid string[] да ID пользователей

UserWithProjects

Поле Тип Обязательное Описание
userId uuid string да ID пользователя
projects UserProjectInfo[] да Список с ифнформациями о проектах пользователя

UserProjectInfo

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
roleId uuid string да ID роли в справочнике
addedToProject timestamp Да Дата, когда пользователя добавили в проект

ExportLabelingItem

Поле Тип Обязательное Описание
documentId uuid string да ID документа
documentUrl url string нет Ссылка на файл документа
pdfJsonUrl url string нет Ссылка на pdfJson-представления документа
classificationFieldN (где N - номер поля) object для проектов типа Classification Поля со значениями проставленных классов
nerFieldN (где N - номер поля) object для проектов типа Ner (выделение сущностей) Поля с выделенными сущностями

ListBatchTaskDocuments (dto)

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
id uuid string да ID задания
status uuid string нет Статус задания
search Search да Search объект

BatchTaskDocument

Поле Тип Обязательное Описание
id uuid string да ID документа
title string да Название документа
created TimeStamp да Дата загрузки документа
markerTaskStatus uuid string да Статус документа у разметчика
expertTaskStatus uuid string да Статус документа у эксперта

ListTaskWithFragment (dto)

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
field string да Поле, документы с которым нужно получить
search Search да Search объект

TaskWithFragment

Поле Тип Обязательное Описание
id uuid string да ID документа
projectId uuid string да ID проекта
taskId uuid string да ID задания (Task, не BatchTask)
status LabelingStatus string да Статус разметки
title string Да Название документа
fragments Fragment[] Да Фрагменты

Fragment

Поле Тип Обязательное Описание
created TimeStamp да Дата создания разметки
fragment string да Фрагмент
attributes Atribute[] да Аттрибуты
subNer SubNer[] да Дочерние разметки

Attribute

Поле Тип Обязательное Описание
key string да Ключ аттрибута
value string нет Значение аттрибута

SubNer

Поле Тип Обязательное Описание
title string да Название разметки
fragments Fragment[] Да Фрагменты

DistributeBatchTasksDto

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
docsPerTask number нет Количество документов в BatchTask
tasksPerParticipant number нет Количество заданий на одном разметчике

Labeling

Поле Тип Обязательное Описание
id uuid string да ID разметки
projectId uuid string да ID проекта
userId uuid string да ID пользователя
created TimeStamp да Дата создания разметки
modified TimeStamp да Дата изменения разметки
data object да Данные разметки
version number да Версия разметки

DeleteBatchTask (Dto)

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
batchTaskId uuid string да ID задания

Setting

Настройка (nerSetting или classificationSetting) в обобщенном виде

Поле Тип Обязательное Описание
id uuid string да ID настройки
field string да поле
title string да название
projectId uuid string да ID проекта

Сервис статистики разметки

Сервис обрабатывает часть команд самого разметчика, и хранит промежуточные read представления для более удобного вывода информации. Сервис может принимать обрабатывать события, сохранять результат обработки в PostgresSQL и возвращать информацию из PostgresSQL. Команды на чтение приходят по HTTP, сервисные команды приходят через Kafka. Также поддерживается синхронизация с МД. Для этого через команду МД listObjects постранично выгружаются объекты, после чего, для каждого из объектов вызывается обработчик добавления объекта.

Сервис разбит на несколько модулей, в виде sbt проектов: - domain, в котором содержатся все доменные модели и их различные представления. - commands, в котором содержатся все команды, их описание и обработчики: http-routes. - store, содержит сервисы для сохранения и чтения из разных хранилищ доменных моделей. - service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой. - boot, содержит зависимости и описание для сборки и запуска сервиса.

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура: - PostgreSQL база по адресу localhost:5432/markerstats_db - Kafka по адресу localhost:9092 - Consul по адресу localhost:8500 - Адрес Kafka будет указан в application.conf - Добавлены необходимые переменные окружения: - MARKER_STATS_DB_HOST - MARKER_STATS_DB_PORT - MARKER_STATS_DB_NAME - MARKER_STATS_DB_USER - MARKER_STATS_DB_PASSWORD

Запуск из консоли с помощью SBT

MARKER_STATS_DB_HOST=localhost MARKER_STATS_DB_PORT=5432 MARKER_STATS_DB_NAME=markerstats_db MARKER_STATS_DB_USER=postgres MARKER_STATS_DB_PASSWORD=12345 sbt boot/run

Список переменных окружения сервиса marker-stats

Все доступные переменные окружения для настройки сервиса.

Переменная Тип Обязательная Значение по умолчанию Описание
MARKER_STATS_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
MARKER_STATS_HTTP_PORT int нет 8192 Порт, на котором слушает HTTP-сервер
MARKER_STATS_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
MARKER_STATS_KAFKA_TOPIC string нет "marker_stats_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
MARKER_STATS_KAFKA_ENTITY_OBJECT_EVENT_TOPIC string нет "entityObjectEvent" Название кафка-топика, с событиями об объектах в модели данных
MARKER_STATS_KAFKA_CATALOG_EVENTS_TOPIC string нет "catalogEvents" Название кафка-топика, с событиями о каталогах
MARKER_STATS_KAFKA_USER_EVENTS_TOPIC string нет "userEvents" Название кафка-топика, с событиями о пользователях
MARKER_STATS_KAFKA_CONSUMER_GROUP string нет "marker_stats_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
MARKER_STATS_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
MARKER_STATS_EVENT_KAFKA_PARTITIONS int нет 10 Количество партиций в топике с событиями об объектах в модели данных
MARKER_STATS_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
MARKER_STATS_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
MARKER_STATS_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
MARKER_STATS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах MARKER_STATS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
MARKER_STATS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который MARKER_STATS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
MARKER_STATS_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
MARKER_STATS_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
MARKER_STATS_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
MARKER_STATS_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
MARKER_STATS_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к харнилищу сертификатов.
MARKER_STATS_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
MARKER_STATS_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
MARKER_STATS_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
MARKER_STATS_TRACE_DURATION boolean нет false Признак необходимости трассировки выполнения команд
MARKER_STATS_DISCOVERABLE_ID string нет "another_MARKER_STATS _service_instance" ID сервиса в ServiceDiscovery
MARKER_STATS_DISCOVERABLE_NAME string нет "markerstats" Имя сервиса в ServiceDiscovery
MARKER_STATS_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
MARKER_STATS_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
MARKER_STATS_DISCOVERABLE_LIVETIME duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
MARKER_STATS_DISCOVERABLE_HEALTHPASS string нет 1 minute Периодичность отправки health check в ServiceDiscovery
MARKER_STATS_AKKA_HTTP_CLIENT_MAXCON int нет 512 Максимальное число одновременных исходящих HTTP-соединений
MARKER_STATS_AKKA_HTTP_CLIENT_MAXREQ int нет 1024 Максимальное число одновременных исходящих HTTP-запросов
MARKER_STATS_AKKA_HTTP_SERVER_MAXCON int нет 1024 Максимальное число одновременных входящих HTTP-соединений
MARKER_STATS_INTERNALCMD_ALLOW bool нет false Можно ли сервису отправлять внутрисистемные команды
MARKER_STATS_HEALTH_TIMEOUT duration string нет 5 seconds Максимальное время ожидания ответа health check
MARKER_STATS_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
MARKER_STATS_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
MARKER_STATS_DB_HOST string да Хост БД
MARKER_STATS_DB_PORT int да Порт БД
MARKER_STATS_DB_NAME string да Имя базы в БД
MARKER_STATS_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
MARKER_STATS_DB_USER string да Пользователь БД
MARKER_STATS_DB_PASSWORD string да Пароль пользователя БД
MARKER_STATS_AUTHZFORCE_ADDR string нет "http://localhost:8080/authzforce-ce" Адрес AuthZforce server
MARKER_STATS_AUTHZFORCE_DOMAIN string нет "" Доступный DomainID в AuthZforce server
MARKER_STATS_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
MARKER_STATS_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
MARKER_STATS_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
MARKER_STATS_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
MARKER_STATS_LOG_LEVEL_SLICK_STATEMENT string нет DEBUG Уровень логирования запросов, отправляемых slick в БД
MARKER_STATS_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирование бенчмарков выполнения запросов slick
MARKER_STATS_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
MARKER_STATS_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования конфига kafka-consumer
MARKER_STATS_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
MARKER_STATS_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
MARKER_STATS_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
MARKER_STATS_LOG_LEVEL_KAFKACOMMANDSCONSUMER string нет INFO Уровень логирования для получения команд через Kafka
MARKER_STATS_LOG_LEVEL_SYNCHRONIZATION string нет INFO Уровень логирования при синхронизации read-модели
MARKER_STATS_LOG_LEVEL_AKKA_EVENTS_CONSUMER string нет INFO Уровень логирования для обработки событий из всех сервисов
MARKER_STATS_LOG_LEVEL_TEAM_ROUTES string нет TRACE Уровень логирования для роутов /team
MARKER_STATS_VERDI_CLIENT_PARALLELISM int нет 32 Максимальное количество параллельных запросов в verdi в batch операциях
MARKER_STATS_VERDI_CLIENT_DEFAULT_PAGE_SIZE int нет 250 Размер страницы, получаемой из модели данных при синхронизации

Список команд сервиса marker-stats

В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

В сервисе реализованны следующие команды: - Запустить синхронизацию - Запустить синхронизацию для всех сущностей с префиксом - Запустить синхронизацию отношений - Запустить синхронизацию отношений для всех сущностей с префиксом - Запустить полную синхронизацию сервиса - Получить статистику проекта для текущего пользователя - Получить статистику проекта без учета пользователя - Получить список проектов со статистикой - Получить участников проекта - Получить статистику по сущностям проекта

SyncEntityType

Запускает синхронизацию EntityType из МД с сервисом, если он упустил какие-то события. Имя для вызова markerstats_kafka_SyncEntityType. Поддерживает синхронный и асинхронный вызов. Команда возвращает результат, когда синхронизация завершена.

Синхронизацию заданий на разметку запускать можно, только если сервис не получал событий по заданиям для этого проекта до этого

SyncAllEntityTypes

На входе префикс сущности и имя сущности, чей id используется как постфикс

{
   "prefix": "BatchTaskFor",
   "listEntity": "Project"
}

Выходных данных нет

Запускает синхронизацию всех EntityType с указанным префиксом. Необходимый список EntityType формируется через запрос списка сущностей типа listEntity Имя для вызова markerstats_kafka_SyncAllEntityType. Поддерживает синхронный и асинхронный вызов.

SyncRelation

На входе типы сущностей и поле, по которому идет связь

{
   "entityFrom": "ProjectParticipant",
   "entityTo": "Project",
   "field": "project"
}

Выходных данных нет

Запускает синхронизацию всех отношений для указанных типов данных. Имя для вызова markerstats_kafka_SyncRelations. Поддерживает синхронный и асинхронный вызов.

SyncAllRelations

На входе данные для определения синхронизируемых сущностей

{
   "prefix1": "TaskFor",
   "prefix2": "BatchTaskFor",
   "listEntity": "Project",
   "field": "parent"
}

Выходных данных нет

Запускает синхронизацию всех отношений между сущностями с указанными префиксами. Необходимый список EntityType формируется через запрос списка сущностей типа listEntity. Имя для вызова markerstats_kafka_SyncAllRelations. Поддерживает синхронный и асинхронный вызов.

SyncEverything

Входные и выходные данные отсутствуют

Запускает синхронизацию всех данных, необходимых для работы сервиса. Эту команду можно запускать без предварительной очистки БД. Имя для вызова markerstats_kafka_SyncEverything. Поддерживает синхронный и асинхронный вызов.

SyncCatalog

Запускает синхронизацию каталога из Alexandrina с сервисом, если он упустил какие-то события. Имя для вызова markerstats_kafka_SyncCatalog. Поддерживает синхронный и асинхронный вызов. Команда возвращает результат, когда синхронизация завершена.

GetProjectFields

На входе Search объект (поддерживается только пагинация)

{
   "query": "",
   "context": {},
   "paging": {
      "page": 1,
      "count": 10
   }
}

На выходе статистика по спанам проекта

{
   "items": [
      {
         "id": "db77be48-6ffb-4d8f-983a-c20411043e10",
         "title":  "Проект 1",
         "startDate": 1649146493990,
         "endDate": 1649146493990,
         "projectStatus": "db77be48-6ffb-4d8f-983a-c20411043e10",
         "labelingType": "db77be48-6ffb-4d8f-983a-c20411043e10",
         "taskCount": 10,
         "nerSettings": [
            {
               "field": "nerField1",
               "title": "Город",
               "selectionColor": "#783f13",
               "showInDocList": true,
               "nerHint": "размечай обдумывая",
               "minLabelingCount": 10,
               "attributes": [],
               "subNers": [
                  {
                     "field": "nerField1SubNer3",
                     "title": "Город",
                     "selectionColor": "#783f13",
                     "showInDocList": true,
                     "nerHint": "размечай обдумывая",
                     "minLabelingCount": 10,
                     "subNers": []
                  }
               ]
            }
         ],
        "spanCounts": [
           {
              "field": "nerField1",
              "count": 3
           }
        ]
      }
   ],
   "total": 1
}

Получение статистики по спанам проекта

Имя команды для вызова: marker_getProjectFields. Поддерживается только синхронный вызов.

GetProjectStatistics

На входе ID проекта

"db77be48-6ffb-4d8f-983a-c20411043e10"

На выходе свойства и статистика проекта

{
  "id": "db77be48-6ffb-4d8f-983a-c20411043e10",
  "title": "TestProject",
  "startDate": 1649146493990,
  "endDate": 1649146493990,
  "projectStatus": "6fae306e-9120-4b84-a79e-530a0be5617c",
  "instruction": "Делай что должно и будь что будет",
  "labelingType": "9d08b328-9882-4ea2-bbc9-c44d341e028c",
  "statistics": {
    "taskStatuses": [
      {
        "status": "18388b51-3c31-4530-a76b-24404f32ae3c",
        "count": 0
      },
      {
        "status": "66d92292-10da-48e2-81c7-6189725ed813",
        "count": 1
      },
      {
        "status": "a0305766-bb9d-499a-92a4-a34cc6333355",
        "count": 2
      },
      {
        "status": "25e5128f-7e8b-44d6-b515-d1c0c3e0bf3d",
        "count": 3
      }
    ]
  }
}

Или ошибка, если проект отсутствует

{
    "businessError": null,
    "message": "ERROR: Object not found",
    "stackTrace": null,
    "data": null
}

Получение статистики проекта по его ID

Имя команды для вызова: marker_getProjectStatistics. Поддерживается только синхронный вызов. Команда в основном сервисе доступна с именем marker_getProjectStatistics_direct.

GetFullProjectStatistics

На входе ID проекта

"db77be48-6ffb-4d8f-983a-c20411043e10"

На выходе статистика проекта

{
   "distributedUsersCount": 20,
   "newUsersCount": 20,
   "distributedTasksCount": 10,
   "newTasksCount": 10
}

Или ошибка, если проект отсутствует

{
    "businessError": null,
    "message": "ERROR: Object not found",
    "stackTrace": null,
    "data": null
}

Получение статистики проекта по его ID без учета пользователя

Имя команды для вызова: marker_getFullProjectStatistics. Поддерживается только синхронный вызов.

ListProjectStatistics

На входе параметры поиска и пагинации проектов (Search)

{
  "query": "",
  "context": {},
  "paging": {"page": 1, "count": 5}
}

На выходе свойства и статистика проектов из выборки

{
  "items": [
    {
      "id": "9bc7e8c6-f71c-4a53-abc6-222a8a431e84",
      "title": "Test Classification",
      "startDate": 1649146493990,
      "endDate": 1649146493990,
      "labelingType": "9d08b328-9882-4ea2-bbc9-c44d341e028c",
      "projectStatus": "6fae306e-9120-4b84-a79e-530a0be5617c",
      "statistics": {
        "taskStatuses": [
          {
            "status": "18388b51-3c31-4530-a76b-24404f32ae3c",
            "count": 0
          },
          {
            "status": "66d92292-10da-48e2-81c7-6189725ed813",
            "count": 1
          },
          {
            "status": "a0305766-bb9d-499a-92a4-a34cc6333355",
            "count": 2
          },
          {
            "status": "25e5128f-7e8b-44d6-b515-d1c0c3e0bf3d",
            "count": 3
          }
        ]
      }
    }
  ],
  "total": 1
}

Получение статистики проектов

Имя команды для вызова: marker_listProjectStatistics. Поддерживается только синхронный вызов. Команда в основном сервисе доступна с именем marker_listProjectStatistics_direct.

ListProjectUsers

На входе ID проекта

{
  "projectId": "db77be48-6ffb-4d8f-983a-c20411043e10",
  "roleId": "45ca52f3-d346-41ce-9ebf-904b40eddd76",
  "search": {
    "query": "",
    "context": {},
    "sorting": null,
    "paging": {
      "page": 1,
      "count": 5
    }
  }
}

На выходе страница с пользователями проекта

{
  "total": 300,
  "items": [
    {
      "userId": "f0ed4aa8-2090-4e48-82e5-62a2ef5623cf",
      "roleId": "45ca52f3-d346-41ce-9ebf-904b40eddd76",
      "taskStatuses": [
        {
          "status": "18388b51-3c31-4530-a76b-24404f32ae3c",
          "count": 0
        },
        {
          "status": "66d92292-10da-48e2-81c7-6189725ed813",
          "count": 1
        },
        {
          "status": "a0305766-bb9d-499a-92a4-a34cc6333355",
          "count": 2
        },
        {
          "status": "25e5128f-7e8b-44d6-b515-d1c0c3e0bf3d",
          "count": 3
        }
      ]
    }
  ]
}

Возвращает список пользователей в проекте. На данный момент Search объект поддерживает только Paging

Имя команды для вызова: marker_listProjectUsers. Поддерживается только синхронный вызов. Команда в основном сервисе доступна с именем marker_listProjectUsers_direct.

ListEntityStats

На входе ID проекта

"09e65817-e136-4f7c-913b-cb04f4edbef1"

На выходе статистика по сущностям

[
   {
      "entityCode": "nerField1",
      "documentCount": 28
   },
   {
      "entityCode": "nerField10",
      "documentCount": 5
   }
]

Возвращает статистику по сущностям указанного проекта.

Имя команды для вызова: marker_listEntityStats. Поддерживается только синхронный вызов.

GetBatchTaskAdmin

На входе Id задачи

"09e65817-e136-4f7c-913b-cb04f4edbef1"

На выходе полная информация о задаче

{
   "id": "09e65817-e136-4f7c-913b-cb04f4edbef1",
   "projectId": "68dc922b-5588-4654-8796-78b0ef5ae197",
   "marker": "b963a6c6-b63d-4bff-b810-80dd3762b56d",
   "expert": "92201b05-9311-4b0b-ad05-d1030e41c1e4",
   "title": "№1",
   "status": "36bb2406-ee88-4d05-8730-b9cf521eaad6",
   "created": 1666957524,
   "modified": 1666957524,
   "markerTasksStats": {
      "taskStatuses": [
         {
            "status": "18388b51-3c31-4530-a76b-24404f32ae3c",
            "count": 0
         },
         {
            "status": "66d92292-10da-48e2-81c7-6189725ed813",
            "count": 1
         },
         {
            "status": "a0305766-bb9d-499a-92a4-a34cc6333355",
            "count": 2
         },
         {
            "status": "25e5128f-7e8b-44d6-b515-d1c0c3e0bf3d",
            "count": 3
         }
      ]
   },
   "expertTasksStats": {
      "taskStatuses": [
         {
            "status": "18388b51-3c31-4530-a76b-24404f32ae3c",
            "count": 0
         },
         {
            "status": "66d92292-10da-48e2-81c7-6189725ed813",
            "count": 1
         },
         {
            "status": "a0305766-bb9d-499a-92a4-a34cc6333355",
            "count": 2
         },
         {
            "status": "25e5128f-7e8b-44d6-b515-d1c0c3e0bf3d",
            "count": 3
         }
      ]
   }
}

Возвращает информацию по заданию для админки.

Имя команды для вызова: marker_getBatchTaskAdmin. Поддерживается только синхронный вызов.

ListBatchTasksAdmin

На входе Id проекта и Search объект

{
   "projectId": "5c04e027-e819-4f75-9652-8d1a6f76668e",
   "search": {
      "query": "",
      "context": {},
      "sorting": null,
      "paging": {"page": 1, "count": 1}
   }
}

На выходе страница с задачами

[
   {
      "id": "d4a3423b-cf43-4f59-9f93-01fbb07e7ac5",
      "created": 1666957679,
      "modified": 1666957679,
      "status": "36bb2406-ee88-4d05-8730-b9cf521eaad6",
      "docCount": 6,
      "userInfo": {
         "id": "b963a6c6-b63d-4bff-b810-80dd3762b56d",
         "email": "emailname@mail.io",
         "info": {
            "firstName": "John",
            "lastName": "Week",
            "middleName": "Jovonovich"
         }
      }
   }
]

Возвращает информацию в проекте по страницам.

Имя команды для вызова: marker_listBatchTasksAdmin. Поддерживается только синхронный вызов.

Search объект поддерживает следующие параметры:

Доступные поля для фильтрации и виды фильтров по ним:

Поле Виды фильтров
id InSetQuery
marker InSetQuery
expert InSetQuery
title InSetQuery, LikeQuery
created RangeQuery
modified RangeQuery
status InSetQuery

Доступные поля для сортировки:

Поле
title
created
modified

GetBatchTask

На входе Id задачи

"340b6d6c-97a4-4eab-81ee-61e0a617736d"

На выходе информация о задаче интересная конкретному пользователю

{
   "id": "340b6d6c-97a4-4eab-81ee-61e0a617736d",
   "projectId": "ee6d40a9-9fbc-4e72-a107-6cdce3dd9ffb",
   "title": "№1",
   "status": "36bb2406-ee88-4d05-8730-b9cf521eaad6",
   "created": 1666957679,
   "modified": 1666957679,
   "tasksStats": {
      "taskStatuses": [
         {
            "status": "18388b51-3c31-4530-a76b-24404f32ae3c",
            "count": 0
         },
         {
            "status": "66d92292-10da-48e2-81c7-6189725ed813",
            "count": 1
         },
         {
            "status": "a0305766-bb9d-499a-92a4-a34cc6333355",
            "count": 2
         },
         {
            "status": "25e5128f-7e8b-44d6-b515-d1c0c3e0bf3d",
            "count": 3
         }
      ]
   }
}

Возвращает информацию о задаче для ЛК.

Имя команды для вызова: marker_getBatchTask. Поддерживается только синхронный вызов.

Для выполнения команды пользователь должен быть авторизован. Если задание существует, но пользователь в нем не участвует, команда вернет 404.

ListBatchTasks

На входе Id проекта

"ee6d40a9-9fbc-4e72-a107-6cdce3dd9ffb"

На выходе список с информацией о задачах конкретного пользователя в указанном проекте

[
   {
      "id": "340b6d6c-97a4-4eab-81ee-61e0a617736d",
      "projectId": "ee6d40a9-9fbc-4e72-a107-6cdce3dd9ffb",
      "title": "№1",
      "status": "36bb2406-ee88-4d05-8730-b9cf521eaad6",
      "created": 1666957679,
      "modified": 1666957679,
      "tasksStats": {
         "taskStatuses": [
            {
               "status": "18388b51-3c31-4530-a76b-24404f32ae3c",
               "count": 0
            },
            {
               "status": "66d92292-10da-48e2-81c7-6189725ed813",
               "count": 1
            },
            {
               "status": "a0305766-bb9d-499a-92a4-a34cc6333355",
               "count": 2
            },
            {
               "status": "25e5128f-7e8b-44d6-b515-d1c0c3e0bf3d",
               "count": 3
            }
         ]
      }
   }
]

Возвращает все задания пользователя.

Имя команды для вызова: marker_listBatchTasks. Поддерживает только синхронный вызов.

Для выполнения команды пользователь должен быть авторизован.

ListProjectSpans (В разработке)

На входе Id проекта

"2af4d2ef-8315-46ce-bda8-8028d51b25f7"

На выходе информация о количестве спанов

{
   "total": 300,
   "items": [
      {
         "id": "9bc7e8c6-f71c-4a53-abc6-222a8a431e84",
         "title": "Test Classification",
         "startDate": 1649146493990,
         "endDate": 1649146493990,
         "labelingType": "9d08b328-9882-4ea2-bbc9-c44d341e028c",
         "projectStatus": "6fae306e-9120-4b84-a79e-530a0be5617c",
         "documentsTotal": 100,
         "spanCounts": [
            {
               "field": "nerField1",
               "count": 10
            },
            {
               "field": "nerField1SubNer3",
               "count": 15
            }
         ],
         "nerSettings": [
            {
               "field": "nerField1",
               "title": "Город",
               "selectionColor": "#783f13",
               "showInDocList": true,
               "nerHint": "размечай обдумывая",
               "minLabelingCount": 10,
               "attributes": [],
               "subNers": [
                  {
                     "field": "nerField1SubNer3",
                     "title": "Город",
                     "selectionColor": "#783f13",
                     "showInDocList": true,
                     "nerHint": "размечай обдумывая",
                     "minLabelingCount": 10,
                     "subNers": []
                  }
               ]
            }
         ]
      }
   ]
}

Возвращает количество спанов для каждого поля выделения сущностей в проекте.

Объекты сервиса статистики разметки

SyncAllRequest

Поле Тип Обязательное Описание
prefix string да Префикс EntityType, для которых будет запущена синхронизация
listEntity string да Будет запрошен список сущностей с этим EntityType. Id из этого списка будут использованы как постфикс для синхронизируемых EntityType

SyncRelationRequest

Поле Тип Обязательное Описание
entityFrom string да Тип первой сущности отношения
entityTo string да Тип второй сущности отношения
field string да Имя поля, по которому идет отношение

SyncAllRelationsRequest

Поле Тип Обязательное Описание
prefix1 string да Префикс типов первых сущностей отношения
prefix2 string да Префикс типов вторых сущностей отношения
listEntity string да Тип сущности, id которых будут использованы как постфикс
field string да Имя поля, по которому идут отношения

ProjectWithSpanStats

Поле Тип Обязательное Описание
id uuid string да ID проекта
title string да Наименование проекта
startDate timestamp нет Дата и время начала проекта
endDate timestamp нет Дата и время окончания проекта
labelingType uuid string да ID вида разметки (из справочника)
projectStatus uuid string да ID статуса проекта (из справочника)
documentsTotal number да Суммарное количество документов в проекте
nerSettings object[] нет Настройки выделения сущностей
spanCounts object[] нет Массив с информацией о количестве спанов для поля

FullProjectStatistics

Поле Тип Обязательное Описание
distributedUsersCount number да Кол-во распределенных пользователей
newUsersCount number да Кол-во нераспределенных пользователей
distributedTasksCount number да Кол-во распределенных документов
newTasksCount number да Кол-во нераспределенных документов

SpanStatItem

Поле Тип Описание
field string Id поля выделения сущностей
count number Количество спанов

EntityStatsItem

Поле Тип Обязательное Описание
entityCode string да Код сущности
documentCount number да Количество документов с этой сущностью

BatchTask

Поле Тип Описание
id uuid string Строковый код типа поля
projectId uuid string Название типа поля для вывода в UI
title string Название задания
status uuid string Статус задания
created timestamp Дата и время создания задания
modified timestamp Дата и время последнего изменения задания
tasksStats object Агрегированная статистика по подзаданиям для запросившего пользователя

BatchTaskAdmin

Поле Тип Описание
id uuid string Строковый код типа поля
projectId uuid string Название типа поля для вывода в UI
marker uuid string Тип поля в БД
expert uuid string Произвольные настройки, применяемые для данного типа поля
title string Название задания
status uuid string Статус задания
created timestamp Дата и время создания задания
modified timestamp Дата и время последнего изменения задания
markerTasksStats object Агрегированная статистика по подзаданиям для разметчика
expertTasksStats object Агрегированная статистика по подзаданиям для эксперта

BatchTaskAdminListItem

Поле Тип Описание
id uuid string Строковый код типа поля
title string Название задания
status uuid string Статус задания
created timestamp Дата и время создания задания
modified timestamp Дата и время последнего изменения задания
docCount number Количество документов
userInfo object Информация о разметчике назначенном на задание

User (mon)

Структура описывающая сущность "пользователь"

Поле Описание
id Идентификатор пользователя
email Уникальный email пользователя
info Опциональная информация о пользователе UserInfo

UserInfo (mon)

Поле Описание
firstName Имя пользователя (необязательное поле)
lastName Фамилия пользователя (необязательное поле)
middleName Отчество пользователя (необязательное поле)

ListBatchTaskAdminRequestDTO

Поле Тип Обязательное Описание
projectId uuid string да ID проекта
search Search да Фильтры, сортировка, пагинация

ProjectFields

Поле Тип Обязательное Описание
id uuid string да ID проекта
title string да Название проекта
startDate timestamp нет Дата и время начала проекта
endDate timestamp нет Дата и время окончания проекта
projectStatus uuid string да ID статуса проекта (из справочника)
labelingType uuid string да ID вида разметки (из справочника)
taskCount number да Количество документов в проекте
nerSettings object[] да Настройки выделения сущностей
spanCounts object[] да Информация по количеству спанов

FieldCount

Поле Тип Обязательное Описание
field string да Название спана
count number да Количество

Tolka: сервис аналитики

Сервис подготавливает данные для аналитики, построения графиков/таблиц. Состояние хранится в PostgreSQL. Команды могут приходить как по HTTP, так и через Kafka в топик tolka_commands.

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

Optimistic Lock

У нескольких команд реализован механизм оптимистичных блокировок. Для этого в данных присутствует поле version. Задача оптимистичных блокировок - предотвратить одновременное редактирование объекта из двух открытых форм. Сначала фронтэнд запрашивает данные объекта и получает в ответе версию данных - поле version. Он прикладывает эту версию в ответе. Если на бэкэнде она совпадает с исходной (не было других модификаций), тогда данные сохраняются, а версия поднимается. Иначе сохранения не происходит, данные не перетираются.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информация по добавлению команд можно прочитать в описании шаблона

Конфигурирование Tolka

Требования к запуску Tolka

Запуск сервиса осуществляется локально через sbt, на стенде в docker на jvm.

Для корректной минимальной работы сервиса требуется обязательное подключение к PostgreSQL, Kafka, Consul. Для настройки подключения к ним нужно заполнить обязательные переменные окружения из раздела ниже.

Для нормальной работы сервису дополнительно требуется окружение Verdi: CommandStatus, ApiGateway. В этом случае нужно уделить внимание настройкам, связанным с ServiceDiscovery и CommandDiscovery.

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

Команда Внешние сервисы
tolka_BuildRelatednessAnalytics full-text-search
tolka_BuildRelatednessSummary full-text-search
tolka_BuildRelatednessWidgetData data-model, full-text-search
tolka_BuildSimilaritySummary full-text-search
tolka_CreateWidget data-model, full-text-search (при создании виджета типа BarChart)
tolka_UpdateWidget data-model, full-text-search (при создании виджета типа BarChart)

Запуск Tolka из консоли с помощью SBT

TOLKA_DB_HOST=localhost TOLKA_DB_PORT=5432 TOLKA_DB_NAME=tolka_db TOLKA_DB_USER=postgres TOLKA_DB_PASSWORD=12345 sbt boot/run

Список переменных окружения Tolka

Все доступные переменные окружения для настройки сервиса.

Переменная Тип Обязательная Значение по умолчанию Описание
TOLKA_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
TOLKA_HTTP_PORT int нет 8192 Порт, на котором слушает HTTP-сервер
TOLKA_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
TOLKA_KAFKA_TOPIC string нет "tolka_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
TOLKA_KAFKA_CONSUMER_GROUP string нет "tolka_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
TOLKA_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
TOLKA_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
TOLKA_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
TOLKA_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
TOLKA_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах TOLKA_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
TOLKA_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который TOLKA_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
TOLKA_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
TOLKA_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
TOLKA_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
TOLKA_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
TOLKA_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к хранилищу сертификатов.
TOLKA_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
TOLKA_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
TOLKA_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
TOLKA_TRACE_DURATION boolean нет false Признак необходимости трассировки выполнения команд
TOLKA_DISCOVERABLE_ID string нет "another_TOLKA_service_instance" ID сервиса в ServiceDiscovery
TOLKA_DISCOVERABLE_NAME string нет "tolka" Имя сервиса в ServiceDiscovery
TOLKA_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
TOLKA_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
TOLKA_DISCOVERABLE_LIVETIME duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
TOLKA_DISCOVERABLE_HEALTHPASS string нет 1 minute Периодичность отправки health check в ServiceDiscovery
TOLKA_SERVICE_TITLE string нет "Tolka" Название сервиса для отображения
TOLKA_SERVICE_DESCRIPTION string нет "Сервис аналитики" Описание сервиса для отображения
TOLKA_AKKA_HTTP_CLIENT_MAXCON int нет 512 Максимальное число одновременных исходящих HTTP-соединений
TOLKA_AKKA_HTTP_CLIENT_MAXREQ int нет 1024 Максимальное число одновременных исходящих HTTP-запросов
TOLKA_AKKA_HTTP_SERVER_MAXCON int нет 1024 Максимальное число одновременных входящих HTTP-соединений
TOLKA_INTERNALCMD_ALLOW bool нет false Можно ли сервису отправлять внутрисистемные команды
TOLKA_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
TOLKA_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
TOLKA_DB_HOST string да Хост БД
TOLKA_DB_PORT int да Порт БД
TOLKA_DB_NAME string да Имя базы в БД
TOLKA_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
TOLKA_DB_USER string да Пользователь БД
TOLKA_DB_PASSWORD string да Пароль пользователя БД
TOLKA_FS_URI string да http://localhost:9000/ Адрес файлового хранилища
TOLKA_FS_ACCESS_KEY_ID string да minioadmin Имя пользователя файлового хранилища
TOLKA_FS_SECRET_ACCESS_KEY string да minioadmin Пароль пользователя файлового хранилища
TOLKA_FS_UPLOAD_PARALLELISM int нет 4 Параллелизм для загрузки файлов
TOLKA_FS_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
TOLKA_FS_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с маппингом учетных записей
TOLKA_FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
TOLKA_FS_CACHE_TTL duration string нет Время жизни клиента в кеше
TOLKA_AUTHZFORCE_ADDR string нет "http://localhost:8080/authzforce-ce" Адрес AuthZforce server
TOLKA_AUTHZFORCE_DOMAIN string нет "" Доступный DomainID в AuthZforce server
TOLKA_AUTHZFORCE_CONNECT_TIMEOUT string нет 10 seconds Таймаут на подключение к AuthZforce server
TOLKA_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
TOLKA_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
TOLKA_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
TOLKA_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
TOLKA_LOG_LEVEL_SLICK_STATEMENT string нет DEBUG Уровень логирования запросов, отправляемых slick в БД
TOLKA_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирование бенчмарков выполнения запросов slick
TOLKA_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
TOLKA_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования конфига kafka-consumer
TOLKA_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
TOLKA_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
TOLKA_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
TOLKA_LOG_LEVEL_TEAM_ROUTES string нет TRACE Уровень логирования для роутов /team
TOLKA_EXTERNAL_MIGRATIONS_RETRY_DELAY duration string нет 15 seconds Задержка между повторными попытками запуска внешних миграций
TOLKA_EXTERNAL_MIGRATIONS_RETRY_ATTEMPTS int нет 5 Максимальное количество попыток запуска внешних миграций
TOLKA_DM_SCHEMA_CACHE_SIZE int нет 128 Максимальный размер кэша для json schema
TOLKA_DM_SCHEMA_CACHE_TTL duration string нет 5 minute Время жизни элементов в кэше для json schema
TOLKA_LAMP_FILE_CACHE_SIZE int нет 64 Максимальный размер кэша для файлов из lamp
TOLKA_LAMP_FILE_CACHE_TTL duration string нет 30 minute Время жизни элементов в кэше для файлов из lamp
TOLKA_FTS_MAPPING_CACHE_SIZE int нет 64 Максимальный размер кэша для маппингов в полнотекстовом поиске
TOLKA_FTS_MAPPING_CACHE_TTL duration string нет 5 minute Время жизни элементов в кэше для маппингов в полнотекстовом поиске
TOLKA_DM_OBJECT_PAGE_SIZE int нет 100 Размер страницы при выборке объектов из data-model

Список команд сервиса Tolka

Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.

Название команды EntityType Actions UIAction
tolka_BuildRelatednessAnalytics RelatednessAnalytics View ViewAnalytics
tolka_BuildRelatednessSummary RelatednessAnalytics View ViewAnalytics
tolka_BuildRelatednessWidgetData RelatednessAnalytics View ViewAnalytics
tolka_BuildSimilaritySummary SimilarityAnalytics View ViewAnalytics
tolka_AddMetricThresholds MetricThreshold Create ChangeAnalyticsSettings
tolka_GetMetricThresholds MetricThreshold View ViewAnalytics
tolka_ListAllWidgets Widget View ViewAnalytics
tolka_CreateWidget Widget Create ChangeAnalyticsSettings
tolka_UpdateWidget Widget Update ChangeAnalyticsSettings
tolka_DeleteWidget Widget Delete ChangeAnalyticsSettings
tolka_ReorderWidgets Widget Update ChangeAnalyticsSettings
tolka_CreateAnalyticsEntity AnalyticsEntity Create ChangeAnalyticsSettings
tolka_UpdateAnalyticsEntity AnalyticsEntity Update ChangeAnalyticsSettings
tolka_DeleteAnalyticsEntity AnalyticsEntity Delete ChangeAnalyticsSettings
tolka_ListAnalyticsEntity AnalyticsEntity View ViewAnalytics

В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

BuildRelatednessAnalytics (tolka)

На входе файлы с результатами plagiarismSearch

{
  "data": [
    "processing/10b1011b-9db3-4186-a53c-971016030068",
    "processing/e95024a7-4dc3-4107-8df4-68f47e98679a",
    "processing/c3907091-f0de-4990-ac9b-68f1d9221f7b"
  ],
  "settings": {
    "thresholds": {
      "high": {
        "from": 80,
        "to": 100,
        "color": "#F95959"
      },
      "medium": {
        "from": 50,
        "to": 80,
        "color": "#F2AF4A"
      },
      "low": {
        "from": 10,
        "to": 50,
        "color": "#BB85E5"
      }
    },
    "entities": [
      {
        "code": "document",
        "color": "#2F80ED",
        "fieldName": "publishYear"
      },
      {
        "code": "patent",
        "color": "#27AE60",
        "fieldName": "year"
      }
    ]
  }
}

На выходе данные для построения аналитики

{
  "buckets": {
    "1998": {
      "total": 1,
      "entities": [
        {
          "code": "patent",
          "count": 1
        }
      ]
    },
    "1990": {
      "total": 2,
      "entities": [
        {
          "code": "document",
          "count": 2
        }
      ]
    },
    "1980": {
      "total": 1,
      "entities": [
        {
          "code": "document",
          "count": 1
        }
      ]
    }
  },
  "summary": {
    "total": 4,
    "high": {
      "patent": {
        "total": 1,
        "items": [
          {
            "objectId": "6e896d39-0439-4af4-85fd-115749bdb29a",
            "relatedness": 0.98
          }
        ]
      },
      "document": {
        "total": 1,
        "items": [
          {
            "objectId": "82f79ca0-4caf-4503-8d1c-db3af2718fff",
            "relatedness": 0.82
          }
        ]
      }
    },
    "medium": {
      "document": {
        "total": 1,
        "items": [
          {
            "objectId": "947cb658-f2a1-4bbf-b856-579d80fc1466",
            "relatedness": 0.66
          }
        ]
      }
    },
    "low": {
      "document": {
        "total": 1,
        "items": [
          {
            "objectId": "082d61e6-11ac-4bf5-978d-ff24378fc57f",
            "relatedness": 0.41
          }
        ]
      }
    }
  }
}

Возвращает данные для построения аналитики по близким документам, на основе результатов plagiarismSearch (Lamp).
В данные аналитики попадают только те объекты, которые присутствуют в индексе полнотекстового поиска (FullTextSearch).

Имя команды для вызова: tolka_BuildRelatednessAnalytics. Поддерживается только синхронный вызов.

Результат выполнения команды не журналируется.

BuildRelatednessSummary (tolka)

На входе файлы с результатами plagiarismSearch, и настройки, если необходимы отличные от настроек по умолчанию.

{
  "data": [
    "processing/10b1011b-9db3-4186-a53c-971016030068",
    "processing/e95024a7-4dc3-4107-8df4-68f47e98679a",
    "processing/c3907091-f0de-4990-ac9b-68f1d9221f7b"
  ],
  "settings": {
    "thresholds": {
      "high": {
        "from": 80,
        "to": 100
      },
      "medium": {
        "from": 50,
        "to": 80
      },
      "low": {
        "from": 10,
        "to": 50
      }
    },
    "entities": ["RfbrDocument"]
  }
}

На выходе данные для построения системного виджета сводных данных

{
  "thresholds": {
    "high": {
      "RfbrDocument": {
        "total": 1,
        "items": [
          {
            "objectId": "47d6f786-562b-43f0-9999-5e1098d8cf6e",
            "relatedness": 0.95595397,
            "metric": 0.95595397
          }
        ]
      }
    },
    "medium": {
      "RfbrDocument": {
        "total": 1,
        "items": [
          {
            "objectId": "9465d4f9-c19d-400e-8353-433174e49d81",
            "relatedness": 0.55595397,
            "metric": 0.55595397
          }
        ]
      }
    },
    "low": {
      "RfbrDocument": {
        "total": 2,
        "items": [
          {
            "objectId": "0d6f3e9f-27ef-4bd4-bdd2-2d66a07c707a",
            "relatedness": 0.15188915,
            "metric": 0.15188915
          },
          {
            "objectId": "7840164e-b40a-44ee-8e3f-88fde1a96681",
            "relatedness": 0.025739253,
            "metric": 0.025739253
          }
        ]
      }
    }
  },
  "total": 4
}

Возвращает данные для построения системного виджета сводных данных по близким документам, на основе результатов plagiarismSearch (Lamp).
В данные аналитики попадают только те объекты, которые присутствуют в индексе полнотекстового поиска (FullTextSearch).

Имя команды для вызова: tolka_BuildRelatednessSummary. Поддерживается только синхронный вызов.

Результат выполнения команды не журналируется.

BuildRelatednessWidgetData (tolka)

На входе ID виджета, файлы с результатами Lamp-Similarity, и настройки, если необходимы отличные от настроек по умолчанию.

{
  "widgetId": "3ef4639f-dc0b-4bd8-80f9-ecba44e45aef",
  "data": [
    "temp/5322db77-4cfe-4d6a-a905-e8469bb81dca"
  ],
  "settings": {
    "thresholds": {
      "high": {
        "from": 80,
        "to": 100,
        "color": "#F95959"
      },
      "medium": {
        "from": 50,
        "to": 80,
        "color": "#F2AF4A"
      },
      "low": {
        "from": 0,
        "to": 50,
        "color": "#BB85E5"
      }
    },
    "entities": [
      "RfbrDocument"
    ]
  }
}

На выходе данные для пользовательского виджета

{
  "widgetId": "3ef4639f-dc0b-4bd8-80f9-ecba44e45aef",
  "buckets": {
    "2016": {
      "entities": [
        {
          "code": "RfbrDocument",
          "count": 2
        }
      ],
      "total": 2
    },
    "1999": {
      "entities": [
        {
          "code": "RfbrDocument",
          "count": 1
        }
      ],
      "total": 1
    },
    "2002": {
      "entities": [
        {
          "code": "RfbrDocument",
          "count": 1
        }
      ],
      "total": 1
    }
  }
}

Возвращает данные для построения пользовательского виджета, на основе результатов plagiarism (Lamp).
В данные аналитики попадают только те объекты, которые присутствуют в индексе полнотекстового поиска (FullTextSearch).

Имя команды для вызова: tolka_BuildRelatednessWidgetData. Поддерживается только синхронный вызов.

Результат выполнения команды не журналируется.

BuildSimilaritySummary (tolka)

На входе файлы с результатами Lamp-Similarity, и настройки, если необходимы отличные от настроек по умолчанию.

{
  "data": [
    "processing/10b1011b-9db3-4186-a53c-971016030068",
    "processing/e95024a7-4dc3-4107-8df4-68f47e98679a",
    "processing/c3907091-f0de-4990-ac9b-68f1d9221f7b"
  ],
  "settings": {
    "thresholds": {
      "high": {
        "from": 80,
        "to": 100
      },
      "medium": {
        "from": 50,
        "to": 80
      },
      "low": {
        "from": 10,
        "to": 50
      }
    },
    "entities": ["RfbrDocument"]
  }
}

На выходе данные для построения системного виджета сводных данных

{
  "thresholds": {
    "high": {
      "RfbrDocument": {
        "total": 1,
        "items": [
          {
            "objectId": "47d6f786-562b-43f0-9999-5e1098d8cf6e",
            "metric": 0.95595397
          }
        ]
      }
    },
    "medium": {
      "RfbrDocument": {
        "total": 1,
        "items": [
          {
            "objectId": "9465d4f9-c19d-400e-8353-433174e49d81",
            "metric": 0.55595397
          }
        ]
      }
    },
    "low": {
      "RfbrDocument": {
        "total": 2,
        "items": [
          {
            "objectId": "0d6f3e9f-27ef-4bd4-bdd2-2d66a07c707a",
            "metric": 0.15188915
          },
          {
            "objectId": "7840164e-b40a-44ee-8e3f-88fde1a96681",
            "metric": 0.025739253
          }
        ]
      }
    }
  },
  "total": 4
}

Возвращает данные для построения системного виджета сводных данных по близким документам, на основе результатов similarity (Lamp).
В данные аналитики попадают только те объекты, которые присутствуют в индексе полнотекстового поиска (FullTextSearch).

Имя команды для вызова: tolka_BuildSimilaritySummary. Поддерживается только синхронный вызов.

Результат выполнения команды не журналируется.

AddMetricThresholds (tolka)

На входе настройки порогов для метрик аналитики

{
 "id":  "00000000-0000-0000-0000-000000000000",
 "version": 1,
 "thresholds": [
   {
     "name": "high",
     "title": "high",
     "interval": {
       "from": 80,
       "to": 100
     },
     "color": "#F95959"
   },
   {
     "name": "medium",
     "title": "medium",
     "interval": {
       "from": 50,
       "to": 80
     },
     "color": "#F2AF4A"
   },
   {
     "name": "low",
     "title": "low",
     "interval": {
       "from": 10,
       "to": 50
     },
     "color": "#BB85E5"
   }
 ]
}

На выходе результат сохранения настроек

true

Сохраняет настройки для порогов метрики в конкретной аналитике.
Метрика всегда зависит от запрашиваемой аналитики. Применение настройки для порогов зависит от реализации аналитики.
Список реализованных аналитик можно посмотреть в списке команд.

Имя команды для вызова: tolka_AddMetricThresholds. Поддерживается асинхронный и синхронный вызов.

GetMetricThresholds (tolka)

На выходе настоойки порогов для метрик аналитики

{
 "id":  "00000000-0000-0000-0000-000000000000",
 "version": 1,
 "thresholds": [
   {
     "name": "high",
     "title": "high",
     "interval": {
       "from": 80,
       "to": 100
     },
     "color": "#F95959"
   },
   {
     "name": "medium",
     "title": "medium",
     "interval": {
       "from": 50,
       "to": 80
     },
     "color": "#F2AF4A"
   },
   {
     "name": "low",
     "title": "low",
     "interval": {
       "from": 10,
       "to": 50
     },
     "color": "#BB85E5"
   }
 ]
}

Возвращает настройки для порогов метрики в конкретной аналитике.
Список реализованых аналитик можно посмотреть в списке команд.

Имя команды для вызова: tolka_GetMetricThresholds. Поддерживается только синхронный вызов.

Результат выполнения команды не журналируется.

ListAllWidgets (tolka)

На входе ничего

На выходе список всех виджетов в системе

{
  "status": "Completed",
  "timestamp": 1680860689954,
  "value": [
    {
      "id": "4f2b79f7-4c74-480a-9999-4dac31fcd629",
      "title": "TestWidget1",
      "widgetType": "analyticsWidgetType_barChart",
      "settings": {
        "showLegend": true,
        "entities": [
          {
            "code": "elibBook",
            "fieldName": "bookNote"
          },
          {
            "code": "elibJournalArticle",
            "fieldName": "issueEDN"
          }
        ],
        "fieldType": "string"
      },
      "visibility": true,
      "position": 1,
      "version": 1
    },
    {
      "id": "55b03d4f-2b35-49bc-a754-0b93d3d81642",
      "title": "TestWidget2",
      "widgetType": "analyticsWidgetType_linearBar",
      "settings": {
        "showLegend": true,
        "entities": [
          "elibBook",
          "elibPublication"
        ]
      },
      "visibility": true,
      "position": 2,
      "version": 1
    }
  ]
}

Возвращает полный перечень всех виджетов в системе.

Имя команды для вызова: tolka_ListAllWidgets. Поддерживается только синхронный вызов.

Результат выполнения команды не журналируется.

CreateWidget (tolka)

На входе параметры нового виджета

{
  "title": "Test",
  "widgetType": "analyticsWidgetType_barChart",
  "settings": {
    "showLegend": true,
    "fieldType": "string",
    "entities": [
      {
        "code": "elibBook",
        "fieldName": "bookNote"
      },
      {
        "code": "elibJournalArticle",
        "fieldName": "issueEDN"
      }
    ]
  },
  "visibility": true
}

На выходе ID нового виджета

"2112b855-9beb-4f76-8e51-818a16aadf60"

Сохраняет новый виджет аналитики в системе и возвращает его ID.

Имя команды для вызова: tolka_CreateWidget. Поддерживается асинхронный и синхронный вызов.

UpdateWidget (tolka)

На входе новые параметры виджета

{
  "id":"2112b855-9beb-4f76-8e51-818a16aadf60",
  "title": "Test",
  "widgetType": "analyticsWidgetType_barChart",
  "settings": {
    "showLegend": false,
    "fieldType": "string",
    "entities": [
      {
        "code": "elibBook",
        "fieldName": "bookNote"
      },
      {
        "code": "elibJournalArticle",
        "fieldName": "issueEDN"
      }
    ]
  },
  "visibility": false
}

На выходе признак успешности

true

Обновляет виджет аналитики.

Имя команды для вызова: tolka_UpdateWidget. Поддерживается асинхронный и синхронный вызов.

DeleteWidget (tolka)

На входе ID удаляемого виджета

"2112b855-9beb-4f76-8e51-818a16aadf60"

На выходе признак успешности

true

Удаляет виджет аналитики из системы.

Имя команды для вызова: tolka_DeleteWidget. Поддерживается асинхронный и синхронный вызов.

ReorderWidgets (tolka)

На входе данные, необходимые для перестановки местами двух виджетов

{
  "first": {
    "id": "89c1c73e-5051-454d-9557-b6bbedd4d956",
    "newPosition": 9,
    "version": 2
  },
  "second": {
    "id": "a21bf274-dc8c-4f96-91ef-2c3c20e21f6d",
    "newPosition": 10,
    "version": 2
  }
}

На выходе признак успешности

true

Переставляет местами два виджета, изменяя их позицию в списке.

Имя команды для вызова: tolka_ReorderWidgets. Поддерживается асинхронный и синхронный вызов.

CreateAnalyticsEntity (tolka)

На входе настройки сущности в аналитике

{
 "code": "MyEntity",
 "color": "#EBC425",
 "visibleOnDashboard": true
}

На выходе идентификатор созданных настроек

"cdb00bc8-7516-4349-8b88-dc58d0b6e1c1"

Создает настройки для типа сущности в конкретной аналитике.

Имя команды для вызова: tolka_CreateAnalyticsEntity. Поддерживается асинхронный и синхронный вызов.

UpdateAnalyticsEntity (tolka)

На входе настройки сущности в аналитике

{
  "id": "cdb00bc8-7516-4349-8b88-dc58d0b6e1c1",
  "version": 1,
  "code": "MyEntity",
  "color": "#FFD40A",
  "visibleOnDashboard": true
}

На выходе результат изменения настроек

true

Изменяет настройки для типа сущности в конкретной аналитике.

Имя команды для вызова: tolka_UpdateAnalyticsEntity. Поддерживается асинхронный и синхронный вызов.

DeleteAnalyticsEntity (tolka)

На входе идентификатор настройки сущности в аналитике

"cdb00bc8-7516-4349-8b88-dc58d0b6e1c1"

На выходе результат удаления настроек

true

Удаляет настройки для типа сущности в конкретной аналитике.

Имя команды для вызова: tolka_DeleteAnalyticsEntity. Поддерживается асинхронный и синхронный вызов.

ListAnalyticsEntity (tolka)

На входе фильтры для получения настроек для сущностей в аналитике

{
 "code": "MyEntity",
 "color": "#EBC425",
 "visibleOnDashboard": true
}

На выходе идентификатор созданных настроек

{
  "total": 2,
  "items": [
    {
      "id": "cdb00bc8-7516-4349-8b88-dc58d0b6e1c1",
      "version": 2,
      "code": "MyEntity",
      "color": "#FFD40A",
      "visibleOnDashboard": true
    },
    {
      "id": "75ec78a8-616a-46ce-a270-abfbe0515fd3",
      "version": 1,
      "code": "AnotherEntity",
      "color": "#CC6CDC",
      "visibleOnDashboard": false
    }
  ]
}

Возвращает список настроек для типов сущностей используемых в аналитике.
Применение настройки зависит от реализации аналитики. Список реализованых аналитик можно посмотреть в списке команд.

Имя команды для вызова: tolka_ListAnalyticsEntity. Поддерживается синхронный вызов.

Результат выполнения команды не журналируется.

Модели сервиса Tolka

BuildAnalyticsDTO (tolka)

Исходные данные для построения аналитики.

Поле Тип Обязательное Описание Ограничения
data List[StoredFile] Да Список ссылок на файлы с результатами LAMP - Значения в списке не пустые
- Элементы списка должны быть StoredFile закодированными в виде строки (URL)
settings SummaryAnalysisSettingsOld Да Настройки для построения аналитики

SummaryAnalysisSettingsOld (tolka)

Идентификатор конкретной версии политики.

Поле Тип Обязательное Описание Ограничения
thresholds Thresholds Да Информация об интервалах
entities List[GraphEntity] Да Информация о сущностях, которые требуются в аналитике

Threshold (tolka)

Информация о интервале, который используются для группировки объектов по значению определенной метрики

Поле Тип Обязательное Описание Ограничения
name AsciiCode Да Человекочитаемое наименование интервала Не пустое, 'A-Z' 'a-z' '0-9' '_'
title Title Да Человекочитаемое наименование интервала Не пустое
color HexColor Да Цвет для выделения объектов в данном интервале Формат Hexadecimal color
interval Interval Да Пороги значений для интервала Интервалы не должны пересекаться

GraphEntity (tolka)

Информация о сущности.

Поле Тип Обязательное Описание Ограничения
code String Да Код сущности
color String Да Цвет, связанный с данной сущностью
fieldName String Да Название поля, которое содержит значение для целевой метрики

BuildSummaryDTO (tolka)

Параметры для построения системного виджета сводных данных.

Поле Тип Обязательное Описание Ограничения
data List[StoredFile] Да Список ссылок на файлы с результатами LAMP - Значения в списке не пустые
- Элементы списка должны быть StoredFile закодированными в виде строки (URL)
settings AnalysisSettings Нет Настройки для построения аналитики

BuildWidgetDataDTO (tolka)

Параметры для построения данных для пользовательского виджета.

Поле Тип Обязательное Описание Ограничения
widgetId WidgetId Да ID виджета, для которого строятся данные
data List[StoredFile] Да Список ссылок на файлы с результатами LAMP - Значения в списке не пустые
- Элементы списка должны быть StoredFile закодированными в виде строки (URL)
settings AnalysisSettings Нет Настройки для построения аналитики

AnalysisSettings (tolka)

Настройки для построения аналитики. Если какие-либо настройки не указаны, то используется соответствующие глобальные настройки.

Поле Тип Обязательное Описание Ограничения
thresholds Map[String, Interval] Нет Информация об интервалах
entities List[EntityTypeId] Нет Коды сущностей, которые требуются в аналитике

Interval (tolka)

Закрытый интервал [from, to].

Поле Тип Обязательное Описание Ограничения
from Int Да Значение, с которого начинается интервал. Значение входит в интервал. Больше или равно 0
to Int Да Значение, до которого продолжается интервал. Значение входит в интервал. Меньше или равно 100

RelatednessAnalyticsResponse (tolka)

Данные для построения аналитики по relatedness, сгруппированные по интервалам.

Поле Тип Обязательное Описание Ограничения
buckets Map[String, AggregateBucketValue] Да Список бакетов, которые появляются в результате агрегации объектов по определенному значению (key в Map)
summary RelatednessSummaryOld Да Объекты, сгруппированные по типу сущности, которые попадают в интервал. Границы интервала соответствуют настройкам для Relatedness.

RelatednessSummaryOld (tolka)

Данные для построения аналитики по relatedness, сгруппированные по интервалам.

Поле Тип Обязательное Описание Ограничения
total Long Да Общее количество объектов.
high ObjectsRelatedness Да Объекты, сгруппированные по типу сущности, которые попадают в интервал. Границы интервала соответствуют настройкам для Relatedness.
medium ObjectsRelatedness Да Объекты, сгруппированные по типу сущности, которые попадают в интервал. Границы интервала соответствуют настройкам для Relatedness.
low ObjectsRelatedness Да Объекты, сгруппированные по типу сущности, которые попадают в интервал. Границы интервала соответствуют настройкам для Relatedness.

ObjectsSummary (tolka)

Данные для построения сводных данных по объектам, сгруппированные по интервалам, на основе метрики.

Поле Тип Обязательное Описание
total Long Да Общее количество объектов.
thresholds Map[String, ObjectsIntervalByMetric] Да Ключ - код интервала; значение - объекты, которые попадают в интервал

RelatednessWidgetData (tolka)

Данные для пользовательского виджета

Поле Тип Обязательное Описание
widgetId WidgetId Да ID виджета, для которого предназначены данные
buckets Map[String, AggregateBucketValue] Для виджетов типа BarChart Список бакетов, которые появляются в результате агрегации объектов по определенному значению.
summary ObjectsSummary Для виджетов типа LinearBar, PieChart, SummaryTable Данные для построения сводных данных, сгруппированные по интервалам.

ObjectsIntervalByMetric (tolka)

Объекты, сгруппированные по требуемому параметру (например типу сущности или значению поля сущности), которые попадают в интервал.
Соответствует типу Map[String, Page[ObjectIdWithMetric]].

ObjectIdWithMetric (tolka)

Идентификатор объекта и значение метрики. Метрика зависит от вызванной команды.

Поле Тип Обязательное Описание Ограничения
objectId ObjectId Да Идентификатор объекта Не пустое
metric Float Да Значение метрики от 0.0 до 1.0
relatedness Float Да Deprecated. Значение relatedness от 0.0 до 1.0

AnalyticsEntityId (tolka)

Соответствует типу UUID.

AsciiCode (tolka)

Соответствует типу String.
Формат должен соответствовать regular expression "^[A-Za-z0-9_]$".

HexColor (tolka)

Соответствует типу String.
Hexadecimal формат для обозначения цвета: #HexHexHexHex, где Hex это 2 символа в диапазонах 0-9 и a-f (регистр значения не имеет).
Первые три Hex обязательны (общая длина = 1+6), а четверный опционален и редко используется (обозначает прозрачность).

ThresholdsSettingId (tolka)

Соответствует типу UUID.

WidgetId (tolka)

Соответствует типу UUID.

ThresholdsSetting (tolka)

Настройки для порогов метрики в аналитике.

Поле Тип Обязательное Описание Ограничения
id ThresholdsSettingId Нет Идентификатор настройки. Если не задан, будет присвоен ID глобальных настроек "00000000-0000-0000-0000-000000000000".
version Int Нет Версия настройки. Если не задана, будет присвоена "1". Если глобальные настройки уже заданы и ID и версию не задать, то может привести к ошибке, т.к. версия будет отличаться от "1".
thresholds List[Threshold] Да Список интервалов значений для метрики. Интервалы не должны пересекаться.

Widget (tolka)

Данные виджета аналитики

Поле Тип Обязательное Описание Ограничения
id WidgetId Да Идентификатор виджета
title String Да Название виджета - Не пустое
- Не длиннее 256 символов
widgetType String Да Код типа виджета Должен соответствовать коду из справочника analyticsWidgetType
settings WidgetSettings Да Настройки виджета
visibility Boolean Да Видимость виджета на дашборде
position Int Да Позиция виджета на дашборде Больше 0
version Int Да Версия виджета

CreateWidgetDTO (tolka)

Параметры для создания нового виджета

Поле Тип Обязательное Описание Ограничения
title String Да Название виджета - Не пустое
- Не длиннее 256 символов
widgetType String Да Код типа виджета Должен соответствовать коду из справочника analyticsWidgetType
settings WidgetSettings Да Настройки виджета
visibility Boolean Да Видимость виджета на дашборде

UpdateWidgetDTO (tolka)

Параметры для обновления виджета

Поле Тип Обязательное Описание Ограничения
id WidgetId Да Идентификатор виджета
title String Да Название виджета - Не пустое
- Не длиннее 256 символов
widgetType String Да Код типа виджета Должен соответствовать коду из справочника analyticsWidgetType
settings WidgetSettings Да Настройки виджета
visibility Boolean Да Видимость виджета на дашборде
version Int Да Версия виджета

WidgetSettings (tolka)

Настройки виджета. Формат настроек зависит от типа виджета (поле widgetType).

Формат для типов виджета "Круговая диаграмма", "Линейный бар", "Сводная таблица":

Поле Тип Обязательное Описание Ограничения
showLegend Boolean Да Отображать ли легенду
entities List[String] Да Перечень кодов сущностей
fieldName String Нет Если выбрана одна сущность, то поле целевой метрики в этой сущности; иначе не используется.

Формат для типа виджета "Столбчатая диаграмма":

Поле Тип Обязательное Описание Ограничения
showLegend Boolean Да Отображать ли легенду
fieldType String Да Тип данных, по которым строится диаграмма
entities List[BarChartSettingsEntity] Да Перечень кодов сущностей и полей из них Все поля должны соответствовать типу, указанному в fieldType

BarChartSettingsEntity (tolka)

Информация о сущности для настроек виджета типа "Столбчатая диаграмма"

Поле Тип Обязательное Описание Ограничения
code EntityTypeId Да Код сущности
fieldName String Да Название поля, которое содержит значение для целевой метрики Поле должно содержаться в модели сущности, а также в качестве фасета в правилах ее поиска

ReorderWidgetsDTO (tolka)

Данные для перестановки местами двух виджетов

Поле Тип Обязательное Описание Ограничения
first ReorderWidgetDTO Да Первый виджет из пары меняемых местами
second ReorderWidgetDTO Да Второй виджет из пары меняемых местами

ReorderWidgetDTO (tolka)

Данные для изменения положения виджета

Поле Тип Обязательное Описание Ограничения
id WidgetId Да Идентификатор виджета
newPosition Int Да Новая позиция виджета на дашборде Больше 0
version Int Да Версия виджета

AnalyticsEntity (tolka)

Настройки для порогов метрики в аналитике.

Поле Тип Обязательное Описание Ограничения
id AnalyticsEntityId Да Идентификатор настройки Не пустое
version Int Да Версия настройки
code EntityTypeId Да Код сущности Не пустое
color HexColor Да Цвет, связанный с данной сущностью Формат Hexadecimal color
visibleOnDashboard Boolean Да Видимость сущности на дашбордах. В общей статистике объекты все равно учитываются

AnalyticsEntityCreateDTO (tolka)

Настройки для порогов метрики в аналитике.

Поле Тип Обязательное Описание Ограничения
code EntityTypeId Да Код сущности Не пустое
color HexColor Да Цвет, связанный с данной сущностью Формат Hexadecimal color
visibleOnDashboard Boolean Да Видимость сущности на дашбордах. В общей статистике объекты все равно учитываются

Сервис хранения UI

Сервис принимает команды и хранит состояние в PostgreSQL. Команды могут приходить как по HTTP, так и через Kafka в топик ui_storage_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Локальный запуск сервиса хранения UI

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск сервиса хранения UI из консоли с помощью SBT

UI_STORAGE_DB_HOST=localhost UI_STORAGE_DB_PORT=5432 UI_STORAGE_DB_NAME=UIStorage_db UI_STORAGE_DB_USER=postgres UI_STORAGE_DB_PASSWORD=12345 sbt boot/run

Список переменных окружения сервиса хранения UI

Переменная Тип Обязательная Значение по-умолчанию Описание
UI_STORAGE_HTTP_HOST string "0.0.0.0" Хост для HttpListener
UI_STORAGE_HTTP_PORT int 8192 Порт для HttpListener
UI_STORAGE_KAFKA_SERVERS string "localhost:9092" Адрес Kafka
UI_STORAGE_KAFKA_TOPIC string "ui_storage_commands" Название топика для команд
UI_STORAGE_KAFKA_CONSUMER_GROUP string "ui_storage_consumer_group" Название consumer-группы для чтения команд
UI_STORAGE_KAFKA_COMMANDEVENT_TOPIC string "commandevents" Название топика для отправки сообщений со статусом команд
UI_STORAGE_CONSUL_ADDR string "http://localhost:8500" Адрес Сonsul
UI_STORAGE_TRACE_DURATION bool false Признак необходимости трассировки выполнения команд
UI_STORAGE_DISCOVERABLE_ID string "ui_storage_instance" Id сервиса в ServiceDiscovery
UI_STORAGE_DISCOVERABLE_NAME string "UIStorage" Имя сервиса в ServiceDiscovery
UI_STORAGE_DISCOVERABLE_HOST string "localhost" Хост, публикуемый в ServiceDiscovery
UI_STORAGE_DISCOVERABLE_PORT int Порт, публикуемый в ServiceDiscovery
UI_STORAGE_DISCOVERABLE_LIVETIME duration string 2 minutes Период после отправки health check, в течение которого ServiceDiscovery считает сервис живым
UI_STORAGE_DISCOVERABLE_HEALTHPASS duration string 1 minute Периодичность отправки health check в ServiceDiscovery
UI_STORAGE_AKKA_HTTP_CLIENT_MAXCON int 512 Максимальное число одновременных исходящих HTTP-соединений
UI_STORAGE_AKKA_HTTP_CLIENT_MAXREQ int 1024 Максимальное число одновременных исходящих HTTP-запросов
UI_STORAGE_AKKA_HTTP_SERVER_MAXCON int 1024 Максимальное число одновременных входящих HTTP-соединений
UI_STORAGE_INTERNALCMD_ALLOW bool false Можно ли сервису отправлять внутрисистемные команды
UI_STORAGE_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string 10 minutes Время кэширования данных по командам из CommandDiscovery
UI_STORAGE_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
UI_STORAGE_DB_URL string Адрес базы данных. Можно использовать вместо DB_HOST, DB_PORT и DB_NAME
UI_STORAGE_DB_HOST string Хост сервера базы данных
UI_STORAGE_DB_PORT int Порт сервера базы данных
UI_STORAGE_DB_NAME string Название базы данных
UI_STORAGE_DB_USER string Пользователь базы данных
UI_STORAGE_DB_PASSWORD string Пароль для пользователя базы данных
UI_STORAGE_FS_URI string "http://localhost:9000" Адрес файлового хранилища
UI_STORAGE_FS_ACCESS_KEY_ID string "minioadmin" Идентификатор пользователя файлового хранилища
UI_STORAGE_FS_SECRET_ACCESS_KEY string "minioadmin" Пароль для пользователя файлового хранилища
UI_STORAGE_FS_UPLOAD_PARALLELISM int нет 4 Параллелизм для загрузки файлов
UI_STORAGE_FS_AUTH_MODE string нет "static" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
UI_STORAGE_FS_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с маппингом учетных записей
UI_STORAGE_FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
UI_STORAGE_FS_CACHE_TTL duration string нет Время жизни клиента в кеше
UI_STORAGE_FS_BUCKET_TEMP string "temp" Название бакета для временных файлов
UI_STORAGE_FS_BUCKET_PERMANENT string "uisettings" Название бакета для постоянных файлов
UI_STORAGE_AUTHZFORCE_ADDR string "http://localhost:8080/authzforce-ce" Адрес сервиса authzforce
UI_STORAGE_AUTHZFORCE_DOMAIN string "not defined" Доступный DomainID в Authzforce server

Команды сервиса хранения UI

Список реализованных в сервисе команд, моделей EntityType и действий Actions, которые можно использовать при настройке авторизации.
Не все поля EntityType доступны для использования в настройке авторизации.

Название команды EntityType Actions
ListFormTypes FormType UIStorage_ViewList
CreateForm - -
GetForm EntityFormSettings UIStorage_View
DeleteForm - -
UpdateForm - -
ListForms EntityFormSettingsDTO UIStorage_ViewList
GetEntityForm EntityFormSettings UIStorage_View
GetFormsByType EntityFormSettings UIStorage_ViewList
ListKeys GlobalSetting UIStorage_ViewList
GetValue GlobalSetting UIStorage_View
CreateKey GlobalSetting UIStorage_CRUD
UpdateKey GlobalSetting UIStorage_CRUD
UpdateValue GlobalSetting UIStorage_UpdateValue
DeleteKey GlobalSetting UIStorage_CRUD
PersistFile GlobalSetting UIStorage_UpdateValue

Доступные для авторизации поля моделей сервиса хранения UI

EntityFormSettings (AuthzDTO, UI Storage)

Поле Тип Actions Описание
id EntityFormSettingsId UIStorage_View, UIStorage_ViewList ID формы
entityType String UIStorage_View, UIStorage_ViewList Тип сущности (127 символов)
formData Json UIStorage_ViewList Данные формы
formType String UIStorage_View Code типа формы
formType FormTypeId UIStorage_ViewList ID типа формы

EntityFormSettingsDTO (AuthzDTO, UI Storage)

Поле Тип Actions Описание
id EntityFormSettingsId UIStorage_View, UIStorage_ViewList ID формы
entityType String UIStorage_View, UIStorage_ViewList Тип сущности
formType FormType UIStorage_View, UIStorage_ViewList Тип формы

FormType (AuthzDTO, UI Storage)

Поле Тип Actions Описание
code String UIStorage_View, UIStorage_ViewList Код типа формы
title String UIStorage_View, UIStorage_ViewList Заголовок типа формы

GlobalSettigns (AuthzDTO, UI Storage)

Поле Тип Actions Описание
key GlobalSettingKey UIStorage_View, UIStorage_ViewList, UIStorage_CRUD, UIStorage_UpdateValue Ключ для идентификации настроек
title String UIStorage_ViewList Название настроек
value Json UIStorage_ViewList Данные описывающие настройки

ListFormTypes (UI Storage)

Получаем JSON со списком всех существующих типов форм

[
    {
        "id": "ef965621-3cb9-45f3-ab08-aefd8ab9069f",
        "code": "card",
        "title": "Карточка объекта",
        "description": "Карточка объекта"
    },
    {
        "id": "331026b6-0387-4728-b0fc-8d313ab28984",
        "code": "createForm",
        "title": "Форма создания",
        "description": "Форма создания"
    }
]

Возвращает список всех существующих типов форм.

Поддерживается только синхронный вызов.

Команда Путь
UIStorage_http_ListFormTypes HTTP POST "/v1/form/listFormTypes"

CreateForm (UI Storage)

Передаем JSON с данными формы

{
    "entityType": "document",
    "formType": "e4fdad30-f658-4d89-86d3-14cb14ff6660",
    "formData": {
        "field1": "value1"
    }
}

Получаем Id формы

"0ccd05ac-50c0-4e7e-906b-6893eaa8d9de"

Создать новую форму из данных EntityFormSettingsCreateDTO. Гарантируется уникальность для набора полей: entityType, formType. Пустая строка в поле entityType не допускается.

В ответ приходит Id формы.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
UIStorage_kafka_CreateForm Kafka Topic "ui_storage_commands"

GetForm (UI Storage)

Передаем Id формы

"63680617-1cda-40db-bd99-303fbfcbb736"

Получаем JSON с данными формы

{
    "id": "63680617-1cda-40db-bd99-303fbfcbb736",
    "entityType": "organization",
    "formType": "ef965621-3cb9-45f3-ab08-aefd8ab9069f",
    "formData": {
        "field1": "value1"
    },
    "version": 1
}

Возвращает форму EntityFormSettings по её Id.

Поддерживается только синхронный вызов.

Команда Путь
UIStorage_http_GetForm HTTP POST "/v1/form/getForm"

DeleteForm (UI Storage)

Передаем Id формы

"0ccd05ac-50c0-4e7e-906b-6893eaa8d9de"

Получаем результат

1

Удалить существующую форму по её Id.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
UIStorage_kafka_DeleteForm Kafka Topic "ui_storage_commands"

UpdateForm (UI Storage)

Передаем JSON данные для обновления

{
    "id": "0ccd05ac-50c0-4e7e-906b-6893eaa8d9de",
    "formData": {
        "field1": "newValue"
    },
    "version": "1"
}

Получаем результат

1

Обновить существующую форму данными из EntityFormSettingsForUpdate. При успешном обновлении version формы увеличивается на единицу.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
UIStorage_kafka_UpdateForm Kafka Topic "ui_storage_commands"

ListForms (UI Storage)

Получаем JSON со списком всех форм с типом

[
    {
        "id": "b13971a2-5d00-4455-bd48-4e4256157353",
        "entityType": "document",
        "formType": {
            "code": "card",
            "title": "Карточка объекта"
        }
    },
    {
        "id": "fd460be0-99f6-4cfc-95eb-2e3f6a847efe",
        "entityType": "employee",
        "formType": {
            "code": "list",
            "title": "Список"
        }
    }
]

Возвращает список всех форм с типом, отсортированный по entityType.

Поддерживается только синхронный вызов.

Команда Путь
UIStorage_http_ListForms HTTP POST "/v1/form/listForms"

GetEntityForm (UI Storage)

Передаем JSON

{
    "entityType": "document",
    "formType": "card"
}

Получаем JSON с данными формы

{
    "id": "5fe0c0fc-f79a-4a0f-b741-7717c03ad5ed",
    "entityType": "document",
    "formType": "e4fdad30-f658-4d89-86d3-14cb14ff6661",
    "formData": {
        "field1": "value1"
    },
    "version": 1
}

Возвращает форму EntityFormSettings по коду типа объекта entityType из EntityFormSettings и коду типа формы code из FormType из справочника.

Поддерживается только синхронный вызов.

Команда Путь
UIStorage_http_GetEntityForm HTTP POST "/v1/form/getEntityForm"

GetFormsByType (UI Storage)

Передаем JSON со списком типов форм

[
    "textSearchSnippet",
    "card"
]

Получаем JSON со списком форм

[
    {
        "id": "bb02daf9-5386-471e-93c0-04344c74272c",
        "entityType": "document",
        "formType": "8eb3e3a7-1e4a-4759-b0be-1cc809088fb2",
        "formData": {
            "field1": "value1"
        },
        "version": 1
    },
    {
        "id": "f755bbcd-7a67-4ad4-bcab-839323d54398",
        "entityType": "organization",
        "formType": "eddce6fe-8f62-4e4f-97a6-c1b40eb59244",
        "formData": {
            "field1": "value1"
        },
        "version": 1
    }
]

Возвращает список форм на основе списка их типов. Если список типов форм пустой, то возвращается список всех форм.

Поддерживается только синхронный вызов.

Команда Путь
UIStorage_http_GetFormsByType HTTP POST "/v1/form/getFormsByType"

ListKeys (UI Storage)

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

[
  {
    "key": "logo",
    "value": "<svg><circle cx=\"10\" cy=\"10\" r=\"10\"/></svg>",
    "title": "Логотип",
    "created": 1634644383273,
    "modified": 1634644383273,
    "lastUser": "d3f7d9c4-43aa-49ae-9d66-1d500f53cf3d",
    "version": 1
  },
  {
    "key": "color",
    "value": "#fcbe03",
    "title": "Цвет",
    "created": 1634644887499,
    "modified": 1634644887499,
    "lastUser": "d3f7d9c4-43aa-49ae-9d66-1d500f53cf3d",
    "version": 2
  }
]

Возвращает список всех существующих глобальных настроек.

Поддерживается только синхронный вызов.

Команда Путь
UIStorage_http_ListKeys HTTP POST "/v1/global/listKeys"

GetValue (UI Storage)

Передаем ключ глобальной настройки

"color"

Получаем значение глобальной настройки

"#fcbe03"

Возвращает JSON-значение глобальной настройки по ключу key.

Поддерживается только синхронный вызов.

Команда Путь
UIStorage_http_GetValue HTTP POST "/v1/global/getValue"

CreateKey (UI Storage)

Передаем данные глобальной настройки

{
  "key": "color",
  "value": "#fcbe03",
  "title": "Цвет"
}

Получаем признак успешности

true

Создать новую глобальную настройку из данных CreateKeyDTO.
Гарантируется уникальность для поля key.

В ответ приходит признак успешности выполнения команды.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
UIStorage_kafka_CreateKey Kafka Topic "ui_storage_commands"

UpdateKey (UI Storage)

Передаем данные глобальной настройки для обновления

{
  "key": "color",
  "value": "#fcbe04",
  "title": "Цвет фона",
  "version": 1
}

Получаем признак успешности

true

Обновить существующую глобальную настройку данными из UpdateKeyDTO.
При успешном обновлении version настройки увеличивается на единицу.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
UIStorage_kafka_UpdateKey Kafka Topic "ui_storage_commands"

UpdateValue (UI Storage)

Передаем данные глобальной настройки для обновления

{
  "key": "color",
  "value": "#fcbe05",
  "version": 1
}

Получаем признак успешности

true

Обновить значение существующей глобальной настройки из UpdateValueDTO.
При успешном обновлении version настройки увеличивается на единицу.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
UIStorage_kafka_UpdateValue Kafka Topic "ui_storage_commands"

DeleteKey (UI Storage)

Передаем ключ глобальной настройки

"color"

Получаем признак успешности

true

Удалить существующую глобальную настройку по её ключу key.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
UIStorage_kafka_DeleteKey Kafka Topic "ui_storage_commands"

PersistFile (UI Storage)

Передаем список файлов и связанных ключей глобальных настроек

[
  {
    "path": "logo/background",
    "tempFileId": "ec476b5d-7cea-4138-b537-8f3032f33ac4"
  },
  {
    "path": "theme-color",
    "tempFileId": "f0e1f19a-c386-48aa-874f-d58ff9a147e3"
  }
]

Получаем список url для сохраненных файлов

[
  {
    "path": "logo/background",
    "fileUrl": "uisettings/logo/ec476b5d-7cea-4138-b537-8f3032f33ac4"
  },
  {
    "path": "theme-color",
    "fileUrl": "uisettings/theme-color/f0e1f19a-c386-48aa-874f-d58ff9a147e3"
  }
]

Сохранить файлы для указанных глобальных настроек по пути path.

Поддерживается асинхронный и синхронный вызов.

Команда Путь
UIStorage_kafka_PersistFile Kafka Topic "ui_storage_commands"

Модели сервиса хранения UI

В сервисе использованы следующие модели:

FormTypeId (UI Storage)

Поле Тип Описание
asUUID UUID ID типа формы

FormType (UI Storage)

Поле Тип Описание
id FormTypeId ID типа формы
code String Код типа формы (127 символов)
title String Заголовок типа формы (127 символов)
description Option[String] Описание типа формы (127 символов)

Встроенный справочник:

code title description
card Карточка объекта Карточка объекта
createForm Форма создания Форма создания
editForm Форма редактирования Форма редактирования
list Список Элемент списка в реестре объектов
textSearchSnippet Сниппет текстового поиска Сниппет текстового поиска
smartSearchSnippet Сниппет интеллектуального поиска Сниппет интеллектуального поиска

EntityFormSettingsId (UI Storage)

Поле Тип Описание
asUUID UUID ID формы

EntityFormSettingsCreateDTO (UI Storage)

Поле Тип Описание
entityType String Тип сущности (127 символов)
formType FormTypeId ID типа формы
formData Json Данные формы

EntityFormSettings (UI Storage)

Поле Тип Описание
id EntityFormSettingsId ID формы
entityType String Тип сущности (127 символов)
formType FormTypeId ID типа формы
formData Json Данные формы
version Int Версия

EntityFormSettingsForUpdate (UI Storage)

Поле Тип Описание
id EntityFormSettingsId ID формы
formData Json Данные формы
version Int Версия

EntityTypeWithFormType (UI Storage)

Поле Тип Описание
entityType String Код типа объекта
formType String Код типа формы

EntityFormSettingsDTO (UI Storage)

Поле Тип Описание
id EntityFormSettingsId ID формы
entityType String Тип сущности
formType FormTypeDTO Тип формы

FormTypeDTO (UI Storage)

Поле Тип Описание
code String Код типа формы
title String Заголовок типа формы

GlobalSettingKey (UI Storage)

Поле Тип Описание
raw String Ключ глобальной настройки (64 символа)

GlobalSetting (UI Storage)

Поле Тип Описание
key GlobalSettingKey Ключ глобальной настройки (64 символа)
value Json Значение глобальной настройки
title String Название глобальной настройки (127 символов)
created Long Дата создания
modified Long Дата обновления
lastUser Option[UUID] Пользователь, выполнивший последнее обновление (опциональное)
version Int Версия (optimistic lock)

CreateKeyDTO (UI Storage)

Поле Тип Описание
key GlobalSettingKey Ключ глобальной настройки (64 символа)
value Json Значение глобальной настройки
title String Название глобальной настройки (127 символов)

UpdateKeyDTO (UI Storage)

Поле Тип Описание
key GlobalSettingKey Ключ глобальной настройки (64 символа)
value Json Значение глобальной настройки
title String Название глобальной настройки (127 символов)
version Int Версия (optimistic lock)

UpdateValueDTO (UI Storage)

Поле Тип Описание
key GlobalSettingKey Ключ глобальной настройки (64 символа)
value Json Значение глобальной настройки
version Int Версия (optimistic lock)

PersistFileDTO (UI Storage)

Поле Тип Описание
key GlobalSettingKey Ключ глобальной настройки (64 символа)
tempFileId String ID временного файла

GlobalSettingFile (UI Storage)

Поле Тип Описание
key GlobalSettingKey Ключ глобальной настройки (64 символа)
fileUrl String URL к сохраненному файлу

Профили пользователей

Сервис профилей пользователей выступает в роли прокси к модели данных. Предоставляет более удобный интерфейс для работы конкретно с профилями пользователей, чем модель данных.

В сервисе предусмотрены следующие команды (все команды начинаются с префикса "userProfile_"):

Также сервис слушает события из авторизации и создает профили при регистрации.

Конфигурирование

Для работы сервису нужно стандартное окружение Verdi, а также сервис модели данных, работающий в этом окружении.

Список переменных окружения

Переменная Тип Значение по умолчанию Описание
SERVER_PORT int 8080 Порт сервера
USER_PROFILE_CONSUMER_GROUP string user-profile-service Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
USER_PROFILE_CONSUMER_TOPIC string user-profile-service-commands Имя кафка-топика с командами для этого сервиса
USER_PROFILE_COMMANDS_CONSUMER_PARALLELISM int 16 Параллелизм при обработке команд
VERDI_CONSUL string http://localhost:8500 Адрес сервера consul
VERDI_CONSUL_AUTH_USER string нет Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
VERDI_CONSUL_AUTH_PASSWORD string нет Пароль учетной записи Сonsul.
VERDI_KAFKA_ADDRESS string localhost:9092 Адрес брокера Kafka.
VERDI_KAFKA_TOPIC string нет Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
VERDI_KAFKA_AUTH_USER string нет Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
VERDI_KAFKA_AUTH_PASSWORD string нет Пароль учетной записи Kafka.
VERDI_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
VERDI_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет Пароль к харнилищу сертификатов.
VERDI_HOST string localhost Адрес service discovery для Verdi
VERDI_TTL duration
string
30 seconds Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
VERDI_HEALTH_CHECK duration
string
10 seconds Периодичность отправки health check в ServiceDiscovery
VERDI_COMMAND_STORAGE_UPDATE_PERIOD duration
string
1 minutes Время кэширования данных по командам из CommandDiscovery
VERDI_SERVICE_DISCOVERY_UPDATE_PERIOD duration
string
30 seconds Время кэширования данных по сервисам из ServiceDiscovery
VERDI_ALLOW_INTERNAL_COMMANDS bool true Можно ли сервису отправлять внутрисистемные команды
VERDI_CONSUL_CONNECTION_MAX_RETRY int 5 Максимальное количество попыток подключений к Consul
VERDI_CONSUL_CONNECTION_RETRY_DELAY duration
string
1 seconds Таймаут между неудачными попытками подключения к Consul
VERDI_KAFKA_SYNC_POLLING_PERIOD duration
string
1 seconds
VERDI_KAFKA_SYNC_POLLING_TIMEOUT duration
string
1 seconds
VERDI_NON_BLOCKING_PARALLELISM int 2 Количество потоков в асинхронном пуле для senderlib
USER_PROFILE_DATA_MODEL_COMMANDS_PREFIX string commands/userProfile Префикс по которому модель данных принимает команды
USER_PROFILE_USER_EVENTS_TOPIC string userEvents Топик с событиями из авторизации о регистрации пользователей
USER_PROFILE_USER_EVENTS_HANDLING_PARALLELISM int 16 Параллелизм при обработке событий о регистрациях пользователей
USER_PROFILE_DB_JDBC_URL string jdbc:postgresql://127.0.0.1:5432/userprofile Адрес Postgres
USER_PROFILE_DB_USER string postgres Имя пользователя в базе данных
USER_PROFILE_DB_PASSWORD string postgres Пароль к базе данных

Команды

createProfileSection

На входе объект с секцией

{
  "title": "test section"
}

На выходе Id созданной секции

"test_section"

Создает секцию в профиле пользователя. Если явный Id не указан, генерирует его автоматически, заменяя " " на "_" и транслитерируя символы кириллицы в латиницу.

deleteProfileSection

На входе Id секции

"test_section"

На выходе ничего

{}

Удаляет секцию в профиле пользователя по ее Id.

updateProfileSection

Объект для изменения секции

{
  "id": "test_section",
  "title": "new test title",
  "description": "test description"
}

На выходе ничего

{}

Меняет название и описание секции.

getProfileSections

На входе ничего

{}

На выходе список информаций о секции

[
  {
    "title": "Профиль пользователя",
    "id": "userProfile",
    "description": ""
  },
  {
    "title": "Основные данные",
    "id": "basicData",
    "description": ""
  },
  {
    "title": "Test title",
    "id": "test_title",
    "description": "Test title"
  }
]

Возвращает список секций в структуре профиля.

addProfileField

На входе объект с информацией о поле

{
  "sectionId": "test_section",
  "title": "Тестовое поле",
  "type": "string",
  "multiple": false,
  "settings": {
    "maxLength": 100
  }
}   

На выходе Id нового поля

"Testovoye_pole"

Создает поле в секции профиля. Если явный Id поля не указан, генерирует его автоматически, заменяя " " на "_" и транслитерируя символы кириллицы в латиницу.

deleteProfileField

На входе Id секции и Id поля

{
  "sectionId": "test_section",
  "fieldId": "Testovoye_pole"
}

На выходе ничего

{}

Удаляет поле в секции.

updateProfileField

На входе новые параметры поля

{
  "sectionId": "test_section",
  "fieldId": "Testovoye_pole",
  "title": "new test title",
  "description": "updated description",
  "settings": {
    "maxLength": 150
  }
}

На выходе ничего

{}

Изменяет некоторые параметры поля.

getProfileSectionFields

На входе Id секции

"basicData"

На выходе список полей в секции

[
  {
    "sectionId": "basicData",
    "fieldId": "secondName",
    "type": "string",
    "title": "Фамилия",
    "description": "",
    "multiple": false,
    "nullable": false,
    "settings": {
      "maxLength": 64
    }
  },
  {
    "sectionId": "basicData",
    "fieldId": "name",
    "type": "string",
    "title": "Имя",
    "description": "",
    "multiple": false,
    "nullable": false,
    "settings": {
      "maxLength": 64
    }
  },
  {
    "sectionId": "basicData",
    "fieldId": "email",
    "type": "string",
    "title": "Email",
    "description": "",
    "multiple": false,
    "nullable": false,
    "settings": {
      "maxLength": 64
    }
  },
  {
    "sectionId": "basicData",
    "fieldId": "middleName",
    "type": "string",
    "title": "Отчество",
    "description": "",
    "multiple": false,
    "nullable": true,
    "settings": {
      "maxLength": 64
    }
  }
]

Возвращает список полей в секции.

getUserProfile

На входе Id пользователя и список секций, которые нужно получить

{
    "userId": "5dfbbda7-b340-4a04-aae2-da4379f89eb9",
    "sections": ["basicData"]
}

На выходе полная информация о пользователя

{
  "id": "5dfbbda7-b340-4a04-aae2-da4379f89eb9",
  "created": 1654608945300,
  "modified": 1654609126388,
  "version": 1,
  "sections": {
    "basicData": {
      "name": "John",
      "email": "emailname@mail.io9",
      "middleName": "Jovonovich",
      "secondName": "Week"
    }
  }
}

Возвращает информацию о пользователе. Если передать список секций, то возвращает не всю информацию, а только запрошенные секции.

setUserProfileField

На входе информация для обновления поля профиля

{
    "userId": "5dfbbda7-b340-4a04-aae2-da4379f89eb9",
    "section": "basicData",
    "field": "name",
    "value": "JohnJohn",
    "version": 3
}

На выходе новая версия

4

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

Обрабатываемые события

События слушаются в USER_PROFILE_USER_EVENTS_TOPIC

Источник событий eventType payloadType Описание
mon registration user Создает профиль пользователя при авторизации

Объекты

Типы данных, который принимают или возвращают команды сервиса.

AddSectionField

Поле Тип Описание
sectionId String Id секции, в которую поместить поле
fieldId Option[String] Id поля
title String Название поля
type String Тип поля
description Option[String] Описание поля
multiple Boolean Множественное ли поле
settings Option[Json] Дополнительные настройки поля

CreateSection

Поле Тип Описание
title String Название секции
id Option[String] Id секции
description Option[String] Описание секции

DeleteSectionField

Поле Тип Описание
sectionId String Id секции с полем
fieldId String Id поля

Section

Поле Тип Описание
title String Название секции
id String Id секции
description Option[String] Описание секции

SectionField

Поле Тип Описание
sectionId String Id секции с полем
fieldId String Id поля в секции
title String Название поля
type String Тип поля
description String Описание поля
multiple Boolean Множественное ли поле
nullable Boolean Обязательное ли поле
settings Json Дополнительные настройки поля

UpdateSectionField

Поле Тип Описание
sectionId String Id секции с полем
fieldId String Id поля
title String Новое название поля
description Option[String] Новое описание поля
settings Json Новые дополнительные настройки поля

UserProfile (dto)

Поле Тип Описание
id String Id пользователя
created Long Время создания
modified Long Время последнего изменения
version Int Версия для борьбы с потерями обновлений
sections Map[String, Json] Данный из секций профиля

GetUserProfile (dto)

Поле Тип Описание
userId String Id пользователя
sections Option[String[]] Список секций, которые нужно вернуть

SetProfileField (dto)

Поле Тип Описание
userId String Id пользователя
section String Секция, в которой находится поле для изменения
field String Название поля, которое нужно поменять
value Json Новое значение для этого поля
version Int Версия полученная в составе UserProfile