NAV
json

Cursor

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

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

v1.8

Важные изменения

v1.7.1

Важные изменения

v1.7

Важные изменения

v1.6.1

Важные изменения

v1.6

Важные изменения

v1.5.3

v1.5.2

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

v1.5.1

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

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 нет Параметры пейджинга. В случае отсутствия данного поля, считается что пейджинг указан как "Номер страницы - 1, число элементов - 10".

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. Добавлено для более удобной навигации.

CommandStatus

Описывает статус выполнения команды.

Возможные значения Описание Дополнительно
Created Команда создана Обязательный начальный статус
InProcess Началась обработка команды Необязательный промежуточный статус
Completed Команда завершена Конечный статус. Считается успешным.
Failed Команда завершена с ошибкой Конечный статус. Считается неуспешным.
TimedOut Команда не завершилась за заданное время. Выполнение прекращено. Конечный статус. Считается неуспешным.

ErrorResponse

Ответ команды с ошибкой в качестве результата.

Название поля Тип Обязательное Описание
code ErrorResponseCode да Тип ошибки
message String нет Сообщение об ошибке (см. https://confluence.dev.embedika.ru/pages/viewpage.action?pageId=889782432)
stackTrace String нет Информация о стеке вызовов во время ошибки
businessError Json нет Константа описывающая бизнес-ошибку (контекстно-специфичный код ошибки)
data Json нет Данные, которые необходимо передавать клиенту вместе с ошибкой
cause Throwable нет Поле не участвует в сериализации. Содержит исключение, которое является причиной ошибки.

ErrorResponseCode

Код обозначающий тип ошибки в ответе.

Возможные значения Тип Описание
InvalidParameters String Для команды переданы неверные параметры.
NotAvailableDestinations String Нет ни одного доступного получателя для данной команды.
NotValidResponse String Некорректный HTTP ответ по команде.
CannotWaitCommandCompletion String Async команда не успела завершится за определенное время.
CannotSend String Невозможно отправить команду или результат ее работы. Содержит описание причины.
Exception String Необработанный exception. Может содержать Throwable и его сообщение, являющийся причиной ошибки.
HttpError(statusCode: Int) Json Результат команды следует интерпретировать как HttpResponse с определенным статусом.

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 List[String] Нет Список альтернативных названий бакета. Не пустое
credentials FSCredentials Да Данные учетной записи для подключения к бакету.

FSCredentials (FSClient)

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

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

VerdiCacheConfig (Verdi-cache)

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

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

KafkaAuthConfig (senderlib)

Параметры для авторизации kafka-клиента (доступ к топикам).

Поле Тип Обязательное Описание Ограничения
user string Да Имя пользователя
password string Да Пароль пользователя
truststore TrustStoreConfig Нет Параметры для хранилища сертификатов
topic string Нет Название топика, к которому привязаны данные
kind string Нет Тип сущности, к которой привязаны данные "producer" или "consumer" или "both"(равнозначно параметрам, валидным для "producer" и "consumer") или "admin"(не входит в "both")

TrustStoreConfig (senderlib)

Параметры для хранилища сертификатов (Java key store)

Поле Тип Обязательное Описание Ограничения
location string Да Путь до хранилища сертификатов
password string Нет Пароль к хранилищу сертификатов

KafkaAuthSettings (senderlib)

Параметры для авторизации kafka-клиента (доступ к топикам).

Поле Тип Обязательное Описание Ограничения
staticAuth KafkaAuthConfig Нет Данные для статической аутентификации (не зависит от топика)
authMode string Нет Режим аутентификации "Static"(одна учетная запись на все запросы) или "Mapping"(учетная запись зависит от запроса)
authConfig string Нет Данные для аутентификации в указанном режиме, если он отличается от KafkaAuthMode.Static Строка в формате JSON с типом List[KafkaAuthConfig]
clientsCache VerdiCacheConfig Нет Настройки кеширования Kafka-клиентов

RetrySettings (senderlib)

Настойки для повтороного вызова функций

Поле Тип Обязательное Описание Ограничения
attempts string Да Максимальное количество повторных вызовов. Чтобы исключить возможность повторного вызова, нужно установить значение 0.
delay duration string Да Константная задержка перед повторным вызовом

CommandResultRetryConditionKind (senderlib)

Вид условия, по которому результат команды будет считаться неуспешным и команду следует вызвать повторно.
Соответствует типу String.

Возможные значения Описание
OnFailStatuses Если результат команды ErrorResponse или результат имеет CommandStatus, который является неуспешным
OnAllExceptions Если результат команды ErrorResponse и имеет ErrorResponseCode = Exception
OnSomeExceptions(Name1, Name2, ..) Содержит список значений с разделителем , (запятая). Если результат команды ErrorResponse, имеет ErrorResponseCode = Exception. Значения в полях message или cause должны содержать одно из значений.

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

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

Фильтрация

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

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

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

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

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

3) Условие наличия всех значений из предоставленного списка в массиве всех значений objectFieldName, которые присутствуют в объектах поля arrayFieldName. Работает только для полей arrayFieldName, содержащих массив. Предоставленный в запросе список должен содержать не менее двух значений.
{ "context": { "arrayFieldName.objectFieldName": "all[первое значение, второе, другое]" } }

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

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

6) Условие текствого поиска PGSQL
Значение поля обязательно должно начинаться со слова ts.
{ "context": { "fieldName": "ts (this | that) & the:*" } }

Сортировка

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

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

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

Основное

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

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

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

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

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

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

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

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

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

Настройки PostgreSQL:

