Cursor
Описание команд всех сервисов, которые входят в состав Cursor.
Список версий
v1.8
Важные изменения
- Актуализирован Storybook (CURS-153)
Исправлено множество багов в компонентах UI
Data-model
- В объект GetObjectLinksList добавить указание типа сущности, с которой нужно искать связь объекта (CURS-77)
- В объект GetObjectLinksList добавить указание типа сущности, с которой нужно искать связь объекта (CURS-77)
v1.7.1
Важные изменения
- Data-model
- Реализован Soft delete объектов модели данных (CURS-154, SUP-18)
v1.7
Важные изменения
В целом по системе были подняты версии библиотек, чтобы избавиться от некоторых уязвимостей
Data-model
- Добавлен различный функционал связанный с хранением "Ключевых слов"
v1.6.1
Важные изменения
Различные сервисы
- Добавлена возможность разделить учётные данные кафки для доступов producer и consumer (SUP-132, CURS-2307)
- Реализованы доработки позволяющие работать в системе без развернутого authzforce
AppUi
- Возможность завершить сеанс пользователя (SUP-135, CURS-2342)
v1.6
Важные изменения
Full-text-search
- В обработку команды fullTextSearchDSLV2 добавлен вариант поиска по строгой фразе (CURS-2146)
- При поиске в поле с типом keyword теперь применяется WildcardQuery (CURS-2222)
Indexation
- Добавлен прототип поддержка OCR в индексации (шаг Erika) (CURS-2236)
UI
- Реализована вкладка "Виджеты" (CURS-1054)
- Angular обновлен до 16 версии в Cursor в webclients, graph, ui-plugins и vespa (CURS-1124)
- Добавлены кастомные типы связи в элемент "Таблица пересечений" (CURS-2204) и в документоцентричный граф (CURS-2218)
- Добавлена поисковая строка в реестры (CURS-2205)
- Установка по умолчанию типа поиска по тексту "Строгая фраза" (CURS-2255)
Добавлены логи в формате CEF в сервисы Cursor/Verdi (CURS-36)
В Slate внесены множественные изменения и исправления
Полный список задач релиза зафиксирован в Confluence
v1.5.3
service-common
- Убрана зависимость от fs-client (SUP-66)
Tolka
- Исправлено: Не работает сортировка по умолчанию по проценту пересечений (CUR-2025)
В нескольких сервисах выставлено дефолтное значение allowInternalCommands=true (SUP-77)
v1.5.2
Версия от 04.07.2023. Список изменений:
- DataModel:
- Исправлен HealthCheck роут (SUP-48)
v1.5.1
Версия от 27.06.2023. Список изменений:
- AppUI
- Исправлено: В поиске с исп. документа не работает фильтр по проценту содержательных пересечений
v1.5
Версия от 06.06.2023. Список изменений:
Общее
- Исправлена и дополнена документация в различных разделах Cursor
- Исправлены различные баги в рамках исправлений по 9 этапу
DataModel:
- Добавлен фильтр RangeQuery по полям сущности (SUP-57)
- Исправлено: при указании фильтра по полю created - фильтрация работает некорректно если указана комбинация фильтров
DataModelClient:
- Добавлена команда listFilesInfoWithTags (SUP-14)
UI
- Исправлено: Некорректно работает компонент ввода даты из двух полей
- Исправлено: На странице настройки стартового экрана при нажатии отмены не сбрасываются изменения настроек
- Исправлено: Различается отображение длинных текстовых/ссылочных наименований/ID в таблицах системы
Indexation (+DataModel)
- Добавлена постраничная обработка файлов при индексации сущностей
Tolka
- Создан сервис аналитики
- Виджеты (хранение, вычисление данных)
- Настройки порогов
- Страница аналитики (виджеты и поисковая выдача) в appui (проект @corund/analytics)
v1.4.1
Версия от 03.05.2023. Список изменений:
Appui
- Исправлено:
- В поиске с использованием документа напротив сниппетов не отображается процент пересечения
Integration:
- Добавлен http-route для проверки жизни сервиса с помощью ServiceHealthApi
UI-Storage:
- Добавлен http-route для проверки жизни сервиса с помощью ServiceHealthApi
Marker-Service
- Добавлен http-route для проверки жизни сервиса с помощью ServiceHealthApi
v1.4
Версия от 22.03.2023. Список изменений:
- Integration:
- Доработано внешнее API для работы с отношениями
- Full-text-search:
- Доработана обработка ошибок при неверном формате входных данных
- Исправлена документация
- Добавлена авторизация на все команды сервиса с публикацией всех нужных констант
- Добавлена поддержка числовых фасетов во всех видах поиска в поле
numberFacets
- DataModel:
- Доработана обработка ошибок при неверном формате входных данных у команд для работы с тегами файлов,
getFile,deleteObject - В команды
listObjectsиrichListObjectsдобавлена сортировка поcreated - В командах, работающих по
externalIdдля отношений возвращаются такжеexternalId, а не внутренниеid - Добавлена команда установки новых отношений по
externalId - Исправлены ошибки команд для получения списков объектов
- Служебные поля (
id,entityType,created, и т.д.) теперь передаются с подчеркиванием в начале (_id,_entityType,_created, и т.д.) в результатах RichGet команд - Исправлена фильтрация по
idфайла в командахListFilesInfoWithTagsиListTagsWithFilesCount - Добавлены команды для удаления нескольких объектов
DeleteObjectBatchиDeleteObjectSearch - Добавлена генерация событий при удалении/изменении файлов у объектов
- Исправлены ошибки сортировки команды
richListObjects
- Доработана обработка ошибок при неверном формате входных данных у команд для работы с тегами файлов,
- Indexation:
- Исправлена ошибка, из-за которой не удалялись шаги удаленных индексаций
- Добавлено удаление данных из LAMP при получении события об удалении файлов у объекта
- UI-Storage:
- Добавлена публикация авторизационных констант в сервисе Attila
Общие типы данных
Search
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описывает значение для полей, указанных вquery
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"
}
}
Сортировка определяется двумя полями:
fieldNameназвание поля, по которому будет производиться сортировкаorderнаправление сортировки. Бывает двух видов:asc,desc.
Адаптер сетевой папки
Основное
Адаптер сетевой папки позволяет экспортировать в Cursor все содержимое указанной папки и в дальнейшем синхронизировать состояние (удалять из Cursor удаленные из папки файлы, доэкспортировать новые и обновлять измененные).
Экспорт осуществляется в виде Cursor-объекта указанного в конфигурации вида, который должен содержать обязательное поле бинарного файла (тип file), а также может содержать часть (или все) из нижеперечисленных полей:
- Наименование файла (string/text)
- Путь до файла относительно корня папки (string/text)
- Владелец файла в файловой системе (string/text)
- Дата создания файла (dateTime)
- Дата редактирования файла (dateTime)
Поддерживаются:
- локальные папки
- протокол сетевых папок SMB
Экспорт происходит при старте адаптера, и далее перезапускается через указанный промежуток времени. Кроме того, адаптер предоставляет HTTP API для вызова внепланового экспорта и восстановления.
Конфигурирование адаптера сетевой папки
Требования к запуску адаптера сетевой папки
Для корректной минимальной работы адаптера требуется:
- Развернутый стенд Cursor, включая:
- Доступ из адаптера к HTTP API интеграций Cursor (например https://cursorapp/integration/api/external)
- Настроенная модель данных (см. шапку документации).
- Зарегистрированный клиент адаптера, имеющий доступ к настроенной модели данных.
- Доступ из адаптера к папке, из которой будут выгружаться файлы
- Подключение к PostgreSQL для хранения состояния выгрузки (см. соответствующий раздел)
Список переменных окружения адаптера сетевой папки
Обязательные параметры выделены жирным
Настройки 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. Примеры:
file:///C:/users/ivanov%20ivan/dir/в Windowsfile:///home/ivanov%20ivan/dirв Linux
Для папок, доступных по протоколу сетевых папок SMB, используется следующий формат: smb://server[:port]/share/[path/]. Примеры:
smb://127.0.0.1/MyShare- все файлы конкретного sharesmb://127.0.0.1/MyShare/my%20directory/- все файлы внутри определенной папки
Версии 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 для внепланового запуска задач (при условии, что в данный момент адаптер не занят другой задачей):
POST /export- запуск экспортаPOST /recover- запуск режима восстановления
Хост и порт сервера 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, то необходимо задать следующие переменные, которые по умолчанию не заданы:
LOGGING_SRC_IP, для параметраsrcв логахLOGGING_SRC_HOST, для параметраshostв логахLOGGING_DST_IP, для параметраdstв логах
В файле 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
}
}
Поддерживается только синхронный вызов
- На входе: BushcraftSearchRequest
- На выходе: AggregationSearchResult
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
}
}
Поддерживается только синхронный вызов
- На входе: BranchUnfoldRequest
- На выходе: AggregationSearchResult если найденные документы сами являются корнями или ByParentSearchResult если документы являются листьями
createBush
Создание ограниченного контекста
На входе форма создания
{
"id": "fixedBush",
"relations": {
"links": {"Patent": {"RfbrDocument": {}}},
"1thesis": {"RfbrDocument": {}},
"poems": {"kate": {}}
}
}
В результате идентификатор успешно созданного контекста
"fixedBush"
Поддерживается только синхронный вызов
- На входе: BushCreateDTO
- На выходе: String
getBush
Получение ограниченного контекста
На входе идентификатор ограниченного контекста
"fixedBush"
В результате ограниченный контекст
{
"id": "fixedBush",
"relations": {
"links": {"Patent": {"RfbrDocument": {}}},
"1thesis": {"RfbrDocument": {}},
"poems": {"kate": {}}
}
}
Поддерживается только синхронный вызов
- На входе: String
- На выходе: BushCreateDTO
listBush
Получение списка ограниченных контекстов
Входных данных нет
В результате список ограниченных контекстов
[
{
"id": "fixedBush",
"relations": {
"links": {
"Patent": {
"RfbrDocument": {}
}
},
"poems": {
"kate": {}
},
"1thesis": {
"RfbrDocument": {}
}
},
"version": 1
}
]
Поддерживается только синхронный вызов
- Команда не принимает параметров
- На выходе: Seq[Bush]
deleteBush
Удаление ограниченного контекста
На входе идентификатор контекста
"fixedBush"
В результате кол-во удаленных записей
Поддерживается только синхронный вызов
- На входе: String
- На выходе: Integer
updateBush
Обновление ограниченного контекста
На входе описание контекста
{
"id": "fixedBush",
"relations": {
"links": {"Patent": {"RfbrDocument": {}}},
"1thesis": {"RfbrDocument": {}},
"newRoot": {"newLeaf": {}}
},
"version": 1
}
В результате кол-во обновленных записей
Поддерживается только синхронный вызов
- На входе: Bush
- На выходе: Integer
Сервис модели данных
Сервис модели данных (Data Model Service) позволяет настроить какие сущности, с какими полями и отношениями будут храниться
в системе Cursor. На основе данных о сущностях сервис будет формировать описание модели данных и возвращать его в
формате JsonSchema. Также сервис управляет созданием/изменением/удалением объектов сущностей в реестрах.
Сущности, полученные из внешних источников (клиентов), таких как сетевая папка или 1С, называются внешними.
Отличие от внутренних сущностей состоит в том, что помимо внутреннего ID, они имеют ID из внешнего источника,
по которому этот источник может совершать запросы.
Общая документация по сервису находится в разделе Confluence: Cursor/Техническая документация/Сервис Модели данных
В сервисе предусмотрены следующие команды:
- Список типов полей
- Список типов отношений
- Создать модель данных
- Получить модель данных
- Список моделей данных
- Получить полную схему всех сущностей и отношений
- Получить пример объекта сущности
- Сохранить объект
- Сохранить список объектов
- Сохранить внешний объект
- Получить объект
- Получить объект (внутренняя команда)
- Получить объект с определенными полями
- Получить объект с определенными полями (внутренняя команда)
- Получить список объектов по ID
- Получить внешний объект
- Обновить объект
- Обновить часть полей в объекте
- Обновить часть полей в объектах (по поисковому запросу)
- Обновить часть полей в объектах (по ID)
- Обновить внешний объект
- Отметить объект как удаленный
- Удалить объект
- Удалить объекты по списку
- Удалить объект по поиску
- Удалить внешний объект
- Сохранить дополнительную информацию в объект
- Сохранить дополнительную информацию в файлы объекта
- Список объектов
- Список объектов с определенными полями
- Список метаданных объектов
- Список наименований объектов (V1)
- Список наименований объектов (V2)
- Позиция объекта в списке
- Получение агрегированной статистики полей модели данных
- Сохранить отношение между объектами
- Сохранить несколько отношений между объектами
- Получить отношение между объектами
- Получить отношения для конкретного объекта с конкретной сущностью
- Получить отношения для конкретных объектов с конкретными сущностями
- Получить все отношения для конкретного объекта
- Удалить отношение между объектами
- Удалить отношения для конкретного объекта
- Удалить все отношения для конкретного объекта
- Обновить список отношений внешнего объекта
- Переиндексировать объект
- Получить связь между объектами
- Получить список связей конкретного объекта
- Получить список всех связей между указанными типами
- Создать связь между объектами
- Создать связи между объектами
- Удалить связь между объектами
- Удалить все связи для конкретного объекта
- Список файлов с подробным описанием и тегами
- Список тегов с количеством привязанных файлов
- Список уникальных расширений файлов
- Записать новые теги для конкретного файла
- Удалить выбранные теги для конкретного файла
- Удалить все теги для конкретного файла
- Получение информации о файле для скачивания
- Создать новые ключевые слова и прикрепить к объекту
- Получить список ключевых слов объектов
- Получить список ключевых слов
Конфигурирование сервиса модели данных
Требования к запуску сервиса модели данных
Запуск сервиса осуществляется локально через 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, то необходимо задать следующие переменные, которые по умолчанию не заданы:
LOGGING_SRC_IP, для параметраsrcв логахLOGGING_SRC_HOST, для параметраshostв логахLOGGING_DST_IP, для параметраdstв логах
В файле 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. Поддерживается только синхронный вызов.
- Команда не принимает параметров
- На выходе: List[FieldType]
GetRelationTypes
Входных данных нет
На выходе
[
{
"id": "one-to-one",
"title": "1 к 1",
"description": "Один к одному"
},
{
"id": "many-to-one",
"title": "Многие к 1",
"description": "Многие к одному"
},
{
"id": "many-to-many",
"title": "Многие ко многим",
"description": "Многие ко многим"
}
]
Получение доступных типов отношений между сущностями в модели данных.
Имя команды для вызова: getRelationTypes. Поддерживается только синхронный вызов.
- Команда не принимает параметров
- На выходе: List[RelationType]
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:
- Создать сущность CreateEntity
- Изменить сущность UpdateEntity
- Удалить сущность DeleteEntity
- Добавить поле сущности AddField
- Добавить дополнительное поле сущности AddAdditionalField
- Удалить поле у сущности DeleteField
- Изменить поле у сущности UpdateField
- Добавить отношение между сущностями AddRelation
- Изменить отношение между сущностями UpdateRelation
- Удалить отношение между сущностями DeleteRelation
- Выполнить операцию для сущностей с префиксом PrefixMigration
Каждой операции соответствует json-объект, список которых и образует MigrationDSL-запрос на создание модели данных. Объекты
для операций указаны возле них в списке. Они различаются по коду операции, передаваемому в поле
operation. Все объекты для описания шагов наследуются от общего типа MigrationDslOperation.
Порядок операций важен! Нельзя добавить поле перед созданием сущности.
Имя команды для вызова: createDataModel. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: List[MigrationDslOperation]
- На выходе: Boolean
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. Поддерживается только синхронный вызов.
- На входе: JSON-строка
- На выходе: Json schema
ListDataModels
Входных данных нет
На выходе
[
{
"id": "Order",
"title": "Договор",
"description": "Описывает договор между несколькими агентами",
"settings": {
"titleRule": "title"
}
},
{
"id": "Person",
"title": "Человек",
"description": "Дополнительные человеческие аттрибуты для пользователя",
"settings": {}
}
]
Получение созданных типов сущностей.
Имя команды для вызова: listDataModels. Поддерживается только синхронный вызов.
- Команда не принимает параметров
- На выходе: List[EntityType]
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. Поддерживается только синхронный вызов.
- Команда не принимает параметров
- На выходе: Json schema
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. Поддерживается только синхронный вызов
- На входе: строка с типом сущности
- На выходе: EntityObject
SaveObject
На входе общие свойства сохраняемого объекта и основные атрибуты
{
"entityType": "Order",
"source": "manual",
"attributes": {
"date": 1577869200,
"number": 514
}
}
На выходе ID созданного объекта
"18b1011b-9db3-4186-a53c-971016030068"
Сохранение объекта сущности.
Имя команды для вызова: saveObject. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: AddEntityObject
- На выходе: UUID созданного объекта
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), не требует аутентификации.
- На входе: AddEntityObjectBatch
- На выходе: Seq[UUID] созданных объектов
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), не требует аутентификации. Результат выполнения команды журналируется.
- На входе: AddExternalEntityObject
- На выходе: внутренний UUID созданного объекта
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. Поддерживается только синхронный вызов
- На входе: EntityObjectIdentity
- На выходе: EntityObject
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 только отсутствием аутентификации.
- На входе: EntityObjectIdentity
- На выходе: EntityObject
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. Поддерживается только синхронный вызов
- На входе: List[EntityObjectIdentity]
- На выходе: List[EntityObject]
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. Поддерживается только синхронный вызов
- На входе: EntityObjectFields
- На выходе: EntityObject
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 только отсутствием аутентификации.
- На входе: EntityObjectFields
- На выходе: EntityObject
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. Поддерживается только синхронный вызов
- На входе: List[EntityObjectsBatchWithFields]
- На выходе: Map[EntityTypeId, Seq[EntityObject]]
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), не требует аутентификации.
- На входе: EntityObjectExternalIdentity
- На выходе: EntityObject
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. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: UpdateEntityObject
- На выходе: boolean, true - обновление успешно, false - неуспешно.
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. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: UpdateEntityObjectFields
- На выходе: boolean, true - обновление успешно, false - неуспешно.
UpdateObjectFieldsList
На входе параметры списочного запроса, а также json-объект, где ключ - это изменяемое поле, а значение - новое значение этого поля
{
"entityType": "Order",
"search": {
"query": "title",
"context": {"title": "External Order"}
},
"updates": {"date": 1577869200, "title": "Updated External Order"}
}
На выходе количество измененных объектов
42
Массовое изменение полей в объектах сущности, попадающих под списочный запрос.
Имя команды для вызова: updateObjectFieldsList. Поддерживается асинхронный и синхронный вызов.
Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.
- На входе: UpdateEntityObjectFieldsList
- На выходе: number, количество измененных объектов
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), не требует аутентификации.
- На входе: UpdateEntityObjectFieldsBatch
- На выходе: ObjectProcessingResult[]
UpdateExternalObject
На входе общие свойства сохраняемого объекта и основные атрибуты
{
"entityType": "Order",
"externalId": "ExternalOrder",
"attributes": {
"date": 1577869200,
"number": 514,
"title": "External Order v2"
}
}
На выходе признак успешного сохранения
true
Изменение внешнего объекта
Имя команды для вызова: updateExternalObject. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.
- На входе: UpdateExternalEntityObject
- На выходе: boolean, true - обновление успешно, false - неуспешно.
SoftDeleteObject
На входе ID получаемого объекта и его тип сущности
{
"entityType": "Order",
"objectId": "18b1011b-9db3-4186-a53c-971016030068"
}
На выходе признак успешного удаления
true
Или ошибка, если объекта не существует
{
"businessError": null,
"message": "ERROR: Entity object not found",
"stackTrace": null,
"data": null
}
Отмечает в БД объект сущности как удаленный. События, файлы, ссылки и отношения связанные с этим объектом должны измениться как и при обычном удалении.
Имя команды для вызова: softDeleteObject. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: EntityObjectIdentity
- На выходе: boolean, true - удаление успешно, false - неуспешно.
DeleteObject
На входе ID получаемого объекта и его тип сущности
{
"entityType": "Order",
"objectId": "18b1011b-9db3-4186-a53c-971016030068"
}
На выходе признак успешного удаления
true
Или ошибка, если объекта не существует
{
"businessError": null,
"message": "ERROR: Entity object not found",
"stackTrace": null,
"data": null
}
Удаление объекта сущности. Если у объекта есть связи, они тоже будут удалены.
Имя команды для вызова: deleteObject. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: EntityObjectIdentity
- На выходе: boolean, true - удаление успешно, false - неуспешно.
DeleteObjectBatch
На входе список EntityObjectIdentity удаляемых объектов
[
{
"entityType": "Patent",
"objectId": "7cba68ef-10fe-4629-9680-3346e73756bd"
},
{
"entityType": "Document",
"objectId": "b7bb4a5a-dc0f-4bfc-b7e3-f2258700b47b"
}
]
На выходе количество успешно удаленных объектов, которые существовали на момент вызова команды
2
Удаление объектов сущностей по списку. Если у объектов есть связи, они тоже будут удалены.
Если входные данные для команды содержат идентификаторы объектов, которые не существуют (например, были удалены ранее), то
мы считаем такие идентификаторы "ранее удаленными" и команда пытается удалить остальные существующие идентификаторы.
В таком случае, количество удаленных записей будет меньше, чем изначальное количество идентификаторов.
Имя команды для вызова: deleteObjectBatch. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.
- На входе: Seq[EntityObjectIdentity]
- На выходе: количество удаленных объектов.
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), не требует аутентификации.
- На входе: ListObjects
- На выходе: количество удаленных объектов.
DeleteExternalObject
На входе внешний ID удаляемого объекта и его тип сущности
{
"entityType": "Order",
"externalId": "ExternalOrder"
}
На выходе признак успешного удаления
true
Удаление внешнего объекта сущности. Если у объекта есть связи, они тоже будут удалены.
Имя команды для вызова: deleteExternalObject. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.
- На входе: EntityObjectExternalIdentity
- На выходе: boolean, true - удаление успешно, false - неуспешно.
SaveAdditionalInfo
На входе дополнительные свойства сохраняемого объекта и его ID
{
"entityType": "Order",
"objectId": "18b1011b-9db3-4186-a53c-971016030068",
"additionalData": {
"keywords": ["Договор", "аренда", "лошадь"]
}
}
На выходе признак успешного сохранения
true
Сохранение дополнительных полей объекта сущности. Дополняет текущий список дополнительных полей новым. Если поле уже есть, тогда перезаписывает. Передавать полный список не нужно.
Имя команды для вызова: saveAdditionalInfo. Поддерживается асинхронный и синхронный вызов.
Команда только внутренняя (нельзя вызвать через Api Gateway), не требует аутентификации.
- На входе: SaveObjectAdditionalInfo
- На выходе: boolean, true - обновление успешно, false - неуспешно.
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), не требует аутентификации.
- На входе: SaveFilesAdditionalInfo
- На выходе: int кол-во обновленных файлов
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
- На входе: ListObjects
- На выходе: Page[EntityObject]
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 в порядке возрастания
- На входе: RichListObjects
- На выходе: Page[EntityObject]
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. Поддерживается только синхронный вызов
- На входе: ListObjects
- На выходе: Page[EntityObjectMeta]
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. Поддерживается только синхронный вызов
- На входе: Search
- На выходе: Page[TitledEntityObjectIdentity]
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. Поддерживается только синхронный вызов
- На входе: ListObjects
- На выходе: Page[TitledEntityObjectIdentity]
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. Поддерживается только синхронный вызов
- На входе: GetObjectPosition
- На выходе: PositionInList
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. Поддерживается только синхронный вызов
- На входе: GetEntityFieldAggregation
- На выходе: object, где ключи - наименования полей, а значения - FieldAggregatedValue[]
SaveRelation
На входе параметры сущности, отношение между которыми сохраняется, а также ID конкретных объектов, входящих в отношение
{
"entity1Type": "Order",
"entity2Type": "Item",
"entity1Field": "items",
"object1Id": "18b1011b-9db3-4186-a53c-971016030068",
"object2Id": "48911128-39a1-418c-93f1-c9773cda224e",
"source": "manual"
}
На выходе признак успешного сохранения
true
Сохранение отношения между объектами двух сущностей.
Имя команды для вызова: saveRelation. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: AddObjectRelation
- На выходе: boolean, true - сохранение успешно, false - неуспешно.
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. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: AddObjectRelation[]
- На выходе: AddObjectRelationResult[]
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. Поддерживается только синхронный вызов
- На входе: DeleteObjectRelation
- На выходе: ObjectRelation
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. Поддерживается только синхронный вызов.
- На входе: ListObjectRelations
- На входе: ObjectRelation[]
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. Поддерживается только синхронный вызов.
- На входе: ListObjectRelations[]
- На входе: ObjectRelation[]
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. Поддерживается только синхронный вызов.
- На входе: EntityObjectIdentity
- На входе: ObjectRelation[]
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. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: DeleteObjectRelation
- На выходе: boolean, true - удаление успешно, false - неуспешно.
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. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: DeleteObjectRelations
- На входе: ObjectRelation[]
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. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: EntityObjectIdentity
- На входе: ObjectRelation[]
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), не требует аутентификации.
- На входе: UpdateExternalObjectRelations
- На выходе: UpdateExternalObjectRelationResult[]
ReindexObject
На входе ID объекта и его тип сущности
{
"entityType": "Order",
"objectId": "18b1011b-9db3-4186-a53c-971016030068"
}
На выходе признак успешной отправки события переиндексации
true
Имя команды для вызова: reindexObject. Поддерживается асинхронный и синхронный вызов
- На входе: EntityObjectIdentity
- На выходе: Boolean
GetLink
На входе 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. Поддерживается только синхронный вызов
- На входе: UUID
- На выходе: ObjectLink
GetLinks
На входе объект, связи которого нужно получить, список типов связей, и признак прямой или обратной связи
{
"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. Поддерживается только синхронный вызов
- На входе: GetObjectLinksList
- На выходе: List[ObjectLink]
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. Поддерживается только синхронный вызов
- На входе: GetObjectRelationsByType
- На выходе: Page[ObjectLinkWithObjects]
CreateLink
На входе параметры создаваемой связи
{
"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. Поддерживается асинхронный и синхронный вызов
- На входе: CreateObjectLink
- На выходе: UUID
CreateObjectsLinks
На входе список создаваемых связей
[
{
"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), не требует аутентификации.
- На входе: Seq[CreateObjectLink]
- На выходе: Int
DeleteLink
На входе ID удаляемой связи
"4faf020e-d0f6-4cb7-ab54-8412d50a28f4"
На выходе признак успешного удаления
true
Или ошибка, если связи не существует не существует
{
"businessError": null,
"message": "ERROR: Entity object not found",
"stackTrace": null,
"data": null
}
Удаление связи между объектами по ID.
Имя команды для вызова: deleteObjectLink. Поддерживается асинхронный и синхронный вызов
- На входе: UUID
- На выходе: boolean, true - удаление успешно, false - неуспешно.
DeleteAllLinks
На входе параметры объекта и его связей для удаления (тип сущности, 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. Поддерживается асинхронный и синхронный вызов
- На входе: DeleteObjectLinks
- На выходе: int, количество удаленных ссылок.
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. Поддерживается только синхронный вызов
- На входе: Search
- На выходе: Page[FileInfoWithTags]
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. Поддерживается только синхронный вызов
- На входе: Search (поля
sortingиpagingдля данной команды не используются) - На выходе: Map[String, Int] Список пар из названия тега и количества привязанных файлов
ListFileExtensions
На входе никаких параметры не требуется
null
На выходе список уникальных расширений загруженных в систему файлов
[
"docx",
"txt",
"pdf"
]
Возвращает список уникальных расширений загруженных в систему файлов.
Имя команды для вызова: listFileExtensions. Поддерживается только синхронный вызов
- На входе: NULL
- На выходе: List[String] Список расширений файлов
WriteFileTags
На входе список идентификаторов файла с новыми тегами
[
{
"fileId": "54a4da2d-05da-448e-88af-b44757ceef40",
"tags": ["TextFile", "DocxFile"]
}
]
На выходе количество записаных тегов
2
Перезаписывает текущие теги файла объекта новым списком, полученным в параметрах команды.
Имя команды для вызова: writeFileTags. Поддерживается асинхронный и синхронный вызов
- На входе: List[ObjectFileWithTags]
- На выходе: Int
RemoveFileTags
На входе список идентификаторов файлов с тегами, которые нужно удалить
[
{
"fileId": "54a4da2d-05da-448e-88af-b44757ceef40",
"tags": ["DocxFile"]
}
]
На выходе количество успешно удаленных тегов
1
Удаляет из текущего набора тегов для файла объекта те теги, которые переданы в параметрах команды.
Имя команды для вызова: removeFileTags. Поддерживается асинхронный и синхронный вызов
- На входе: List[ObjectFileWithTags]
- На выходе: Int
RemoveAllFileTags
На входе список идентификаторов файла
[
"54a4da2d-05da-448e-88af-b44757ceef40"
]
На выходе количество успешно удаленных тегов
2
Удаляет все теги для указанных файлов
Имя команды для вызова: removeAllFileTags. Поддерживается асинхронный и синхронный вызов
- На входе: List[String]
- На выходе: Int
GetEntityParents
На входе код типа сущностей
"RfbrDocument"
На выходе все родительские сущности
[
{
"entityType": "Patent",
"fieldId": "patent",
"nested": [
{
"entityType": "links",
"fieldId": "links",
"nested": []
}
]
},
{
"entityType": "1thesis",
"fieldId": "thesis",
"nested": []
}
]
Имя команды для вызова: getEntityParents. Поддерживается только синхронный вызов
- На входе: String
- На выходе: Seq[ParentRelation]
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. Поддерживается только синхронный вызов.
- На входе: FileIdentity
- На выходе: StoredFile
Скачивание файла
Эта команда имеет тип возвращаемого значения "файл". Она все еще возвращает 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. Поддерживается асинхронный и синхронный вызов
- На входе: ObjectWithKeywordsDTO]
- На выходе: Int
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. Поддерживается асинхронный и синхронный вызов
- На входе: EntityObjectIdentity
- На выходе: ObjectWithKeywords
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
- UpdateEntity
- DeleteEntity
- AddField
- DeleteField
- AddAdditionalField
- UpdateField
- AddRelation
- UpdateRelation
- DeleteRelation
- PrefixMigration
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
Применяется в конструкторе UI.
Заполняется значением нужного типа. Если строка, тогда строка. Если число или дата - тогда число. Для типа file нельзя указать пример.
Будет в таком же виде возвращено в конструктор.
Если значение не указано, то см. Значения по умолчанию
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-схеме
На текущий момент поддерживаются настройки для следующих типов полей:
- Строка
string- StringFieldSettings - Текст
text- TextFieldSettings - Элемент справочника
catalog- CatalogFieldSettings - Файл
file- FileFieldSettings
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 | нет | Описание ошибки, если произошла |
ObjectLink
Связь между двумя объектами сущностей. Связь устанавливается на основе интеллектуализации (содержательные пересечения, близкие по смыслу) или вручную.
| Поле | Тип | Описание |
|---|---|---|
| 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-объект с дополнительными данными, специфичными для конкретного типа связи |
GetObjectLinksList
Получение списка связей объекта
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityType | string | да | Тип сущности объекта, для которого запрашиваются связи |
| objectId | uuid | да | ID объекта, для которого запрашиваются связи |
| linkTypes | array[string] | нет | Типы запрашиваемых связей. Может содержать несколько значений. Может быть пустым, тогда вернутся все доступные связи. |
| forwardLinks | boolean | да | Признак получения прямых или обратных связей. Если true, тогда связи прямые, тогда искомый объект - это первый объект из связи (object1). Если false, тогда искомый объект - это второй объект из связи (object2) |
| linkedEntityType | string | нет | Тип сущности объектов на "другом конце" связи. Если связи прямые, то тип linkedEntityType должны иметь все вторые объекты из связи, а если обратные - то первый. |
GetObjectRelationsByType
Получение списка связей для типов объектов
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| entityFrom | string | да | Тип сущности объекта, от которого идут запрашиваемые связи |
| entityTo | string | да | Тип сущности объекта, к которому идут запрашиваемые связи |
| field | string | да | Название поля, по которому идет связь |
CreateObjectLink
Создание связи между объектами сущностей
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| 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 | нет | Идентификатор файла из второго объекта, если связь строится на основании файла |
DeleteObjectLinks
Удаление связей объекта
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| 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
нужно применить и пробует их применить. В случае каких-то проблем из метода возвращается ошибка, повторная отправка
запросов не производится.
Сервис полнотекстового поиска - ПП
В сервисе реализованы следующие команды
- Индексация объекта
- Получение правила индексации
- Создание правила индексации
- Удаление правила индексации
- Обновление правила индексации
- Список всех правил индексации
- Полнотекстовый поиск (v1)
- Полнотекстовый поиск (v2)
- Полнотекстовый поиск для графа (v1)
- Полнотекстовый поиск для графа (v2)
- Поиск по идентификаторам (LAMP, v1)
- Поиск по plagiarism (LAMP, v1)
- Поиск по similarity (LAMP, v2)
- Поиск по plagiarism (LAMP, v2)
- Список всех ES анализаторов
- Автодополнение поисковой строки
- Индексация фраз в индексе для автодополнений
- Агрегированный полнотекстовый поиск
- Полнотекстовый поиск внутри родительского документа
- Агрегация документов (внутренняя команда)
Общее описание архитектуры сервиса ПП
Сервис делает доступными для полнотекстового поиска объекты сервиса модели данных. Для каждого типа объектов должно существовать правило индексации в 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 для логов сервиса full-text-search
У логов есть возможность включить формат 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, то необходимо задать следующие переменные, которые по умолчанию не заданы:
LOGGING_SRC_IP, для параметраsrcв логахLOGGING_SRC_HOST, для параметраshostв логахLOGGING_DST_IP, для параметраdstв логах
В файле src/main/resources/log4j.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.
Команды для сервиса full-text-search
Список реализованных в сервисе команд, моделей 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:
- Значение не задано null. Фильтрация не применяется
- Пустая Map {}. Фильтрация включена, но фильтры не указаны. Результат - пустой список.
- Map содержит элементы названия типов, но не заданы идентификаторы объектов { "type1": null, "type2": null }. В результате будут только объекты с типами из фильтра, но т.к. списки ID не указаны, то фильтрации по ID нет.
- Map содержит названия типов, но заданы идентификаторы объектов { "type1": ["1", "2"], "type2": null }. В результате будут только объекты с типами и ID из фильтра.
- Map содержит названия типов, но список идентификаторов пустой { "type1": [], "type2": null }. Объекты с типом, у которого пустой списком ID, в результате отображаться не будут.
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"
]
}
}
Команда не возвращает никаких данных после выполнения
Поддерживается асинхронный и синхронный вызов.
- На входе: EntityWithFiles
- Команда не возвращает данных
getMappingFullTextSearch
Получение правила индексации
На входе идентификатор правила, по сути тип объекта
"Document"
В результате описания индексации
{
"entityType": "Document",
"fullText": [
{
"name": "content"
},
{
"name": "title"
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": [],
"seqNo": 31,
"primaryTerm": 1
}
Поддерживается только синхронный вызов. При пустом entityType в теле вернет Bad Request
- На входе: String
- На выходе: Mapping
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
- На входе: MappingDTO
- На выходе: String
deleteMappingFullTextSearch
Удаление правила индексации. Пока команда существует только для отладки, после удаления правила не будет работать поиск
по удаленному типу. При пустом entityType в теле вернет Bad Request
На входе идентификатор правила
"Document"
В результате кол-во удаленных записей
Поддерживается только синхронный вызов
- На входе: String
- На выходе: Integer
updateMappingFullTextSearch
Обновление правила индексации. Пока команда существует только для отладки, после обновления правила уже проиндексированные записи никак не будут обновляться, поэтому на них новый поиск может работать некорректно.
На входе описание индексации
{
"entityType": "Document",
"fullText": [
{
"name": "content"
},
{
"name": "title"
}
],
"stringFacets": [
"author",
"city"
],
"numberFacets": [],
"seqNo": 14,
"primaryTerm": 1
}
В результате кол-во обновленных записей
Поддерживается только синхронный вызов. При пустом entityType в [Mapping] вернет Bad Request
- На входе: Mapping
- На выходе: Integer
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
}
]
Поддерживается только синхронный вызов
- Команда не принимает параметров
- На выходе: List[Mapping]
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. Поддерживается только синхронный вызов
- На входе: SearchRequestDSLV1
- На выходе: FTSearchResult
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. Поддерживается только синхронный вызов
- На входе: SearchRequestDSLV2
- На выходе: FTSearchResult
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. Поддерживается только синхронный вызов
- На входе: SearchRequestDSLV1
- На выходе: FTSearchResultGraph
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. Поддерживается только синхронный вызов
- На входе: SearchRequestDSLV2
- На выходе: FTSearchResultGraph
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
}
Поддерживается только синхронный вызов
- На входе: SearchByLampResultRequest
- На выходе: FTSearchResultShort
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
}
Поддерживается только синхронный вызов
- На входе: SearchByLampResultRequest
- На выходе: FTSearchResultShort
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
}
Поддерживается только синхронный вызов
- На входе: SearchByLampResultRequestV2
- На выходе: FTSearchResultShort
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
}
Поддерживается только синхронный вызов
- На входе: SearchByLampResultRequestV2
- На выходе: FTSearchResultShort
fullTextSearchAnalyzers
Список всех ES анализаторов
Входных данных нет
В результате список ES анализаторов
[
"my_custom_analyzer",
"standard",
"simple",
"whitespace",
"stop",
"keyword",
"pattern",
"fingerprint",
"russian",
"english"
]
Поддерживается только синхронный вызов
- Команда не принимает параметров
- На выходе: List[String]
fullTextAutocomplete
На входе запрос с поисковой строкой
{
"query": "sol"
}
На выходе результаты с предложениями автодополнений по исходной строке
[
{
"text": "Solution Architect",
"score": 1
},
{
"text": "Software Developer",
"score": 1
}
]
Получение дополнений для поисковой строки. Ищет дополнения в специально сформированном индексе. Учитывает возможные опечатки в исходной строке (до 2), см. пример.
Поддерживается только синхронный вызов.
- На входе: AutocompleteRequest
- На выходе: Seq[AutocompleteResult]
fullTextSearchIndexCompletionPhrase
На входе набор фраз для сохранения в индексе для автодополнения
{
"entityType": "Document",
"objectId": "ba03990e-58d5-40dd-9316-c3257109dc06",
"phrases": [
"Software Architect",
"Software Developer"
]
}
Команда не возвращает данных на выходе
Индексирование фраз для получения их при автодополнении. Фразы привязываются к некоторому объекту, из которого они извлекаются. При удалении этого объекта фразы также будут удалены.
Поддерживается синхронный и асинхронный вызов.
- На входе: Seq[CompletionPhrases]
- Команда не возвращает данных
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
}
Поддерживается только синхронный вызов.
- На входе: AggregationSearchRequest
- На выходе: AggregationSearchResult
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
}
Поддерживается только синхронный вызов.
- На входе: ByParentSearchRequest
- На выходе: ByParentSearchResult
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). Поддерживается только синхронный вызов. Если поле отсутствует, то этот документ не учитывается в результате.
- На входе: List[DocumentsToAggregate]
- На выходе: AggregateDocumentsResult
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.
Сервис индексаций содержит следующие таблицы:
- "indexation_description" Таблица с описанием индексации: тип целевой сущности и список шагов Step. Является основной таблицей.
- "indexation" Таблица со статусами процесса индексации (история запуска индексаций). Связана с
indexation_descriptionчерез колонку "entity_type". - "indexation_row" Таблица со статусами отдельных шагов индексаций (история выполнения шагов). Связана с
indexation_descriptionчерез колонку "entity_type", а сindexationчерез колонку "correlation_id".
Конфигурирование сервиса индексаций
Требования к запуску сервиса индексаций
Запуск сервиса осуществляется локально через 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, то необходимо задать следующие переменные, которые по умолчанию не заданы:
LOGGING_SRC_IP, для параметраsrcв логахLOGGING_SRC_HOST, для параметраshostв логахLOGGING_DST_IP, для параметраdstв логах
В файле 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 указывается кафка-топик, по которому произойдет связь с конкретным плагином. Доступные на данный момент:
plagiarismPlugin- построение ссылок между объектами на основе содержательных пересечений,similarityPlugin- построение ссылок между объектами близкими по смыслу,taggingPlugin- назначение тэгов файлам на основе их расширения.
| Название поля | Тип | Описание |
|---|---|---|
| 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"
]
}
}
]
}
В результате возвращается идентификатор описания
Поддерживается только синхронный вызов
- На входе: IndexationDescriptionDTO
- На выходе: String
getIndexationDescription
Получение описания индексации по идентификатору (по сути по типу объекта)
На входе идентификатор описания
"Document"
В результате описание индексации
{
"id": "NewEntityType",
"steps": [
{
"children": [],
"payload": {
"fields": [
"files"
],
"type": "Erika"
},
"extensionFilter": {
"type": "WhiteList",
"allowed": [
"docx"
],
"default": false
}
}
],
"version": 1
}
Поддерживается только синхронный вызов
- На входе: String
- На выходе: IndexationDescription
deleteIndexationDescription
Удаление описания индексации и истории запусков данной индексации.
На входе идентификатор описания
"Document"
В результате количество удаленных записей
Поддерживается только синхронный вызов
- На входе: String
- На выходе: Integer
updateIndexationDescription
Обновление описания индексации
На входе описание индексации
{
"id": "NewEntityType",
"steps": [
{
"children": [],
"payload": {
"fields": [
"files"
],
"type": "Erika"
}
},
{
"children": [],
"payload": {
"filesRoutes": [
{
"field": "files",
"actions": [
{
"lampRoute": "Plagiarism"
}
]
}
],
"type": "Lamp"
}
}
],
"version": 1
}
В результате количество обновленных записей
Поддерживается только синхронный вызов
- На входе: IndexationDescription
- На выходе: Integer
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
}
]
Поддерживается только синхронный вызов
- Команда не принимает параметров
- На выходе: List[IndexationDescription]
listIndexationDescriptionPages
Получение списка описаний индексаций (с поддержкой пагинации).
{
"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
}
Поддерживается только синхронный вызов
- На входе: Search
- На выходе: Page[IndexationDescription]
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
}
Поддерживается только синхронный вызов
- На входе: Search
- На выходе: Page[IndexationRow]
indexationRestartStep
Перезапуск шага
На входе идентификатор статуса шага
"be54b09d-c655-41f6-a87e-1c5b1ed021cd"
В результате признак успешного перезапуска
Поддерживается только синхронный вызов
- На входе: String
- На выходе: Boolean
startIndexation
Запуск индексации всех сущностей определенного типа
На вход тип сущности
"RfbrDocument"
В результате идентификатор индексации
"be54b09d-c655-41f6-a87e-1c5b1ed021cd"
Поддерживает только синхронный вызов
- На входе: String
- На выходе: UUID
fixIndexation
Перезапуск индексации. Будут заново проиндексированы объекты, у которых имеется хотя-бы 1 провалившийся шаг по данной индексации, а так же будут проиндексированы новые, не индексировавшиеся до этого объекты
На вход идентификатор завершившейся индексации
"be54b09d-c655-41f6-a87e-1c5b1ed021cd"
Поддерживает только синхронный вызов
- На входе: String
- Команда не возвращает данных
interruptIndexation
Прерывание индексации. Индексация будет прервана только после завершения индексации текущей страницы данных (см. параметр INDEXATION_DATA_BATCH)
На вход идентификатор индексации
"be54b09d-c655-41f6-a87e-1c5b1ed021cd"
Поддерживает только асинхронный вызов
- На входе: UUID
- Команда не возвращает данных
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"
}
Поддерживает только синхронный вызов
- На входе: UUID
- На выходе: IndexationStatistics
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
}
}
Поддерживает только синхронный вызов
- На входе: UUID
- На выходе: Indexation
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
}
}
]
Поддерживает только синхронный вызов
- Команда не принимает параметров
- На выходе: Seq[Indexation]
Внешний интерфейс сервиса интеграций
Внешний 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
- Загрузка файла
- Получение элементов справочника
- Создание объектов в системе (импорт)
- Обновление объектов в системе
- Удаление объектов в системе
- Получение данных объектов
- Обновление списка отношений объектов
- Получение метаданных объектов
В свою очередь, OpenAPI-документация содержит описание команд для работы с указанным типом данных, а также вспомогательных команд (загрузка файла для последующего использования в объектах, выгрузка элементов используемых справочников и т.д.).
Получение документации внешнего интерфейса сервиса интеграций
ListEntityTypesForCurrent
На входе ничего
На выходе список доступных типов данных для текущего клиента
[
{
"id": "paper",
"title": "Научная статья",
"description": "Документ, представляющий научную статью"
}
]
Возвращает перечень доступных для клиента типов данных
Путь: HTTP GET /external/v1/help/entityType
- Input: -
- Output: List[AvailableEntityType]
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
- Input: -
- Output: JSON-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
- Input: -
- Output: EntityObject
GetOpenAPI
Генерирует описание внешнего API для указанной сущности (в формате OpenAPI v3.0.3)
Путь: HTTP GET /external/v1/help/entityType/:entityTypeId/openAPI
- Input: -
- Output: Json в формате OpenAPI v3.0.3
Работа с файлами (внешний интерфейс сервиса интеграций)
UploadFile
На входе POST-запрос с Content-Type: multipart/form-data и файлом в бинарном виде в поле file
На выходе ID загруженного файла
{
"fileId": "1c689788-9617-4c93-bcee-6eae8909a0ba"
}
Загрузить файл в систему.
Путь: HTTP POST /external/v1/file/upload
- Input: multipart/form-data с файлом в поле file
- Output: FileUploadResult
Работа со справочниками (внешний интерфейс сервиса интеграций)
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
- Input: ListCatalogItemsDTO
- Output: Page[CatalogItem]
Работа с объектами (внешний интерфейс сервиса интеграций)
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
- Input: ObjectCrudDTO
- Output: ObjectCrudResponse
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
- Input: ObjectCrudDTO
- Output: ObjectCrudResponse
DeleteEntity (Integration)
На входе перечень ID удаляемых объектов
{
"items": [
{
"id": "second"
}
]
}
На выходе данные по статусу удаления каждого объекта и дополнительные данные об удалении
{
"items": [
{
"id": "second",
"statusCode": 200,
"payload": null
}
]
}
Удаление объектов в системе.
Путь: HTTP POST /external/v1/entity/:entityTypeId/deleteByIds
- Input: ObjectCrudDTO
- Output: ObjectCrudResponse
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
- Input: ObjectCrudDTO
- Output: ObjectCrudResponse
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
- Input: UpdateRelationsDTO
- Output: UpdateRelationsResponse
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
- Input: ListEntityMetaDTO
- Output: Page[EntityMeta]
Объекты документации внешнего интерфейса сервиса интеграций
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. Является набором команд Verdi.
- Внешний API - позволяет импортировать данные в Cursor, получать описание и пример данных для импорта. Доступен по HTTP.
В данной документации описан внутренний API. Во внутреннем API сервиса реализованы следующие команды:
- Регистрация клиента
- Список зарегистрированных клиентов
- Обновление клиента
- Обновление токена доступа для клиента
- Выдача права для клиента на действия с данными определенного типа
- Запрет для клиента на действия с данными определенного типа
- Список всех доступных типов данных
- Обновить список всех доступных типов данных из сервиса модели данных
- Список типов данных, доступных для указанного клиента
Локальный запуск сервиса интеграций
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу, указанному в конфиге (см. ниже)
- Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - В Consul будет добавлен адрес Kafka по ключу
kafka_bootstrap_serverили адрес будет указан вapplication.conf. - Добавлены необходимые переменные окружения:
- INTEGRATION_DB_HOST
- INTEGRATION_DB_PORT
- INTEGRATION_DB_NAME
- INTEGRATION_DB_USER
- INTEGRATION_DB_PASSWORD
Кроме того, конфигурация стенда должна подразумевать доступ к внешней части 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, то необходимо задать следующие переменные, которые по умолчанию не заданы:
INTEGRATION_LOGGING_SRC_IP, для параметраsrcв логахINTEGRATION_LOGGING_SRC_HOST, для параметраshostв логахINTEGRATION_LOGGING_DST_IP, для параметраdstв логах
В файле boot/src/main/resources/logback.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.
Команды внутреннего интерфейса сервиса Integration
CreateClient
На входе свойства регистрируемого клиента
{
"id": "network-folder-papers",
"title": "Сетевая папка - научные статьи",
"allowFiles": true,
"data": null
}
На выходе Boolean (признак успешности исполнения)
true
Регистрирует новый клиент.
Поддерживается асинхронный и синхронный вызов.
- Input: CreateClientDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| integration_CreateClient | Kafka Topic "integration_commands" |
ListClients
Входные данные отсутствуют
На выходе перечень зарегистрированных клиентов
[
{
"id": "network-folder-papers",
"title": "Сетевая папка - научные статьи",
"token": "mK8XoAb3GwICWZ4inj00Ax?lO_ZFRzshyTKQyH8j?COulcQFLnzcj6RczsSvBUYn",
"allowFiles": true,
"data": null,
"blocked": false
}
]
Возвращает полный перечень зарегистрированных клиентов.
Поддерживается только синхронный вызов.
- Input: -
- Output: List[Client]
| Команда | Путь |
|---|---|
| integration_ListClients | HTTP POST /v1/client/list |
UpdateClient
На входе ID обновляемого клиента и новые свойства
{
"id": "network-folder-papers",
"title": "Сетевая папка (научные статьи)",
"allowFiles": true,
"data": null,
"blocked": false
}
На выходе Boolean (признак успешности исполнения)
true
Обновляет данные клиента.
Поддерживается асинхронный и синхронный вызов.
- Input: UpdateClientDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| integration_UpdateClient | Kafka Topic "integration_commands" |
RefreshClientToken
На входе ID клиента, для которого требуется перегенерировать токен
"network-folder-papers"
На выходе Boolean (признак успешности исполнения)
true
Повторно генерирует токен клиента.
Поддерживается асинхронный и синхронный вызов.
- Input: String
- Output: Boolean
| Команда | Путь |
|---|---|
| integration_RefreshClientToken | Kafka Topic "integration_commands" |
AllowEntityType
На входе ID клиента и ID типа данных, которые требуется связать
{
"clientId": "network-folder-papers",
"entityTypeId": "paper"
}
На выходе Boolean (признак успешности исполнения)
true
Дает указанному клиенту право создавать, редактировать и удалять данные указанного типа.
Поддерживается асинхронный и синхронный вызов.
- Input: ClientToEntityTypeIds
- Output: Boolean
| Команда | Путь |
|---|---|
| integration_AllowEntityType | Kafka Topic "integration_commands" |
DisallowEntityType
На входе ID клиента и ID типа данных, для которых требуется удалить связь
{
"clientId": "network-folder-papers",
"entityTypeId": "paper"
}
На выходе Boolean (признак успешности исполнения)
true
Запрещает указанному клиенту создавать, редактировать и удалять данные указанного типа.
Поддерживается асинхронный и синхронный вызов.
- Input: ClientToEntityTypeIds
- Output: Boolean
| Команда | Путь |
|---|---|
| integration_DisallowEntityType | Kafka Topic "integration_commands" |
ListEntityTypes
Входные данные отсутствуют
На выходе список доступных типов данных
[
{
"id": "paper",
"title": "Бумага",
"description": ""
},
{
"id": "document",
"title": "Документ",
"description": ""
}
]
Возвращает полный перечень доступных типов данных.
Сервис запрашивает список типов данных из сервиса модели данных с определенной периодичностью, указанной в конфиге INTEGRATION_ENTITY_TYPES_REFRESH_RATE,
поэтому при добавлении нового типа в сервис модели данных, в сервисе интеграций он может появиться не сразу.
В случае необходимости, список доступных типов данных можно обновить принудительно при помощи соответствующей команды.
Поддерживается только синхронный вызов.
- Input: -
- Output: List[EntityType]
| Команда | Путь |
|---|---|
| integration_ListEntityTypes | HTTP POST /v1/entityType/list |
RefreshEntityTypes
Входные данные отсутствуют
На выходе Boolean (признак успешности исполнения)
true
Вызывает принудительное обновление списка доступных типов данных (обычно список обновляется по расписанию в указанные в INTEGRATION_ENTITY_TYPES_REFRESH_RATE промежутки времени).
Поддерживается асинхронный и синхронный вызов.
- Input: -
- Output: Boolean
| Команда | Путь |
|---|---|
| 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": ""
}
]
Возвращает перечень доступных для клиента типов данных.
Поддерживается только синхронный вызов.
- Input: String
- Output: List[EntityType]
| Команда | Путь |
|---|---|
| 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, то необходимо задать следующие переменные, которые по умолчанию не заданы:
LOGGING_SRC_IP, для параметраsrcв логахLOGGING_SRC_HOST, для параметраshostв логахLOGGING_DST_IP, для параметраdstв логах
В файле 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"
Поддерживается асинхронный и синхронный вызов.
- На входе: LampQuery
- На выходе: StoredFile
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}]}
Поддерживается асинхронный и синхронный вызов.
- На входе: LampQueryJson
- На выходе: Json
Tolka: сервис аналитики
Сервис подготавливает данные для аналитики, построения графиков/таблиц. Состояние хранится в PostgreSQL.
Команды могут приходить как по HTTP, так и через Kafka в топик tolka_commands.
В сервисе реализованы следующие команды:
- Построение аналитики по близким документам
- Построение сводных данных по близким документам
- Построение данных для пользовательского виджета по близким документам
- Построение сводных данных по похожим документам
- Сохранение настроек для порогов метрик в аналитике
- Получение настроек для порогов метрик в аналитике
- Создание настроек для типа сущности в аналитике
- Редактирование настроек для типа сущности в аналитике
- Удаление настроек для типа сущности в аналитике
- Получение списка настроек для типов сущности в аналитике
- Получение списка всех виджетов аналитики
- Создание нового виджета аналитики
- Редактирование виджета аналитики
- Удаление виджета аналитики
- Изменение порядка виджетов аналитики
Optimistic Lock
У нескольких команд реализован механизм оптимистичных блокировок. Для этого в данных присутствует поле version.
Задача оптимистичных блокировок - предотвратить одновременное редактирование объекта из двух открытых форм.
Сначала фронтэнд запрашивает данные объекта и получает в ответе версию данных - поле version.
Он прикладывает эту версию в ответе. Если на бэкэнде она совпадает с исходной (не было других модификаций),
тогда данные сохраняются, а версия поднимается. Иначе сохранения не происходит, данные не перетираются.
Сервис разбит на несколько модулей, в виде sbt проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все? что связано с командами, их описанием и обработчиками.infrastructure, в котором содержится описание взаимодействия с другими сервисами.storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.utils, в котором содержатся разные хелперы.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Конфигурирование 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, то необходимо задать следующие переменные, которые по умолчанию не заданы:
TOLKA_LOGGING_SRC_IP, для параметраsrcв логахTOLKA_LOGGING_SRC_HOST, для параметраshostв логахTOLKA_LOGGING_DST_IP, для параметраdstв логах
В файле 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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: BuildAnalyticsDTO
- На выходе: RelatednessAnalyticsResponse
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: BuildSummaryDTO
- На выходе: ObjectsSummary
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: BuildWidgetDataDTO
- На выходе: RelatednessWidgetData
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: BuildSummaryDTO
- На выходе: ObjectsSummary
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. Поддерживается асинхронный и синхронный вызов.
- На входе: ThresholdsSetting
- На выходе: Boolean
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: -
- На выходе: ThresholdsSetting
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: -
- На выходе: List[Widget]
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. Поддерживается асинхронный и синхронный вызов.
- На входе: CreateWidgetDTO
- На выходе: WidgetId
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. Поддерживается асинхронный и синхронный вызов.
- На входе: UpdateWidgetDTO
- На выходе: Boolean
DeleteWidget (tolka)
На входе ID удаляемого виджета
"2112b855-9beb-4f76-8e51-818a16aadf60"
На выходе признак успешности
true
Удаляет виджет аналитики из системы.
Имя команды для вызова: tolka_DeleteWidget. Поддерживается асинхронный и синхронный вызов.
- На входе: WidgetId
- На выходе: Boolean
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. Поддерживается асинхронный и синхронный вызов.
- На входе: ReorderWidgetsDTO
- На выходе: Boolean
CreateAnalyticsEntity (tolka)
На входе настройки сущности в аналитике
{
"code": "MyEntity",
"color": "#EBC425",
"visibleOnDashboard": true
}
На выходе идентификатор созданных настроек
"cdb00bc8-7516-4349-8b88-dc58d0b6e1c1"
Создает настройки для типа сущности в конкретной аналитике.
Имя команды для вызова: tolka_CreateAnalyticsEntity. Поддерживается асинхронный и синхронный вызов.
- На входе: AnalyticsEntityCreateDTO
- На выходе: AnalyticsEntityId
UpdateAnalyticsEntity (tolka)
На входе настройки сущности в аналитике
{
"id": "cdb00bc8-7516-4349-8b88-dc58d0b6e1c1",
"version": 1,
"code": "MyEntity",
"color": "#FFD40A",
"visibleOnDashboard": true
}
На выходе результат изменения настроек
true
Изменяет настройки для типа сущности в конкретной аналитике.
Имя команды для вызова: tolka_UpdateAnalyticsEntity. Поддерживается асинхронный и синхронный вызов.
- На входе: AnalyticsEntityUpdateDTO
- На выходе: Boolean
DeleteAnalyticsEntity (tolka)
На входе идентификатор настройки сущности в аналитике
"cdb00bc8-7516-4349-8b88-dc58d0b6e1c1"
На выходе результат удаления настроек
true
Удаляет настройки для типа сущности в конкретной аналитике.
Имя команды для вызова: tolka_DeleteAnalyticsEntity. Поддерживается асинхронный и синхронный вызов.
- На входе: AnalyticsEntityId
- На выходе: Boolean
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. Поддерживается синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: Search
- На выходе: Page[AnalyticsEntity]
Модели сервиса 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 проектов:
domain, в котором содержатся все доменные модели и их различные представления.infrastructure, в котором содержатся базовые компоненты для взаимодействия с инфраструктурой.store, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логии, которые определяют правила взаимодействия компонентов между собой.route, содержит HTTP роуты.boot, содержит зависимости и описание для сборки и запуска сервиса.
В сервисе реализованы следующие команды:
- Получить список типов форм
- Создать форму
- Получить форму по ID
- Удалить форму
- Обновить форму
- Получить список форм
- Получить форму по типу объекта
- Получить формы по типу форм
- Получить список ключей глобальных настроек
- Получить значение глобальной настройки
- Создать глобальную настройку
- Обновить ключ глобальной настройки
- Обновить значение глобальной настройки
- Удалить глобальную настройку
- Сохранить файлы для глобальных настроек
Локальный запуск сервиса хранения UI
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/UIStorage_db - Kafka по адресу
localhost:9092 - Minio по адресу
localhost:9000 - Consul по адресу
localhost:8500 - В Consul будет добавлен адрес Kafka по ключу
kafka_bootstrap_serverили адрес будет указан вapplication.conf. Добавлены необходимые переменные окружения:
- UI_STORAGE_DB_HOST
- UI_STORAGE_DB_PORT
- UI_STORAGE_DB_NAME
- UI_STORAGE_DB_USER
- UI_STORAGE_DB_PASSWORD
Запуск сервиса хранения 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, то необходимо задать следующие переменные, которые по умолчанию не заданы:
UI_STORAGE_LOGGING_SRC_IP, для параметраsrcв логахUI_STORAGE_LOGGING_SRC_HOST, для параметраshostв логахUI_STORAGE_LOGGING_DST_IP, для параметраdstв логах
В файле 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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: Команда не принимает параметров
- На выходе: List[FormType]
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. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: EntityFormSettingsCreateDTO
- На выходе: EntityFormSettingsId
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: EntityFormSettingsId
- На выходе: EntityFormSettings
DeleteForm (UI Storage)
Передаем Id формы
"0ccd05ac-50c0-4e7e-906b-6893eaa8d9de"
Получаем результат
1
Удалить существующую форму по её Id.
Имя команды для вызова: UIStorage_kafka_DeleteForm. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: EntityFormSettingsId
- На выходе: Int (1 - в случае успеха, 0 - при неудаче)
UpdateForm (UI Storage)
Передаем JSON данные для обновления
{
"id": "0ccd05ac-50c0-4e7e-906b-6893eaa8d9de",
"formData": {
"field1": "newValue"
},
"version": "1"
}
Получаем результат
1
Обновить существующую форму данными из EntityFormSettingsForUpdate. При успешном обновлении version формы увеличивается на единицу.
Имя команды для вызова: UIStorage_kafka_UpdateForm. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: EntityFormSettingsForUpdate
- На выходе: Int (1 - в случае успеха, 0 - при неудаче)
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: Команда не принимает параметров
- На выходе: List[EntityFormSettingsDTO]
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: EntityTypeWithFormType
- На выходе: EntityFormSettings
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: List[String]
- На выходе: List[EntityFormSettings]
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: Команда не принимает параметров
- На выходе: List[GlobalSetting]
GetValue (UI Storage)
Передаем ключ глобальной настройки
"color"
Получаем значение глобальной настройки
"#fcbe03"
Возвращает JSON-значение глобальной настройки по ключу key.
Имя команды для вызова: UIStorage_http_GetValue. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: GlobalSettingKey
- На выходе: Json
CreateKey (UI Storage)
Передаем данные глобальной настройки
{
"key": "color",
"value": "#fcbe03",
"title": "Цвет"
}
Получаем признак успешности
true
Создать новую глобальную настройку из данных CreateKeyDTO.
Гарантируется уникальность для поля key.
Имя команды для вызова: UIStorage_kafka_CreateKey. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: CreateKeyDTO
- На выходе: Boolean (приходит признак успешности выполнения команды)
UpdateKey (UI Storage)
Передаем данные глобальной настройки для обновления
{
"key": "color",
"value": "#fcbe04",
"title": "Цвет фона",
"version": 1
}
Получаем признак успешности
true
Обновить существующую глобальную настройку данными из UpdateKeyDTO.
При успешном обновлении version настройки увеличивается на единицу.
Имя команды для вызова: UIStorage_kafka_UpdateKey. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: UpdateKeyDTO
- На выходе: Boolean
UpdateValue (UI Storage)
Передаем данные глобальной настройки для обновления
{
"key": "color",
"value": "#fcbe05",
"version": 1
}
Получаем признак успешности
true
Обновить значение существующей глобальной настройки из UpdateValueDTO.
При успешном обновлении version настройки увеличивается на единицу.
Имя команды для вызова: UIStorage_kafka_UpdateValue. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: UpdateValueDTO
- На выходе: Boolean
DeleteKey (UI Storage)
Передаем ключ глобальной настройки
"color"
Получаем признак успешности
true
Удалить существующую глобальную настройку по её ключу key.
Имя команды для вызова: UIStorage_kafka_DeleteKey. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды журналируется.
- На входе: GlobalSettingKey
- На выходе: Boolean
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. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: List[PersistFileDTO]
- На выходе: List[GlobalSettingFile]
Модели сервиса хранения UI
В сервисе использованы следующие модели:
- FormTypeId
- FormType
- EntityFormSettingsId
- EntityFormSettingsCreateDTO
- EntityFormSettings
- EntityFormSettingsForUpdate
- EntityTypeWithFormType
- EntityFormSettingsDTO
- FormTypeDTO
- GlobalSettingKey
- GlobalSetting
- CreateKeyDTO
- UpdateKeyDTO
- UpdateValueDTO
- PersistFileDTO
- GlobalSettingFile
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, то необходимо задать следующие переменные, которые по умолчанию не заданы:
LOGGING_SRC_IP, для параметраsrcв логахLOGGING_SRC_HOST, для параметраshostв логахLOGGING_DST_IP, для параметраdstв логах
В файле src/main/resources/log4j.xml можно поменять class path для основного класса приложения (переменная projectMainClassPath), если это необходимо.
Команды сервиса профилей пользователей
createProfileSection (User-profile)
На входе объект с секцией
{
"title": "test section"
}
На выходе Id созданной секции
"test_section"
Создает секцию в профиле пользователя. Если явный Id не указан, генерирует его автоматически, заменяя " " на "_" и транслитерируя символы кириллицы в латиницу.
Имя команды для вызова: userProfile_createProfileSection. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: CreateSection
- На выходе: String
deleteProfileSection (User-profile)
На входе Id секции
"test_section"
На выходе ничего
{}
Удаляет секцию в профиле пользователя по ее Id.
Имя команды для вызова: userProfile_deleteProfileSection. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: String
- На выходе: Json (пустой объект)
updateProfileSection (User-profile)
Объект для изменения секции
{
"id": "test_section",
"title": "new test title",
"description": "test description"
}
На выходе ничего
{}
Меняет название и описание секции.
Имя команды для вызова: userProfile_updateProfileSection. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: Section
- На выходе: Json (пустой объект)
getProfileSections (User-profile)
На входе ничего
{}
На выходе список информаций о секции
[
{
"title": "Профиль пользователя",
"id": "userProfile",
"description": ""
},
{
"title": "Основные данные",
"id": "basicData",
"description": ""
},
{
"title": "Test title",
"id": "test_title",
"description": "Test title"
}
]
Возвращает список секций в структуре профиля.
Имя команды для вызова: userProfile_getProfileSections. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: Команда не принимает параметров
- На выходе: List[Section]
addProfileField (User-profile)
На входе объект с информацией о поле
{
"sectionId": "test_section",
"title": "Тестовое поле",
"type": "string",
"multiple": false,
"settings": {
"maxLength": 100
}
}
На выходе Id нового поля
"Testovoye_pole"
Создает поле в секции профиля. Если явный Id поля не указан, генерирует его автоматически, заменяя " " на "_" и транслитерируя символы кириллицы в латиницу.
Имя команды для вызова: userProfile_addProfileField. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: AddSectionField
- На выходе: String
deleteProfileField (User-profile)
На входе Id секции и Id поля
{
"sectionId": "test_section",
"fieldId": "Testovoye_pole"
}
На выходе ничего
{}
Удаляет поле в секции.
Имя команды для вызова: userProfile_deleteProfileField. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: DeleteSectionField
- На выходе: Json (пустой объект)
updateProfileField (User-profile)
На входе новые параметры поля
{
"sectionId": "test_section",
"fieldId": "Testovoye_pole",
"title": "new test title",
"description": "updated description",
"settings": {
"maxLength": 150
}
}
На выходе ничего
{}
Изменяет некоторые параметры поля.
Имя команды для вызова: userProfile_updateProfileField. Поддерживается асинхронный и синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: UpdateSectionField
- На выходе: Json (пустой объект)
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. Поддерживается только синхронный вызов.
Результат выполнения команды не журналируется.
- На входе: String
- На выходе: List[SectionField]
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. Поддерживается синхронный и асинхронный вызов.
Результат выполнения команды не журналируется.
- На входе: GetUserProfileDTO
- На выходе: UserProfileDTO
setUserProfileField (User-profile)
На входе информация для обновления поля профиля
{
"userId": "5dfbbda7-b340-4a04-aae2-da4379f89eb9",
"section": "basicData",
"field": "name",
"value": "JohnJohn",
"version": 3
}
На выходе новая версия
4
Меняет указанное поле в профиле пользователя, если совпадает версия.
Имя команды для вызова: userProfile_setUserProfileField. Поддерживается синхронный и асинхронный вызов.
Результат выполнения команды не журналируется.
- На входе: SetProfileFieldDTO
- На выходе: Int
Обрабатываемые события сервиса профилей пользователей
События слушаются в 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 |