Переменная Описание Значение по умолчанию
ADAPTER_FOLDER_DB_THREADS Количество потоков в пуле потоков для соединения с БД 10
ADAPTER_FOLDER_DB_QUEUE_SIZE Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей 300
ADAPTER_FOLDER_DB_CONN_MAX Максимальное количество одновременных подключений к БД 10
ADAPTER_FOLDER_DB_CONN_TIMEOUT Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. 20 second
ADAPTER_FOLDER_DB_ISOLATION Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. "READ_COMMITTED"
ADAPTER_FOLDER_DB_READONLY Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. false
ADAPTER_FOLDER_DB_CONN_MIN Минимальное количество одновременных подключений к БД = DB_THREADS
ADAPTER_FOLDER_DB_VALIDATION_TIMEOUT Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. 1 seconds
ADAPTER_FOLDER_DB_IDLE_TIMEOUT Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. 10 minutes
ADAPTER_FOLDER_DB_MAX_LIFETIME Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. 30 minutes
ADAPTER_FOLDER_DB_INITIALIZATION_FAIL_FAST Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. false
ADAPTER_FOLDER_DB_LEAK_DETECTION_THRESHOLD Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. 0
ADAPTER_FOLDER_DB_CONNECTION_TEST_QUERY Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). "SELECT 1"
ADAPTER_FOLDER_DB_REGISTER_MBEANS Зарегистрированы ли JMX Management Beans («MBeans») false

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

Переменная Описание Значение по умолчанию
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 Пароль пользователя БД
DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
LOG_OUTPUT string нет STDOUT Параметры вывода логов: STDOUT - обычный лог, STDOUT_CEF - лог в формате CEF
LOG_LEVEL_HTTP string нет WARN Уровень логирования HTTP-сервера
LOGGING_SRC_IP string нет Параметр SRC (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, src=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_SRC_HOST string нет Параметр SHOST (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".
LOGGING_DST_IP string нет Параметр DST (получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена, dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_CEF_VER int нет 0 Версия формата CEF: либо 0, либо 1. Рекомендуется использовать 0.
VERDI_COMMANDS_HTTP_RETRY_ATTEMPTS int нет 5 Поле attempts из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_DELAY duration string нет "5 seconds" Поле delay из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_KIND string нет "OnSomeExceptions(ConnectException)" CommandResultRetryConditionKind

Формат CEF для логов сервиса Bush

У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.

Чтобы включить логирование в формате CEF, нужно задать переменную LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то необходимо задать следующие переменные, которые по умолчанию не заданы:

В файле src/main/resources/log4j.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.

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

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_KAFKA_AUTH_MODE string нет "" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
DATA_MODEL_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
DATA_MODEL_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кэша для Kafka producer (количество активных соединений).
DATA_MODEL_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кэше.
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_DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
DATA_MODEL_DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
DATA_MODEL_DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
DATA_MODEL_DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
DATA_MODEL_DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
DATA_MODEL_DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
DATA_MODEL_DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
DATA_MODEL_DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
DATA_MODEL_DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
DATA_MODEL_DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
DATA_MODEL_DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
DATA_MODEL_DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
DATA_MODEL_DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
DATA_MODEL_DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
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 с List[FSBucketConfig] соответствует полю authConfig FSConfigRep
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 команд
DATA_MODEL_AUTHORIZER_KIND string нет "authzforce" Вид авторизатора, который используется в сервисе. Допустимые значения: "authzforce", "oberto". При указании неизвестного значения будет использовано значение по-умолчанию.
DATA_MODEL_LOG_OUTPUT string нет "STDOUT" Параметры вывода логов: STDOUT - обычный лог в консоль, STDOUT_CEF - лог в формате CEF в консоль, FILE - обычный лог в файл, FILE_CEF - лог в формате CEF в файл.
Может принимать несколько значений через любой разделитель (например, "STDOUT FILE_CEF"). Преобразования, если указано несколько значений: присутствуют "STDOUT" + "STDOUT_CEF" = учитывается только "STDOUT_CEF"; "FILE" + "FILE_CEF" = "FILE_CEF";
DATA_MODEL_LOGGING_SRC_IP string нет Параметр SRC (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, src=notFound. Требуемый формат: IPv4, например "192.168.10.1".
DATA_MODEL_LOGGING_SRC_HOST string нет Параметр SHOST (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".
DATA_MODEL_LOGGING_DST_IP string нет Параметр DST (получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена, dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".
DATA_MODEL_LOGGING_CEF_VER int нет 0 Версия формата CEF: либо 0, либо 1. Рекомендуется использовать 0.
DATA_MODEL_SENDERLIB_COMMANDS_HTTP_RETRY_ATTEMPTS int нет 5 Поле attempts из RetrySettings
DATA_MODEL_SENDERLIB_COMMANDS_HTTP_RETRY_DELAY duration string нет "5 seconds" Поле delay из RetrySettings
DATA_MODEL_SENDERLIB_COMMANDS_HTTP_RETRY_KIND string нет "OnSomeExceptions(ConnectException)" CommandResultRetryConditionKind

Формат CEF для логов сервиса Data model

У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.

Чтобы включить логирование в формате CEF, нужно задать переменную LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то необходимо задать следующие переменные, которые по умолчанию не заданы:

В файле boot/src/main/resources/logback.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.

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

Список реализованных в сервисе команд, моделей 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 - -
softDeleteObject Произвольный EntityType из ObjectStorage DataModel_DeleteObject
deleteObject Произвольный EntityType из ObjectStorage DataModel_DeleteObject
deleteObjectBatch Список произвольных EntityObjectId -
deleteObjectSearch Произвольный ListObjects -
deleteExternalObject - -
getFile Произвольный EntityType из ObjectStorage DataModel_GetObject
listObjects Произвольный EntityType(берется на проверку из input.entityType) из ObjectStorage DataModel_GetObject
listObjectsMeta Произвольный EntityType(берется на проверку из input.entityType) из ObjectStorage DataModel_GetObject
listFilesInfoWithTags - DataModel_GetObject
listTagsWithFilesCount - DataModel_GetObject
listFileExtensions - DataModel_GetObject
listObjectTitlesV2 Произвольный EntityType(берется на проверку из input.entityType) из ObjectStorage DataModel_GetObject
listObjectTitles - DataModel_GetObject
listDataModels - DataModel_GetDataModel
listRelations Произвольный EntityType(берется на проверку из input.entityType и input.relatedEntityType) из ObjectStorage DataModel_GetRelation
listRelationsBatch Произвольный EntityType(берется на проверку из input.entityType и input.relatedEntityType) из ObjectStorage DataModel_GetRelation
listAllRelations Произвольный EntityType(берется на проверку из input.entityType) из ObjectStorage DataModel_GetRelation
listRelationsByType Произвольный EntityType(берется на проверку из input.entityFrom и input.entityTo) из ObjectStorage DataModel_GetRelation

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",
    "title1": "Автор договора",
    "title2": "Договора автора",
    "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), не требует аутентификации.

SoftDeleteObject

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

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

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

true

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

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

Отмечает в БД объект сущности как удаленный. События, файлы, ссылки и отношения связанные с этим объектом должны измениться как и при обычном удалении.

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

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

Удаление объектов сущностей по списку. Если у объектов есть связи, они тоже будут удалены.
Если входные данные для команды содержат идентификаторы объектов, которые не существуют (например, были удалены ранее), то мы считаем такие идентификаторы "ранее удаленными" и команда пытается удалить остальные существующие идентификаторы. В таком случае, количество удаленных записей будет меньше, чем изначальное количество идентификаторов.

Имя команды для вызова: 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

На входе параметры спискового запроса

{
  "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

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

ListObjectTitlesV2

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

{
  "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, но массовое. Порядок relation-ов в ответе совпадает с порядком идентификаторов в запросе.

Имя команды для вызова: 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

UpdateKeywords

На входе тип и идентификатор объекта и список его ключевых слов (фраз)

{
  "entityType": "Patent",
  "objectId": "6f1c4255-952b-4b5c-b463-3fd1662ccd4e",
  "keywords": [
    {
      "keyword": "Сталь",
      "pos": "NOUN",
      "weight": 0.94
    },
    {
      "keyword": "Дерево",
      "pos": "NOUN",
      "weight": 0.78
    },
    {
      "keyword": "бронзА и олово",
      "pos": "NOUN",
      "weight": 1
    }
  ]
}

На выходе количество созданных связей между ключевым словом и объектом json 3

Перезаписывает текущие ключевые слова объекта новым списком слов, полученным в параметрах команды. Так же новые ключевые слова добавляются в реестр ключевых слов Все слова приводятся к нижнему регистру

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

ListObjectKeywords

На входе тип и идентификатор объекта

{
  "entityType": "Patent",
  "objectId": "8505d418-371f-466e-9cb3-6a8cbbf7a610"
}

На выходе объект с ключевыми словами json { "objectId": "8505d418-371f-466e-9cb3-6a8cbbf7a610", "keywords": [ { "keywordId": "894c334c-cd9d-4e9a-9ecd-d35623412ad6", "keyword": "сталь", "pos": "NOUN", "weight": 1.0 }, { "keywordId": "fce6be0f-a2ca-4f9d-92ff-0aaa4c8cb2b8", "keyword": "пластик", "pos": "NOUN", "weight": 0.78 } ] }

Команда позволяет по типу и идентификатору объекта получить его ключевые слова

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

ListKeywords

На входе параметры поискового запроса (объект Search)

{
  "query": "title",
  "context": {"title": "like %ронза%"},
  "paging": {
    "page": 1,
    "count": 10
  }
}

На выходе страница найденых ключевых слов json { "items": [ { "id": "ebad64c4-9fa4-450d-bb49-94aa439a7289", "title": "бронза", "pos": "NOUN" }, { "id": "434e6425-774c-43b3-b94c-40bd4ee869f2", "title": "бронза и олово", "pos": "NOUN" } ], "total": 2 }

Команда позволяет по параметрам поискового запроса получить список ключевых слов (страницу и общее количество)

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

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

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

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": {},
  "defaultValue": 123
}

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

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

Параметр 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",
  "defaultValue": "TestOrder"
}

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

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

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, тогда в поле будет храниться несколько файлов. Как и в случае одиночного поля данные передаются массивом
maxCount Integer нет Признак максимального количества файлов, присваивается полю maxItems в JSON-схеме сущности. Используется только если multiple=true, иначе maxItems будет присвоено 1. По умолчанию 10. - Не может быть больше 100
- Не может быть меньше 1

AddRelation

{
  "operation": "AddRelation",
  "relationType": "many-to-one",
  "entity1": "Order",
  "entity2": "Person",
  "title1": "Автор договора",
  "title2": "Договора автора",
  "entity1Field": "author",
  "entity2Field": "orders"
}

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

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

UpdateRelation (migration)

{
  "operation": "UpdateRelation",
  "entity1": "Order",
  "entity2": "Person",
  "entity1Field": "author",
  "entity2Field": "orders",
  "relationType": "many-to-many",
  "title1": "Автор договора",
  "title2": "Договора автора",
}

Операция изменения атрибутов (entity2Field, relationType, title1, title2) отношения между типами сущностей.

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

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)
linkedEntityType string нет Тип сущности объектов на "другом конце" связи. Если связи прямые, то тип linkedEntityType должны иметь все вторые объекты из связи, а если обратные - то первый.

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

ID файла и список его тегов

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

FileInfoWithTags

Информация о файле, включая его теги и ссылку на родительский объект.

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

ObjectFile

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

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

FileIdentity

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

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

StoredFile

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

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

ObjectWithKeywordsDTO

Тип и ID объекта и список его ключевых слов

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

KeywordDTO

Информация о ключевом слове

Поле Тип Обязательное Описание
keyword string да Ключевое слово
pos string да Часть речи
weight double нет Вес ключевого слова по отношению к объекту

ObjectWithKeywords

Тип и ID объекта и список его ключевых слов

Поле Тип Обязательное Описание
objectId uuid да ID объекта
keywords ListKeywordWithWeight да Список ключевых слов объекта

KeywordWithWeight

Информация о ключевом слове совмещенная с весом ключевого слова в объекте

Поле Тип Обязательное Описание
keywordId uuid да ID ключевого слова
keyword string да Ключевое слово
pos string да Часть речи
weight double нет Вес ключевого слова по отношению к объекту

Keyword

Ключевое слово

Поле Тип Обязательное Описание
id uuid да ID ключевого слова
title string да Ключевое слово
pos 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, version.

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

Для примеров, используется отношение между Order(number: String, name: String) и Person(name: String), где Order ссылается на Person через поле "authors: Person[]".

Пример запроса RichGetObjects с указанием нужных полей

{
  "id": {
    "entityType": "Order",
    "objectId": "18b1011b-9db3-4186-a53c-971016030068"
  },
  fields: [
    "name",              // Order.name
    "authors.data.name", // Полный путь к Person.name
    "authors.name",      // Короткая запись Person.name
    "authors.id",        // Системное поле EntityObject
  ]
}

Результатом запроса будет объект EntityObject с полями связанных объектов в "data"

{
  "id": "18b1011b-9db3-4186-a53c-971016030068",
  "externalId": "ExternalOrder",
  "entityType": "Order",
  "title": "Аренда лошади",
  "source": "manual",
  "created": 1630326492,
  "modified": 1630326492,
  "data": {
    "name": "Test order",
    "authors": [
      {
        "_id": "505e7939-94e4-4c1a-b175-b622258d00fc",
        "_externalId": null,
        "_entityType": "Person",
        "_title": "First author",
        "_source": "manual",
        "_created": 1634553248859,
        "_modified": 1634553248859,
        "_version": 1,
        "name": "First author"      
      },
      {
        "_id": "66806625-ea74-4c9e-8fca-ccf1e1366e8b",
        "_externalId": null,
        "_entityType": "Person",
        "_title": "Second author",
        "_source": "manual",
        "_created": 1634553248859,
        "_modified": 1634553248859,
        "_version": 123,
        "name": "Second author"      
      }
    ]
  },
  "additionalData": {},
  "version": 1
}

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

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-сервер
SERVER_AUTHORIZER_KIND string нет "authzforce" Вид авторизатора, который используется в сервисе. Допустимые значения: "authzforce", "oberto". При указании неизвестного значения будет использовано значение по-умолчанию.
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_KAFKA_AUTH_MODE string нет "" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
VERDI_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
VERDI_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
VERDI_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
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 с List[FSBucketConfig] соответствует полю authConfig FSConfigRep
FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
FS_CACHE_TTL duration string нет Время жизни клиента в кеше
LOG_OUTPUT string нет STDOUT Параметры вывода логов: STDOUT - обычный лог, STDOUT_CEF - лог в формате CEF.
LOG_LEVEL_HTTP string нет WARN Уровень логирования HTTP-сервера
LOGGING_SRC_IP string нет Параметр SRC (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, src=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_SRC_HOST string нет Параметр SHOST (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".
LOGGING_DST_IP string нет Параметр DST (получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена, dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_CEF_VER int нет 0 Версия формата CEF: либо 0, либо 1. Рекомендуется использовать 0.
VERDI_COMMANDS_HTTP_RETRY_ATTEMPTS int нет 5 Поле attempts из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_DELAY duration string нет "5 seconds" Поле delay из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_KIND string нет "OnSomeExceptions(ConnectException)" CommandResultRetryConditionKind

У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.

Чтобы включить логирование в формате CEF, нужно задать переменную LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то необходимо задать следующие переменные, которые по умолчанию не заданы:

В файле src/main/resources/log4j.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.

Список реализованных в сервисе команд, моделей 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 - по всем словам (каждое значимое слово должно присутствовать в объекте), Strict - по точной фразе (все значимые слова запроса должны присутствовать в искомом объекте в том же порядке, на минимальном расстоянии друг от друга).
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,
    "removed": false
  },
  "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-сервер
SERVER_AUTHORIZER_KIND string нет "authzforce" Вид авторизатора, который используется в сервисе. Допустимые значения: "authzforce", "oberto". При указании неизвестного значения будет использовано значение по-умолчанию.
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_KAFKA_AUTH_MODE string нет "" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
VERDI_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
VERDI_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
VERDI_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
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 Пароль пользователя БД
DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
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 с List[FSBucketConfig] соответствует полю authConfig FSConfigRep
FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
FS_CACHE_TTL duration string нет Время жизни клиента в кеше
LAMP_USE_VERSION_2 bool нет false Использовать ли LAMP2 (true) или LAMP1 (false)
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 нет "Предназначен для индексации" Читаемое описание этого сервиса
LOG_OUTPUT string нет STDOUT Параметры вывода логов: STDOUT - обычный лог, STDOUT_CEF - лог в формате CEF
LOG_LEVEL_HTTP string нет WARN Уровень логирования HTTP-сервера
LOGGING_SRC_IP string нет Параметр SRC (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, src=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_SRC_HOST string нет Параметр SHOST (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".
LOGGING_DST_IP string нет Параметр DST (получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена, dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_CEF_VER int нет 0 Версия формата CEF: либо 0, либо 1. Рекомендуется использовать 0.
VERDI_COMMANDS_HTTP_RETRY_ATTEMPTS int нет 5 Поле attempts из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_DELAY duration string нет "5 seconds" Поле delay из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_KIND string нет "OnSomeExceptions(ConnectException)" CommandResultRetryConditionKind

Формат CEF для логов сервиса indexation

У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.

Чтобы включить логирование в формате CEF, нужно задать переменную LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то необходимо задать следующие переменные, которые по умолчанию не заданы:

В файле src/main/resources/log4j.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.

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

Список реализованных в сервисе команд, моделей 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] Поля, значение которых нужно сохранить в индексе для автодополнений
saveKeywordsToDM Option[String] Поле в модели данных, внутри additionalData, в которое нужно сохранить ключевые слова, выделенные из файлов

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 должен совпадать с entityType индексируемой сущности в сервисе Модели данных.

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

{
  "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_KAFKA_AUTH_MODE string нет "static" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
INTEGRATION_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
INTEGRATION_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
INTEGRATION_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
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_DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
INTEGRATION_DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
INTEGRATION_DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
INTEGRATION_DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
INTEGRATION_DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
INTEGRATION_DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
INTEGRATION_DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
INTEGRATION_DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
INTEGRATION_DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
INTEGRATION_DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
INTEGRATION_DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
INTEGRATION_DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
INTEGRATION_DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
INTEGRATION_DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
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 с List[FSBucketConfig] соответствует полю authConfig FSConfigRep
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 Периодичность обновления перечня доступных типов данных из модели данных.
INTEGRATION_LOG_OUTPUT string нет STDOUT Параметры вывода логов: STDOUT - обычный лог в консоль, STDOUT_CEF - лог в формате CEF в консоль, FILE - обычный лог в файл, FILE_CEF - лог в формате CEF в файл.
Может принимать несколько значений через любой разделитель (например, "STDOUT FILE_CEF"). Преобразования, если указано несколько значений: присутствуют "STDOUT" + "STDOUT_CEF" = учитывается только "STDOUT_CEF"; "FILE" + "FILE_CEF" = "FILE_CEF";
INTEGRATION_LOGGING_SRC_IP string нет Параметр SRC (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, src=notFound. Требуемый формат: IPv4, например "192.168.10.1".
INTEGRATION_LOGGING_SRC_HOST string нет Параметр SHOST (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".
INTEGRATION_LOGGING_DST_IP string нет Параметр DST (получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена, dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".
INTEGRATION_LOGGING_CEF_VER int нет 0 Версия формата CEF: либо 0, либо 1. Рекомендуется использовать 0.
INTEGRATION_SENDERLIB_COMMANDS_HTTP_RETRY_ATTEMPTS int нет 5 Поле attempts из RetrySettings
INTEGRATION_SENDERLIB_COMMANDS_HTTP_RETRY_DELAY duration string нет "5 seconds" Поле delay из RetrySettings
INTEGRATION_SENDERLIB_COMMANDS_HTTP_RETRY_KIND string нет "OnSomeExceptions(ConnectException)" CommandResultRetryConditionKind

Формат CEF для логов сервиса Integration

У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.

Чтобы включить логирование в формате CEF, нужно задать переменную INTEGRATION_LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то необходимо задать следующие переменные, которые по умолчанию не заданы:

В файле boot/src/main/resources/logback.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.

Команды внутреннего интерфейса сервиса Integration

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_KAFKA_AUTH_MODE string нет "" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
VERDI_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
VERDI_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
VERDI_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
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 с List[FSBucketConfig] соответствует полю authConfig FSConfigRep
FS_CACHE_SIZE int нет 1 Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
FS_CACHE_TTL duration string нет Время жизни клиента в кеше
LAMP_USE_VERSION_2 bool нет false Использовать ли LAMP2 (true) или LAMP1 (false)
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 нет 150 second Таймаут отправки сообщения и получения результатов через клиент 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
LOG_OUTPUT string нет "STDOUT" Параметры вывода логов: STDOUT - обычный лог, STDOUT_CEF - лог в формате CEF.
LOGGING_SRC_IP string нет Параметр SRC (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, src=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_SRC_HOST string нет Параметр SHOST (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".
LOGGING_DST_IP string нет Параметр DST (получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена, dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_CEF_VER int нет 0 Версия формата CEF: либо 0, либо 1. Рекомендуется использовать 0.
VERDI_COMMANDS_HTTP_RETRY_ATTEMPTS int нет 5 Поле attempts из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_DELAY duration string нет "5 seconds" Поле delay из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_KIND string нет "OnSomeExceptions(ConnectException)" CommandResultRetryConditionKind

Формат CEF для логов сервиса клиента LAMP

У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.

Чтобы включить логирование в формате CEF, нужно задать переменную LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то необходимо задать следующие переменные, которые по умолчанию не заданы:

В файле src/main/resources/log4j.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.

Модели сервиса клиента 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}]}

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

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_KAFKA_AUTH_MODE string нет "static" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
TOLKA_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
TOLKA_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
TOLKA_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
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_DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
TOLKA_DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
TOLKA_DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
TOLKA_DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
TOLKA_DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
TOLKA_DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
TOLKA_DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
TOLKA_DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
TOLKA_DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
TOLKA_DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
TOLKA_DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
TOLKA_DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
TOLKA_DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
TOLKA_DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
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 с List[FSBucketConfig] соответствует полю authConfig FSConfigRep
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_AUTHORIZER_KIND string нет "authzforce" Вид авторизатора, который используется в сервисе. Допустимые значения: "authzforce", "oberto". При указании неизвестного значения будет использовано значение по-умолчанию.
TOLKA_LOG_OUTPUT string нет STDOUT Параметры вывода логов: STDOUT - обычный лог в консоль, STDOUT_CEF - лог в формате CEF в консоль, FILE - обычный лог в файл, FILE_CEF - лог в формате CEF в файл.
Может принимать несколько значений через любой разделитель (например, "STDOUT FILE_CEF"). Преобразования, если указано несколько значений: присутствуют "STDOUT" + "STDOUT_CEF" = учитывается только "STDOUT_CEF"; "FILE" + "FILE_CEF" = "FILE_CEF";
TOLKA_LOGGING_SRC_IP string нет Параметр SRC (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, src=notFound. Требуемый формат: IPv4, например "192.168.10.1".
TOLKA_LOGGING_SRC_HOST string нет Параметр SHOST (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".
TOLKA_LOGGING_DST_IP string нет Параметр DST (получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена, dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".
TOLKA_LOGGING_CEF_VER int нет 0 Версия формата CEF: либо 0, либо 1. Рекомендуется использовать 0.
TOLKA_SENDERLIB_COMMANDS_HTTP_RETRY_ATTEMPTS int нет 5 Поле attempts из RetrySettings
TOLKA_SENDERLIB_COMMANDS_HTTP_RETRY_DELAY duration string нет "5 seconds" Поле delay из RetrySettings
TOLKA_SENDERLIB_COMMANDS_HTTP_RETRY_KIND string нет "OnSomeExceptions(ConnectException)" CommandResultRetryConditionKind

Формат CEF для логов сервиса Tolka

У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.

Чтобы включить логирование в формате CEF, нужно задать переменную TOLKA_LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то необходимо задать следующие переменные, которые по умолчанию не заданы:

В файле boot/src/main/resources/logback.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.

Список команд сервиса 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,
  "version": 2
}

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

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)

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

{
  "query": "",
  "context": {},
  "sorting": {"fieldName": "created", "order": "Asc"},
  "paging": {"page": 1, "count": 10}
}

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

{
  "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 Да Человекочитаемое наименование интервала Не пустое, не длиннее 256 символов
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 Title Да Название виджета Не пустое, не длиннее 256 символов
widgetType String Да Код типа виджета Должен соответствовать коду из справочника analyticsWidgetType
settings WidgetSettings Да Настройки виджета
visibility Boolean Да Видимость виджета на дашборде
position Int Да Позиция виджета на дашборде Больше 0
version Int Да Версия виджета

CreateWidgetDTO (tolka)

Параметры для создания нового виджета

Поле Тип Обязательное Описание Ограничения
title Title Да Название виджета Не пустое, не длиннее 256 символов
widgetType String Да Код типа виджета Должен соответствовать коду из справочника analyticsWidgetType
settings WidgetSettings Да Настройки виджета
visibility Boolean Да Видимость виджета на дашборде

UpdateWidgetDTO (tolka)

Параметры для обновления виджета

Поле Тип Обязательное Описание Ограничения
id WidgetId Да Идентификатор виджета
title Title Да Название виджета Не пустое, не длиннее 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 Да Видимость сущности на дашбордах. В общей статистике объекты все равно учитываются
created TimeStamp Да Дата создания настройки

AnalyticsEntityCreateDTO (tolka)

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

Поле Тип Обязательное Описание Ограничения
code EntityTypeId Да Код сущности Не пустое
color HexColor Да Цвет, связанный с данной сущностью Формат Hexadecimal color
visibleOnDashboard Boolean Да Видимость сущности на дашбордах. В общей статистике объекты все равно учитываются

AnalyticsEntityUpdateDTO (tolka)

Обновление настроек порогов метрики в аналитике.

Поле Тип Обязательное Описание Ограничения
id AnalyticsEntityId Да Идентификатор настройки Не пустое
version Int Да Версия настройки
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_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
UI_STORAGE_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
UI_STORAGE_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применяться не будет.
UI_STORAGE_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к хранилищу сертификатов.
UI_STORAGE_KAFKA_AUTH_MODE string нет "static" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
UI_STORAGE_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
UI_STORAGE_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
UI_STORAGE_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
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 Адрес базы данных. Можно использовать вместо DB_HOST, DB_PORT и DB_NAME
UI_STORAGE_DB_HOST string если не указана DB_URL Хост сервера базы данных
UI_STORAGE_DB_PORT int если не указана DB_URL Порт сервера базы данных
UI_STORAGE_DB_NAME string если не указана DB_URL Название базы данных
UI_STORAGE_DB_USER string да Пользователь базы данных
UI_STORAGE_DB_PASSWORD string да Пароль для пользователя базы данных
UI_STORAGE_DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
UI_STORAGE_DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
UI_STORAGE_DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
UI_STORAGE_DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
UI_STORAGE_DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
UI_STORAGE_DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
UI_STORAGE_DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
UI_STORAGE_DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
UI_STORAGE_DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
UI_STORAGE_DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
UI_STORAGE_DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
UI_STORAGE_DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
UI_STORAGE_DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
UI_STORAGE_DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
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 с List[FSBucketConfig] соответствует полю authConfig FSConfigRep
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_STORAGE_AUTHORIZER_KIND string нет "authzforce" Вид авторизатора, который используется в сервисе. Допустимые значения: "authzforce", "oberto". При указании неизвестного значения будет использовано значение по-умолчанию.
UI_STORAGE_LOG_OUTPUT string нет "STDOUT" Параметры вывода логов: STDOUT - обычный лог в консоль, STDOUT_CEF - лог в формате CEF в консоль, FILE - обычный лог в файл, FILE_CEF - лог в формате CEF в файл.
Может принимать несколько значений через любой разделитель (например, "STDOUT FILE_CEF"). Преобразования, если указано несколько значений: присутствуют "STDOUT" + "STDOUT_CEF" = учитывается только "STDOUT_CEF"; "FILE" + "FILE_CEF" = "FILE_CEF";
UI_STORAGE_LOGGING_SRC_IP string нет Параметр SRC (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, src=notFound. Требуемый формат: IPv4, например "192.168.10.1".
UI_STORAGE_LOGGING_SRC_HOST string нет Параметр SHOST (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".
UI_STORAGE_LOGGING_DST_IP string нет Параметр DST (получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена, dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".
UI_STORAGE_LOGGING_CEF_VER int нет 0 Версия формата CEF: либо 0, либо 1. Рекомендуется использовать 0.
UI_STORAGE_SENDERLIB_COMMANDS_HTTP_RETRY_ATTEMPTS int нет 5 Поле attempts из RetrySettings
UI_STORAGE_SENDERLIB_COMMANDS_HTTP_RETRY_DELAY duration string нет "5 seconds" Поле delay из RetrySettings
UI_STORAGE_SENDERLIB_COMMANDS_HTTP_RETRY_KIND string нет "OnSomeExceptions(ConnectException)" CommandResultRetryConditionKind

Формат CEF для логов сервиса хранения UI

У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.

Чтобы включить логирование в формате CEF, нужно задать переменную UI_STORAGE_LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то необходимо задать следующие переменные, которые по умолчанию не заданы:

В файле boot/src/main/resources/logback.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.

Команды сервиса хранения 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 Заголовок типа формы

GlobalSettings (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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

CreateForm (UI Storage)

Передаем JSON с данными формы

{
    "entityType": "document",
    "formType": "e4fdad30-f658-4d89-86d3-14cb14ff6660",
    "formData": {
        "field1": "value1"
    }
}

Получаем Id формы

"0ccd05ac-50c0-4e7e-906b-6893eaa8d9de"

Создать новую форму из данных EntityFormSettingsCreateDTO. Гарантируется уникальность для набора полей: entityType, formType.

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

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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

DeleteForm (UI Storage)

Передаем Id формы

"0ccd05ac-50c0-4e7e-906b-6893eaa8d9de"

Получаем результат

1

Удалить существующую форму по её Id.

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

UpdateForm (UI Storage)

Передаем JSON данные для обновления

{
    "id": "0ccd05ac-50c0-4e7e-906b-6893eaa8d9de",
    "formData": {
        "field1": "newValue"
    },
    "version": "1"
}

Получаем результат

1

Обновить существующую форму данными из EntityFormSettingsForUpdate. При успешном обновлении version формы увеличивается на единицу.

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

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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.

GetValue (UI Storage)

Передаем ключ глобальной настройки

"color"

Получаем значение глобальной настройки

"#fcbe03"

Возвращает JSON-значение глобальной настройки по ключу key.

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

CreateKey (UI Storage)

Передаем данные глобальной настройки

{
  "key": "color",
  "value": "#fcbe03",
  "title": "Цвет"
}

Получаем признак успешности

true

Создать новую глобальную настройку из данных CreateKeyDTO.
Гарантируется уникальность для поля key.

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

UpdateKey (UI Storage)

Передаем данные глобальной настройки для обновления

{
  "key": "color",
  "value": "#fcbe04",
  "title": "Цвет фона",
  "version": 1
}

Получаем признак успешности

true

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

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

UpdateValue (UI Storage)

Передаем данные глобальной настройки для обновления

{
  "key": "color",
  "value": "#fcbe05",
  "version": 1
}

Получаем признак успешности

true

Обновить значение существующей глобальной настройки из UpdateValueDTO.
При успешном обновлении version настройки увеличивается на единицу.

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

DeleteKey (UI Storage)

Передаем ключ глобальной настройки

"color"

Получаем признак успешности

true

Удалить существующую глобальную настройку по её ключу key.

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

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/background/ec476b5d-7cea-4138-b537-8f3032f33ac4"
  },
  {
    "path": "theme-color",
    "fileUrl": "uisettings/theme-color/f0e1f19a-c386-48aa-874f-d58ff9a147e3"
  }
]

Сохранить файлы для указанных глобальных настроек по пути path.

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

Модели сервиса хранения UI

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

FormTypeId (UI Storage)

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

FormType (UI Storage)

Описание типа форм.

Поле Тип Обязательное Описание
id FormTypeId Да ID типа формы
code String Да Код типа формы
title String Да Заголовок типа формы
description String Нет Описание типа формы

Встроенный справочник:

code title description
card Карточка объекта Карточка объекта
createForm Форма создания Форма создания
editForm Форма редактирования Форма редактирования
list Список Элемент списка в реестре объектов
textSearchSnippet Сниппет текстового поиска Сниппет текстового поиска
smartSearchSnippet Сниппет интеллектуального поиска Сниппет интеллектуального поиска

EntityFormSettingsId (UI Storage)

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

EntityFormSettingsCreateDTO (UI Storage)

Модель для создания формы.

Поле Тип Обязательное Описание Ограничения
entityType EntityTypeId Да Тип сущности - Не пустое
- Не длиннее 127 символов
formType FormTypeId Да ID типа формы
formData Json Да Данные формы

EntityFormSettings (UI Storage)

Модель формы.

Поле Тип Обязательное Описание
id EntityFormSettingsId Да ID формы
entityType EntityTypeId Да Тип сущности
formType FormTypeId Да ID типа формы
formData Json Да Данные формы
version Int Да Версия

EntityFormSettingsForUpdate (UI Storage)

Модель для обновления формы.

Поле Тип Обязательное Описание Ограничения
id EntityFormSettingsId Да ID формы
formData Json Да Данные формы
version Int Да Версия

EntityTypeWithFormType (UI Storage)

Идентификатор конкретной формы конкретного типа объектов.

Поле Тип Обязательное Описание Ограничения
entityType EntityTypeId Да Код типа объекта
formType FormTypeId Да Код типа формы

EntityFormSettingsDTO (UI Storage)

Сокращенная модель формы (используется для списков).

Поле Тип Обязательное
id EntityFormSettingsId Да
entityType EntityTypeId Да
formType FormTypeDTO Да

FormTypeDTO (UI Storage)

Сокращенная модель типа форм (используется для списков).

Поле Тип Обязательное Описание
code String Да Код типа формы
title String Да Заголовок типа формы

GlobalSettingKey (UI Storage)

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

GlobalSetting (UI Storage)

Модель глобальной настройки.

Поле Тип Обязательное Описание
key GlobalSettingKey Да Ключ глобальной настройки
value Json Да Значение глобальной настройки
title String Да Название глобальной настройки
created TimeStamp Да Дата создания
modified TimeStamp Да Дата обновления
lastUser 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)

Модель для сохранения файлов глобальной настройки.

Поле Тип Обязательное Описание Ограничения
path String Да Полный путь, по которому надо сохранить временный файл - Не пустое
- Не длиннее 64 символов
tempFileId UUID Да ID временного файла

GlobalSettingFile (UI Storage)

Файл глобальной настройки.

Поле Тип Обязательное Описание
path String Да Полный путь, по которому сохранен файл
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 нет 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_KAFKA_AUTH_MODE string нет "" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
VERDI_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
VERDI_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
VERDI_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
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 Пароль к базе данных
USER_PROFILE_DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
USER_PROFILE_DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
USER_PROFILE_DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
USER_PROFILE_DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
USER_PROFILE_DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
USER_PROFILE_DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
USER_PROFILE_DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
USER_PROFILE_DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
USER_PROFILE_DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
USER_PROFILE_DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
USER_PROFILE_DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
USER_PROFILE_DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
USER_PROFILE_DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
USER_PROFILE_DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
LOG_OUTPUT string нет STDOUT Параметры вывода логов: STDOUT - обычный лог, STDOUT_CEF - лог в формате CEF.
LOGGING_SRC_IP string нет Параметр SRC (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, src=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_SRC_HOST string нет Параметр SHOST (источник/source, на который ссылается событие) для логов в формате CEF. Если не установлена, shost=notFound. Требуемый формат: fully qualified domain name (FQDN), например "host" или "host.domain.com".
LOGGING_DST_IP string нет Параметр DST (получатель/destination, на который ссылается событие) для логов в формате CEF. Если не установлена, dst=notFound. Требуемый формат: IPv4, например "192.168.10.1".
LOGGING_CEF_VER int нет 0 Версия формата CEF: либо 0, либо 1. Рекомендуется использовать 0.
VERDI_COMMANDS_HTTP_RETRY_ATTEMPTS int нет 5 Поле attempts из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_DELAY duration string нет "5 seconds" Поле delay из RetrySettings
VERDI_COMMANDS_HTTP_RETRY_KIND string нет "OnSomeExceptions(ConnectException)" CommandResultRetryConditionKind

Формат CEF для логов сервиса User profile

У логов есть возможность включить формат CEF для логирования по следующему шаблону:
2022-12-14T16:56:31+0500 CEF:Version|Device Vendor|Device Product|Device Version|EventClassId|Message|Severity|src=? dst=? shost=? suid=? suser=? msg=? end=currentTimeMillis|.

Чтобы включить логирование в формате CEF, нужно задать переменную LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то необходимо задать следующие переменные, которые по умолчанию не заданы:

В файле src/main/resources/log4j.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.

Команды сервиса профилей пользователей

createProfileSection (User-profile)

На входе объект с секцией

{
  "title": "test section"
}

На выходе Id созданной секции

"test_section"

Создает секцию в профиле пользователя. Если явный Id не указан, генерирует его автоматически, заменяя " " на "_" и транслитерируя символы кириллицы в латиницу.

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

deleteProfileSection (User-profile)

На входе Id секции

"test_section"

На выходе ничего

{}

Удаляет секцию в профиле пользователя по ее Id.

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

updateProfileSection (User-profile)

Объект для изменения секции

{
  "id": "test_section",
  "title": "new test title",
  "description": "test description"
}

На выходе ничего

{}

Меняет название и описание секции.

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

getProfileSections (User-profile)

На входе ничего

{}

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

[
  {
    "title": "Профиль пользователя",
    "id": "userProfile",
    "description": ""
  },
  {
    "title": "Основные данные",
    "id": "basicData",
    "description": ""
  },
  {
    "title": "Test title",
    "id": "test_title",
    "description": "Test title"
  }
]

Возвращает список секций в структуре профиля.

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

addProfileField (User-profile)

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

{
  "sectionId": "test_section",
  "title": "Тестовое поле",
  "type": "string",
  "multiple": false,
  "settings": {
    "maxLength": 100
  }
}   

На выходе Id нового поля

"Testovoye_pole"

Создает поле в секции профиля. Если явный Id поля не указан, генерирует его автоматически, заменяя " " на "_" и транслитерируя символы кириллицы в латиницу.

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

deleteProfileField (User-profile)

На входе Id секции и Id поля

{
  "sectionId": "test_section",
  "fieldId": "Testovoye_pole"
}

На выходе ничего

{}

Удаляет поле в секции.

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

updateProfileField (User-profile)

На входе новые параметры поля

{
  "sectionId": "test_section",
  "fieldId": "Testovoye_pole",
  "title": "new test title",
  "description": "updated description",
  "settings": {
    "maxLength": 150
  }
}

На выходе ничего

{}

Изменяет некоторые параметры поля.

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

getProfileSectionFields (User-profile)

На входе 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
    }
  }
]

Возвращает список полей в секции.

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

getUserProfile (User-profile)

На входе 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"
    }
  }
}

Возвращает информацию о пользователе. Если передать список секций, то возвращает не всю информацию, а только запрошенные секции.

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

setUserProfileField (User-profile)

На входе информация для обновления поля профиля

{
    "userId": "5dfbbda7-b340-4a04-aae2-da4379f89eb9",
    "section": "basicData",
    "field": "name",
    "value": "JohnJohn",
    "version": 3
}

На выходе новая версия

4

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

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

Обрабатываемые события сервиса профилей пользователей

События слушаются в USER_PROFILE_USER_EVENTS_TOPIC

Источник событий eventType payloadType Описание
mon registration user Создает профиль пользователя при авторизации

Объекты сервиса профилей пользователей

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

AddSectionField (User-profile)

Поле Тип Обязательное Описание Ограничения
sectionId String Да Id секции, в которую поместить поле - Не пустое
- Не больше 64 символов
fieldId String Нет Id поля - Не больше 64 символов
title String Да Название поля - Не больше 256 символов
type String Да Тип поля доступный для сущностей модели данных
description String Нет Описание поля
multiple Boolean Да Множественное ли поле
settings Json Нет Дополнительные настройки для указанного типа поля

CreateSection (User-profile)

Поле Тип Обязательное Описание Ограничения
title String Да Название секции - Не больше 256 символов
id String Нет Id секции - Не пустое
- Не больше 64 символов
description String Нет Описание секции

DeleteSectionField (User-profile)

Поле Тип Обязательное Описание Ограничения
sectionId String Да Id секции с полем
fieldId String Да Id поля

Section (User-profile)

Поле Тип Обязательное Описание Ограничения
title String Да Название секции - Не больше 256 символов
id String Да Id секции
description String Нет Описание секции

SectionField (User-profile)

Поле Тип Обязательное Описание
sectionId String Да Id секции с полем
fieldId String Да Id поля в секции
title String Да Название поля
type String Да Тип поля доступный для сущностей модели данных
description String Да Описание поля
multiple Boolean Да Множественное ли поле
nullable Boolean Да Обязательное ли поле
settings Json Да Дополнительные настройки для указанного типа поля

UpdateSectionField (User-profile)

Поле Тип Обязательное Описание Ограничения
sectionId String Да Id секции с полем
fieldId String Да Id поля
title String Да Новое название поля
description String Нет Новое описание поля
settings Json Да Новые дополнительные настройки для указанного типа поля

UserProfileDTO (User-profile)

Поле Тип Обязательное Описание
id String Да Id пользователя
created Long Да Время создания
modified Long Да Время последнего изменения
version Int Да Версия для борьбы с потерями обновлений
sections Map[String, Json] Да Данные из секций профиля

GetUserProfileDTO (User-profile)

Поле Тип Обязательное Описание Ограничения
userId UUID Да Id пользователя
sections List[String] Нет Список секций, которые нужно вернуть

SetProfileFieldDTO (User-profile)

Поле Тип Обязательное Описание Ограничения
userId UUID Да Id пользователя
section String Да Секция, в которой находится поле для изменения
field String Да Название поля, которое нужно поменять
value Json Да Новое значение для этого поля
version Int Да Версия, полученная в составе UserProfile