NAV
json scala

Standart

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

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

21.0.0

sed-comment - Убран скролл при появление ошибки в добавление/редактирование комментария FRGU-1854

19.2.0

sed-components

16.0.0

sed-components

15.1.0

15.0.0

13.1.1

sed-comment

13.1.0

sed-comment

@standart/components - Добавлено событие close для PopoverComponent. - Добавлена возможность управлять закрытием элемента с AttachedOverlayDirective при клике за его границу. FRGU-2374 - Добавлена функция isPresentPredicate - Добавлен оператор controlValue FRGU-690

12.2.0

13.0.0

12.0.1

job-scheduler

12.0.0

job-scheduler

11.3.1

sed-task-manager - Доработка TaskEnricher, для работы с несколькими полями

11.3.0

job-scheduler

11.2.0

job-scheduler

11.1.4

11.1.3

11.1.0

11.0.2

11.0.1

11.0.0

@standart/comment

10.5.0

job-scheduler - Добавлен сервис нагрузки SEDNMD-3113

10.4.0

crypto-service - Добавлен сервис хранения электронных подписей FRGU-1644

standart-libs - Добавлены миксин JournalingHandler для обработчиков команд с журналированием.

[BreakingChanges] com.embedika.standart.commands.tf.handlers: - Типы тела команды и результата обработки "спрятаны внутрь" класса CommandHandler, то есть теперь являются абстрактными членами-типами, а не типопараметрами. - В связи с пунктом выше отпала необходимость в классе CommandHandlersModuleDef, ибо вместо подробного описания всех типов теперь можно обойтись строчкой many[CommandHandler[F]].add[MyHandler[F]]. - В связи с пунктом выше отпала необходимость в пакете com.embedika.standart.boot.tf.modules.commands. Класс CommandsModule перемещён на уровень выше. - Удалены классы HttpCommandHandler, KafkaCommandHandler, и, соответственно, AuthorizedHttpCommandHandler и AuthorizedKafkaCommandHandler. Теперь за тип приёма команды отвечает новый пункт dispatchType в CommandDescription. - Класс AuthorizeOneActionDTO переехал из объекта AuthorizedHandler в вышестоящий пакет.

standart-libs - [Deprecation] Трейт BaseClient будет удален в будущем. - Изменён подход к описанию клиентов для сервисов. Теперь набор базовых методов для отправки команд добавляется в класс не посредством примешивания трейта BaseClient, а посредством прокидывания в качестве зависимости экземпляра ExtendedDispatcherTF/ExtendedDispatcher. - Функционал отправки асинхронных команд с запросом результата вынесен в подкласс AsyncPollingDispatcherTF. - На основании вышеприведённых доработок создан TF клиент сервиса иерархий. - В качестве временной меры добавлены клиенты сервисов buzzer и erika. Будут удалены после появления таковых в verdi-libs.

@standart/components

hierarchy-entities - В таблице HierarchyEntityObject добавлен foreign key для поля parentId, ссылающийся на поле id в той же таблице. - Добавлены в сервис и клиент команды deleteHierarchyEntityObjectWithChildrenCheck и deleteHierarchyEntityObjectBatchWithChildrenCheck, позволяющие различными способами обработать (каскадно удалить, прикрепить к другой сущности и т. д. ) дочерние сущности перед удалением родительской. STND-63

standart-libs В механизме слияния документов (WordDocumentProcessorImpl.mergeDocumentStreams) изменена используемая внутри библиотека с docx4j на apache poi. Пользовательское апи никак не изменено. Рекомендуется в проектах, использующих данный функционал и логирование через slf4j, подключить зависимость "org.apache.logging.log4j" % "log4j-to-slf4j" % "2.17.1", чтобы работали внутренние механизмы логирования apache poi (они обращаются к апи log4j).

Версия 10.3.0

sed-task-manager

iua-adapter

standart-libs

Версия 10.2.0

hierarchy-entities

standart-libs

@standart/components

Версия 10.1.0

standart-libs

ui-libs

Версия 8.0.7

hierarchy-entities - В таблице HierarchyEntityObject добавлен foreign key для поля parentId, ссылающийся на поле id в той же таблице. - Добавлены в сервис и клиент команды deleteHierarchyEntityObjectWithChildrenCheck и deleteHierarchyEntityObjectBatchWithChildrenCheck, позволяющие различными способами обработать (каскадно удалить, прикрепить к другой сущности и т. д. ) дочерние сущности перед удалением родительской. STND-63

standart-libs В механизме слияния документов (WordDocumentProcessorImpl.mergeDocumentStreams) изменена используемая внутри библиотека с docx4j на apache poi. Пользовательское апи никак не изменено. Рекомендуется в проектах, использующих данный функционал и логирование через slf4j, подключить зависимость "org.apache.logging.log4j" % "log4j-to-slf4j" % "2.17.1", чтобы работали внутренние механизмы логирования apache poi (они обращаются к апи log4j).

Версия 8.0.6

standart-libs - В клиент для s3 добавлен мехазим ретраев. - Ошибки клиента для s3 сделаны более читаемыми. - Класс OutgoingRequestsSettings переехал из модуля boot в модуль domain. Версия из модуля boot временно существует, также в модуль UtilsModule добавлено преобразование из legacy модели. Данное преобразование и старый класс будут удалены в ближайших релизах. STND-64

Версия 10.0.0

sed-comment

standart-libs

ui-libs

Версия 9.0.0

standart-libs

ui-libs

Версия 8.0.5

hierarchy-entities

Версия 8.0.4

-обновлено verdi/cursor до 1.10.1 SEDNMD-3026

Версия 8.0.1

hierarchy-entities

Версия 8.0.0

standart-libs

sed-comment

Версия 7.2.0

sed-comment

sedTaskManager

Версия 7.1.0

sed-comment

ui-libs

sedTaskManager

Версия 7.0.1

standart-libs

Версия 7.0.0

Обновлено до версии 1.10.0 Cursor/Verdi

STND-23 STND-25

hierarchy-entities

sed-comment

sed-route

ui-libs

standart-libs

Версия 6.3.0

standart-libs

ui-libs

Версия 6.2.0

standart-conf

Добавлен payload в логи для случаев когда команда с ошибкой завершилась FRGU-109

standart-libs

Версия 6.1.0

Обновлено до версии 1.9.1 Cursor/Verdi

hierarchy-entities

В клиент сервиса иерархии вынесена команда hierarchyEntities_listHierarchy SEDNMD-2664 Доработка запроса для выбора модели - Поддержка серверной части

sed-comment

Добавлена команда для кол-ва комментариев с резолюциями FRGU-707

sed-route

Миграция для старых данных FRGU-870

standart-libs

Версия 6.0.0

sed-comment

sed-route

Версия 5.0.0

sed-comment

sed-task-manager

sed-route

FRGU-606 Выделение логики из crud команд FRGU-635 Комментирование атрибутов отображать на всех стадиях FRGU-649 Поиск и фильтрация списка задач SEDNMD-2547 Типы переходов routeStageLink

В OpenSearchStorageClient добавлено поле index в DeleteByQueryRequest

SEDNMD-2357

Версия 4.0.0

FRGU-595 Обновиться до Angular 17 FRGU-608 Оптимизировать библиотеки Стандарта FRGU-609 Почистить библиотеки Стандарт от не используемого кода FRGU-610 Почистить зависимости сервисов Стандарт

Обновлено до версии 1.9 Cursor/Verdi

Версия 3.0.0

Обновлено до версии 1.8.2 Cursor/Verdi

  1. FRGU-625
  2. SEDNMD-2456
  3. SEDNMD-2478

sed-route

Добавлен параметр для управления уведомлением на стадии SEDNMD-2433 Изменить уведомление "Изменение стадии маршрута"

UI-libs-sed-comment

Версия 2.2.0

sed-comment

  1. FRGU-519 Реализована возможность привязывать комментарии к атрибутам.
  2. FRGU-519 Доработка listThreads для отображения кол-ва комментариев

sed-route

SEDNMD-2401 Модальное окно выбора решения в Запросах маршрутов

sed-libs

  1. В библиотеке standart-storage-lib добавлены общие трейты для Queries для того, чтобы была возможность фильтроваться и сортировать по Search не наследуясь от трейта Modifiable FRGU-514 Интерфейс Управления миграциями
  2. Создан обобщенный клиент хранилища. Добавлена возможность перехода от использования только ElasticSearch на переключаемый между ElasticSearch и OpenSearch FRGU-495 Добавить поддержку sed-analytic и sed-report поддержку openSearch

UI-libs

В либе добавлен раздел комментирования атрибутов FRGU-520 Комментирование атрибутов

Версия 2.1.0

sed-comment

sed-components

sed-route

Версия 2.0.0

Обновлено до версии 1.8 Cursor/Verdi

Список изменений:

Verdi: Версия 1.8 Cursor: Версия 1.8

Версия 1.0.1

Добавлен на фронте option-dependencies, чтобы либы не зависили сами от себя

Версия 1.0.0

Вынесен общий код из СЭД в общий репозиторий Standart

SEDNMD-2296 FRGU-377

Общая библиотека:

Сервисы:

Созданы UI-библиотеки:

FRGU-393

Переименованы команды сервиса комментариев

FRGU-407 SEDNMD-2296

analytics: сервис аналитики

Сервис читает события EntityObjectEvent и формирует представления по заданным настройкам, по полученным представлением можно строить аналитику двух видов - Сводная таблица и круговая диаграмма. Настройки аналитики хранятся в виджетах и могут быть настроены.

Команды могут приходить как по HTTP, так и через Kafka в топик analytics_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информацию по добавлению команд можно прочитать в описании шаблона

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью SBT

ANALYTICS_DB_HOST=localhost ANALYTICS_DB_PORT=5432 ANALYTICS_DB_NAME=analytics_db ANALYTICS_DB_USER=postgres ANALYTICS_DB_PASSWORD=12345 sbt boot/run

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

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

Переменная Тип Обязательная Значение по умолчанию Описание
ANALYTICS_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
ANALYTICS_HTTP_PORT int нет 8192 Порт, на котором слушает HTTP-сервер
ANALYTICS_COMMANDS_CONSIDER_ALL_INTERNAL boolean да false Все межсервисные команды являются внутренними (internal) и не требуют авторизации
ANALYTICS_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
ANALYTICS_KAFKA_TOPIC string нет "analytics_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
ANALYTICS_KAFKA_CONSUMER_GROUP string нет "analytics_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
ANALYTICS_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
ANALYTICS_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
ANALYTICS_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
ANALYTICS_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
ANALYTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах ANALYTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
ANALYTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который ANALYTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
ANALYTICS_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
ANALYTICS_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
ANALYTICS_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
ANALYTICS_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
ANALYTICS_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к хранилищу сертификатов.
ANALYTICS_KAFKA_AUTH_PRINCIPAL string нет "" Principal учетной записи Kafka в Kerberos(в случае соединения с kafka через Kerberos).
ANALYTICS_KAFKA_AUTH_KEYTAB_PATH string нет "" Путь до keytab-файла(в случае соединения с kafka через Kerberos).
ANALYTICS_KAFKA_AUTH_MODE string нет "" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
ANALYTICS_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]
ANALYTICS_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
ANALYTICS_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
ANALYTICS_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
ANALYTICS_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
ANALYTICS_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
ANALYTICS_DISCOVERABLE_ID_PREFIX string нет "another_analytics_instance" Префикс для ID сервиса в ServiceDiscovery. ID сервиса будет состоять из префикса и времени запуска сервиса в формате Unix timestamp.
ANALYTICS_DISCOVERABLE_NAME string нет "analytics" Имя сервиса в ServiceDiscovery
ANALYTICS_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
ANALYTICS_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
ANALYTICS_DISCOVERABLE_TTL duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
ANALYTICS_DISCOVERABLE_HEALTHPASS duration string нет 1 minute Периодичность отправки health check в ServiceDiscovery
ANALYTICS_DISCOVERABLE_HEALTHTIMEOUT duration string нет 10 seconds Таймаут отправки health check в ServiceDiscovery
ANALYTICS_SERVICE_NAME string нет analytics Название сервиса для отображения
ANALYTICS_SERVICE_DESCRIPTION string нет "Service ANALYTICS" Описание сервиса для отображения
ANALYTICS_INTERNALCMD_ALLOW bool нет true Можно ли сервису отправлять внутрисистемные команды
ANALYTICS_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
ANALYTICS_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
ANALYTICS_DB_HOST string да Хост БД
ANALYTICS_DB_PORT int да Порт БД
ANALYTICS_DB_NAME string да Имя базы в БД
ANALYTICS_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
ANALYTICS_DB_USER string да Пользователь БД
ANALYTICS_DB_PASSWORD string да Пароль пользователя БД
ANALYTICS_DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
ANALYTICS_DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
ANALYTICS_DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
ANALYTICS_DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
ANALYTICS_DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
ANALYTICS_DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
ANALYTICS_DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
ANALYTICS_DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
ANALYTICS_DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
ANALYTICS_DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
ANALYTICS_DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
ANALYTICS_DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
ANALYTICS_DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
ANALYTICS_DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
ANALYTICS_AUTHZFORCE_ADDR string нет "http://localhost:8080/authzforce-ce" Адрес AuthZforce server
ANALYTICS_AUTHZFORCE_DOMAIN string нет "" Доступный DomainID в AuthZforce server
ANALYTICS_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
ANALYTICS_LOG_LEVEL_AUTHORIZATIONSERVICE string нет INFO Уровень логирования для AuthorizationService
ANALYTICS_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
ANALYTICS_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
ANALYTICS_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
ANALYTICS_LOG_LEVEL_SLICK_STATEMENT string нет DEBUG Уровень логирования запросов, отправляемых slick в БД
ANALYTICS_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирования бенчмарков выполнения запросов slick
ANALYTICS_LOG_LEVEL_SLICK_PARAMETER string нет OFF Уровень логирования заполнения параметризованных запросов slick параметрами
ANALYTICS_LOG_LEVEL_SLICK_QUERY_COMPILER string нет OFF Уровень логирования компиляции запросов slick
ANALYTICS_LOG_LEVEL_SLICK_QUERY_COMPILER_BENCHMARK string нет OFF Уровень логирования бенчмарков компиляции запросов slick
ANALYTICS_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
ANALYTICS_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования kafka-consumer
ANALYTICS_LOG_LEVEL_HTTP_SERVER string нет WARN Уровень логирования HTTP-сервера
ANALYTICS_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
ANALYTICS_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
ANALYTICS_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
ANALYTICS_LOG_OUTPUT string нет STDOUT Вывод лога
ANALYTICS_SYSLOG_TYPE string нет UDP Тип передачи syslog
ANALYTICS_LOGGING_SRC_IP string нет "localhost" для параметра src в логах
ANALYTICS_LOGGING_SRC_HOST string нет "SERVER" для параметра shost в логах
ANALYTICS_LOGGING_DST_IP string нет "SERVER" для параметра dst в логах
ANALYTICS_LOGGING_CEF_VER string нет 0 версия CEF
ANALYTICS_MAX_PAGE_SIZE int нет 500 Максимальный размер одной страницы при постраничном получении или отправке данных
ANALYTICS_REQUEST_PARALLELISM int нет 16 Максимальное число одновременно отправляемых запросов во внешние сервисы
ANALYTICS_RETRY_DELAY duration string нет 2 seconds Максимальное число ретраев на запросы во внешние сервисы
ANALYTICS_RETRY_COUNT string нет 5 Задержка между ретраями запросов во внешние сервисы
ANALYTICS_MIGRATIONS_TIMEOUT duration string нет 10 minutes Таймаут для миграций CustomChange
ANALYTICS_EXPORT_FILE_NAME string нет .xlsx Имя файла при экспорте данных
ANALYTICS_EXPORT_TIME_ZONE string нет Europe/Moscow Зона для даты/времени экспорта
ANALYTICS_EXPORT_DATE_FORMAT string нет dd.MM.yyyy HH.mm Формат даты/времени для экспорта
ANALYTICS_EXPORT_BUCKET string нет temp Бакет, в который сохраняется экспортируемый файл
ANALYTICS_EXPORT_DATE_COLUMN_NAMES string нет "" Названия колонок с датами в экспортируемом файле, для правильного отображения
ANALYTICS_EXPORT_COUNT_COLUMN_NAMES string нет "" Названия колонок с общим количеством в экспортируемом файле, для правильного отображения
ANALYTICS_EXPORT_PAGE_SIZE int нет 256 Размер страницы для экспорта
ANALYTICS_EXPORT_READ_BUFFER_SIZE int нет 4096 Размер буфера для экспорта
ANALYTICS_EXPORT_GROUPS_SEPARATOR string нет ; Уровень логирования для проверки состояний команд в сервисе статусов
ANALYTICS_FS_URI string нет http://localhost:9000 Адрес хранилица для файлов FS
ANALYTICS_FS_ACCESS_KEY_ID string нет "" ID для подключения хранилица файлов FS
ANALYTICS_FS_SECRET_ACCESS_KEY string нет "" Key для подключения хранилица файлов FS
ANALYTICS_FS_UPLOAD_PARALLELISM int нет 4 Количество файлов, одновременно загружаемых в хранилище FS
ANALYTICS_FS_AUTH_MODE string нет static Режим аутентификации FS клиента: Static - данные для подключения не зависят от бакета, Mapping - данные зависят от бакета. По-умолчанию Static
ANALYTICS_FS_AUTH_CONFIG string нет "" Настройки для выбранного режима аутентификации FS клиента. Если authMode=Mapping, то ожидается Seq[FSBucketConfig] в формате JSON.
ANALYTICS_FS_TARGET_THROUGHPUT_IN_GPS double нет 10.0
ANALYTICS_FS_MINIMUM_PART_SIZE_IN_BYTES int нет 8388608
ANALYTICS_FS_CHECKSUM_VALIDATION_ENABLED string нет ""
ANALYTICS_FS_CACHE_SIZE int нет ""
ANALYTICS_FS_CACHE_TTL bool нет ""

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

У логов есть возможность включить формат 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, нужно задать значение переменной с постфиксом CEF. Например, ANALYTICS_LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то желательно поменять следующие переменные:

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

Список команд сервиса analytics

В сервисе реализованно 3 команды:

ImportView

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

На входе описание представления

{
  "table": "Registry",
  "columns": [
    {
      "table": "Registry",
      "name": "id",
      "isMultiple": false,
      "displayName": "ID услуги",
      "dataType": "StringType",
      "isId": true
    },
    {
      "table": "Registry",
      "name": "name",
      "isMultiple": false,
      "displayName": "Наименование",
      "dataType": "StringType",
      "isId": false
    },
    {
      "table": "Registry",
      "name": "isDraft",
      "isMultiple": false,
      "displayName": "Признак черновика",
      "dataType": "BooleanType",
      "isId": false
    }
  ],
  "events": [
    {
      "affectType": {
        "affectType": "Upsert"
      },
      "entityType": "Registry",
      "eventType": [
        "update"
      ],
      "entityObjectFilter": {
        "key": "status",
        "values": [
          "New",
          "InProcess"
        ]
      },
      "fields": [
        {
          "from": "name",
          "to": "name",
          "fieldAffectType": {
            "fieldAffectType": "Replace"
          }
        }
      ]
    },
    {
      "affectType": {
        "affectType": "Upsert"
      },
      "entityType": "AnotherRegistry",
      "eventType": [
        "update"
      ],
      "fields": [
        {
          "from": "draft",
          "to": "isDraft",
          "fieldAffectType": {
            "fieldAffectType": "Replace"
          }
        }
      ]
    },
    {
      "affectType": {
        "affectType": "Delete"
      },
      "entityType": "Registry",
      "eventType": [
        "update",
        "create"
      ],
      "entityObjectFilter": {
        "key": "status",
        "values": [
          "Removed"
        ]
      },
      "fields": []
    }
  ]
}

На выходе создаётся предсталвение с название Registry, с колонками id, name и isDraft, колонка id берётся из id сущности Registry, колонка name обновляется по событиям обновления сущности Registry с полем status равным New или InProcess. Колонка isDraft обновляется при событии обновления сущности AnotherRegistry и берётся из колонки draft . Запись удаляется из представления по событию обновления поля status = Removed у сущности Registry.

Команда Тип
analytics_importView Kafka

ImportWidget

Добавляет новый виджет, который является запросом над представлениями.

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

Первый вариант, создаёт сводную таблицу

{
  "name": "summaryWidget",
  "title": "Сводная таблица",
  "table": {
    "name": "Registry",
    "tableDef": "SimpleTable"
  },
  "view": [
    {
      "alias": "countId",
      "level": 1,
      "table": null,
      "column": "id",
      "function": {
        "aggType": "Count",
        "distinct": false
      },
      "displayName": "Количество сущностей",
      "transformationType": "Aggregate"
    },
    {
      "alias": "countName",
      "level": 1,
      "table": null,
      "column": "name",
      "function": {
        "aggType": "Count",
        "distinct": true
      },
      "displayName": "Количество уникальных наименований",
      "transformationType": "Aggregate"
    }
  ]
}

Второй вариант, круговая диаграмма

{
  "name": "pieChartWidget",
  "title": "Круговая диаграмма",
  "table": {
    "joins": [
      {
        "left": {
          "name": "Registry",
          "alias": "Registry",
          "joinColumn": "columnRegistry"
        },
        "right": {
          "name": "AnotherRegistry",
          "alias": "AnotherRegistry",
          "joinColumn": "anotherColumn"
        },
        "joinType": {
          "joinType": "InnerJoin"
        }
      }
    ],
    "tableDef": "TableJoins"
  },
  "view": [],
  "settings": {
    "columns": [
      "name"
    ],
    "chartSettingsType": "PieChartSettings"
  }
}
Команда Тип
analytics_importWidget Kafka

GetAnalytics

Получает аналитику по заданному виджету.

На входе название виджета и Search

{
  "widget": "summaryWidget",
  "search": {
    "query": "level",
    "context": {
      "level": {
        "values": [
          "Init"
        ],
        "kind": "any"
      }
    }
  }
}

Пример вывода (сводная таблица)

{
  "tableData": {
    "columns": [
      {
        "name": "countId",
        "isMultiple": false,
        "displayName": "Количество сущностей",
        "dataType": "StringType"
      },
      {
        "name": "countName",
        "isMultiple": false,
        "displayName": "Количество наименований",
        "dataType": "StringType"
      }
    ],
    "rows": [
      {
        "countId": 561,
        "countName": 269
      }
    ],
    "total": 1
  },
  "chartType": "Summary"
}

Пример вывода (круговая диаграмма)

{
  "values": [
    {
      "value": "Territorial",
      "count": 2.0,
      "percentOfParent": 2.5,
      "percentOfTotal": 2.5,
      "subLayers": []
    },
    {
      "value": "Central",
      "count": 78.0,
      "percentOfParent": 97.5,
      "percentOfTotal": 97.5,
      "subLayers": []
    }
  ],
  "totalCount": 80,
  "chartType": "PieChart"
}
Команда Тип
analytics_getAnalytics HTTP

UpdateViewManual

Внутренняя команда, добавляет информацию о событиях.

На входе событие TypedEvent[Json]

{
  "event": {
    "eventType": "update",
    "payloadType": "Registry",
    "payloadId": "bc2ed3ed-a985-4ddf-935e-29a878de6bbd",
    "payload": {
      "id": "bc2ed3ed-a985-4ddf-935e-29a878de6bbd",
      "externalId": null,
      "entityType": "Registry",
      "title": "Tests",
      "created": 1759833793752,
      "modified": 1759833793752
    }
  }
}

Добавляет информацию в представление с соответствующим названием.

Команда Тип
analytics_updateViewManual Kafka

CreateAnalyticsReport

Создаёт выгрузку данных виджета в Excel формате.

На входе название виджета и Search

{
  "widget": "summaryWidget",
  "search": {
    "query": "level",
    "context": {
      "level": {
        "values": [
          "Init"
        ],
        "kind": "any"
      }
    }
  }
}

На выходе StoredFile, содержащий файл Excel

Команда Тип
analytics_createAnalyticsReport Kafka

Сущности сервиса Analytics

ViewInfo

Поле Тип Обязательное Описание
table string да Название представления в БД, используется в виджетах
columns ColumnInfo да Описание колонок представления
events AffectingEvent да Описание событий, по которым обновляется представления

ColumnInfo

Поле Тип Обязательное Описание
table string да Название представления в БД, используется в виджетах
name string да Название колонки
isMultiple boolean да Признак, что колонка является массивом
displayName string да Человекочитаемое название колонки, для вывода на фронт
dataType string да Тип данных колонки DataType
isId string да Признак первичного ключа

DataType

Тип данных колонки, может быть StringType для строк, NumericType для чисел (scala-тип BigDecimal), BooleanType для булевых значений

AffectingEvent

Поле Тип Обязательное Описание
affectType AffectType да Тип обновления представления из события
entityType string да Тип сущности из EntityObject
eventType boolean да Тип события
updateValueColumn string нет Название колонки в data, где хранится ID строки представления, если не передано, берётся ID EntityObject
updateColumn string нет Название колонки для обновления представления, если не передано, берётся колонка с isId = true
fields AffectingField да Список обновлений колонок
entityObjectFilter EntityObjectFilter нет Фильтр EntityObject, событие пропускается, если не подходит под фильтр

AffectType

Тип обновления представления, Insert, Update, Upsert, Delete

AffectingField

Поле Тип Обязательное Описание
from string да Название колонки в data, откуда берётся значение
to string да Название колонки представления, куда кладётся значение
fieldAffectType FieldAffectType да Тип обновления колонки

FieldAffectType

Тип обновления колонки, реализование один тип - Replace, полная замена значения колонки

EntityObjectFilter

Поле Тип Обязательное Описание
key string да Название колонки в data
values json[] да Список допустимых значений

Widget

Поле Тип Обязательное Описание
name string да Название виджета
title string да Название видхета в человекочитаемом виде
table TableDef да Описание таблицы
view Transformation[] да Список преобразований представления для аналитики
settings ChartSettings да Настройки виджета
exportSettings WidgetExportSettings нет Настройки экспорта виджета

TableDef

Описание таблицы, может быть SimpleTable или TableJoins

SimpleTable

Поле Тип Обязательное Описание
name string да Название представления

TableJoins

Поле Тип Обязательное Описание
joins TableJoin[] да Список таблиц

TableJoin

Поле Тип Обязательное Описание
left TableWithAlias да Левая таблица соединения
right TableWithAlias да Правая таблица соединения
joinType JoinType да Тип соединения

TableWithAlias

Поле Тип Обязательное Описание
name string да Название представления
alias string да Алиас представления
joinColumn string да Название колонки соединения

JoinType

Тип соединения, InnerJoin, LeftJoin, RightJoin

Transformation

Описание преобразования над представлением, бывает:

Select

Поле Тип Обязательное Описание
columns SelectField[] да Список колонки для выбора

SelectField

Поле Тип Обязательное Описание
table string нет Название таблицы (если колонка повторяется в нескольких таблицах)
column string да Название колонки
level integer да Уровень (для многоуровневой группировки, иначе везде 1)

GroupBy

Поле Тип Обязательное Описание
columns GroupByColumn[] да Список колонки для выбора

GroupByColumn

Поле Тип Обязательное Описание
table string нет Название таблицы (если колонка повторяется в нескольких таблицах)
column string да Название колонки
includeInSelect boolean да Включать ли колонку в итоговую выборку
level integer да Уровень (для многоуровневой группировки, иначе везде 1)

Filter

Поле Тип Обязательное Описание
column string да Название колонки
condition FilterCondition да Условие фильтрации
negation boolean да Признак отрицания

FilterCondition

Условие фильтрации, бывает In, More, Less, ILike

In

Поле Тип Обязательное Описание
values string[] да Список зачений фильтра

More

Поле Тип Обязательное Описание
value integer да Зачение фильтра

Less

Поле Тип Обязательное Описание
value integer да Значение фильтра

ILike

Поле Тип Обязательное Описание
value string да Значение фильтра

MathExpression

Поле Тип Обязательное Описание
leftColumn string нет Название левой колонки
rightColumn string да Название правой колонки
expr MathOperation да Математическое выражение
alias string да Алиас колонки
displayName string да Человекочитаемое название колонки
level string да Уровень (для многоуровневой группировки, иначе везде 1)

MathOperation

Условие фильтрации, бывает Add, Subtract, Multiply

Aggregate

Поле Тип Обязательное Описание
table string нет Название таблицы (если колонка повторяется в нескольких таблицах)
function AggregateFunction да Тип агрегации
column string да Название колонки
alias string да Алиас колонки
displayName string да Человекочитаемое название колонки
level string да Уровень (для многоуровневой группировки, иначе везде 1)

MathOperation

Условие фильтрации, бывает Avg, ArrayAgg, Sum, Max, Count

ChartSettings

Условие фильтрации, бывает PieChartSettings

PieChartSettings

Поле Тип Обязательное Описание
columns string[] да Колонки для построения круговой диаграммы
alwaysIncludedValues json[] нет Список обязательных значений, если они отсутствуют в PieChart будет value со значением 0
sortStrategy PieChartSortStrategy нет Стратегия сортировки значений
agg Aggregate нет Колонка для финальной агрегации (если не задано - count(*))

PieChartSortStrategy

Условие сортировки, ByValue или ByCount

AnalyticsInput

Поле Тип Обязательное Описание
widget string да Название виджета
search Search нет Search для фильтрации/пагинации/сортировки

Chart

Тип графика для аналитики:

Summary

Поле Тип Обязательное Описание
tableData TableInfo да Информация о таблице

TableInfo

Поле Тип Обязательное Описание
columns ShortColumnInfo[] да Информация о колонках
rows Map[String, Json][] да Строки таблицы
total long да Общее число записей

ShortColumnInfo

Поле Тип Обязательное Описание
name string да Название колонки
isMultiple boolean да Признак, что колонка является массивом
displayName string да Человекочитаемое название колонки, для вывода на фронт
dataType string да Тип данных колонки DataType

PieChart

Поле Тип Обязательное Описание
values PieChartValue[] да Информация о диаграмме
totalCount double да Сумма всех count у values

PieChartValue

Поле Тип Обязательное Описание
value json да Значение части диаграммы
count integer да Число таких значений
percentOfParent integer да Процент от родительского уровня
percentOfTotal integer да Процент от общего уровня
subLayers PieChartValue[] да Дорчерние уровни (если мультигруппировка)

WidgetExportSettings

Поле Тип Обязательное Описание
visibleColumns List[String] нет Id колонок, которые должны отображаться в экспорте. Порядок в массиве должен совпадать с ожидаемым порядком в xlsx файле.

TypedEvent[Json]

Поле Тип Обязательное Описание
eventType String да Тип события информация для более удобной фильтрации, например может принимать значения create, update, delete
payloadType String да Поле может содержать тип объекта, который передается, например в событиях из модели данных это может быть EntityTypeId
payloadId String да Id объекта, который передается. Может содержать идентификатор объекта из сервиса, который отправляет события, например UserId из mon или ObjectId из модели данных
payload json да Передаваемый объект

crypto-service: сервис для примера

Сервис принимает запросы для работы с игроками и командами. Состояние хранится в PostgreSQL. Команды могут приходить как по HTTP, так и через Kafka в топик crypto_service_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информацию по добавлению команд можно прочитать в описании шаблона

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью SBT

CRYPTO_SERVICE_DB_HOST=localhost CRYPTO_SERVICE_DB_PORT=5432 CRYPTO_SERVICE_DB_NAME=cryptoservice_db CRYPTO_SERVICE_DB_USER=postgres CRYPTO_SERVICE_DB_PASSWORD=12345 sbt boot/run

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

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

Переменная Тип Обязательная Значение по умолчанию Описание
CRYPTO_SERVICE_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
CRYPTO_SERVICE_HTTP_PORT int нет 8192 Порт, на котором слушает HTTP-сервер
CRYPTO_SERVICE_COMMANDS_CONSIDER_ALL_INTERNAL boolean да false Все межсервисные команды являются внутренними (internal) и не требуют авторизации
CRYPTO_SERVICE_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
CRYPTO_SERVICE_KAFKA_TOPIC string нет "crypto_service_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
CRYPTO_SERVICE_KAFKA_CONSUMER_GROUP string нет "crypto_service_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
CRYPTO_SERVICE_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
CRYPTO_SERVICE_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
CRYPTO_SERVICE_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
CRYPTO_SERVICE_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
CRYPTO_SERVICE_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах CRYPTO_SERVICE_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
CRYPTO_SERVICE_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который CRYPTO_SERVICE_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
CRYPTO_SERVICE_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
CRYPTO_SERVICE_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
CRYPTO_SERVICE_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
CRYPTO_SERVICE_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
CRYPTO_SERVICE_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к хранилищу сертификатов.
CRYPTO_SERVICE_KAFKA_AUTH_PRINCIPAL string нет "" Principal учетной записи Kafka в Kerberos(в случае соединения с kafka через Kerberos).
CRYPTO_SERVICE_KAFKA_AUTH_KEYTAB_PATH string нет "" Путь до keytab-файла(в случае соединения с kafka через Kerberos).
CRYPTO_SERVICE_KAFKA_AUTH_MODE string нет "" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
CRYPTO_SERVICE_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]
CRYPTO_SERVICE_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
CRYPTO_SERVICE_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
CRYPTO_SERVICE_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
CRYPTO_SERVICE_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
CRYPTO_SERVICE_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
CRYPTO_SERVICE_DISCOVERABLE_ID_PREFIX string нет "another_crypto_service_instance" Префикс для ID сервиса в ServiceDiscovery. ID сервиса будет состоять из префикса и времени запуска сервиса в формате Unix timestamp.
CRYPTO_SERVICE_DISCOVERABLE_NAME string нет "cryptoservice" Имя сервиса в ServiceDiscovery
CRYPTO_SERVICE_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
CRYPTO_SERVICE_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
CRYPTO_SERVICE_DISCOVERABLE_TTL duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
CRYPTO_SERVICE_DISCOVERABLE_HEALTHPASS duration string нет 1 minute Периодичность отправки health check в ServiceDiscovery
CRYPTO_SERVICE_DISCOVERABLE_HEALTHTIMEOUT duration string нет 10 seconds Таймаут отправки health check в ServiceDiscovery
CRYPTO_SERVICE_SERVICE_NAME string нет crypto-service Название сервиса для отображения
CRYPTO_SERVICE_SERVICE_DESCRIPTION string нет "Service CRYPTO_SERVICE" Описание сервиса для отображения
CRYPTO_SERVICE_INTERNALCMD_ALLOW bool нет true Можно ли сервису отправлять внутрисистемные команды
CRYPTO_SERVICE_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
CRYPTO_SERVICE_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
CRYPTO_SERVICE_DB_HOST string да Хост БД
CRYPTO_SERVICE_DB_PORT int да Порт БД
CRYPTO_SERVICE_DB_NAME string да Имя базы в БД
CRYPTO_SERVICE_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
CRYPTO_SERVICE_DB_USER string да Пользователь БД
CRYPTO_SERVICE_DB_PASSWORD string да Пароль пользователя БД
CRYPTO_SERVICE_DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
CRYPTO_SERVICE_DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
CRYPTO_SERVICE_DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
CRYPTO_SERVICE_DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
CRYPTO_SERVICE_DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
CRYPTO_SERVICE_DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
CRYPTO_SERVICE_DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
CRYPTO_SERVICE_DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
CRYPTO_SERVICE_DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
CRYPTO_SERVICE_DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
CRYPTO_SERVICE_DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
CRYPTO_SERVICE_DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
CRYPTO_SERVICE_DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
CRYPTO_SERVICE_DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
CRYPTO_SERVICE_AUTHZFORCE_ADDR string нет "http://localhost:8080/authzforce-ce" Адрес AuthZforce server
CRYPTO_SERVICE_AUTHZFORCE_DOMAIN string нет "" Доступный DomainID в AuthZforce server
CRYPTO_SERVICE_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
CRYPTO_SERVICE_LOG_LEVEL_AUTHORIZATIONSERVICE string нет INFO Уровень логирования для AuthorizationService
CRYPTO_SERVICE_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
CRYPTO_SERVICE_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
CRYPTO_SERVICE_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
CRYPTO_SERVICE_LOG_LEVEL_SLICK_STATEMENT string нет DEBUG Уровень логирования запросов, отправляемых slick в БД
CRYPTO_SERVICE_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирования бенчмарков выполнения запросов slick
CRYPTO_SERVICE_LOG_LEVEL_SLICK_PARAMETER string нет OFF Уровень логирования заполнения параметризованных запросов slick параметрами
CRYPTO_SERVICE_LOG_LEVEL_SLICK_QUERY_COMPILER string нет OFF Уровень логирования компиляции запросов slick
CRYPTO_SERVICE_LOG_LEVEL_SLICK_QUERY_COMPILER_BENCHMARK string нет OFF Уровень логирования бенчмарков компиляции запросов slick
CRYPTO_SERVICE_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
CRYPTO_SERVICE_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования kafka-consumer
CRYPTO_SERVICE_LOG_LEVEL_HTTP_SERVER string нет WARN Уровень логирования HTTP-сервера
CRYPTO_SERVICE_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
CRYPTO_SERVICE_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
CRYPTO_SERVICE_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
CRYPTO_SERVICE_LOG_OUTPUT string нет STDOUT Вывод лога
CRYPTO_SERVICE_SYSLOG_TYPE string нет UDP Тип передачи syslog
CRYPTO_SERVICE_LOGGING_SRC_IP string нет "localhost" для параметра src в логах
CRYPTO_SERVICE_LOGGING_SRC_HOST string нет "SERVER" для параметра shost в логах
CRYPTO_SERVICE_LOGGING_DST_IP string нет "SERVER" для параметра dst в логах
CRYPTO_SERVICE_LOGGING_CEF_VER string нет 0 версия CEF
CRYPTO_SERVICE_MAX_PAGE_SIZE int нет 500 Максимальный размер одной страницы при постраничном получении или отправке данных
CRYPTO_SERVICE_REQUEST_PARALLELISM int нет 16 Максимальное число одновременно отправляемых запросов во внешние сервисы
CRYPTO_SERVICE_RETRY_DELAY duration string нет 2 seconds Максимальное число ретраев на запросы во внешние сервисы
CRYPTO_SERVICE_RETRY_COUNT string нет 5 Задержка между ретраями запросов во внешние сервисы
CRYPTO_SERVICE_MIGRATIONS_TIMEOUT duration string нет 10 minutes Таймаут для миграций CustomChange
CRYPTO_SERVICE_FS_URI url string нет "http://localhost:9000" Адрес для подключения к хранилищу файлов по S3-API
CRYPTO_SERVICE_FS_ACCESS_KEY_ID string нет minioadmin Ключ доступа для хранилища файлов (aka логин)
CRYPTO_SERVICE_FS_SECRET_ACCESS_KEY string нет minioadmin Секретный ключ для хранилища файлов (aka пароль)
CRYPTO_SERVICE_FS_UPLOAD_PARALLELISM int нет 4 Параллелизм для загрузки файлов
CRYPTO_SERVICE_FS_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
CRYPTO_SERVICE_FS_AUTH_CONFIG string нет "" Настройки для аутентификации, если AuthMode = mapping (необходим доступ к бакетам "temp" и "datamodel")
CRYPTO_SERVICE_FS_CACHE_SIZE int нет Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
CRYPTO_SERVICE_FS_CACHE_TTL duration string нет Время жизни клиента в кеше
CRYPTO_SERVICE_TEMP_BUCKET string нет temp Бакет в файловом хранилище для временных файлов, загружаемых на gateway

Формат CEF для логов сервиса crypto-service

У логов есть возможность включить формат 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, нужно задать значение переменной с постфиксом CEF. Например, CRYPTO_SERVICE_LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то желательно поменять следующие переменные:

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

Список команд сервиса crypto-service

В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

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

CreateSignature

Создает новую подпись, сохраняет переданный контент в .sig файл, связывает подпись и внешнюю сущность.

Команда Тип
cryptoservice_createSignature Kafka

DeleteSignature

Удаляет подпись

Команда Тип
cryptoservice_deleteSignature Kafka

DeleteSignaturesByEntity

Удаляет подпись

Команда Тип
cryptoservice_deleteSignaturesByEntity Kafka

GetSignature

Возвращает подпись по Id.

Команда Тип
cryptoservice_getSignature HTTP

GetEntityWithSignatures

Возвращает внешнюю сущность со всеми связанными подписями.

Команда Тип
cryptoservice_getEntitySignatures HTTP

SignatureCreateDTO

Поле Тип Обязательное Описание
content String да content подписи
data Json нет Доп. данные
entityInfo EntityInfo нет Внешняя сущность

Signature

Поле Тип Обязательное Описание
id String да id/ md5 хэш
signature String да content подписи
authorId UUID да автор подписи
data Json нет Доп. данные
file SignatureFileMeta да Информация о файле

SignatureFileMeta

fileId: ObjectFileId, name: String, extension: String, size: Long, url: String, created: TimeStamp, md5: String,

Поле Тип Обязательное Описание
fileId UUID да id файла
name String да имя файла
extension String да расширение файла
size long да размер файла
url String да ссылка на файл
created long да время создания файла
md5 String да хэш файла

EntityInfo

Поле Тип Обязательное Описание
classCode String да Тип сущности
entityId String да Идентификатор сущности
data Json нет Доп. данные

ExtId

Поле Тип Обязательное Описание
classCode String да Тип сущности
entityId String да Идентификатор сущности

EntityWithSignature

Поле Тип Обязательное Описание
classCode String да Тип сущности
entityId String да Идентификатор сущности
signatures [Signature] нет Связанные подписи

hierarchy-entities

Сервис принимает команды и хранит состояние в PostgreSQL. Команды могут приходить как по HTTP, так и через Kafka в топик hierarchy_entities_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью SBT

HIERARCHY_ENTITIES_DB_HOST=localhost HIERARCHY_ENTITIES_DB_PORT=5432 HIERARCHY_ENTITIES_DB_NAME=hierarchyentities HIERARCHY_ENTITIES_DB_USER=postgres HIERARCHY_ENTITIES_DB_PASSWORD=12345 sbt boot/run

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

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

Переменная Тип Обязательная Значение по умолчанию Описание
HIERARCHY_ENTITIES_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
HIERARCHY_ENTITIES_HTTP_PORT int нет 8192 Порт, на котором слушает HTTP-сервер
HIERARCHY_ENTITIES_COMMANDS_CONSIDER_ALL_INTERNAL boolean да false Все межсервисные команды являются внутренними (internal) и не требуют авторизации
HIERARCHY_ENTITIES_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
HIERARCHY_ENTITIES_KAFKA_TOPIC string нет "hierarchy_entities_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
HIERARCHY_ENTITIES_KAFKA_CONSUMER_GROUP string нет "hierarchy_entities_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
HIERARCHY_ENTITIES_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который HIERARCHY_ENTITIES_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
HIERARCHY_ENTITIES_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
HIERARCHY_ENTITIES_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka(в случае аутентификации в kafka с помощью пароля). Если название не указано, то настройки авторизации не будут применены.
HIERARCHY_ENTITIES_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka(в случае аутентификации в kafka с помощью пароля).
HIERARCHY_ENTITIES_KAFKA_AUTH_PRINCIPAL string нет "" Principal учетной записи Kafka в Kerberos(в случае аутентификации в kafka через Kerberos).
HIERARCHY_ENTITIES_KAFKA_AUTH_KEYTAB_PATH string нет "" Путь до keytab-файла(в случае аутентификации в kafka через Kerberos).
HIERARCHY_ENTITIES_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
HIERARCHY_ENTITIES_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к хранилищу сертификатов.
HIERARCHY_ENTITIES_KAFKA_AUTH_MODE string нет "static" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
HIERARCHY_ENTITIES_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
HIERARCHY_ENTITIES_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
HIERARCHY_ENTITIES_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
HIERARCHY_ENTITIES_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL duration string нет 4 minutes Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом.
HIERARCHY_ENTITIES_KAFKA_CONNECTION_CHECK_INTERVAL duration string нет 60 seconds Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений.
HIERARCHY_ENTITIES_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL duration string нет 5 minutes Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным.
HIERARCHY_ENTITIES_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
HIERARCHY_ENTITIES_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
HIERARCHY_ENTITIES_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
HIERARCHY_ENTITIES_TRACE_DURATION boolean нет false Признак необходимости трассировки выполнения команд
HIERARCHY_ENTITIES_DISCOVERABLE_ID string нет "another_hierarchy_entities_service_instance" ID сервиса в ServiceDiscovery
HIERARCHY_ENTITIES_DISCOVERABLE_NAME string нет "hierarchyentities" Имя сервиса в ServiceDiscovery
HIERARCHY_ENTITIES_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
HIERARCHY_ENTITIES_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
HIERARCHY_ENTITIES_DISCOVERABLE_LIVETIME duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
HIERARCHY_ENTITIES_DISCOVERABLE_HEALTHPASS string нет 1 minute Периодичность отправки health check в ServiceDiscovery
HIERARCHY_ENTITIES_SERVICE_TITLE string нет "hierarchy-entities" Название сервиса для отображения
HIERARCHY_ENTITIES_SERVICE_DESCRIPTION string нет "Service HIERARCHY_ENTITIES" Описание сервиса для отображения
HIERARCHY_ENTITIES_AKKA_HTTP_CLIENT_MAXCON int нет 512 Максимальное число одновременных исходящих HTTP-соединений
HIERARCHY_ENTITIES_AKKA_HTTP_CLIENT_MAXREQ int нет 1024 Максимальное число одновременных исходящих HTTP-запросов
HIERARCHY_ENTITIES_AKKA_HTTP_SERVER_MAXCON int нет 1024 Максимальное число одновременных входящих HTTP-соединений
HIERARCHY_ENTITIES_INTERNALCMD_ALLOW bool нет false Можно ли сервису отправлять внутрисистемные команды
HIERARCHY_ENTITIES_HEALTH_TIMEOUT duration string нет 5 seconds Максимальное время ожидания ответа health check
HIERARCHY_ENTITIES_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
HIERARCHY_ENTITIES_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
HIERARCHY_ENTITIES_DB_HOST string да Хост БД
HIERARCHY_ENTITIES_DB_PORT int да Порт БД
HIERARCHY_ENTITIES_DB_NAME string да Имя базы в БД
HIERARCHY_ENTITIES_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
HIERARCHY_ENTITIES_DB_USER string да Пользователь БД
HIERARCHY_ENTITIES_DB_PASSWORD string да Пароль пользователя БД
HIERARCHY_ENTITIES_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
HIERARCHY_ENTITIES_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
HIERARCHY_ENTITIES_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
HIERARCHY_ENTITIES_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
HIERARCHY_ENTITIES_LOG_LEVEL_SLICK_STATEMENT string нет INFO Уровень логирования запросов, отправляемых slick в БД
HIERARCHY_ENTITIES_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирование бенчмарков выполнения запросов slick
HIERARCHY_ENTITIES_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
HIERARCHY_ENTITIES_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования конфига kafka-consumer
HIERARCHY_ENTITIES_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
HIERARCHY_ENTITIES_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
HIERARCHY_ENTITIES_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
LOGGING_HOSTNAME string нет SERVER Имя сервера для CEF-логов
LOGGING_EXTERNAL_ADDRESS string нет localhost IP-адрес сервера для CEF-логов
GPN_VERSION_POSTFIX string нет Постфикс библиотеки gpn-libs для сборки CI
CLIENT_VERSION_POSTFIX string нет Постфикс библиотеки sed-domain-lib для сборки CI
SYSTEM_VERSION_POSTFIX string нет Постфикс библиотеки sed-system-lib для сборки CI
HIERARCHY_ENTITIES_JOURNAL_MODE string да WriteToJournal Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь)
HIERARCHY_ENTITIES_JOURNAL_TOPIC string нет да, если переменная HIERARCHY_ENTITIES_JOURNAL_MODE = WriteToTopic Название очереди журналирования. Для режима WriteToJournal значение игнорируется.

Список команд сервиса hierarchy-entities

В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

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

CreateHierarchyEntity

На входе атрибуты для создания иерархичной сущности

{
  "id": "HierarchyEntityId",
  "title": "title",
  "description": "description",
  "data": {
    "someInfo": "info"
  }
}

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

"HierarchyEntityId"

Добавление новой иерархичной сущности.

Команда Путь
hierarchyEntities_createHierarchyEntity Kafka Topic "hierarchyEntities_commands"

UpdateHierarchyEntity

На выходе атрибуты для обновления иерархичной сущности

{
  "id": "HierarchyEntityId",
  "title": "title",
  "description": "description",
  "data": {
    "someInfo": "info"
  },
  "version": 1
}

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

true

Обновление иерархичной сущности.

Команда Путь
hierarchyEntities_updateHierarchyEntity Kafka Topic "hierarchyEntities_commands"

DeleteHierarchyEntity

На входе ID иерархичной сущности

"hierarchyEntityId"

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

true

Удаление иерархичной сущности.

Команда Путь
hierarchyEntities_deleteHierarchyEntity Kafka Topic "hierarchyEntities_commands"

RestoreHierarchyEntity

На входе ID иерархичной сущности

"hierarchyEntityId"

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

true

Восстановление иерархичной сущности.

Команда Путь
hierarchyEntities_restoreHierarchyEntity Kafka Topic "hierarchyEntities_commands"

GetHierarchyEntity

На входе ID иерархичной сущности

"hierarchyEntityId"

На выходе атрибуты иерархичной сущности

{
  "id": "HierarchyEntityId",
  "title": "title",
  "description": "description",
  "data": {
    "someInfo": "info"
  },
  "created": 1664292962695,
  "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "modified": 1664292962695,
  "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "removed": false,
  "version": 2
}

Получение иерархичной сущности.

Команда Путь
hierarchyEntities_getHierarchyEntity HTTP POST "/v1/hierarchy-entity/get"

ListHierarchyEntities

На входе параметры поиска, сортировки и пагинации (Search) Возможна фильтрация и сортировка по полям data. Для строковых значений префикс data (Например "data.someInfo.info) Для числовых значений префикс dataNumber (Например "dataNumber.someInfo.numberInfo)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "title",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

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

{
  "items": [
    {
      "id": "HierarchyEntityId",
      "title": "title",
      "description": "description",
      "data": {
        "someInfo": {
          "info": "info",
          "numberInfo": 10
        }
      },
      "created": 1664292962695,
      "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "modified": 1664292962695,
      "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "removed": false,
      "version": 2
    }
  ],
  "total": 1
}

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

Команда Путь
hierarchyEntities_listHierarchyEntities HTTP POST "/v1/hierarchy-entity/list"

CreateHierarchyEntityObject

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

{
  "hierarchyEntityId": "HierarchyEntityId",
  "parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "data": {
    "title": "objectTitle",
    "objectNumber": 3
  }
}

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

"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"

Добавление нового объекта иерархий.

Команда Путь
hierarchyEntities_createHierarchyEntityObject Kafka Topic "hierarchyEntities_commands"

CreateHierarchyEntityObjectBatch

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

[
  {
    "hierarchyEntityId": "HierarchyEntityId",
    "data": {
      "title": "objectTitle",
      "objectNumber": 1
    }
  },
  {
    "hierarchyEntityId": "HierarchyEntityId",
    "data": {
      "title": "objectTitle",
      "objectNumber": 2
    }
  }
]

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

[
  "2513bdc2-8083-4e88-b09c-3978e05e5076",
  "8fe7159d-c457-432e-a58d-ca41af44e5d7"
]

Добавление нового объекта иерархий.

Команда Путь
hierarchyEntities_createHierarchyEntityObjectBatch HTTP POST "/v1/hierarchy-entity-object/create-batch"

UpdateHierarchyEntityObject

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

{
  "id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "hierarchyEntityId": "HierarchyEntityId",
  "parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "data": {
    "title": "objectTitle",
    "objectNumber": 3
  },
  "version": 1
}

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

true

Обновление объекта иерархий.

Команда Путь
hierarchyEntities_updateHierarchyEntityObject Kafka Topic "hierarchyEntities_commands"

UpdateHierarchyEntityObjectBatch

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

[
  {
    "id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
    "hierarchyEntityId": "HierarchyEntityId",
    "parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
    "data": {
      "title": "objectTitle",
      "objectNumber": 3
    },
    "version": 1
  },
  {
    "id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
    "hierarchyEntityId": "HierarchyEntityId",
    "parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
    "data": {
      "title": "objectTitle",
      "objectNumber": 3
    },
    "version": 1
  }
]

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

true

Обновление объекта иерархий.

Команда Путь
hierarchyEntities_updateHierarchyEntityObjectBatch HTTP POST "/v1/hierarchy-entity-object/update-batch"

DeleteHierarchyEntityObject

На входе ID объекта иерархий

"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"

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

true

Удаление объекта иерархий.

Команда Путь
hierarchyEntities_deleteHierarchyEntityObject Kafka Topic "hierarchyEntities_commands"

DeleteHierarchyEntityObjectWithChildrenCheck

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

{
  "id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "childrenAction": {
    "childrenActionKind": "CascadeDelete",
    "returnChildrenIds": true
  }
}

На выходе ID удаленных дочерних сущностей (если указано их удалять и возвращать)

[
  "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
]

Удаление объекта иерархий с обработкой детей.

Команда Путь
hierarchyEntities_deleteHierarchyEntityObjectWithChildrenCheck Kafka Topic "hierarchyEntities_commands"

DeleteHierarchyEntityObjectBatch

На входе список ID объектов иерархий

[
  "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
]

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

true

Удаление объекта иерархий пакетное.

Команда Путь
hierarchyEntities_deleteHierarchyEntityObjectBatch HTTP POST "/v1/hierarchy-entity-object/delete-batch"

DeleteHierarchyEntityObjectBatchWithChildrenCheck

На входе список ID объектов иерархий

{
  "ids": [
    "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
    "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
  ],
  "childrenAction": {
    "childrenActionKind": "CascadeDelete",
    "returnChildrenIds": true
  }
}

На выходе ID удаленных дочерних сущностей (если указано их удалять и возвращать)


[
  "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
]

Удаление объекта иерархий пакетное с обработкой детей.

Команда Путь
hierarchyEntities_deleteHierarchyEntityObjectBatchWithChildrenCheck Kafka Topic "hierarchyEntities_commands"

RestoreHierarchyEntityObject

На входе ID объекта иерархий

"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"

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

true

Восстановление объекта иерархий.

Команда Путь
hierarchyEntities_restoreHierarchyEntityObject Kafka Topic "hierarchyEntities_commands"

GetHierarchyEntityObject

На входе ID объекта иерархий

"hierarchyEntityId"

На выходе атрибуты объекта иерархий

{
  "id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "hierarchyEntityId": "HierarchyEntityId",
  "parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "data": {
    "title": "objectTitle",
    "objectNumber": 3
  },
  "created": 1664292962695,
  "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "modified": 1664292962695,
  "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "removed": false,
  "version": 2
}

Получение объекта иерархий.

Команда Путь
hierarchyEntities_getHierarchyEntityObject HTTP POST "/v1/hierarchy-entity-object/get"

ListHierarchyEntityObjects

На входе параметры поиска, сортировки и пагинации (Search) Возможна фильтрация и сортировка по полям data. Для строковых значений префикс data (Например "data.someInfo.info) Для числовых значений префикс dataNumber (Например "dataNumber.someInfo.numberInfo)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "title",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

На выходе список объектов иерархий и их общее количество

{
  "items": [
    {
      "id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "hierarchyEntityId": "HierarchyEntityId",
      "parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
      "data": {
        "title": "objectTitle",
        "objectNumber": 3
      },
      "created": 1664292962695,
      "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "modified": 1664292962695,
      "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "removed": false,
      "version": 2
    }
  ],
  "total": 1
}

Получение списка объектов иерархий с поиском, сортировкой и пагинацией.

Команда Путь
hierarchyEntities_listHierarchyEntityObjects HTTP POST "/v1/hierarchy-entity-object/list"

ListHierarchy

На входе параметры поиска, сортировки и пагинации (Search), параметр expandTree и опциональный parentId Пагинация влияет только на самый верхний уровень вложенности (parentId = null) Возможна фильтрация и сортировка по полям data. Для строковых значений префикс data (Например "data.someInfo.info) Для числовых значений префикс dataNumber (Например "dataNumber.someInfo.numberInfo)

Если expandTree = false поле children у объектов всегда = null, в остальных случаях это список вложенных объектов

Сценарии работы Фильтрация с expandTree = false, parentId = null На выходе список верхне уровневых объектов, которые хранят попавшие под фильтр сущности на нижних уровнях, или сами попадают под фильтр.

{
  "items": [
    {
      "entityObject": {
        "id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
        "hierarchyEntityId": "HierarchyEntityId",
        "parentId": null,
        "data": {
          "title": "objectTitle",
          "objectNumber": 3
        },
        "created": 1664292962695,
        "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
        "modified": 1664292962695,
        "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
        "removed": false,
        "version": 2
      },
      "isMatched": false,
      "childrenCount": 10,
      "children": null
    }
  ],
  "total": 1
}

Фильтрация с expandTree = false, parentId != null На выходе список объектов у которых родитель = parentId, которые хранят попавшие под фильтр сущности на нижних уровнях, или сами попадают под фильтр.

{
  "items": [
    {
      "entityObject": {
        "id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
        "hierarchyEntityId": "HierarchyEntityId",
        "parentId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
        "data": {
          "title": "objectTitle",
          "objectNumber": 3
        },
        "created": 1664292962695,
        "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
        "modified": 1664292962695,
        "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
        "removed": false,
        "version": 2
      },
      "isMatched": true,
      "childrenCount": 0,
      "children": null
    }
  ],
  "total": 1
}

Фильтрация с expandTree = true, parentId можно не указывать, так как дерево будет раскрыто полностью На выходе список объектов от верхнего уровня с иерархичной вложенностью до объекта, который попадает под фильтр

{
  "items": [
    {
      "entityObject": {
        "id": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
        "hierarchyEntityId": "HierarchyEntityId",
        "parentId": null,
        "data": {
          "title": "objectTitle",
          "objectNumber": 3
        },
        "created": 1664292962695,
        "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
        "modified": 1664292962695,
        "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
        "removed": false,
        "version": 2
      },
      "isMatched": false,
      "childrenCount": 1,
      "children": [
        {
          "entityObject": {
            "id": "72602ae9-66ab-4065-8305-d374ff14a4bf",
            "hierarchyEntityId": "HierarchyEntityId",
            "parentId": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
            "data": {
              "title": "objectTitle",
              "objectNumber": 3
            },
            "created": 1664292962695,
            "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
            "modified": 1664292962695,
            "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
            "removed": false,
            "version": 2
          },
          "isMatched": true,
          "childrenCount": 0,
          "children": []
        }
      ]
    }
  ],
  "total": 1
}

Получение списка объектов иерархий с поиском, сортировкой и пагинацией.

Команда Путь
hierarchyEntities_listHierarchy HTTP POST "/v1/hierarchy/list"

Объекты сервиса hierarchy-entities

HierarchyEntity

Поле Тип Обязательное Описание
id string да ID
title string да имя сущности
description string да описание сущности
data json да доп. данные
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да признак удаления
version Integer да версия для оптимистичной блокировки

HierarchyEntityCreateDTO

Поле Тип Обязательное Описание
id string да ID
title string да имя сущности
description string да описание сущности
data json нет доп. данные

HierarchyEntityUpdateDTO

Поле Тип Обязательное Описание
id string да ID
title string да имя сущности
description string да описание сущности
data json нет доп. данные
version Integer да версия для оптимистичной блокировки

HierarchyEntityObject

Поле Тип Обязательное Описание
id UUID да ID
hierarchyEntityId string да ID сущности объекта
parentId UUID нет Родительский объект
data json да доп. данные
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да признак удаления
version Integer да версия для оптимистичной блокировки

HierarchyEntityObjectCreateDTO

Поле Тип Обязательное Описание
hierarchyEntityId string да ID сущности объекта
parentId UUID нет Родительский объект
data json да доп. данные

HierarchyEntityObjectUpdateDTO

Поле Тип Обязательное Описание
id UUID да ID
hierarchyEntityId string да ID сущности объекта
parentId UUID нет Родительский объект
data json да доп. данные
version Integer да версия для оптимистичной блокировки

HierarchyEntityObjectExtendedDTO

Поле Тип Обязательное Описание
entityObject EntityObject да Сущность иерархий
isMatched boolean да Попадает ли объект под фильтр
childrenCount Integer да Количество дочерних объектов на следующем уровне
children EntityObject[] нет Дочерние объекты

ChildrenAction

Действие с дочерними объектами при удалении объекта. Возможные подтипы:

CascadeDelete

Каскадно удалить всех потомков сущности.

Поле Тип Обязательное Описание
returnChildrenIds boolean да Нужно ли сохранить и вернуть идентификаторы удаленных детей

VerifyAbsence

Убедиться в отсутствии детей. При их наличии не удалять сущность и вернуть ошибку.

Ignore

Не делать с детьми ничего.

ReattachToGrandparent

Прикрепить детей сущности к её текущему родителю. Если сущность была корневой (parentId == null), то её дети станут корневыми.

ReattachToAnother

Прикрепить детей сущности к другой указанной сущности. Если newParent == null, дети станут корневыми сущностями.

Поле Тип Обязательное Описание
newParent UUID нет ID нового родителя

HierarchyEntityObjectDeleteWithChildrenCheckDTO

Поле Тип Обязательное Описание
id UUID да ID удаляемого объекта
childrenAction ChildrenAction да Действие с дочерними объектами

HierarchyEntityObjectDeleteBatchWithChildrenCheckDTO

Поле Тип Обязательное Описание
ids UUID[] да ID удаляемых объектов
childrenAction ChildrenAction да Действие с дочерними объектами

iua-adapter: сервис взаимодействия со СМЭВ

Сервис реализует kafka интерфейс для взаимодействия с ИУА. Два топика, для приема и отправки сообщений, задаются в конфигурации. Также реализована конвертация в/из xml с помощью шаблонов mustache Команды могут приходить как по HTTP, так и через Kafka в топик IUA_ADAPTER_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информацию по добавлению команд можно прочитать в описании шаблона

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью SBT

IUA_ADAPTER_DB_HOST=localhost IUA_ADAPTER_DB_PORT=5432 IUA_ADAPTER_DB_NAME=iuaadapter_db IUA_ADAPTER_DB_USER=postgres IUA_ADAPTER_DB_PASSWORD=12345 sbt boot/run

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

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

Переменная Тип Обязательная Значение по умолчанию Описание
IUA_ADAPTER_COMMANDS_CONSIDER_ALL_INTERNAL boolean да false Все межсервисные команды являются внутренними (internal) и не требуют авторизации
IUA_ADAPTER_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
IUA_ADAPTER_HTTP_PORT int нет 8192 Порт, на котором слушает HTTP-сервер
IUA_ADAPTER_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
IUA_ADAPTER_KAFKA_TOPIC string нет "IUA_ADAPTER_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
IUA_ADAPTER_KAFKA_CONSUMER_GROUP string нет "IUA_ADAPTER_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
IUA_ADAPTER_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
IUA_ADAPTER_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
IUA_ADAPTER_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
IUA_ADAPTER_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
IUA_ADAPTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах IUA_ADAPTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
IUA_ADAPTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который IUA_ADAPTER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
IUA_ADAPTER_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
IUA_ADAPTER_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
IUA_ADAPTER_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
IUA_ADAPTER_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
IUA_ADAPTER_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к хранилищу сертификатов.
IUA_ADAPTER_KAFKA_AUTH_PRINCIPAL string нет "" Principal учетной записи Kafka в Kerberos(в случае соединения с kafka через Kerberos).
IUA_ADAPTER_KAFKA_AUTH_KEYTAB_PATH string нет "" Путь до keytab-файла(в случае соединения с kafka через Kerberos).
IUA_ADAPTER_KAFKA_AUTH_MODE string нет "" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
IUA_ADAPTER_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]
IUA_ADAPTER_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
IUA_ADAPTER_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
IUA_ADAPTER_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
IUA_ADAPTER_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
IUA_ADAPTER_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
IUA_ADAPTER_DISCOVERABLE_ID_PREFIX string нет "another_IUA_ADAPTER_instance" Префикс для ID сервиса в ServiceDiscovery. ID сервиса будет состоять из префикса и времени запуска сервиса в формате Unix timestamp.
IUA_ADAPTER_DISCOVERABLE_NAME string нет "iuaadapter" Имя сервиса в ServiceDiscovery
IUA_ADAPTER_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
IUA_ADAPTER_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
IUA_ADAPTER_DISCOVERABLE_TTL duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
IUA_ADAPTER_DISCOVERABLE_HEALTHPASS duration string нет 1 minute Периодичность отправки health check в ServiceDiscovery
IUA_ADAPTER_DISCOVERABLE_HEALTHTIMEOUT duration string нет 10 seconds Таймаут отправки health check в ServiceDiscovery
IUA_ADAPTER_SERVICE_NAME string нет iua-adapter Название сервиса для отображения
IUA_ADAPTER_SERVICE_DESCRIPTION string нет "Service IUA_ADAPTER" Описание сервиса для отображения
IUA_ADAPTER_INTERNALCMD_ALLOW bool нет true Можно ли сервису отправлять внутрисистемные команды
IUA_ADAPTER_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
IUA_ADAPTER_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
IUA_ADAPTER_DB_HOST string да Хост БД
IUA_ADAPTER_DB_PORT int да Порт БД
IUA_ADAPTER_DB_NAME string да Имя базы в БД
IUA_ADAPTER_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
IUA_ADAPTER_DB_USER string да Пользователь БД
IUA_ADAPTER_DB_PASSWORD string да Пароль пользователя БД
IUA_ADAPTER_DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
IUA_ADAPTER_DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
IUA_ADAPTER_DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
IUA_ADAPTER_DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
IUA_ADAPTER_DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
IUA_ADAPTER_DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
IUA_ADAPTER_DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
IUA_ADAPTER_DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
IUA_ADAPTER_DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
IUA_ADAPTER_DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
IUA_ADAPTER_DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
IUA_ADAPTER_DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
IUA_ADAPTER_DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
IUA_ADAPTER_DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
IUA_ADAPTER_AUTHZFORCE_ADDR string нет "http://localhost:8080/authzforce-ce" Адрес AuthZforce server
IUA_ADAPTER_AUTHZFORCE_DOMAIN string нет "" Доступный DomainID в AuthZforce server
IUA_ADAPTER_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
IUA_ADAPTER_LOG_LEVEL_AUTHORIZATIONSERVICE string нет INFO Уровень логирования для AuthorizationService
IUA_ADAPTER_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
IUA_ADAPTER_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
IUA_ADAPTER_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
IUA_ADAPTER_LOG_LEVEL_SLICK_STATEMENT string нет DEBUG Уровень логирования запросов, отправляемых slick в БД
IUA_ADAPTER_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирования бенчмарков выполнения запросов slick
IUA_ADAPTER_LOG_LEVEL_SLICK_PARAMETER string нет OFF Уровень логирования заполнения параметризованных запросов slick параметрами
IUA_ADAPTER_LOG_LEVEL_SLICK_QUERY_COMPILER string нет OFF Уровень логирования компиляции запросов slick
IUA_ADAPTER_LOG_LEVEL_SLICK_QUERY_COMPILER_BENCHMARK string нет OFF Уровень логирования бенчмарков компиляции запросов slick
IUA_ADAPTER_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
IUA_ADAPTER_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования kafka-consumer
IUA_ADAPTER_LOG_LEVEL_HTTP_SERVER string нет WARN Уровень логирования HTTP-сервера
IUA_ADAPTER_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
IUA_ADAPTER_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
IUA_ADAPTER_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
IUA_ADAPTER_LOG_OUTPUT string нет STDOUT Вывод лога
IUA_ADAPTER_SYSLOG_TYPE string нет UDP Тип передачи syslog
IUA_ADAPTER_LOGGING_SRC_IP string нет "localhost" для параметра src в логах
IUA_ADAPTER_LOGGING_SRC_HOST string нет "SERVER" для параметра shost в логах
IUA_ADAPTER_LOGGING_DST_IP string нет "SERVER" для параметра dst в логах
IUA_ADAPTER_LOGGING_CEF_VER string нет 0 версия CEF
IUA_ADAPTER_MAX_PAGE_SIZE int нет 500 Максимальный размер одной страницы при постраничном получении или отправке данных
IUA_ADAPTER_REQUEST_PARALLELISM int нет 16 Максимальное число одновременно отправляемых запросов во внешние сервисы
IUA_ADAPTER_RETRY_DELAY duration string нет 2 seconds Максимальное число ретраев на запросы во внешние сервисы
IUA_ADAPTER_RETRY_COUNT string нет 5 Задержка между ретраями запросов во внешние сервисы
IUA_ADAPTER_MIGRATIONS_TIMEOUT duration string нет 10 minutes Таймаут для миграций CustomChange
IUA_ADAPTER_FROM_SMEV_BATCH_SIZE int нет 50 Размер страницы для запрашиваемых из СМЭВ сообщений
IUA_ADAPTER_FROM_SMEV_MAX_DELAY duration string нет 5 seconds Максимальный интервал запроса сообщений из СМЭВ
IUA_ADAPTER_FROM_SMEV_MIN_DELAY duration string нет 1 second Минимальный интервал запроса сообщений из СМЭВ
IUA_ADAPTER_FROM_SMEV_TOPIC string нет messages-from-smev Kafka топик для получения сообщений из СМЭВ
IUA_ADAPTER_TO_SMEV_BATCH_SIZE int нет 50 Размер страницы для отправки сообщений в СМЭВ
IUA_ADAPTER_TO_SMEV_MAX_DELAY duration string нет 5 seconds Максимальный интервал отправки сообщений в СМЭВ
IUA_ADAPTER_TO_SMEV_KAFKA_CONSUMER_GROUP string нет "IUA_ADAPTER_messages_consumer_group" Имя consumer-группы для чтения из кафка-топика сообщений СМЭВ
IUA_ADAPTER_TO_SMEV_TOPIC string нет messages-to-smev Kafka топик для отправки сообщений в СМЭВ
IUA_ADAPTER_TO_SMEV_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика сообщений СМЭВ
IUA_ADAPTER_INPUT_TABLE_NAME string нет frgu_iua_Send_Table Название таблицы сообщений для отправки в СМЭВ
IUA_ADAPTER_OUTPUT_TABLE_NAME string нет frgu_iua_Receive_Table Название таблицы сообщений из СМЭВ
IUA_ADAPTER_TO_SMEV_BUCKET string нет iua-to Бакет s3 для файлов, отправляемых в СМЭВ (для ИУА)
IUA_ADAPTER_MNEMONIC string нет Unknown Мнемоника текущей системы
IUA_ADAPTER_FROM_SMEV_BUCKET string нет iua-from Бакет s3 для файлов, приходящих из СМЭВ (для ИУА)
IUA_ADAPTER_FROM_SMEV_APP_BUCKET string нет from-smev Бакет s3 для файлов, приходящих из СМЭВ. (для приложения)
IUA_ADAPTER_SMEVDB_HOST string да Хост БД (БД СМЭВ)
IUA_ADAPTER_SMEVDB_PORT int да Порт БД (БД СМЭВ)
IUA_ADAPTER_SMEVDB_NAME string да Имя базы в БД (БД СМЭВ)
IUA_ADAPTER_SMEVDB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы. (БД СМЭВ)
IUA_ADAPTER_SMEVDB_USER string да Пользователь БД (БД СМЭВ)
IUA_ADAPTER_SMEVDB_PASSWORD string да Пароль пользователя БД (БД СМЭВ)
IUA_ADAPTER_SMEVDB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД (БД СМЭВ)
IUA_ADAPTER_SMEVDB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей (БД СМЭВ)
IUA_ADAPTER_SMEVDB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД (БД СМЭВ)
IUA_ADAPTER_SMEVDB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение. (БД СМЭВ)
IUA_ADAPTER_SMEVDB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE. (БД СМЭВ)
IUA_ADAPTER_SMEVDB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции. (БД СМЭВ)
IUA_ADAPTER_SMEVDB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД (БД СМЭВ)
IUA_ADAPTER_SMEVDB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение. (БД СМЭВ)
IUA_ADAPTER_SMEVDB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула. (БД СМЭВ)
IUA_ADAPTER_SMEVDB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы. (БД СМЭВ)
IUA_ADAPTER_SMEVDB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0. (БД СМЭВ)
IUA_ADAPTER_SMEVDB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с. (БД СМЭВ)
IUA_ADAPTER_SMEVDB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid(). (БД СМЭВ)
IUA_ADAPTER_SMEVDB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
IUA_ADAPTER_FS_URI url string нет "http://localhost:9000" Адрес для подключения к хранилищу файлов по S3-API
IUA_ADAPTER_FS_ACCESS_KEY_ID string нет minioadmin Ключ доступа для хранилища файлов (aka логин)
IUA_ADAPTER_FS_SECRET_ACCESS_KEY string нет minioadmin Секретный ключ для хранилища файлов (aka пароль)
IUA_ADAPTER_FS_UPLOAD_PARALLELISM int нет 4 Параллелизм для загрузки файлов
IUA_ADAPTER_FS_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
IUA_ADAPTER_FS_AUTH_CONFIG string нет "" Настройки для аутентификации, если AuthMode = mapping (необходим доступ к бакетам "temp" и "datamodel")
IUA_ADAPTER_FS_CACHE_SIZE int нет Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений).
IUA_ADAPTER_FS_CACHE_TTL duration string нет Время жизни клиента в кеше
IUA_ADAPTER_FS_ADAPTER_URI url string нет "http://localhost:9000" Адрес для подключения к хранилищу файлов по S3-API (S3 ИУА)
IUA_ADAPTER_FS_ADAPTER_ACCESS_KEY_ID string нет minioadmin Ключ доступа для хранилища файлов (aka логин) (S3 ИУА)
IUA_ADAPTER_FS_ADAPTER_SECRET_ACCESS_KEY string нет minioadmin Секретный ключ для хранилища файлов (aka пароль) (S3 ИУА)
IUA_ADAPTER_FS_ADAPTER_UPLOAD_PARALLELISM int нет 4 Параллелизм для загрузки файлов (S3 ИУА)
IUA_ADAPTER_FS_ADAPTER_AUTH_MODE string нет static Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса (S3 ИУА)
IUA_ADAPTER_FS_ADAPTER_AUTH_CONFIG string нет "" Настройки для аутентификации, если AuthMode = mapping (необходим доступ к бакетам "temp" и "datamodel") (S3 ИУА)
IUA_ADAPTER_FS_ADAPTER_CACHE_SIZE int нет Максимальный размер кеша клиентов для хранилища файлов (количество активных соединений). (S3 ИУА)
IUA_ADAPTER_FS_ADAPTER_CACHE_TTL duration string нет Время жизни клиента в кеше (S3 ИУА)
IUA_ADAPTER_JOURNAL_MODE string да WriteToJournal Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь)
IUA_ADAPTER_JOURNAL_TOPIC string нет да, если переменная IUA_ADAPTER_JOURNAL_MODE = WriteToTopic Название очереди журналирования. Для режима WriteToJournal значение игнорируется.

Формат CEF для логов сервиса iua-adapter

У логов есть возможность включить формат 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, нужно задать значение переменной с постфиксом CEF. Например, IUA_ADAPTER_LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то желательно поменять следующие переменные:

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

Формат передачи сообщений

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

{
  "id": "957da5f8-5ad5-4a89-aead-acefd614e9db",
  "refId": "957da5f8-5ad5-4a89-aead-acefd614e9db",
  "typeId": {
    "namespace": "urn://ru.gov.proc.erknm.communication/6.0.2",
    "localName": "FullInspection"
  },
  "content": {
    "any": "json content"
  },
  "attachments": ["report/attachment.json"]
}

Список команд сервиса iua-adapter

В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

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

MigrateTransformations

Добавляет mustache-преобразования в сервис, а также проверяет их на предоставленных тестовых данных

Команда Тип
iuaAdapter_MigrateTransformations Kafka

Объекты сервиса

Transformation

Поле Тип Обязательное Описание
namespace string да ID вида сведений
localName string да Корневой элемент сообщения
localName string да Корневой элемент сообщения
fromJson FromJsonInput нет Параметры конвертации в xml
toJson ToJsonInput нет Параметры конвертации в json

ToJsonInput

Поле Тип Обязательное Описание
template string да mustache-шаблон для конвертации из xml в json
exampleXmlInput string да Пример входящего xml для проверки конвертации
exampleJsonOutput string да Ожидаемый json-результат конвертации

FromJsonInput

Поле Тип Обязательное Описание
template string да mustache-шаблон для конвертации из xml в json
exampleJsonInput string да Пример входящего json для проверки конвертации
exampleXmlOutput string да Ожидаемый xml-результат конвертации

job-scheduler: сервис распределения нагрузки

Сервис принимает запросы для работы с бронированием дат и планированием нагрузки. Состояние хранится в PostgreSQL. Команды могут приходить как по HTTP, так и через Kafka в топике job_scheduler_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информацию по добавлению команд можно прочитать в описании шаблона

Локальный запуск

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью SBT

JSCH_DB_HOST=localhost JSCH_DB_PORT=5432 JSCH_DB_NAME=jobscheduler_db JSCH_DB_USER=postgres JSCH_DB_PASSWORD=12345 sbt boot/run

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

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

Переменная Тип Обязательная Значение по умолчанию Описание
JSCH_COMMANDS_CONSIDER_ALL_INTERNAL boolean да false Все межсервисные команды являются внутренними (internal) и не требуют авторизации
JSCH_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
JSCH_HTTP_PORT int нет 8034 Порт, на котором слушает HTTP-сервер
JSCH_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
JSCH_KAFKA_TOPIC string нет "job_scheduler_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
JSCH_KAFKA_CONSUMER_GROUP string нет "job_scheduler_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
JSCH_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
JSCH_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
JSCH_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
JSCH_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестартом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
JSCH_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах JSCH_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
JSCH_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который JSCH_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
JSCH_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
JSCH_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka. Если название не указано, то настройки авторизации не будут применены.
JSCH_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka.
JSCH_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
JSCH_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к хранилищу сертификатов.
JSCH_KAFKA_AUTH_PRINCIPAL string нет "" Principal учетной записи Kafka в Kerberos(в случае соединения с kafka через Kerberos).
JSCH_KAFKA_AUTH_KEYTAB_PATH string нет "" Путь до keytab-файла(в случае соединения с kafka через Kerberos).
JSCH_KAFKA_AUTH_MODE string нет "" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
JSCH_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]
JSCH_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
JSCH_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
JSCH_LEVEL_KAFKA_SELECTOR string нет INFO Уровень логирования селектора клиента кафки
JSCH_LEVEL_KAFKA_NETWORK_CLIENT string нет INFO Уровень логирования сети клиента кафки
JSCH_LEVEL_KAFKA_STREAMING_PRODUCER string нет INFO Уровень логирования продьюсера клиента кафки
JSCH_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
JSCH_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
JSCH_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
JSCH_DISCOVERABLE_ID_PREFIX string нет "another_job_scheduler_instance" Префикс для ID сервиса в ServiceDiscovery. ID сервиса будет состоять из префикса и времени запуска сервиса в формате Unix timestamp.
JSCH_DISCOVERABLE_NAME string нет "jobscheduler" Имя сервиса в ServiceDiscovery
JSCH_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
JSCH_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
JSCH_DISCOVERABLE_TTL duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
JSCH_DISCOVERABLE_HEALTHPASS duration string нет 1 minute Периодичность отправки health check в ServiceDiscovery
JSCH_DISCOVERABLE_HEALTHTIMEOUT duration string нет 10 seconds Таймаут отправки health check в ServiceDiscovery
JSCH_SERVICE_NAME string нет job-scheduler Название сервиса для отображения
JSCH_SERVICE_DESCRIPTION string нет "Service JSCH" Описание сервиса для отображения
JSCH_INTERNALCMD_ALLOW bool нет false Можно ли сервису отправлять внутрисистемные команды
JSCH_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
JSCH_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
JSCH_DB_HOST string да Хост БД
JSCH_DB_PORT int да Порт БД
JSCH_DB_NAME string да Имя базы в БД
JSCH_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
JSCH_DB_USER string да Пользователь БД
JSCH_DB_PASSWORD string да Пароль пользователя БД
JSCH_DB_THREADS int нет 10 Количество потоков в пуле потоков для соединения с БД
JSCH_DB_QUEUE_SIZE int нет 300 Размер очереди для действий базы данных, которые не могут быть выполнены немедленно, когда все потоки заняты. За пределами этого значения новые действия немедленно завершаются неудачей
JSCH_DB_CONN_MAX int нет 10 Максимальное количество одновременных подключений к БД
JSCH_DB_CONN_TIMEOUT duration string нет 20 second Максимальное время ожидания ответа для соединения к БД. Если это время превышено, а соединение не становится доступным, будет брошено исключение SQLException. 1000 мс — минимальное значение.
JSCH_DB_ISOLATION string нет "READ_COMMITTED" Уровень изоляции транзакций для новых подключений. Допустимые значения: NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE.
JSCH_DB_READONLY boolean нет false Read-only SQL транзакция может изменять только временные таблицы. Этот параметр управляет статусом «только для чтения» по умолчанию для каждой новой транзакции.
JSCH_DB_CONN_MIN int нет = DB_THREADS Минимальное количество одновременных подключений к БД
JSCH_DB_VALIDATION_TIMEOUT duration string нет 1 seconds Максимальное время, в течение которого соединение будет проверяться на работоспособность. 1000 мс — минимальное значение.
JSCH_DB_IDLE_TIMEOUT duration string нет 10 minutes Максимальное время, в течение которого соединению разрешено простаивать в пуле. Значение 0 означает, что простаивающие соединения никогда не удаляются из пула.
JSCH_DB_MAX_LIFETIME duration string нет 30 minutes Максимальное время жизни соединения в пуле. Когда простаивающее соединение достигает этого времени ожидания, даже если оно недавно использовалось, оно будет удалено из пула. Значение 0 указывает на отсутствие максимального срока службы.
JSCH_DB_INITIALIZATION_FAIL_FAST string нет false Определяет, будет ли пул «быстро выходить из строя», если пул не может быть успешно заполнен начальными соединениями. Если соединения не могут быть созданы во время запуска пула, будет выдано исключение RuntimeException. Это свойство не имеет никакого эффекта, если minConnections равно 0.
JSCH_DB_LEAK_DETECTION_THRESHOLD int нет 0 Время, в течение которого соединение может находиться вне пула, прежде чем будет зарегистрировано сообщение, указывающее на возможную утечку соединения. Значение 0 означает, что обнаружение утечек отключено. Наименьшее приемлемое значение для включения обнаружения утечек составляет 10 с.
JSCH_DB_CONNECTION_TEST_QUERY string нет "SELECT 1" Выражение, которое будет выполнено непосредственно перед получением соединения из пула для проверки того, что соединение с базой данных все еще активно. Оно зависит от базы данных и должно представлять собой запрос, требующий минимальной обработки базой данных (например, «VALUES 1»). Если этот параметр не установлен, вместо него используется метод JDBC4 Connection.isValid().
JSCH_DB_REGISTER_MBEANS boolean нет false Зарегистрированы ли JMX Management Beans («MBeans»)
JSCH_AUTHZFORCE_ADDR string нет "http://localhost:8080/authzforce-ce" Адрес AuthZforce server
JSCH_AUTHZFORCE_DOMAIN string нет "" Доступный DomainID в AuthZforce server
JSCH_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
JSCH_LOG_LEVEL_AUTHORIZATIONSERVICE string нет INFO Уровень логирования для AuthorizationService
JSCH_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
JSCH_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
JSCH_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
JSCH_LOG_LEVEL_SLICK_STATEMENT string нет DEBUG Уровень логирования запросов, отправляемых slick в БД
JSCH_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирования бенчмарков выполнения запросов slick
JSCH_LOG_LEVEL_SLICK_PARAMETER string нет OFF Уровень логирования заполнения параметризованных запросов slick параметрами
JSCH_LOG_LEVEL_SLICK_QUERY_COMPILER string нет OFF Уровень логирования компиляции запросов slick
JSCH_LOG_LEVEL_SLICK_QUERY_COMPILER_BENCHMARK string нет OFF Уровень логирования бенчмарков компиляции запросов slick
JSCH_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
JSCH_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования kafka-consumer
JSCH_LOG_LEVEL_HTTP_SERVER string нет WARN Уровень логирования HTTP-сервера
JSCH_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
JSCH_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
JSCH_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
JSCH_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL duration string нет 4 minutes Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом.
JSCH_CONNECTION_CHECK_INTERVAL duration string нет 60 seconds Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений.
JSCH_CONNECTION_CHECK_FAILED_AFTER_INTERVAL duration string нет 5 minutes Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным.
JSCH_LOG_OUTPUT string нет STDOUT Вывод лога
JSCH_SYSLOG_TYPE string нет UDP Тип передачи syslog
JSCH_LOGGING_SRC_IP string нет "localhost" для параметра src в логах
JSCH_LOGGING_SRC_HOST string нет "SERVER" для параметра host в логах
JSCH_LOGGING_DST_IP string нет "SERVER" для параметра dst в логах
JSCH_LOGGING_CEF_VER string нет 0 версия CEF
JSCH_MAX_PAGE_SIZE int нет 500 Максимальный размер одной страницы при постраничном получении или отправке данных
JSCH_REQUEST_PARALLELISM int нет 16 Максимальное число одновременно отправляемых запросов во внешние сервисы
JSCH_RETRY_DELAY duration string нет 2 seconds Максимальное число ретраев на запросы во внешние сервисы
JSCH_RETRY_COUNT string нет 5 Задержка между ретраями запросов во внешние сервисы
JSCH_MIGRATIONS_TIMEOUT duration string нет 10 minutes Таймаут для миграций CustomChange
JSCH_KAFKA_OBJECT_EVENT_CONSUMER_GROUP string да "job_scheduler_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
JSCH_KAFKA_OBJECT_EVENT_TOPIC string да "entityObjectEvent" Название кафка-топика для получения событий
JSCH_KAFKA_OBJECT_EVENT_PARTITIONS int да 10 Число читаемых партиций из кафка-топика событий
JSCH_KAFKA_OBJECT_EVENT_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
JSCH_KAFKA_OBJECT_EVENT_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
JSCH_KAFKA_OBJECT_EVENT_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестартом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
JSCH_KAFKA_OBJECT_EVENT_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах SED_ANALYTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
JSCH_KAFKA_OBJECT_EVENT_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который SED_ANALYTICS_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
JSCH_SCHEDULE_DURATION_AUTO_DATE duration string нет 30 days Временной отрезок для поиска свободной даты от текущего дня
JSCH_SCHEDULE_DRAFT_RESERVE_DURATION duration string нет 1 days Количество дней резерва в черновике
JSCH_ADAPTER_JOURNAL_MODE string да WriteToJournal Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь)
JSCH_ADAPTER_JOURNAL_TOPIC string нет да, если переменная JSCH_JOURNAL_MODE = WriteToTopic Название очереди журналирования. Для режима WriteToJournal значение игнорируется.

Формат CEF для логов сервиса job-scheduler

У логов есть возможность включить формат 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, нужно задать значение переменной с постфиксом CEF. Например, JSCH_LOG_OUTPUT = STDOUT_CEF. Если логи пишутся в формате CEF, то желательно поменять следующие переменные:

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

Список команд сервиса job-scheduler

В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

В сервисе реализованны команды:

Название команды EntityType Actions
Подтверждение бронирования даты JobScheduleDate ManageScheduleDate
Бронирование даты JobScheduleDate ManageScheduleDate
Замена забронированной даты JobScheduleDate ManageScheduleDate
Удаление бронирования JobScheduleDate ManageScheduleDate
Информация о бронировании за период JobScheduleDate ViewPlanCalendar
Информация об определенном бронировании JobScheduleDate -
Поиск свободной даты JobScheduleDate -
Количество дней резерва в черновике JobScheduleDate -
Список бронирований(внутренняя команда) JobScheduleDate -
Пакетное обновление бронирований(внутренняя команда) JobScheduleDate -
Проверка условий в ограничениях Limit -
Создание новой группы ограничений Limit EditPlanCalendarSettings
Создание новой группы ограничений(внутренняя команда) Limit -
Обновление группы ограничений Limit EditPlanCalendarSettings
Удаление группы ограничений Limit DeletePlanCalendarSettings
Восстановление группы ограничений Limit DeletePlanCalendarSettings
Получение группы ограничений Limit ViewPlanCalendarSettings
Список групп ограничений Limit ViewPlanCalendarSettings
Список групп ограничений(внутренняя команда) Limit -
Список лимитов(внутренняя команда) Limit -

ScheduleDateApply

На входе id брони

{
    "jobScheduleDateId": "cfccfbe8-b957-4a29-81c3-3405cd497983"
}

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

{}

Снимает с брони статус "черновик" по id.

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

Команда Путь
jsch_scheduleDateApply Kafka Topic "job_scheduler_commands"

ScheduleDateDraft

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

{
  "scheduleDate": "1735498800000",
  "subject": {
    "classCode": "UserGroup",
    "entityId": "jobDescriptionCoordinating"
  },
  "objectGroupClass": "Plan",
  "scheduledObjectId": "8ec1c616-79f5-4485-a49d-aef0a35fad81"
}

На выходе id брони

"6bbe8ca1-13a7-4e87-85cf-05299cc9b4cf"

Бронирование даты для работы субъекта над экземпляром объекта.

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

Команда Путь
jsch_scheduleDateDraft Kafka Topic "job_scheduler_commands"

ScheduleDateReplace

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

{
  "scheduleDate": "1735498800000",
  "scheduleDateNew": "1735498800001",
  "subject": {
    "classCode": "UserGroup",
    "entityId": "jobDescriptionCoordinating"
  },
  "objectGroupClass": "Plan",
  "scheduledObjectId": "8ec1c616-79f5-4485-a49d-aef0a35fad81"
}

На выходе id брони

"63cfc7f2-4328-45d3-8e8f-8d402e6d7112"

Меняет дату в брони

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

Команда Путь
jsch_scheduleDateReplace Kafka Topic "job_scheduler_commands"

ScheduleDateRevert

На входе субъект, объект

{
  "subject": {
    "classCode": "UserGroup",
    "entityId": "jobDescriptionCoordinating"
  },
  "objectGroupClass": "Plan",
  "scheduledObjectId": "8ec1c616-79f5-4485-a49d-aef0a35fad81"
}

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

{}

Удаляет бронь (помечает запись удаленной).

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

Команда Путь
jsch_scheduleDateRevert Kafka Topic "job_scheduler_commands"

ScheduleDateStats

На входе фильтр поиска Search

{
    "query": "subjectClassCode && subjectEntityId && objectGroupClass  && draft && scheduleDate",
    "context": {
        "subjectClassCode": "UserGroup",
        "subjectEntityId": "jobDescriptionCoordinating",
        "objectGroupClass": "Plan",
        "scheduleDate": {
            "from":1713000000,
            "to":1713000001,
            "kind":"range"
        },
        "draft": "false"
    },
    "sorting": null,
    "paging": {
        "page": 1,
        "count": 10
    }
}

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

{
  "items": [
    {
      "scheduleDate": 1740596400000,
      "max": 2,
      "count": 1,
      "scheduledObjects": [
        {
          "id": "9f4bb36a-c052-40d9-afcb-ed908727f1d2",
          "limitGroupId": "63cfc7f2-4328-45d3-8e8f-8d402e6d7112"
        }
      ]
    }
  ],
  "total": 2
}

Информация о бронировании за период.

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

Команда Путь
jsch_scheduleDateStats HTTP POST "/jsch_scheduleDateStats"

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

Поле Виды фильтров
subjectClassCode InSetQuery
objectGroupClass InSetQuery
subjectEntityId InSetQuery
scheduleDate QueriesForTimeStamp
draft InSetQuery

ScheduleDateGet

Получение информации об определенном бронировании

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

{
  "id": "4777449d-5c98-4d57-9540-7504c88df369"
}

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

{
  "status": "Completed",
  "timestamp": 1742880616891,
  "value": {
    "id": "4777449d-5c98-4d57-9540-7504c88df369",
    "scheduleDate": 1741651200000,
    "subject": {
        "classCode": "UserGroup",
        "entityId": "jobDescriptionCoordinating"
    },
    "objectGroupClass": "Plan",
    "scheduledObjectId": "1a994271-9cda-459c-8189-ec0e888056b5",
    "limitGroupId": "8633e86f-cffc-4243-bc4c-f17f54c5e122",
    "draftValidityDate": null,
    "created": 1734592452059,
    "createdBy": "e5408b4c-0169-49c3-bd8e-b11f80cb5782",
    "modified": 1736519362338,
    "modifiedBy": "00000000-0000-0000-0000-000000000001",
    "removed": false,
    "version": 9
  }
}

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

Команда Путь
jsch_scheduleDateGet HTTP POST "/jsch_scheduleDateGet"

ScheduleDateAuto

Поиск ближайшей свободной даты

На входе Условия ограничений для субъекта и группы объектов

{
  "subject": {
    "classCode": "jobDescriptionCoordinating",
    "entityId": "user2"
  },
  "objectGroupClass": "Plan",
  "conditions": [
    {
      "cond1": "condValue2"
    }
  ]
}

На выходе дата в формате TimeStamp

1740423600000

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

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

Команда Путь
jsch_scheduleDateAuto Kafka Topic "job_scheduler_commands"

ValidateConditions

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

На входе Условия ограничений для субъекта и группы объектов

{
  "subject": {
    "classCode": "jobDescriptionCoordinating",
    "entityId": "user2"
  },
  "objectGroupClass": "Plan",
  "conditions": [
    {
      "cond1": "condValue2"
    }
  ]
}

На выходе true

true

Проверка существует ли ограничение с указанными условиями

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

Команда Путь
jsch_validateConditions Kafka Topic "job_scheduler_commands"

CreateLimitGroup

Создание новой группы ограничений

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

{
  "subject": {
    "classCode": "UserGroup",
    "entityId": "user",
    "description": ""
  },
  "objectGroupClass": "Plan",
  "title": "",
  "condition": "condition",
  "limits": [
    {
      "conditionValue": "testValue",
      "limitValue": 5
    }
  ],
  "removed": true
}

На выходе UUID идентификатор группы ограничений

"1c9f3d58-3382-4e1f-a2a1-935a45b7116d"

Создает новую группу ограничений(если субъект и группа не существуют, то будут созданы)

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

Команда Путь
jsch_createLimitGroup Kafka Topic "job_scheduler_commands"

CreateLimitGroupInternal

Внутренняя команда аналогичная CreateLimitGroup

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

Команда Путь
jsch_createLimitGroupInternal Kafka Topic "job_scheduler_commands"

UpdateLimitGroup

Обновление группы ограничений

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

{
  "id": "1c9f3d58-3382-4e1f-a2a1-935a45b7116d",
  "title": "Пример для тестового атрибута",
  "condition": "testAttribute",
  "priority": 1,
  "limits": [
    {
      "conditionValue": "testValue",
      "limitValue": 10
    }
  ]
}

На выходе UUID идентификатор группы ограничений

"1c9f3d58-3382-4e1f-a2a1-935a45b7116d"

Обновляет существующее ограничение с указанным условием

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

Команда Путь
jsch_updateLimitGroup Kafka Topic "job_scheduler_commands"

DeleteLimitGroup

Удаление (мягкое) группы ограничений.

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

{
  "id": "1c9f3d58-3382-4e1f-a2a1-935a45b7116d"
}

На выходе true

true

Удаляет существующее ограничение

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

Команда Путь
jsch_deleteLimitGroup Kafka Topic "job_scheduler_commands"

RestoreLimitGroup

Восстановление группы ограничений после удаления.

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

{
  "id": "1c9f3d58-3382-4e1f-a2a1-935a45b7116d"
}

На выходе true

true

Удаляет существующее ограничение

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

Команда Путь
jsch_restoreLimitGroup Kafka Topic "job_scheduler_commands"

GetLimitGroup

Получение группы ограничений по идентификатору.

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

"1c9f3d58-3382-4e1f-a2a1-935a45b7116d"

На выходе описание группы ограничений

 {
  "id": "85dbc5a0-800a-4ef7-b2ae-14e243fe9102",
  "subjectId": "329793dd-7486-4fbc-bf6e-0dff5f5835fd",
  "objectGroupId": "50aa2f26-0ea1-4388-8cf3-993e82dac26a",
  "title": "Пример для тестового атрибута",
  "priority": 1,
  "condition": "testAttribute",
  "modified": 1742471103567,
  "modifiedBy": "e5408b4c-0169-49c3-bd8e-b11f80cb5783",
  "removed": false,
  "limits": [
    {
      "conditionValue": "testValue",
      "limitValue": 10,
      "limitUnit": "per day"
    }
  ]
}

Возвращает информацию о группе ограничений и список условий

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

Команда Путь
jsch_getLimitGroup Kafka Topic "job_scheduler_commands"

ListLimitGroup

Получение списка ограничений с фильтрами.

На входе объект Search

{
  "query": "subjectClassCode && subjectEntityId && objectGroupClass && title",
  "context": {
    "subjectClassCode": "UserGroup",
    "subjectEntityId": "User",
    "objectGroupClass": "Plan",
    "title": "like %"
  },
  "sorting": null,
  "paging": {
    "page": 1,
    "count": 10
  }
}

На выходе описание группы ограничений


{
  "items": [
    {
      "id": "85dbc5a0-800a-4ef7-b2ae-14e243fe9102",
      "subjectId": "329793dd-7486-4fbc-bf6e-0dff5f5835fd",
      "objectGroupId": "50aa2f26-0ea1-4388-8cf3-993e82dac26a",
      "title": "Пример для тестового атрибута",
      "priority": 1,
      "condition": "testAttribute",
      "modified": 1742471103567,
      "modifiedBy": "e5408b4c-0169-49c3-bd8e-b11f80cb5783",
      "removed": false,
      "limits": [
        {
          "conditionValue": "testValue",
          "limitValue": 10,
          "limitUnit": "per day"
        }
      ]
    }
  ],
  "total": 1
}

Выводит список всех ограничений связанных с субъектами и группами объектов.

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

Команда Путь
jsch_listLimitGroup HTTP POST /jsch_listLimitGroup

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

Поле Виды фильтров
subjectClassCode InSetQuery
subjectEntityId InSetQuery
objectGroupClass InSetQuery
title LikeQuery

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

Поле Тип Описание
По умолчанию UUID id
id UUID Идентификатор UUID
created TimeStamp Дата и время создания
createdBy UUID UUID пользователя, который создал запись
modified TimeStamp Дата и время последнего изменения
modifiedBy UUID UUID пользователя, который изменил запись
removed Boolean Признак удаления
title String Текстовая метка ограничений

ListLimitGroupInternal

Внутренняя команда аналогичная ListLimitGroup

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

Команда Путь
jsch_listLimitGroupInternal Kafka Topic "job_scheduler_commands"

ListLimitsInternal

Получение списка лимитов с фильтрами.

На входе объект Search

{
  "query": "limitGroupId && remjved",
  "context": {
    "limitGroupId": "e5408b4c-0169-49c3-bd8e-b11f80cb5783",
    "removed": "false"
  },
  "sorting": null,
  "paging": {
    "page": 1,
    "count": 10
  }
}

На выходе список лимитов

{
  "items": [
    {
      "id": "bc4ab174-902e-4809-a942-71a19cb1e89e",
      "limitValue": 2,
      "limitUnit": "per day",
      "limitGroupId": "b8edd854-845f-4672-ba7d-5a3ea7de9bd1",
      "conditionValue": "2",
      "created": 1743713949151,
      "createdBy": "e5408b4c-0169-49c3-bd8e-b11f80cb5782",
      "modified": 1743715825081,
      "modifiedBy": "e5408b4c-0169-49c3-bd8e-b11f80cb5782",
      "removed": false,
      "version": 3
    }
  ],
  "total": 1
}

Выводит список всех ограничений связанных с субъектами и группами объектов.

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

Команда Путь
jsch_listLimitsInternal HTTP POST /jsch_listLimitsInternal

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

Поле Виды фильтров
limitGroupId InSetQuery
id InSetQuery
created InSetQuery, RangeQuery
createdBy InSetQuery
modified InSetQuery, RangeQuery
modifiedBy InSetQuery
removed InSetQuery

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

Поле Тип Описание
По умолчанию UUID id
id UUID Идентификатор UUID
created TimeStamp Дата и время создания
createdBy UUID UUID пользователя, который создал запись
modified TimeStamp Дата и время последнего изменения
modifiedBy UUID UUID пользователя, который изменил запись
removed Boolean Признак удаления

GetDurationDraftReserve

Получение настройки количества дней резерва в черновике

На входе пустой объект

{}

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

{
  "length": 1,
  "unit": "DAYS"
}

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

Команда Путь
jsch_getDurationDraftReserve HTTP POST "/jsch_getDurationDraftReserve"

CreateCalendar

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

{
  "default": false,
  "data": {}
}

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

"89618431-e33d-4721-a7ea-e53638ec6d93"

Создание календаря

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

Команда Путь
jsch_createCalendar Kafka Topic "job_scheduler_commands"

ScheduleDateList

На входе фильтр поиска Search

{
  "query": "subjectEntityId && objectGroupClass",
  "context": {
    "subjectEntityId": "db1b9c84-6b2b-43ed-8406-ad413c0fbbf2",
    "objectGroupClass": "plan"
  },
  "sorting": null,
  "paging": {
    "page": 1,
    "count": 1
  }
}

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

{
  "items": [
    {
      "status": "Completed",
      "timestamp": 1742880616891,
      "value": {
        "id": "4777449d-5c98-4d57-9540-7504c88df369",
        "scheduleDate": 1741651200000,
        "entityId": "e2c4faa3-5e35-4e2d-8710-95e179162c24",
        "limitId": "89618431-e33d-4721-a7ea-e53638ec6d93",
        "draftValidityDate": null,
        "created": 1734592452059,
        "createdBy": "e5408b4c-0169-49c3-bd8e-b11f80cb5782",
        "modified": 1736519362338,
        "modifiedBy": "00000000-0000-0000-0000-000000000001",
        "removed": false,
        "version": 9
      }
    }
  ],
  "total": 2
}

Информация о бронировании за период.

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

Команда Путь
jsch_scheduleDateListInternal HTTP POST "/jsch_scheduleDateListInternal"

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

Поле Виды фильтров
subjectClassCode InSetQuery
objectGroupClass InSetQuery
subjectEntityId InSetQuery
scheduleDate QueriesForTimeStamp

ScheduleDateUpsertBatchInternal

На входе список броней

[
  {
    "id": "4777449d-5c98-4d57-9540-7504c88df369",
    "scheduleDate": 1741651200000,
    "tempScheduleDate": null,
    "entityId": "e2c4faa3-5e35-4e2d-8710-95e179162c24",
    "limitId": "89618431-e33d-4721-a7ea-e53638ec6d93",
    "draftValidityDate": null,
    "created": 1734592452059,
    "createdBy": "e5408b4c-0169-49c3-bd8e-b11f80cb5782",
    "modified": 1736519362338,
    "modifiedBy": "00000000-0000-0000-0000-000000000001",
    "removed": false,
    "version": 9
  }
]

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

{}

Обновляет или создает брони

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

Команда Путь
jsch_scheduleDateUpsertBatchInternal HTTP POST "/jsch_scheduleDateUpsertBatchInternal"

CreateWithCopyCalendar

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

"89618431-e33d-4721-a7ea-e53638ec6d93"

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

"476b9a57-a84c-4bb2-91d8-4fd0614919a3"

Создание календаря на основе существующего

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

Команда Путь
jsch_createWithCopyCalendar Kafka Topic "job_scheduler_commands"

DeleteCalendar

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

"89618431-e33d-4721-a7ea-e53638ec6d93"

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

{}

Удаление календаря

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

Команда Путь
jsch_deleteCalendar Kafka Topic "job_scheduler_commands"

ListCalendars

На входе фильтр поиска Search

{
  "query": "id && removed",
  "context": {
    "id": "499c478d-56bf-4281-8603-aae941ce7d4b",
    "removed": "false"
  },
  "sorting": null,
  "paging": {
    "page": 1,
    "count": 10
  }
}

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

{
  "items": [
    {
      "id": "9d6d2d44-007e-4a42-9b1e-966632a1c72c",
      "default": false,
      "data": {},
      "created": 1497528800,
      "createdBy": "015c00b8-4713-4fb5-beab-c0bb2957b9b3",
      "modified": 1277624700,
      "modifiedBy": "391eb444-428c-4d1e-b925-df33e6e896ec",
      "removed": false,
      "version": 1
    },
    {
      "id": "d1fed94c-041b-4fa3-b726-c9bc29693b62",
      "default": false,
      "data": {},
      "created": 1425168000,
      "createdBy": "caf73838-ec0a-44dd-a21d-08e5d8a22f77",
      "modified": 1496275200,
      "modifiedBy": "113b050f-df73-4448-9d1f-41bcb0095a8f",
      "removed": false,
      "version": 1
    }
  ],
  "total": 2
}

Получение списка календарей

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

Команда Путь
jsch_listCalendars HTTP POST "/jsch_listCalendars"

UpdateCalendar

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

{
  "id": "86dbe83e-9fc5-4241-a064-a82c0d4dace2",
  "default": false,
  "data": {}
}

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

{}

Обновление календаря

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

Команда Путь
jsch_updateCalendar Kafka Topic "job_scheduler_commands"

GetCalendar

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

"ad01de76-3a19-4417-8e61-6382336a9ecd"

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

{
  "id": "8a9edbc0-8bda-415d-99fe-8531b39f8278",
  "default": false,
  "data": {},
  "created": 1677628800,
  "createdBy": "015c00b8-4713-4fb5-beab-c0bb2957b9b3",
  "modified": 1577624800,
  "modifiedBy": "b99e6a8e-5e1f-4f24-9092-9edab597a333",
  "removed": false,
  "version": 1
}

Получение календаря.

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

Команда Путь
jsch_getCalendar HTTP POST "/jsch_getCalendar"

GetDefaultCalendar

На входе пустой объект

{}

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

{
  "id": "8a9edbc0-8bda-415d-99fe-8531b39f8278",
  "default": false,
  "data": {},
  "created": 1677628800,
  "createdBy": "015c00b8-4713-4fb5-beab-c0bb2957b9b3",
  "modified": 1577624800,
  "modifiedBy": "b99e6a8e-5e1f-4f24-9092-9edab597a333",
  "removed": false,
  "version": 1
}

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

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

Команда Путь
jsch_getDefaultCalendar HTTP POST "/jsch_getDefaultCalendar"

CreateWeekendDay

На входе информация для создания выходного дня

{
  "date": 1734613104998,
  "name": "Вторник",
  "calendarId": "83e5fdb3-fa84-49b7-b6b6-6c2b457bcd27"
}

На выходе идентификатор выходного дня

"f7dff8d8-27c6-47b4-a6c9-733e15c2d3e3"

Создание выходного дня

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

Команда Путь
jsch_createWeekendDay Kafka Topic "job_scheduler_commands"

CreateWeekendDayBatch

На входе информация для создания выходных дней

[
  {
    "date": 1734613104998,
    "name": "Вторник",
    "calendarId": "83e5fdb3-fa84-49b7-b6b6-6c2b457bcd27"
  },
  {
    "date": 1734613104592,
    "name": "День дня",
    "calendarId": "83e5fdb3-fa84-49b7-b6b6-6c2b457bcd27"
  }
]

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

2

Создание выходных дней

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

Команда Путь
jsch_createWeekendDayBatch Kafka Topic "job_scheduler_commands"

ModifyWeekendsBatch

На входе информация для создания выходных дней и информация об удаляемых днях

{
  "weekends": [
    {
      "date": 1734613104998,
      "name": "Суббота"
    },
    {
      "date": 1734613105001,
      "name": "Понедельник"
    },
    {
      "date": 1734613103278,
      "name": "Восскресенье"
    }
  ],
  "calendarId": "83e5fdb3-fa84-49b7-b6b6-6c2b457bcd27",
  "weekendsToDelete": [
    "7bc10bb8-b439-4bb8-96ee-65c74030f53c",
    "db7fe900-c137-4021-8198-9f9dd15496c6",
    "9446c6c2-0e04-4074-8563-dfbb8b5ce1ef",
    "52022797-ce3f-4c57-8c96-d60780614799"
  ]
}

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

{}

Создание выходных дней и удаление.

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

Команда Путь
jsch_modifyWeekendsBatch Kafka Topic "job_scheduler_commands"

DeleteWeekendDay

На входе информация для создания выходных дней

  "185cc749-a26b-43de-9467-d3a5b5b5be12"

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

{}

Удаление выходного дня

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

Команда Путь
jsch_deleteWeekendDay Kafka Topic "job_scheduler_commands"

ListWeekends

На входе фильтр поиска Search

{
  "query": "calendarId && removed",
  "context": {
    "calendarId": "499c478d-56bf-4281-8603-aae941ce7d4b",
    "removed": "false"
  },
  "sorting": null,
  "paging": {
    "page": 1,
    "count": 10
  }
}

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

{
  "items": [
    {
      "id": "476b9a57-a84c-4bb2-91d8-4fd0614919a3",
      "calendarId": "d97a50b8-372c-48c6-9513-8d63ee3daf9b",
      "date": 1678613488,
      "name": "Восскресенье",
      "created": 1751781789,
      "createdBy": "3d128a7c-e360-4e01-a89d-e2d6cd9a76ed",
      "modified": 1641771900,
      "modifiedBy": "4af33134-4656-4d1e-b583-1e0615fab3c9",
      "removed": false,
      "version": 1
    },
    {
      "id": "3d2b9f18-4dac-47f4-ba93-c7c96e0138df",
      "calendarId": "0b75906c-3c18-4be8-b931-573cb8715cb0",
      "date": 1678613488,
      "name": "Суббота",
      "created": 1741481677,
      "createdBy": "3c210070-ef07-4cc9-b012-ae2f1e1e5670",
      "modified": 1682771354,
      "modifiedBy": "7cdf77f3-995e-4e26-b970-3d2298d43e44",
      "removed": false,
      "version": 1
    }
  ],
  "total": 2
}

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

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

Команда Путь
jsch_listWeekends HTTP POST "/jsch_listWeekends"

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

Поле Виды фильтров
calendarId InSetQuery

GetSubject

На входе информация о внешнем идентификаторе субъекта

{
  "classCode": "UserGroup",
  "entityId": "standardCorporateCenter"
}

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

{
  "id": "7cdf77f3-995e-4e26-b970-3d2298d43e44",
  "classCode": "UserGroup",
  "entityId": "standardCorporateCenter",
  "attributes": {},
  "description": null,
  "capacity": 1,
  "notificationGroupId": "3d128a7c-e360-4e01-a89d-e2d6cd9a76ed",
  "created": 1743171450126,
  "createdBy": "00000000-0000-0000-0000-000000000001",
  "modified": 1743171450126,
  "modifiedBy": "00000000-0000-0000-0000-000000000001",
  "removed": false,
  "version": 1
}

Удаление выходного дня

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

Команда Путь
jsch_getSubject HTTP POST "/jsch_getSubject"

Объекты сервиса job-scheduler

JobScheduleDateDTO

Информация о бронируемой сущности и о дате брони

Поле Тип Обязательное Описание
scheduleDate TimeStamp да Дата брони
subject SubjectIdentity да Субъект брони
objectGroupClass String да Клас объектов брони
scheduledObjectId UUID да Экземпляр объекта

JobScheduleEntityDTO

Информация о бронируемой сущности

Поле Тип Обязательное Описание
subject SubjectIdentity да Субъект брони
objectGroupClass String да Клас объектов брони
scheduledObjectId UUID да Экземпляр объекта

SubjectIdentity

Внешний идентификатор субъекта

Поле Тип Обязательное Описание
classCode String да Код субъекта
entityId String да Id субъекта

JobScheduleDateReplaceDTO

Информация о замене бронируемой сущности и о дате брони

Поле Тип Обязательное Описание
scheduleDate TimeStamp да Дата брони
scheduleDateNew TimeStamp да Дата новой брони
subject SubjectIdentity да Субъект брони
objectGroupClass String да Клас объектов брони
scheduledObjectId UUID да Экземпляр объекта

JobScheduleDateStatsDTO

Информация о статистике по дате

Поле Тип Обязательное Описание
scheduleDate TimeStamp да Дата бронирования
max Int да Максимальное ограничение
count Int да Количество объектов
scheduledObjects ScheduledObject[] да Список объектов

ScheduledObject

Поле Тип Обязательное Описание
id UUID да id объекта
limitGroupId UUID да id группы лимитов

SubjectDescription

Описание субъекта

Поле Тип Обязательное Описание
classCode String да Код субъекта
entityId String да Id субъекта
description String нет Описание субъекта

ObjectGroupDescription

Описание группы объектов

Поле Тип Обязательное Описание
objectGroupClass String да Код группы объектов
description String нет Описание группы объектов

LimitDescription

Описание ограничения

Поле Тип Обязательное Описание
id UUID нет Идентификатор ограничения(обязателен при обновлении, не обязателен при создании)
value int да Значение ограничения
unit String да Единица измерения ограничения
description String нет Описание ограничения

SubjectInfo

Информация о субъекте

Поле Тип Обязательное Описание
id UUID да Идентификатор субъекта
classCode String да Код субъекта
entityId String да Id субъекта
description String нет Описание субъекта
removed Boolean да Признак удаления

Subject

Поле Тип Обязательное Описание
id UUID да Идентификатор субъекта
classCode String да Код сущности в сервисе
entityId String да Id сущности в сервисе
attributes Json нет Дополнительные атрибуты сущности
description String нет Описание субъекта
capacity Int да Мощность субъекта
created TimeStamp да Дата и время создания
createdBy UUID да Идентификатор пользователя создавшего запись
modified TimeStamp да Дата и время изменения
modifiedBy UUID да Идентификатор пользователя изменившего запись
removed Boolean да Признак удаления
version Int да Версия для оптимистичной блокировки
notificationGroupId UUID нет Идентификатор группы пользователей для уведомлениях об изменении

ObjectGroupInfo

Информация о группе объектов

Поле Тип Обязательное Описание
id UUID да Идентификатор группы объектов
objectGroupClass String да Код группы объектов
description String нет Описание группы объектов
removed Boolean да Признак удаления

LimitInfo

Информация об ограничении

Поле Тип Обязательное Описание
id UUID нет Идентификатор ограничения
value int да Значение ограничения
unit String да Единица измерения ограничения
description String нет Описание ограничения
removed Boolean да Признак удаления

Limit

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

Поле Тип Обязательное Описание
id UUID да Идентификатор лимита
limitValue Int да Значение ограничения в limitUnit
conditionValue String нет Ограничение по конкретному значению для condition группы. Если не указано, то это общее ограничение группы
limitUnit String нет Единица измерения limitValue, пока реализовано per day - оно ставится по умолчанию, но в планах per week, per month, per year
limitGroupId UUID да Идентификатор группы ограничений
created TimeStamp да Дата и время создания
createdBy UUID да ID пользователя создавшего запись
modified TimeStamp да Дата и время изменения
modifiedBy UUID да ID пользователя последним изменившего запись
removed Boolean да Признак удаления записи
version Int да Версия для оптимистичной блокировки

ValidateConditionsDTO

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

Поле Тип Обязательное Описание
subject SubjectIdentity да Субъект ограничения
objectGroupClass String да Клас объектов ограничения
conditions Map[String, Option[String]] да Список условий пар ключ-значение

LimitGroupCreateDTO

Описание новой группы ограничений

Поле Тип Обязательное Описание
subject SubjectCreateDTO да Описание субъекта для которого задаются ограничения
objectGroupClass String да Код группы объектов для которого задаются ограничения
title String да Текстовая метка ограничений
priority Int нет Приоритет проверки
condition String нет Условие для проверки ограничений, если не указано, то применяется к любой работе указанного субъекта над группой объектов
conditions LimitConditionValue[] да Список ограничений по условию
removed Boolean нет Признак удаления

LimitGroupUpdateDTO

Изменение группы ограничений

Поле Тип Обязательное Описание
id UUID да Идентификатор группы ограничений
objectGroupClass String да Клас объектов ограничения
title String да Текстовая метка ограничений
priority Int нет Приоритет проверки
condition String нет Условие для проверки ограничений, если не указано, то применяется к любой работе указанного субъекта над группой объектов
conditions LimitConditionValue[] да Список ограничений по условию

SubjectCreateDTO

Описание нового субъекта

Поле Тип Обязательное Описание
classCode String да Код субъекта
entityId String да Идентификатор субъекта
attributes Json нет Дополнительные атрибуты
description String нет Описание субъекта
capacity Int нет Мощность субъекта(по умолчанию 1)
notificationGroupId UUID нет Идентификатор группы для уведомлений

LimitConditionValue

Описание ограничений

Поле Тип Обязательное Описание
limitValue Int да Значение ограничения в limitUnit
conditionValue String нет Ограничение по конкретному значению для condition группы. Если не указано, то это общее ограничение группы
limitUnit String нет Единица измерения limitValue, пока реализовано per day - оно ставится по умолчанию, но в планах per week, per month, per year

ListLimitGroupDTO

Информация об ограничении и списке условий

Поле Тип Обязательное Описание
id UUID да Идентификатор группы ограничений
subjectId UUID да Идентификатор субъекта
objectGroupId UUID да Идентификатор группы объектов
title String да Текстовая метка ограничений
priority Int да Приоритет проверки
condition String нет Условие для проверки ограничений, если не указано, то применяется к любой работе указанного субъекта над группой объектов
modified TimeStamp да Дата и время последнего изменения
modifiedBy UUID да Идентификатор пользователя, который последним вносил изменения
removed Boolean да Признак удаления
limits LimitConditionValue[] да Список ограничений по условию

JobScheduleDateAutoDTO

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

Поле Тип Обязательное Описание
subject SubjectIdentity да Субъект ограничения
objectGroupClass String да Клас объектов ограничения
conditions Map[String, String] да Список условий пар ключ-значение

FiniteDuration

Продолжительность периода

Поле Тип Обязательное Описание
length Long да Количество единиц продолжительности
unit String да Единица продолжительности

CreateCalendarDTO

Информация о календаре при создании

Поле Тип Обязательное Описание
default Boolean да Признак дефолтного календаря
data Json да Структура календаря

UpdateCalendarDTO

Информация о календаре при обновлении

Поле Тип Обязательное Описание
id UUID да Идентификатор календаря
default Boolean да Признак дефолтного календаря
data Json да Структура календаря

Calendar

Сущность календаря

Поле Тип Обязательное Описание
id UUID да Идентификатор календаря
default Boolean да Признак дефолтного календаря
data Json да Структура календаря
created Timestamp да Дата и время создания
createdBy UUID да ID пользователя создавшего запись
modified Timestamp да Дата и время изменения
modifiedBy UUID да ID пользователя последним изменившего запись
removed Boolean да Признак удаления записи
version Int да Версия для оптимистичной блокировки

CreateWeekendDTO

Информация выходном дне при создании

Поле Тип Обязательное Описание
date TimeStamp да Дата
name String да Наименование выходного дня
calendarId UUID да Экземпляр календаря

ModifyWeekendBatchDTO

Информация для создания выходных дней батчем.

Поле Тип Обязательное Описание
weekends ModifyWeekendDTO[] да Список выходных дней
calendarId UUID да Экземпляр календаря
weekendsToDelete UUID[] нет Список выходные дней для удаления

ModifyWeekendDTO

Информация о выходном дне при создании батчем

Поле Тип Обязательное Описание
date TimeStamp да Дата выходного дня
name String нет Наименование выходного дня

Weekend

Сущность выходного дня

Поле Тип Обязательное Описание
id UUID да Идентификатор выходного дня
calendarId UUID да Экземпляр календаря
date TimeStamp да Дата
name String нет Наименование выходного дня
created TimeStamp да Дата и время создания
createdBy UUID да ID пользователя создавшего запись
modified TimeStamp да Дата и время изменения
modifiedBy UUID да ID пользователя последним изменившего запись
removed Boolean да Признак удаления записи
version Int да Версия для оптимистичной блокировки

JobScheduleDate

Информация о бронировании

Поле Тип Обязательное Описание
id UUID да Идентификатор брони
scheduleDate TimeStamp да Дата брони
tempScheduleDate TimeStamp нет Черновик даты брони
entityId UUID да Идентификатор объекта бронирования
limitId UUID да Идентификатор ограничения
draftValidityDate TimeStamp нет Срок действия брони
created TimeStamp да Дата и время создания
createdBy UUID да ID пользователя создавшего запись
modified TimeStamp да Дата и время изменения
modifiedBy UUID да ID пользователя последним изменившего запись
removed Boolean да Признак удаления записи
version Int да Версия для оптимистичной блокировки

JobScheduleDateGetDTO

Информация о бронировании с субъектом и объектом

Поле Тип Обязательное Описание
id UUID да Идентификатор брони
scheduleDate TimeStamp да Дата брони
tempScheduleDate TimeStamp нет Черновик даты брони
entityId UUID да Идентификатор объекта бронирования
limitId UUID да Идентификатор ограничения
draftValidityDate TimeStamp нет Срок действия брони
created TimeStamp да Дата и время создания
createdBy UUID да ID пользователя создавшего запись
modified TimeStamp да Дата и время изменения
modifiedBy UUID да ID пользователя последним изменившего запись
removed Boolean да Признак удаления записи
version Int да Версия для оптимистичной блокировки

IdDTO

Объект с идентификатором

Поле Тип Обязательное Описание
id UUID да Идентификатор

sed-comment

Сервис комментариев

Сервис принимает команды и хранит состояние в PostgreSQL. Команды могут приходить как по HTTP, так и через Kafka в топик sed_comment_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информация по добавлению команд можно прочитать в описании шаблона

Локальный запуск сервиса sed-comment

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью SBT

SED_COMMENT_DB_HOST=localhost SED_COMMENT_DB_PORT=5432 SED_COMMENT_DB_NAME=sed-comment_db SED_COMMENT_DB_USER=postgres SED_COMMENT_DB_PASSWORD=12345 sbt boot/run

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

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

Переменная Тип Обязательная Значение по умолчанию Описание
SED_COMMENT_COMMANDS_CONSIDER_ALL_INTERNAL boolean да false Все межсервисные команды являются внутренними (internal) и не требуют авторизации
SED_COMMENT_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
SED_COMMENT_HTTP_PORT int нет 8025 Порт, на котором слушает HTTP-сервер
SED_COMMENT_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
SED_COMMENT_KAFKA_TOPIC string нет "sed_comment_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
SED_COMMENT_KAFKA_CONSUMER_GROUP string нет "sed_comment_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
SED_COMMENT_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
SED_COMMENT_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
SED_COMMENT_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
SED_COMMENT_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
SED_COMMENT_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах SED_COMMENT_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
SED_COMMENT_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который SED_COMMENT_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
SED_COMMENT_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
SED_COMMENT_KAFKA_OBJECT_EVENT_TOPIC string да "entityObjectEvent" Название кафка-топика для ожидания событий по объектам
SED_COMMENT_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka(в случае аутентификации в kafka с помощью пароля). Если название не указано, то настройки авторизации не будут применены.
SED_COMMENT_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka(в случае аутентификации в kafka с помощью пароля).
SED_COMMENT_KAFKA_AUTH_PRINCIPAL string нет "" Principal учетной записи Kafka в Kerberos(в случае аутентификации в kafka через Kerberos).
SED_COMMENT_KAFKA_AUTH_KEYTAB_PATH string нет "" Путь до keytab-файла(в случае аутентификации в kafka через Kerberos).
SED_COMMENT_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
SED_COMMENT_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к харнилищу сертификатов.
SED_COMMENT_KAFKA_AUTH_MODE string нет "static" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
SED_COMMENT_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
SED_COMMENT_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
SED_COMMENT_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
SED_COMMENT_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL duration string нет 4 minutes Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом.
SED_COMMENT_KAFKA_CONNECTION_CHECK_INTERVAL duration string нет 60 seconds Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений.
SED_COMMENT_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL duration string нет 5 minutes Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным.
SED_COMMENT_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
SED_COMMENT_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
SED_COMMENT_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
SED_COMMENT_TRACE_DURATION boolean нет false Признак необходимости трассировки выполнения команд
SED_COMMENT_DISCOVERABLE_ID string нет "another_SED_COMMENT _service_instance" ID сервиса в ServiceDiscovery
SED_COMMENT_DISCOVERABLE_NAME string нет "sed-comment" Имя сервиса в ServiceDiscovery
SED_COMMENT_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
SED_COMMENT_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
SED_COMMENT_DISCOVERABLE_LIVETIME duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
SED_COMMENT_DISCOVERABLE_HEALTHPASS string нет 1 minute Периодичность отправки health check в ServiceDiscovery
SED_COMMENT_AKKA_HTTP_CLIENT_MAXCON int нет 512 Максимальное число одновременных исходящих HTTP-соединений
SED_COMMENT_AKKA_HTTP_CLIENT_MAXREQ int нет 1024 Максимальное число одновременных исходящих HTTP-запросов
SED_COMMENT_AKKA_HTTP_SERVER_MAXCON int нет 1024 Максимальное число одновременных входящих HTTP-соединений
SED_COMMENT_INTERNALCMD_ALLOW bool нет false Можно ли сервису отправлять внутрисистемные команды
SED_COMMENT_HEALTH_TIMEOUT duration string нет 5 seconds Максимальное время ожидания ответа health check
SED_COMMENT_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
SED_COMMENT_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
SED_COMMENT_DB_HOST string да Хост БД
SED_COMMENT_DB_PORT int да Порт БД
SED_COMMENT_DB_NAME string да Имя базы в БД
SED_COMMENT_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
SED_COMMENT_DB_USER string да Пользователь БД
SED_COMMENT_DB_PASSWORD string да Пароль пользователя БД
SED_COMMENT_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
SED_COMMENT_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
SED_COMMENT_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
SED_COMMENT_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
SED_COMMENT_LOG_LEVEL_SLICK_STATEMENT string нет WARN Уровень логирования запросов, отправляемых slick в БД
SED_COMMENT_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирование бенчмарков выполнения запросов slick
SED_COMMENT_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
SED_COMMENT_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования конфига kafka-consumer
SED_COMMENT_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
SED_COMMENT_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
SED_COMMENT_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
LOGGING_HOSTNAME string нет SERVER Имя хоста для логирования в формате CEF
LOGGING_EXTERNAL_ADDRESS string нет localhost Внешний адрес для логирования в формате CEF
THREAD_SORTING_KEY string нет startOffset Ключ сортировки по умолчанию в ListThreadsWithComments
SED_USER_DATA_BY_EMAIL_COMMAND string нет Команда для получения информации о пользователе по его EMAIL
SED_COMMENT_FILL_USER_DATA_ENABLED boolean нет false Включить заполнение данных о пользователе (Необходимо указать параметр "SED_USER_DATA_BY_EMAIL_COMMAND")
SED_VERSION_POSTFIX string нет Постфикс библиотеки sed-libs для сборки CI
CLIENT_VERSION_POSTFIX string нет Постфикс библиотеки sed-domain-lib для сборки CI
SYSTEM_VERSION_POSTFIX string нет Постфикс библиотеки sed-system-lib для сборки CI
SED_COMMENT_LOG_FORMAT string нет CEF Формат вывода логов (если переменная содержит CEF, применяет формат CEF, иначе дефолтный паттерн)
SED_COMMENT_SYSLOG_ENABLE boolean нет false Включить дополнительный вывод в syslog
SED_COMMENT_SYSLOG_PROTOCOL string нет TCP Протокол (TCP или UDP)
SED_COMMENT_SYSLOG_SSL_ENABLE boolean нет false Включить SSL
SED_COMMENT_SYSLOG_HOST string нет Хост syslog сервера
SED_COMMENT_SYSLOG_PORT string нет Порт syslog сервера
SED_COMMENT_SYSLOG_RECONNECTION_DELAY int нет 10000 Задержка между попытками соединиться с сервером syslog, если было неудачное соединение
SED_COMMENT_SYSLOG_TRUSTSTORE_LOCATION string нет Путь к truststore
SED_COMMENT_SYSLOG_TRUSTSTORE_PASSWORD string нет Пароль к truststore
SED_COMMENT_LOG_FILE_ENABLE boolean нет false Включить вывод в файл

Список команд сервиса sed-comment

В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

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

CreateThread

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

{
  "classCode": "TextSnippet",
  "entityId": "00000000-0000-0000-0000-000000000001",
  "data": {
    "someData": "someValue"
  }
}

На выходе ID нового треда

"df193075-26c5-4d7a-8ff4-dbdf596223b6"

Добавление нового треда.

Команда Путь
sedComment_createThread HTTP POST "/v1/thread/create"

UpdateThread

На выходе атрибуты для обновления треда

{
  "id": "df193075-26c5-4d7a-8ff4-dbdf596223b6",
  "classCode": "NewTextSnippet",
  "entityId": "00000000-0000-0000-0000-000000000001",
  "data": {
    "someData": "someValue"
  },
  "version": 1
}

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

true

Обновление треда.

Команда Путь
sedComment_updateThread HTTP POST "/v1/thread/update"

DeleteThread

На входе ID треда

"df193075-26c5-4d7a-8ff4-dbdf596223b6"

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

true

Удаление треда.

Команда Путь
sedComment_deleteThread HTTP POST "/v1/thread/delete"

DeleteThreadsByEntityId

На входе список Id entityId

["df193075-26c5-4d7a-8ff4-dbdf596223b6","00000000-0000-0000-0000-000000000000"]

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

true

Удаление тредов по entityId.

Команда Путь
sedComment_deleteThreadsByEntityId Kafka topic "sed_comment_commands"

RestoreThread

На входе ID треда

"df193075-26c5-4d7a-8ff4-dbdf596223b6"

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

true

Восстановление треда.

Команда Путь
sedComment_restoreThread HTTP POST "/v1/thread/restore"

GetThread

На входе ID треда

"df193075-26c5-4d7a-8ff4-dbdf596223b6"

На выходе атрибуты треда

{
  "id": "df193075-26c5-4d7a-8ff4-dbdf596223b6",
  "classCode": "TextSnippet",
  "entityId": "00000000-0000-0000-0000-000000000001",
  "data": {
    "someData": "someValue"
  },
  "commentsCount": 5,
  "created": 1675681068129,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1675681068129,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Получение треда.

Команда Путь
sedComment_getThread HTTP POST "/v1/thread/get"

ListThreads

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "entityId",
  "context": {
    "entityId": "00000000-0000-0000-0000-000000000001"
  }
}

На выходе список тредов и их общее количество

{
  "items": [
    {
      "id": "df193075-26c5-4d7a-8ff4-dbdf596223b6",
      "classCode": "TextSnippet",
      "entityId": "00000000-0000-0000-0000-000000000001",
      "data": {
        "someData": "someValue"
      },
      "commentsCount": 5,
      "created": 1675681068129,
      "createdBy": "00000000-0000-0000-0000-000000000000",
      "modified": 1675681068129,
      "modifiedBy": "00000000-0000-0000-0000-000000000000",
      "removed": false,
      "version": 1
    }
  ],
  "total": 1
}

Получение списка тредов с поиском, сортировкой и пагинацией.

Команда Путь
sedComment_listThreads HTTP POST "/v1/thread/list"

CreateComment

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

{
  "threadId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
  "comment": "Содержательный комментарий",
  "data": {
    "someData": "someValue"
  }
}

На выходе ID нового комментария

"6d9edc57-cc78-4b95-850f-159cb38361df"

Добавление нового комментария.

Команда Путь
sedComment_createComment HTTP POST "/v1/comment/create"

CreateCommentWithThread

На входе атрибуты треда и комментария При совпадении entityId, classCode, data комментарий добавляется в существующий тред, иначе создается новый

{
  "entityId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
  "classCode": "Содержательный комментарий",
  "data": {
    "someData": "someValue"
  },
  "comment": "comment"
}

На выходе ID треда и комментария

{
  "threadId": "6d9edc57-cc78-4b95-850f-159cb38361df",
  "commentId": "3207d03e-ae46-40c4-8a47-eb83cad385d7"
}

Добавление нового комментария.

Команда Путь
sedComment_createCommentWithThread HTTP POST "/v1/comment/add-comment"

CountCommentsWithoutResolution

На входе SeqExternalEntityIds

[
  {
    "entityIds": ["ca649694-2fc8-4a63-8ee5-a239127960a3"],
    "classCode": "ClassCode1"
  },
  {
    "entityIds": ["5543f392-55a1-4e5e-a79a-2b2be711be88"],
    "classCode": "ClassCode2"
  }
]

На количество комментариев без резолюции

5

Получение количества комментариев без резолюции.

Команда Путь
sedComment_countCommentsWithoutResolution HTTP POST "/v1/threads-with-comments/count-without-resolution"

UpdateComment

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

{
  "id": "6d9edc57-cc78-4b95-850f-159cb38361df",
  "threadId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
  "comment": "Новый содержательный комментарий",
  "data": {
    "someData": "someValue"
  },
  "version": 1
}

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

true

Обновление комментария. Поле "resolution" зарезервированно. Для добавления в "data" поля "resolution" используется отдельная команда.

Команда Путь
sedComment_updateComment HTTP POST "/v1/comment/update"

SetCommentResolution

На выходе атрибуты для оставления резолюции

{
  "commentId": "6d9edc57-cc78-4b95-850f-159cb38361df",
  "version": 1,
  "resolution": {
    "someData": "someValue"
  }
}

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

true

Проставление резолюции.

Команда Путь
sedComment_setCommentResolution HTTP POST "/v1/comment/set-comment-resolution"

DeleteComment

На входе ID комментария

"6d9edc57-cc78-4b95-850f-159cb38361df"

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

true

Удаление комментария.

Команда Путь
sedComment_deleteComment HTTP POST "/v1/comment/delete"

RestoreComment

На входе ID комментария

"6d9edc57-cc78-4b95-850f-159cb38361df"

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

true

Восстановление комментария.

Команда Путь
sedComment_restoreComment HTTP POST "/v1/comment/restore"

GetComment

На входе ID комментария

"6d9edc57-cc78-4b95-850f-159cb38361df"

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

{
  "id": "6d9edc57-cc78-4b95-850f-159cb38361df",
  "parentId": null,
  "threadId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
  "comment": "Cодержательный комментарий",
  "data": {
    "someData": "someValue"
  },
  "created": 1675685249871,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1675685249871,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Получение комментария.

Команда Путь
sedComment_getComment HTTP POST "/v1/comment/get"

ListComments

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "threadId",
  "context": {
    "threadId": "3207d03e-ae46-40c4-8a47-eb83cad385d7"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

На выходе список комментариев и их общее количество

{
  "items": [
    {
      "id": "6d9edc57-cc78-4b95-850f-159cb38361df",
      "parentId": null,
      "threadId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
      "comment": "Cодержательный комментарий",
      "data": {
        "someData": "someValue"
      },
      "created": 1675685249871,
      "createdBy": "00000000-0000-0000-0000-000000000000",
      "modified": 1675685249871,
      "modifiedBy": "00000000-0000-0000-0000-000000000000",
      "removed": false,
      "version": 1
    },
    {
      "id": "67cf50bc-cdda-4a91-814e-17b065c57f28",
      "parentId": null,
      "threadId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
      "comment": "Новый содержательный комментарий",
      "data": {
        "someData": "someValue"
      },
      "created": 1675684951294,
      "createdBy": "00000000-0000-0000-0000-000000000000",
      "modified": 1675685602358,
      "modifiedBy": "00000000-0000-0000-0000-000000000000",
      "removed": false,
      "version": 2
    }
  ],
  "total": 2
}

Получение списка комментариев с поиском, сортировкой и пагинацией.

Команда Путь
sedComment_listComments HTTP POST "/v1/comment/list"

CommentsCount

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

[
  "a60237f2-33f0-47b3-b3b6-c8131feff18a",
  "c6360a53-3a4c-4a7c-8afb-88c4f4c830f8",
  "d0fa65f0-fac9-44fe-99b5-27d4770f0587",
  "e10da18f-8e00-43a1-a7d8-f32dcd008c49"
]

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

{
  "a60237f2-33f0-47b3-b3b6-c8131feff18a": 3,
  "d0fa65f0-fac9-44fe-99b5-27d4770f0587": 2,
  "c6360a53-3a4c-4a7c-8afb-88c4f4c830f8": 2,
  "e10da18f-8e00-43a1-a7d8-f32dcd008c49": 1
}

Получение количества комментариев к сущностям

Команда Путь
sedComment_commentsCount HTTP POST "/v1/comment/comments-count"

ListThreadsWithComments

На входе параметры поиска, сортировки (Search) Аттрибуты Thread задаются по обычным ключам ("created"), атрибуты Search требуют префикса comment ("comment.created") У Thread есть дополнительный аттрибут сортировки (по умолчанию "startOffset"), если оно содержится в data При сортировке по полям thread, комментарии сортируются по ("comment.created") При сортировке по полям comment, треды сортируются по ("startOffset")

{
  "query": "entityId",
  "context": {
    "entityId": "00000000-0000-0000-0000-000000000001"
  },
  "sorting": {
    "fieldName": "comment.create",
    "order": "desc"
  }
}

На выходе список тредов с комментариями и их оценками, которые не удалены и у комментариев parentId = null

[
  {
    "id": "df193075-26c5-4d7a-8ff4-dbdf596223b6",
    "classCode": "TextSnippet",
    "entityId": "00000000-0000-0000-0000-000000000001",
    "data": {
      "someData": "someValue"
    },
    "comments": [
      {
        "id": "6d9edc57-cc78-4b95-850f-159cb38361df",
        "parentId": null,
        "threadId": "df193075-26c5-4d7a-8ff4-dbdf596223b6",
        "comment": "comment",
        "data": {},
        "childrenCommentsCount": 1,
        "voteStatus": {
          "scores": {
            "1": 1,
            "-1": 2
          },
          "rating": -1,
          "userVote": {
            "id": "d96135e5-0933-4a9a-9650-fcfe4e318a37",
            "score": -1,
            "commentId": "0dd5ea93-8902-4642-8821-923d3bcbd083",
            "created": 1675681068129,
            "createdBy": "34fa2718-2c88-49ab-a76e-ee982e61d8d9",
            "modified": 1675681068129,
            "modifiedBy": "34fa2718-2c88-49ab-a76e-ee982e61d8d9",
            "removed": false,
            "version": 1
          }
        },
        "created": 1675681068129,
        "createdBy": "00000000-0000-0000-0000-000000000000",
        "version": 1
      }
    ],
    "created": 1675681068129,
    "createdBy": "00000000-0000-0000-0000-000000000000",
    "version": 1
  }
]

Получение списка тредов с комментариями.

Команда Путь
sedComment_listThreadsWithComments HTTP POST "/v1/threads-with-comments/list"

ListThreadsWithCommentsFlat

На входе параметры поиска, сортировки (Search) Поддерживает сортировку по comment.created и voteStatus.rating Аналогична команде ListThreadsWithComments, только без тредов

{
  "query": "entityId",
  "context": {
    "entityId": "a60237f2-33f0-47b3-b3b6-c8131feff18a"
  },
  "sorting": {
    "fieldName": "voteStatus.rating",
    "order": "Desc"
  }
}

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

[
  {
    "id": "8a9b1f79-ef56-412a-b82a-27e6a11e95b1",
    "parentId": null,
    "threadId": "090bf07d-b2a5-495a-81db-f0153f39c520",
    "comment": "Комментарий",
    "data": {
      "commentData": {},
      "threadData": {
        "fragment": {
          "startOffset": 4
        }
      }
    },
    "childrenCommentsCount": 1,
    "voteStatus": {
      "scores": {
        "-1": 1,
        "1": 2
      },
      "rating": 1,
      "userVote": {
        "id": "476f3069-f0b0-4c8c-b8d2-8d1c73fb9b38",
        "score": 2,
        "commentId": "8a9b1f79-ef56-412a-b82a-27e6a11e95b1",
        "created": 1675681068129,
        "createdBy": "6eba9d19-1961-4f4a-932b-462a41b6c02a",
        "modified": 1675681068129,
        "modifiedBy": "6eba9d19-1961-4f4a-932b-462a41b6c02a",
        "removed": false,
        "version": 1
      }
    },
    "created": 1675681068129,
    "createdBy": "3e8a183f-8a44-44bb-ac3b-efbc9429e9ea",
    "version": 1
  },
  {
    "id": "a6723c68-32ed-4bb4-9c56-ff1b8f8a947a",
    "parentId": null,
    "threadId": "090bf07d-b2a5-495a-81db-f0153f39c520",
    "comment": "Комментарий",
    "data": {
      "commentData": {},
      "threadData": {
        "fragment": {
          "startOffset": 4
        }
      }
    },
    "voteStatus": {
      "scores": {},
      "rating": 0,
      "userVote": null
    },
    "created": 1675681068129,
    "createdBy": "3e8a183f-8a44-44bb-ac3b-efbc9429e9ea",
    "version": 1
  }
]

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

Команда Путь
sedComment_listThreadsWithCommentsFlat HTTP POST "/v1/threads-with-comments/list-flat"

BatchUpdateThreadEntityId

Тот entityId с которого надо перепривязать и на какой надо перепривязать

{
  "oldEntityId": "00000000-0000-0000-0000-000000000001",
  "newEntityId": "00000000-0000-0000-0000-000000000002"
}

На выходе кол-во измененных тредов

1

Изменения привязки у группы тредов.

Команда Путь
sedComment_batchUpdateThreadEntityId Kafka topic "sed_comment_commands"

CreateVote

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

{
  "commentId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
  "score": "1",
  "data": {
    "someData": "someValue"
  }
}

На выходе ID нового голоса

"6d9edc57-cc78-4b95-850f-159cb38361df"

Добавление нового голоса.

Команда Путь
sedComment_createVote HTTP POST "/v1/vote/create"

UpdateVote

На выходе атрибуты для обновления голоса

{
  "id": "6d9edc57-cc78-4b95-850f-159cb38361df",
  "commentId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
  "score": "-1",
  "version": 1,
  "data": {
    "someData": "someValue"
  }
}

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

true

Обновление комментария.

Команда Путь
sedComment_updateVote HTTP POST "/v1/vote/update"

DeleteVote

На входе ID голоса

"6d9edc57-cc78-4b95-850f-159cb38361df"

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

true

Удаление голоса.

Команда Путь
sedComment_deleteVote HTTP POST "/v1/vote/delete"

ListVotes

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "commentId",
  "context": {
    "threadId": "3207d03e-ae46-40c4-8a47-eb83cad385d7"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

На выходе список голосов и их общее количество

{
  "items": [
    {
      "id": "6d9edc57-cc78-4b95-850f-159cb38361df",
      "score": 1,
      "commentId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
      "data": {
        "employee": {
          "id": "03ec99c9-ac3e-41c3-ab95-f02fb3f7a64c",
          "post": "Начальник управления",
          "email": "mileshin.sa@tomsk.gazprom-neft.loc",
          "lastName": "Милешин",
          "firstName": "Сергей",
          "middleName": "Александрович",
          "subdivision": {
            "id": "29a997d9-afaf-460c-af29-2256f0e037d3",
            "title": "Управление материально-технического обеспечения"
          }
        },
        "created": 1675685249871,
        "createdBy": "00000000-0000-0000-0000-000000000000",
        "modified": 1675685249871,
        "modifiedBy": "00000000-0000-0000-0000-000000000000",
        "removed": false,
        "version": 1
      }
    },
    {
      "id": "6d9edc57-cc78-4b95-850f-159cb38361df",
      "score": -1,
      "commentId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
      "data": {
        "employee": {
          "id": "03ec99c9-ac3e-41c3-ab95-f02fb3f7a64c",
          "post": "Начальник управления",
          "email": "mileshin.sa@tomsk.gazprom-neft.loc",
          "lastName": "Милешин",
          "firstName": "Сергей",
          "middleName": "Александрович",
          "subdivision": {
            "id": "29a997d9-afaf-460c-af29-2256f0e037d3",
            "title": "Управление материально-технического обеспечения"
          }
        },
        "created": 1675685249871,
        "createdBy": "00000000-0000-0000-0000-000000000000",
        "modified": 1675685249871,
        "modifiedBy": "00000000-0000-0000-0000-000000000000",
        "removed": false,
        "version": 1
      }
    }
  ],
  "total": 2
}

Получение списка комментариев с поиском, сортировкой и пагинацией.

Команда Путь
sedComment_listComments HTTP POST "/v1/comment/list"

Объекты сервиса sed-comment

Thread

Поле Тип Обязательное Описание
id UUID да ID треда
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
data json да дополнительные данные
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да признак удаления
version Integer да версия для оптимистичной блокировки

ThreadWithCommentsCountDTO

Поле Тип Обязательное Описание
id UUID да ID треда
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
data json да дополнительные данные
commentsCount Integer да количество комментариев
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
version Integer да версия для оптимистичной блокировки

ThreadCreateDTO

Поле Тип Обязательное Описание
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
data json нет дополнительные данные

ThreadUpdateDTO

Поле Тип Обязательное Описание
id UUID да ID треда
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
data json нет дополнительные данные
version Integer да версия для оптимистичной блокировки

Comment

Поле Тип Обязательное Описание
id UUID да ID комментария
parentId UUID нет ID родительского комментария
threadId UUID да ID треда комментария
comment string да текст комментария
data json да дополнительные данные
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да признак удаления
version Integer да версия для оптимистичной блокировки

CommentDto

Поле Тип Обязательное Описание
id UUID да ID комментария
parentId UUID нет ID родительского комментария (всегда null)
threadId UUID да ID треда
comment string да текст комментария
data json да дополнительные данные
childrenCommentsCount Integer да кол-во дочерних комментариев
voteStatus VoteStatus да данные по голосам
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
version Integer да версия для оптимистичной блокировки

CommentCreateDTO

Поле Тип Обязательное Описание
parentId UUID нет ID родительского комментария
threadId UUID да ID треда комментария
comment string да текст комментария
data json нет дополнительные данные

CommentUpdateDTO

Поле Тип Обязательное Описание
id UUID да ID комментария
parentId UUID нет ID родительского комментария
threadId UUID да ID треда комментария
comment string да текст комментария
data json нет дополнительные данные. Поле "resolution" зарезервированно
version Integer да версия для оптимистичной блокировки

CreateCommentWithThreadDTO

Поле Тип Обязательное Описание
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
data json нет дополнительные данные треда
comment string да текст комментария

CreateCommentWithThreadResult

Поле Тип Обязательное Описание
threadId UUID да ID треда
commentId UUID да ID комментария

ThreadWithCommentsDTO

Поле Тип Обязательное Описание
id UUID да ID треда
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
data json да дополнительные данные
comments CommentDTO[] да комментарии
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
version Integer да версия для оптимистичной блокировки

ThreadBatchUpdateEntityIdDTO

Поле Тип Обязательное Описание
oldEntityId UUID да id старой сущности
newEntityId UUID да id новой сущности

Vote

Поле Тип Обязательное Описание
id UUID да ID голоса
commentId UUID да ID комментария
score Integer да оценка
data json нет доп. данные
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да признак удаления
version Integer да версия для оптимистичной блокировки

VoteCreateDTO

Поле Тип Обязательное Описание
commentId UUID да ID комментария
score Integer да оценка
data json нет доп. данные

VoteUpdateDTO

Поле Тип Обязательное Описание
id UUID да ID голоса
commentId UUID да ID комментария
score Integer да оценка
version Integer да версия для оптимистичной блокировки
data json нет доп. данные

VoteStatus

Поле Тип Обязательное Описание
scores json да количество оценок
rating Integer да рейтинг
userVote Vote нет голос пользователя, отправившего команду

SetCommentResolutionDTO

Поле Тип Обязательное Описание
commentId UUID да ID комментария
version Integer да версия для оптимистичной блокировки
resolution json нет резолюция

ExternalEntityIds

Поле Тип Обязательное Описание
entityIds string[] да Список ID сущностей
classCode Integer да Код сущности в сервисе

sedRoute

Сервис маршрутов

Сервис принимает команды и хранит состояние в PostgreSQL. Команды могут приходить как по HTTP, так и через Kafka в топик sedroute_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информация по добавлению команд можно прочитать в описании шаблона

Локальный запуск сервиса sedRoute

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура: - PostgreSQL база по адресу localhost:5432/sed-route - Kafka по адресу localhost:9092 - Consul по адресу localhost:8500 - Адрес Kafka будет указан в application.conf - Добавлены необходимые переменные окружения: - SED_ROUTE_DB_HOST - SED_ROUTE_DB_PORT - SED_ROUTE_DB_NAME - SED_ROUTE_DB_USER - SED_ROUTE_DB_PASSWORD

Запуск из консоли с помощью SBT

SED_ROUTE_DB_HOST=localhost SED_ROUTE_DB_PORT=5432 SED_ROUTE_DB_NAME=sed-route SED_ROUTE_DB_USER=postgres SED_ROUTE_DB_PASSWORD=12345 sbt boot/run

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

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

Переменная Тип Обязательная Значение по умолчанию Описание
SED_ROUTE_COMMANDS_CONSIDER_ALL_INTERNAL boolean да false Все межсервисные команды являются внутренними (internal) и не требуют авторизации
SED_ROUTE_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
SED_ROUTE_HTTP_PORT int нет 8021 Порт, на котором слушает HTTP-сервер
SED_ROUTE_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
SED_ROUTE_KAFKA_OBJECT_EVENT_TOPIC string да "entityObjectEvent" Название кафка-топика для ожидания событий по объектам
SED_ROUTE_KAFKA_TOPIC string нет "sedroute_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
SED_ROUTE_ENTITY_EVENT_TOPIC string нет "route_entity_events" Название кафка-топика для публикации событий маршрутов сущностей
SED_ROUTE_KAFKA_CONSUMER_GROUP string нет "sedroute_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
SED_ROUTE_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
SED_ROUTE_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
SED_ROUTE_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
SED_ROUTE_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
SED_ROUTE_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах SED_ROUTE_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
SED_ROUTE_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который SED_ROUTE_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
SED_ROUTE_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
SED_ROUTE_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka(в случае аутентификации в kafka с помощью пароля). Если название не указано, то настройки авторизации не будут применены.
SED_ROUTE_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka(в случае аутентификации в kafka с помощью пароля).
SED_ROUTE_KAFKA_AUTH_PRINCIPAL string нет "" Principal учетной записи Kafka в Kerberos(в случае аутентификации в kafka через Kerberos).
SED_ROUTE_KAFKA_AUTH_KEYTAB_PATH string нет "" Путь до keytab-файла(в случае аутентификации в kafka через Kerberos).
SED_ROUTE_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
SED_ROUTE_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к харнилищу сертификатов.
SED_ROUTE_KAFKA_AUTH_MODE string нет "static" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
SED_ROUTE_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
SED_ROUTE_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
SED_ROUTE_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
SED_ROUTE_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
SED_ROUTE_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
SED_ROUTE_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
SED_ROUTE_TRACE_DURATION boolean нет false Признак необходимости трассировки выполнения команд
SED_ROUTE_DISCOVERABLE_ID string нет "another_sedroute_instance" ID сервиса в ServiceDiscovery
SED_ROUTE_DISCOVERABLE_NAME string нет "sed-route" Имя сервиса в ServiceDiscovery
SED_ROUTE_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
SED_ROUTE_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
SED_ROUTE_DISCOVERABLE_LIVETIME duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
SED_ROUTE_DISCOVERABLE_HEALTHPASS string нет 1 minute Периодичность отправки health check в ServiceDiscovery
SED_ROUTE_AKKA_HTTP_CLIENT_MAXCON int нет 512 Максимальное число одновременных исходящих HTTP-соединений
SED_ROUTE_AKKA_HTTP_CLIENT_MAXREQ int нет 1024 Максимальное число одновременных исходящих HTTP-запросов
SED_ROUTE_AKKA_HTTP_SERVER_MAXCON int нет 1024 Максимальное число одновременных входящих HTTP-соединений
SED_ROUTE_INTERNALCMD_ALLOW bool нет false Можно ли сервису отправлять внутрисистемные команды
SED_ROUTE_HEALTH_TIMEOUT duration string нет 5 seconds Максимальное время ожидания ответа health check
SED_ROUTE_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
SED_ROUTE_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
SED_ROUTE_DB_HOST string да Хост БД
SED_ROUTE_DB_PORT int да Порт БД
SED_ROUTE_DB_NAME string да Имя базы в БД
SED_ROUTE_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
SED_ROUTE_DB_USER string да Пользователь БД
SED_ROUTE_DB_PASSWORD string да Пароль пользователя БД
SED_ROUTE_AUTHZFORCE_ADDR string нет "http://localhost:8080/authzforce-ce" Адрес AuthZforce server
SED_ROUTE_AUTHZFORCE_DOMAIN string нет "" Доступный DomainID в AuthZforce server
SED_ROUTE_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
SED_ROUTE_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
SED_ROUTE_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
SED_ROUTE_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
SED_ROUTE_LOG_LEVEL_SLICK_STATEMENT string нет WARN Уровень логирования запросов, отправляемых slick в БД
SED_ROUTE_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирование бенчмарков выполнения запросов slick
SED_ROUTE_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
SED_ROUTE_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования конфига kafka-consumer
SED_ROUTE_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
SED_ROUTE_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
SED_ROUTE_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
LOGGING_HOSTNAME string нет SERVER Имя хоста для логирования в формате CEF
LOGGING_EXTERNAL_ADDRESS string нет localhost Внешний адрес для логирования в формате CEF
SED_ROUTE_LOG_FORMAT string нет CEF Формат вывода логов (если переменная содержит CEF, применяет формат CEF, иначе дефолтный паттерн)
SED_ROUTE_SYSLOG_ENABLE boolean нет false Включить дополнительный вывод в syslog
SED_ROUTE_SYSLOG_PROTOCOL string нет TCP Протокол (TCP или UDP)
SED_ROUTE_SYSLOG_SSL_ENABLE boolean нет false Включить SSL
SED_ROUTE_SYSLOG_HOST string нет Хост syslog сервера
SED_ROUTE_SYSLOG_PORT string нет Порт syslog сервера
SED_ROUTE_SYSLOG_RECONNECTION_DELAY int нет 10000 Задержка между попытками соединиться с сервером syslog, если было неудачное соединение
SED_ROUTE_SYSLOG_TRUSTSTORE_LOCATION string нет Путь к truststore
SED_ROUTE_SYSLOG_TRUSTSTORE_PASSWORD string нет Пароль к truststore
SED_ROUTE_LOG_FILE_ENABLE boolean нет false Включить вывод в файл

Список команд сервиса sedRoute

В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

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

CreateRouteEntity

На выходе атрибуты для создания нового маршрута сущности, если не указать routeStageId, будет автоматически выбрана стадия с stageTypeId = "Start"

{
  "classCode": "classCode",
  "entityId": "00000000-0000-0000-0000-000000000001",
  "routeVersionId": "00000000-0000-0000-0000-000000000001",
  "routeStageId": "00000000-0000-0000-0000-000000000001",
  "data": {

  }
}

На выходе атрибуты нового маршрута сущности

{
  "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "classCode": "classCode",
  "entityId": "00000000-0000-0000-0000-000000000001",
  "routeVersionId": "00000000-0000-0000-0000-000000000001",
  "routeStageId": "00000000-0000-0000-0000-000000000001",
  "data": {

  },
  "created": 1661866284080,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1661866284080,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Добавление нового маршрута сущности.

Команда Путь
sedroute_createRouteEntity Kafka Topic "sedroute_commands"

UpdateRouteEntity

На выходе атрибуты для обновления маршрута сущности

{
  "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "classCode": "classCode",
  "entityId": "00000000-0000-0000-0000-000000000001",
  "routeVersionId": "00000000-0000-0000-0000-000000000001",
  "routeStageId": "00000000-0000-0000-0000-000000000001",
  "data": {

  },
  "version": 1
}

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

true

Обновление маршрута сущности. Принимает "version" для оптимистичной блокировки.

Команда Путь
sedroute_updateRouteEntity Kafka Topic "sedroute_commands"

ChangeRouteEntityStage

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

{
  "routeEntityId": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "routeStageLinkId": "00000000-0000-0000-0000-000000000001"
}

На выходе пустое тело ответа

Изменение стадии маршрута.

Команда Путь
sedroute_changeRouteEntityStage Kafka Topic "sedroute_commands"

ChangeRouteEntityStageByEntity

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

{
  "classCode": "classCode",
  "entityId": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "routeStageLinkId": "00000000-0000-0000-0000-000000000001"
}

На выходе пустое тело ответа

Изменение стадии маршрута.

Команда Путь
sedroute_changeRouteEntityStageByEntity Kafka Topic "sedroute_commands"

ChangeRouteEntityRouteVersion

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

{
  "routeEntityId": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "routeVersionId": "00000000-0000-0000-0000-000000000001",
  "routeStageId": "00000000-0001-0001-0000-000000000001"
}

На выходе пустое тело ответа

Изменение версии маршрута у маршрута сущности.

Команда Путь
sedroute_changeRouteEntityStage Kafka Topic "sedroute_commands"

ChangeRouteEntityStageByEntity

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

{
  "classCode": "classCode",
  "entityId": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "routeVersionId": "00000000-0000-0000-0000-000000000001",
  "routeStageId": "00000000-0001-0001-0000-000000000001"
}

На выходе пустое тело ответа

Изменение версии маршрута у маршрута сущности.

Команда Путь
sedroute_changeRouteEntityStageByEntity Kafka Topic "sedroute_commands"

DeleteRouteEntity

На входе ID маршрута сущности

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Удаление маршрута сущности.

Команда Путь
sedroute_deleteRouteEntity Kafka Topic "sedroute_commands"

DeleteBatchRouteEntity

На входе список ID маршрутов сущности

["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]

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

true

Удаление маршрутов сущности.

Команда Путь
sedroute_deleteBatchRouteEntity Kafka Topic "sedroute_commands"

RestoreRouteEntity

На входе ID маршрута сущности

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Восстановление маршрута сущности.

Команда Путь
sedroute_restoreRouteEntity Kafka Topic "sedroute_commands"

GetRouteEntity

На входе ID маршрута сущности

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

На выходе атрибуты маршрута сущности

{
  "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "classCode": "classCode",
  "entityId": "00000000-0000-0000-0000-000000000001",
  "routeVersionId": "00000000-0000-0000-0000-000000000001",
  "routeStage": {
    "id": "00000000-0000-0000-0000-000000000001",
    "title":  "title"
  },
  "data": {
    "processedRoutes": {
      "routeId": "Route",
      "routeVersionId": "00000000-0000-0000-0000-000000000001",
      "order": 0
    }
  },
  "created": 1661866284080,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1661866284080,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Получение маршрута сущности.

Команда Путь
sedroute_getRouteEntity HTTP POST "/v1/routeEntity/get"

ListRouteEntity

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "classCode",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

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

{
  "items": [
    {
      "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
      "classCode": "classCode",
      "entityId": "00000000-0000-0000-0000-000000000001",
      "routeVersionId": "00000000-0000-0000-0000-000000000001",
      "routeStage": {
        "id": "00000000-0000-0000-0000-000000000001",
        "title":  "title"
      },
      "data": {
        "processedRoutes": {
          "routeId": "Route",
          "routeVersionId": "00000000-0000-0000-0000-000000000001",
          "order": 0
        }
      },
      "created": 1661866284080,
      "createdBy": "00000000-0000-0000-0000-000000000000",
      "modified": 1661866550202,
      "modifiedBy": "00000000-0000-0000-0000-000000000000",
      "removed": false,
      "version": 2
    }
  ],
  "total": 1
}

Получение списка маршрутов сущностей с поиском, сортировкой и пагинацией.

Команда Путь
sedroute_listRouteEntity HTTP POST "/v1/routeEntity/list"

CreateRoute

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

{
  "id": "route",
  "title": "title",
  "description": "description"
}

На выходе атрибуты нового маршрута

{
  "id": "route",
  "title": "title",
  "description": "description",
  "data": {

  },
  "created": 1661866284080,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1661866284080,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Добавление нового маршрута.

Команда Путь
sedroute_createRoute Kafka Topic "sedroute_commands"

UpdateRoute

На входе атрибуты для обновления маршрута

{
  "id": "route",
  "title": "title",
  "description": "description",
  "data": {

  },
  "version": 1
}

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

true

Обновление маршрута. Принимает "version" для оптимистичной блокировки.

Команда Путь
sedroute_updateRoute Kafka Topic "sedroute_commands"

DeleteRoute

На входе id маршрута

"01"

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

true

Удаление маршрута.

Команда Путь
sedroute_deleteRoute Kafka Topic "sedroute_commands"

RestoreRoute

На входе id маршрута

"route"

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

true

Восстановление маршрута.

Команда Путь
sedroute_restoreRoute Kafka Topic "sedroute_commands"

GetRoute

На входе ID маршрута

"route"

На выходе атрибуты маршрута

{
  "id": "route",
  "title": "title",
  "description": "description",
  "data": {

  },
  "created": 1661866284080,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1661866284080,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Получение маршрута.

Команда Путь
sedroute_getRoute HTTP POST "/v1/route/get"

ListRoute

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "classCode",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

На выходе список маршрутов и их общее количество

{
  "items": [
    {
      "id": "route",
      "title": "title",
      "description": "description",
      "data": {

      },
      "created": 1661866284080,
      "createdBy": "00000000-0000-0000-0000-000000000000",
      "modified": 1661866284080,
      "modifiedBy": "00000000-0000-0000-0000-000000000000",
      "removed": false,
      "version": 1
    }
  ],
  "total": 1
}

Получение списка маршрутов с поиском, сортировкой и пагинацией.

Команда Путь
sedroute_listRoute HTTP POST "/v1/route/list"

CreateRouteStage

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

{
  "routeVersionId": "00000000-0000-0000-0000-000000000000",
  "title": "title",
  "description": "description",
  "data": {
    "type": "type",
    "number": "1",
    "participantRoles": [
      "role"
    ]
  },
  "stageTypeId": "Start"
}

На выходе ID новой стадии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

Добавление новой стадии маршрута.

Команда Путь
sedroute_createRouteStage Kafka Topic "sedroute_commands"

CloneRouteWithChanges

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

{
  "routeId": "SomeRoute",
  "changes": [
    {
      "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
      "title": "title",
      "description": "description",
      "version": 1,
      "data": {
        "type": "type",
        "number":  "1",
        "participantRoles": ["role"]
      }
    }
  ]
}

На выходе ID клона версии маршрута

{
  "routeId": "SomeRoute-1666182680185",
  "routeVersionId": "24404bb3-fc1e-4388-ac4b-9c99beb89e91"
}

Клонирование новой версии маршрута. Клонирует версию маршрута по id, применяя изменения для стадий из массива changes

Команда Путь
sedroute_cloneRouteVersionWithChanges Kafka Topic "sedroute_commands"

UpdateRouteStage

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

{
  "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "title": "title",
  "description": "description",
  "version": 1,
  "data": {
    "type": "type",
    "number":  "1",
    "participantRoles": ["role"]
  },
  "stageTypeId": "Start"
}

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

true

Обновление стадии маршрута. Принимает "version" для оптимистичной блокировки.

Команда Путь
sedroute_updateRouteStage Kafka Topic "sedroute_commands"

DeleteRouteStage

На входе ID стадии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Удаление стадии маршрута.

Команда Путь
sedroute_deleteRouteStage Kafka Topic "sedroute_commands"

DeleteBatchRouteStage

На входе список ID стадий маршрутов

["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]

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

true

Удаление стадий маршрутов.

Команда Путь
sedroute_deleteBatchRouteStage Kafka Topic "sedroute_commands"

RestoreRouteStage

На входе ID стадии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Восстановление стадии маршрута.

Команда Путь
sedroute_restoreRouteStage Kafka Topic "sedroute_commands"

GetRouteStage

На входе ID стадии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

На выходе атрибуты стадии маршрута

{
  "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "routeVersionId": "00000000-0000-0000-0000-000000000000",
  "title": "title",
  "description": "description",
  "data": {
    "type": "type",
    "number":  "1",
    "participantRoles": ["role"]
  },
  "stageTypeId": "Start",
  "created": 1661866284080,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1661866284080,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Получение стадии маршрута.

Команда Путь
sedroute_getRouteStage HTTP POST "/v1/routeStage/get"

ListRouteStage

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "classCode",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

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

{
  "items": [
    {
      "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
      "routeVersionId": "00000000-0000-0000-0000-000000000000",
      "title": "title",
      "description": "description",
      "data": {
        "type": "type",
        "number":  "1",
        "participantRoles": ["role"]
      },
      "stageTypeId": "Start",
      "created": 1661866284080,
      "createdBy": "00000000-0000-0000-0000-000000000000",
      "modified": 1661866284080,
      "modifiedBy": "00000000-0000-0000-0000-000000000000",
      "removed": false,
      "version": 1
    }
  ],
  "total": 1
}

Получение списка стадий маршрутов с поиском, сортировкой и пагинацией.

Команда Путь
sedroute_listRouteStage HTTP POST "/v1/routeStage/list"

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

{
  "title": "title",
  "stageFrom": "00000000-0000-0000-0000-000000000000",
  "stageTo": "00000000-0000-0000-0000-000000000001",
  "conditions": {
    "data": "data"
  }
}

На выходе ID нового перехода между маршрутами

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

Добавление нового перехода между маршрутами.

Команда Путь
sedroute_createRouteStageLink Kafka Topic "sedroute_commands"

На входе атрибуты для обновления перехода между маршрутами.

{
  "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "title": "title",
  "stageFrom": "00000000-0000-0000-0000-000000000000",
  "stageTo": "00000000-0000-0000-0000-000000000001",
  "conditions": {
    "data": "data"
  },
  "version": 1
}

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

true

Обновление перехода между маршрутами. Принимает "version" для оптимистичной блокировки.

Команда Путь
sedroute_updateRouteStageLink Kafka Topic "sedroute_commands"

На входе ID перехода между маршрутами

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Удаление перехода между маршрутами.

Команда Путь
sedroute_deleteRouteStageLink Kafka Topic "sedroute_commands"

На входе список ID переходов между маршрутами

["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]

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

true

Удаление переходов между маршрутами.

Команда Путь
sedroute_deleteBatchRouteStageLink Kafka Topic "sedroute_commands"

На входе ID перехода между маршрутами

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Восстановление перехода между маршрутами.

Команда Путь
sedroute_restoreRouteStageLink Kafka Topic "sedroute_commands"

На входе ID перехода между маршрутами

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

На выходе атрибуты перехода между маршрутами

{
  "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "title": "title",
  "stageFrom": {
    "id": "00000000-0000-0000-0000-000000000000",
    "title":  "title"
  },
  "stageTo": {
    "id": "00000000-0000-0000-0000-000000000001",
    "title":  "title"
  },
  "conditions": {
    "data": "data"
  },
  "created": 1661866284080,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1661866284080,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Получение перехода между маршрутами.

Команда Путь
sedroute_getRouteStageLink HTTP POST "/v1/routeStageLink/get"

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "classCode",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

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

{
  "items": [
    {
      "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
      "title": "title",
      "stageFrom": {
        "id": "00000000-0000-0000-0000-000000000000",
        "title":  "title"
      },
      "stageTo": {
        "id": "00000000-0000-0000-0000-000000000001",
        "title":  "title"
      },
      "conditions": {
        "data": "data"
      },
      "created": 1661866284080,
      "createdBy": "00000000-0000-0000-0000-000000000000",
      "modified": 1661866284080,
      "modifiedBy": "00000000-0000-0000-0000-000000000000",
      "removed": false,
      "version": 1,
      "hidden": false
    }
  ],
  "total": 1
}

Получение списка переходов между маршрутами с поиском, сортировкой и пагинацией.

Команда Путь
sedroute_listRouteStageLink HTTP POST "/v1/routeStageLink/list"

CreateRouteVersion

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

{
  "routeId": "routeId",
  "number": "1.0",
  "draft": true
}

На выходе ID новой версии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

Добавление новой версии маршрута.

Команда Путь
sedroute_createRouteVersion Kafka Topic "sedroute_commands"

CloneRouteVersionWithChanges

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

{
  "routeVersionId": "00000202-0000-0000-0000-000000000000",
  "changes": [
    {
      "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
      "title": "title",
      "description": "description",
      "version": 1,
      "data": {
        "type": "type",
        "number":  "1",
        "participantRoles": ["role"]
      }
    }
  ]
}

На выходе ID клона версии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

Клонирование новой версии маршрута. Клонирует версию маршрута по id, применяя изменения для стадий из массива changes

Команда Путь
sedroute_cloneRouteVersionWithChanges Kafka Topic "sedroute_commands"

PublishRouteVersion

На входе ID версии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Публикация версии маршрута.

Команда Путь
sedroute_publishRouteVersion Kafka Topic "sedroute_commands"

UnpublishRouteVersion

На входе ID версии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Отмена публикации версии маршрута.

Команда Путь
sedroute_unPublishRouteVersion Kafka Topic "sedroute_commands"

DeleteRouteVersion

На входе ID версии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Удаление версии маршрута.

Команда Путь
sedroute_deleteRouteVersion Kafka Topic "sedroute_commands"

DeleteBatchRouteVersion

На входе список ID версий маршрутов

["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]

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

true

Удаление версий маршрутов.

Команда Путь
sedroute_deleteBatchRouteVersion Kafka Topic "sedroute_commands"

DeleteBatchRouteVersionCascade

На входе список ID версий маршрутов

["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]

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

true

Каскадное удаление версий маршрутов (помечает removed также сущности RouteStage и RouteStageLink).

Команда Путь
sedroute_deleteBatchRouteVersionCascade Kafka Topic "sedroute_commands"

RestoreRouteVersion

На входе ID версии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Восстановление версии маршрута.

Команда Путь
sedroute_restoreRouteVersion Kafka Topic "sedroute_commands"

GetRouteVersion

На входе ID версии маршрута

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

На выходе атрибуты версии маршрута

{
  "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "routeId": "routeId",
  "number": "1.0",
  "draft": true,
  "created": 1661866284080,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1661866284080,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Получение маршрута.

Команда Путь
sedroute_getRouteVersion HTTP POST "/v1/routeVersion/get"

RouteActualVersion

На входе ID маршрута

"routeId"

На выходе атрибуты версии маршрута

{
  "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "routeId": "routeId",
  "number": "1.0",
  "draft": true,
  "created": 1661866284080,
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "modified": 1661866284080,
  "modifiedBy": "00000000-0000-0000-0000-000000000000",
  "removed": false,
  "version": 1
}

Получение актуальной версии маршрута по id маршрута.

Команда Путь
sedroute_routeActualVersion HTTP POST "/v1/routeVersion/getActual"

ListRouteVersion

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "classCode",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

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

{
  "items": [
    {
      "id": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
      "routeId": "routeId",
      "number": "1.0",
      "draft": true,
      "created": 1661866284080,
      "createdBy": "00000000-0000-0000-0000-000000000000",
      "modified": 1661866284080,
      "modifiedBy": "00000000-0000-0000-0000-000000000000",
      "removed": false,
      "version": 1
    }
  ],
  "total": 1
}

Получение списка версий маршрутов с поиском, сортировкой и пагинацией.

Команда Путь
sedroute_listRouteVersion HTTP POST "/v1/routeVersion/list"

Объекты сервиса sedRoute

RouteEntityCreateDTO

Поле Тип Обязательное Описание
classCode string да Код сущности
entityId string да ID сущности
routeVersionId uuid да ID версии маршрута применяемого для сущности
routeStageId uuid нет ID текущей стадии маршрута
data json да Доп. данные

RouteEntityUpdateDTO

Поле Тип Обязательное Описание
id uuid нет ID маршрута сущности
classCode string да Код сущности
entityId string да ID сущности
routeVersionId uuid да ID версии маршрута применяемого для сущности
routeStageId uuid да ID текущей стадии маршрута
version int нет Версия для оптимистичной блокировки
data json да Доп. данные

ChangeRouteEntityStageDTO

Поле Тип Обязательное Описание
routeEntityId uuid да ID маршрута сущности
routeStageLinkId uuid да ID перехода между стадиями маршрута

ChangeRouteEntityStageByEntityDTO

Поле Тип Обязательное Описание
classCode string да Код сущности
entityId string да ID сущности
routeStageLinkId uuid да ID перехода между стадиями маршрута

ChangeRouteEntityRouteVersionDTO

Поле Тип Обязательное Описание
routeEntityId uuid да ID маршрута сущности
routeVersionId uuid да ID новой версии маршрута применяемого для сущности
routeStageId uuid Нет ID стадии маршрута, на которую необходимо перейти. Если не указать, будет первая стадия маршрута

ChangeRouteEntityRouteVersionByEntityDTO

Поле Тип Обязательное Описание
classCode string да Код сущности
entityId string да ID сущности
routeVersionId uuid да ID новой версии маршрута применяемого для сущности
routeStageId uuid Нет ID стадии маршрута, на которую необходимо перейти. Если не указать, будет первая стадия маршрута

RouteEntity

Поле Тип Обязательное Описание
id uuid да ID маршрута сущности
classCode string да Код сущности
entityId string да ID сущности
routeVersionId uuid да ID версии маршрута применяемого для сущности
routeStageId uuid да ID текущей стадии маршрута
created timestamp да Дата и время создания
createdBy uuid да ID пользователя создавшего запись
modified timestamp да Дата и время изменения
modifiedBy uuid да ID пользователя последним изменившего запись
removed boolean да Признак удаления записи
version int да Версия для оптимистичной блокировки
data json да Доп. данные

RouteCreateDTO

Поле Тип Обязательное Описание
id string да Внутренний код маршрута (до 32 символов)
title string да Заголовок маршрута (64 символа)
description uuid да Описание стадии маршрута
data json да Доп. данные

RouteUpdateDTO

Поле Тип Обязательное Описание
id string да Внутренний код маршрута (до 32 символов)
title string да Заголовок маршрута (64 символа)
description uuid да Описание маршрута
version int нет Версия для оптимистичной блокировки
data json да Доп. данные

Route

Поле Тип Обязательное Описание
id string да Внутренний код маршрута (до 64 символов, выполняет роль Id)
title string да Заголовок маршрута (64 символа)
description uuid да Описание стадии маршрута
data json да Доп. данные
created timestamp да Дата и время создания
createdBy uuid да ID пользователя создавшего запись
modified timestamp да Дата и время изменения
modifiedBy uuid да ID пользователя последним изменившего запись
removed boolean да Признак удаления записи
version int да Версия для оптимистичной блокировки

RouteStageCreateDTO

Поле Тип Обязательное Описание
routeVersionId uuid да Id версии маршрута
title string да Заголовок стадии маршрута
description uuid да Описание стадии маршрута
data json да Доп. данные
stageTypeId string да Тип стадии маршрута

RouteStageUpdateDTO

Поле Тип Обязательное Описание
id uuid да ID маршрута
title string да Заголовок маршрута
description uuid да Описание стадии маршрута
version int да Версия для оптимистичной блокировки
data json да Доп. данные
stageTypeId string да Тип стадии маршрута

RouteStage

Поле Тип Обязательное Описание
id uuid нет ID стадии маршрута
routeVersionId uuid да Id версии маршрута
title string да Заголовок маршрута
description string да Описание стадии маршрута
created timestamp да Дата и время создания
createdBy uuid да ID пользователя создавшего запись
modified timestamp да Дата и время изменения
modifiedBy uuid да ID пользователя последним изменившего запись
removed boolean да Признак удаления записи
version int да Версия для оптимистичной блокировки
data json да Доп. данные.
data.number.displayNumber string нет Человекочитаемое представление номера стадии.
data.number.sortingNumber BigInt да Специальное число для сортировки стадий маршрута (в том числе не имеющих номера). Подчиняется контракту: если стадия А предшествует в маршруте стадии Б, то sortingStageNumber стадии А меньше, чем sortingStageNumber стадии Б.
stageTypeId string да Тип стадии маршрута
number - - Искусственное поле для упрощения сортировки по содержимому поля data.number. При сортировке его можно использовать вместо data.number.sortingNumber, а при фильтрации - вместо data.number.displayNumber.

RouteStageLinkCreateDTO

Поле Тип Обязательное Описание
title string да Заголовок перехода между стадиями маршрута
stageFrom uuid да ID стадии маршрута откуда осуществляется переход
stageTo uuid да ID стадии маршрута куда осуществляется переход
conditions json да Правила для выполнения перехода

RouteStageLinkUpdateDTO

Поле Тип Обязательное Описание
id uuid да ID перехода между стадиями маршрута
title string да Заголовок перехода между стадиями маршрута
stageFrom uuid да ID стадии маршрута откуда осуществляется переход
stageTo uuid да ID стадии маршрута куда осуществляется переход
conditions json да Правила для выполнения перехода
version int нет Версия для оптимистичной блокировки
Поле Тип Обязательное Описание
id uuid да ID перехода между стадиями маршрута
title string да Заголовок перехода между стадиями маршрута
stageFrom uuid да ID стадии маршрута откуда осуществляется переход
stageTo uuid да ID стадии маршрута куда осуществляется переход
conditions json да Правила для выполнения перехода
created timestamp да Дата и время создания
createdBy uuid да ID пользователя создавшего запись
modified timestamp да Дата и время изменения
modifiedBy uuid да ID пользователя последним изменившего запись
removed boolean да Признак удаления записи
hidden boolean да Признак скрытия записи
version int да Версия для оптимистичной блокировки

RouteVersionCreateDTO

Поле Тип Обязательное Описание
routeId string да ID маршрута (64 символа)
number int да Номер версии маршрута
draft boolean да Признак черновика версии маршрута
data json да Доп. данные

RouteVersion

Поле Тип Обязательное Описание
id uuid да ID версии маршрута
routeId string да ID маршрута (64 символа)
number int да Номер версии маршрута
draft boolean да Признак черновика версии маршрута
created timestamp да Дата и время создания
createdBy uuid да ID пользователя создавшего запись
modified timestamp да Дата и время изменения
modifiedBy uuid да ID пользователя последним изменившего запись
removed boolean да Признак удаления записи
version int да Версия для оптимистичной блокировки
data json да Доп. данные

RouteVersionCloneWithChangesDTO

Поле Тип Обязательное Описание
routeVersionId uuid да ID версии маршрута
changes RouteStageUpdateDTO[] да Список изменений стадий

RouteCloneWithChangesDTO

Поле Тип Обязательное Описание
routeId string да ID маршрута
changes RouteStageUpdateDTO[] да Список изменений стадий

RouteIdWithVersionId

Поле Тип Обязательное Описание
routeId string да ID маршрута
routeVersionId uuid да ID версии маршрута

sed-task-manager

Сервис задач

Сервис принимает команды и хранит состояние в PostgreSQL. Команды могут приходить как по HTTP, так и через Kafka в топик sed_task_manager_commands.

Сервис разбит на несколько модулей, в виде sbt проектов:

Информация по добавлению команд можно прочитать в описании шаблона

Локальный запуск сервиса sed-task-manager

При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:

Запуск из консоли с помощью SBT

SED_TASK_MANAGER_DB_HOST=localhost SED_TASK_MANAGER_DB_PORT=5432 SED_TASK_MANAGER_DB_NAME=sed-task-manager SED_TASK_MANAGER_DB_USER=postgres SED_TASK_MANAGER_DB_PASSWORD=12345 sbt boot/run

Список переменных окружения сервиса sed-task-manager

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

Переменная Тип Обязательная Значение по умолчанию Описание
SED_TASK_MANAGER_HTTP_HOST string нет "0.0.0.0" Хост, на котором слушает HTTP-сервер
SED_TASK_MANAGER_HTTP_PORT int нет 8022 Порт, на котором слушает HTTP-сервер
SED_TASK_MANAGER_COMMANDS_CONSIDER_ALL_INTERNAL boolean да false Все межсервисные команды являются внутренними (internal) и не требуют авторизации
SED_TASK_MANAGER_KAFKA_SERVERS string да "localhost:9092" Адрес Kafka
SED_TASK_MANAGER_KAFKA_TOPIC string нет "sed_task_manager_commands" Название кафка-топика для получения команд. Сервис получает кафка-команды по нему, но и также сам публикует это название в CommandDiscovery.
SED_TASK_MANAGER_KAFKA_CONSUMER_GROUP string нет "sed_task_manager_consumer_group" Имя consumer-группы для чтения из кафка-топика команд. Не должна меняться и не должна быть пустой, иначе сервис перечитает свои команды при перезапуске.
SED_TASK_MANAGER_KAFKA_PARTITIONS int нет 10 Число читаемых партиций из кафка-топика команд.
SED_TASK_MANAGER_KAFKA_CONSUMER_RESTART_MIN_BACKOFF duration string нет 1 second Изначальная задержка до рестарта консьюмера после падения (увеличивается в 2 раза после каждого рестарта)
SED_TASK_MANAGER_KAFKA_CONSUMER_RESTART_MAX_BACKOFF duration string нет 30 seconds Максимальное задержка до рестарта консьюмера после падения
SED_TASK_MANAGER_KAFKA_CONSUMER_RESTART_RANDOM_FACTOR double нет 0.2 Рандомный фактор для вычисления задержки перед следующим рестратом консьюмера (При значении 0.2 задержка может быть до 20% больше, чем при 0)
SED_TASK_MANAGER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS int нет 5 Максимальное число рестартов консьюмера после падения (в пределах SED_TASK_MANAGER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN)
SED_TASK_MANAGER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS_WITHIN duration string нет 5 minutes Временной отрезок, в который SED_TASK_MANAGER_KAFKA_CONSUMER_RESTART_MAX_RESTARTS ограничивает число рестартов
SED_TASK_MANAGER_KAFKA_COMMANDEVENT_TOPIC string да "commandevents" Название кафка-топика для отправки сообщений со статусами выполняемых команд. ОБЯЗАТЕЛЬНО должно соответствовать названию этого топика в сервисе статуса команд.
SED_TASK_MANAGER_KAFKA_AUTH_USER string нет "" Название учетной записи Kafka(в случае аутентификации в kafka с помощью пароля). Если название не указано, то настройки авторизации не будут применены.
SED_TASK_MANAGER_KAFKA_AUTH_PASSWORD string нет "" Пароль учетной записи Kafka(в случае аутентификации в kafka с помощью пароля).
SED_TASK_MANAGER_KAFKA_AUTH_PRINCIPAL string нет "" Principal учетной записи Kafka в Kerberos(в случае аутентификации в kafka через Kerberos).
SED_TASK_MANAGER_AUTH_KEYTAB_PATH string нет "" Путь до keytab-файла(в случае аутентификации в kafka через Kerberos).
SED_TASK_MANAGER_KAFKA_AUTH_TRUSTSTORE_LOCATION string нет "" Путь до хранилища сертификатов (Java key store). Если путь не указан, то сертификат применятся не будет.
SED_TASK_MANAGER_KAFKA_AUTH_TRUSTSTORE_PASSWORD string нет "" Пароль к харнилищу сертификатов.
SED_TASK_MANAGER_KAFKA_AUTH_MODE string нет "static" Режим аутентификации: static - одна учетная запись на все запросы, mapping - учетная запись зависит от запроса
SED_TASK_MANAGER_KAFKA_AUTH_CONFIG string нет "" Настройки для аутентификации: если AuthMode = mapping, то необходим JSON с List[KafkaAuthConfig]. Переменная соответствует полю authConfig из KafkaAuthSettings.
SED_TASK_MANAGER_KAFKA_AUTH_CACHE_SIZE int нет Максимальный размер кеша для Kafka producer (количество активных соединений).
SED_TASK_MANAGER_KAFKA_AUTH_CACHE_TTL duration string нет Время жизни Kafka producer в кеше.
SED_TASK_MANAGER_KAFKA_CONNECTION_CHECK_TEST_MESSAGES_INTERVAL duration string нет 4 minutes Применяется только для producer-ов со способом аутентификации kerberos. Интервал отправки тестовых сообщений кафки в топик connectionCheck.testMessagesTopicName. Тестовые сообщения (null, service producer test) отправляются регулярно с этим интервалом.
SED_TASK_MANAGER_KAFKA_CONNECTION_CHECK_INTERVAL duration string нет 60 seconds Применяется только для producer-ов со способом аутентификации kerberos. Интервал проверки того, сколько тестовых сообщений было отправлено за данный период. Если количество сообщений за этот период равно количеству сообщений за прошлый период, то начинается отсчет периода без сообщений.
SED_TASK_MANAGER_KAFKA_CONNECTION_CHECK_FAILED_AFTER_INTERVAL duration string нет 5 minutes Применяется только для producer-ов со способом аутентификации kerberos. Максимальная продолжительность периода без успешно отправленных тестовых сообщений. По ее достижении сервис будет объявлен больным.
SED_TASK_MANAGER_CONSUL_ADDR url string нет "http://localhost:8500" Адрес Сonsul.
SED_TASK_MANAGER_CONSUL_AUTH_USER string нет "" Название учетной записи Сonsul. Если название не указано, то настройки авторизации не будут применены.
SED_TASK_MANAGER_CONSUL_AUTH_PASSWORD string нет "" Пароль учетной записи Сonsul.
SED_TASK_MANAGER_TRACE_DURATION boolean нет false Признак необходимости трассировки выполнения команд
SED_TASK_MANAGER_DISCOVERABLE_ID string нет "another_sed_task_manager_instance" ID сервиса в ServiceDiscovery
SED_TASK_MANAGER_DISCOVERABLE_NAME string нет "sedTaskManager" Имя сервиса в ServiceDiscovery
SED_TASK_MANAGER_DISCOVERABLE_HOST string да "localhost" Хост, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. Указанный адрес должен быть виден другим сервисам. Пример: имя kubernetes/docker_swarm service
SED_TASK_MANAGER_DISCOVERABLE_PORT int нет Порт, публикуемый в ServiceDiscovery. По нему на данный сервис будут обращаться другие через HTTP. По умолчанию указывается порт, который слушает HTTP-сервер.
SED_TASK_MANAGER_DISCOVERABLE_LIVETIME duration string нет 2 minutes Период после последней отправки health check, в течение которого ServiceDiscovery считает данный сервис живым.
SED_TASK_MANAGER_DISCOVERABLE_HEALTHPASS string нет 1 minute Периодичность отправки health check в ServiceDiscovery
SED_TASK_MANAGER_AKKA_HTTP_CLIENT_MAXCON int нет 512 Максимальное число одновременных исходящих HTTP-соединений
SED_TASK_MANAGER_AKKA_HTTP_CLIENT_MAXREQ int нет 1024 Максимальное число одновременных исходящих HTTP-запросов
SED_TASK_MANAGER_AKKA_HTTP_SERVER_MAXCON int нет 1024 Максимальное число одновременных входящих HTTP-соединений
SED_TASK_MANAGER_INTERNALCMD_ALLOW bool нет false Можно ли сервису отправлять внутрисистемные команды
SED_TASK_MANAGER_HEALTH_TIMEOUT duration string нет 5 seconds Максимальное время ожидания ответа health check
SED_TASK_MANAGER_SENDERLIB_COMMANDS_CACHE_UPDATEPERIOD duration string нет 10 minutes Время кэширования данных по командам из CommandDiscovery
SED_TASK_MANAGER_SENDERLIB_SERVICES_CACHE_UPDATEPERIOD duration string нет 30 seconds Время кэширования данных по сервисам из ServiceDiscovery
SED_TASK_MANAGER_DB_HOST string да Хост БД
SED_TASK_MANAGER_DB_PORT int да Порт БД
SED_TASK_MANAGER_DB_NAME string да Имя базы в БД
SED_TASK_MANAGER_DB_URL jdbc url string нет JDBC-url для соединения с БД. По умолчанию собирается из других обязательных переменных. Можно указать только его, если не хочется отдельно указывать хост/порт/имя базы.
SED_TASK_MANAGER_DB_USER string да Пользователь БД
SED_TASK_MANAGER_DB_PASSWORD string да Пароль пользователя БД
SED_TASK_MANAGER_LOG_LEVEL string нет INFO Общий уровень логирования в сервисе
SED_TASK_MANAGER_LOG_LEVEL_AKKA string нет INFO Уровень логирования для akka
SED_TASK_MANAGER_LOG_LEVEL_LIQUIBASE string нет INFO Уровень логирования для liquibase (миграции)
SED_TASK_MANAGER_LOG_LEVEL_APPLICATION string нет DEBUG Уровень логирования для application
SED_TASK_MANAGER_LOG_LEVEL_SLICK_STATEMENT string нет WARN Уровень логирования запросов, отправляемых slick в БД
SED_TASK_MANAGER_LOG_LEVEL_SLICK_BENCHMARK string нет OFF Уровень логирование бенчмарков выполнения запросов slick
SED_TASK_MANAGER_LOG_LEVEL_KAFKA_PRODUCER string нет WARN Уровень логирования конфига kafka-producer
SED_TASK_MANAGER_LOG_LEVEL_KAFKA_CONSUMER string нет WARN Уровень логирования конфига kafka-consumer
SED_TASK_MANAGER_LOG_LEVEL_AKKAHTTPSENDER string нет TRACE Уровень логирования для отправки команд через HTTP. На уровне INFO логируется трассировка, если она включена
SED_TASK_MANAGER_LOG_LEVEL_KAFKASENDER string нет TRACE Уровень логирования для отправки команд через Kafka. На уровне INFO логируется трассировка, если она включена
SED_TASK_MANAGER_LOG_LEVEL_COMMANDSTATUSCLI string нет TRACE Уровень логирования для проверки состояний команд в сервисе статусов
SED_TASK_MANAGER_LOG_LEVEL_TEAM_ROUTES string нет TRACE Уровень логирования для роутов /team
LOGGING_HOSTNAME string нет SERVER Имя хоста для логирования в формате CEF
LOGGING_EXTERNAL_ADDRESS string нет localhost Внешний адрес для логирования в формате CEF
ANALYTICS_TASK_STATUSES string нет new,inProcess,solved Список статусов, учитываемых для аналитики задач в формате "inProcess,solved"
UPDATE_DEPENDENT_TASK_STATUS UpdateStatusType нет ChildDepends Тип зависимости задач,(ChildDepends(Обновляются дочерние задачи), Off(нет зависимости))
SED_TASK_MANAGER_LOG_FORMAT string нет CEF Формат вывода логов (если переменная содержит CEF, применяет формат CEF, иначе дефолтный паттерн)
SED_TASK_MANAGER_SYSLOG_ENABLE boolean нет false Включить дополнительный вывод в syslog
SED_TASK_MANAGER_SYSLOG_PROTOCOL string нет TCP Протокол (TCP или UDP)
SED_TASK_MANAGER_SYSLOG_SSL_ENABLE boolean нет false Включить SSL
SED_TASK_MANAGER_SYSLOG_HOST string нет Хост syslog сервера
SED_TASK_MANAGER_SYSLOG_PORT string нет Порт syslog сервера
SED_TASK_MANAGER_SYSLOG_RECONNECTION_DELAY int нет 10000 Задержка между попытками соединиться с сервером syslog, если было неудачное соединение
SED_TASK_MANAGER_SYSLOG_TRUSTSTORE_LOCATION string нет Путь к truststore
SED_TASK_MANAGER_SYSLOG_TRUSTSTORE_PASSWORD string нет Пароль к truststore
SED_TASK_MANAGER_LOG_FILE_ENABLE boolean нет false Включить вывод в файл
SED_TASK_MANAGER_ENRICHERS string нет [] Список обогатителей задач. Json массив объектов Enricher в виде строки.
SED_TASK_MANAGER_ADAPTER_JOURNAL_MODE string да WriteToJournal Режим журналирования Nestor. Допустимые значения: WriteToJournal (Отправка в сервис журналирования), WriteToTopic (Отправка события в очередь)
SED_TASK_MANAGER_ADAPTER_JOURNAL_TOPIC string нет да, если переменная SED_TASK_MANAGER_JOURNAL_MODE = WriteToTopic Название очереди журналирования. Для режима WriteToJournal значение игнорируется.

Список команд сервиса sed-task-manager

В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.

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

CreateTask

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

{
  "classCode": "routeEntity",
  "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "number": 1,
  "title": "Задача 1",
  "taskType": "RequestCheck",
  "statusId": "inProcess"
}

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

"d4ccf42f-3c1c-41e4-a25e-d916627748d7"

Добавление новой задачи.

Команда Путь
sedTaskManager_createTask Kafka Topic "sedTaskManager_commands"

CreateTaskWithAttachByResponsible

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

{
  "responsible": [
    "c9d234fb-b6d4-4b11-98e1-0aa26ee82de8",
    "951d51d5-a279-4fe8-9472-f277a94164ad"
  ],
  "parentTaskId": "adde8695-f84c-47d0-8b39-d736b654feab",
  "classCode": "routeEntity",
  "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "number": 1,
  "title": "Задача 1",
  "taskType": "RequestCheck",
  "statusId": "inProcess",
  "service": "service",
  "taskAttach": {
    "classCode": "classCode",
    "entityId": "895028c2-c2fe-4cc7-8653-46a3414ce242"
  }
}

На выходе пустое тело ответа

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

Команда Путь
sedTaskManager_createTaskWithAttachByResponsible Kafka Topic "sedTaskManager_commands"

CreateTasksWithAttaches

На входе список задач с вложениями

[
  {
    "parentTaskId": "adde8695-f84c-47d0-8b39-d736b654feab",
    "classCode": "routeEntity",
    "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
    "number": 1,
    "title": "Задача 1",
    "taskType": "RequestCheck",
    "responsibles": [
      "c9d234fb-b6d4-4b11-98e1-0aa26ee82de8",
      "951d51d5-a279-4fe8-9472-f277a94164ad"
    ],
    "statusId": "inProcess",
    "service": "service",
    "attaches": [
      {
        "classCode": "classCode",
        "entityId": "895028c2-c2fe-4cc7-8653-46a3414ce242"
      }
    ]
  }
]

На выходе пустое тело ответа

Добавление новых задач с вложениями.

Команда Путь
sedTaskManager_createTasksWithAttaches Kafka Topic "sedTaskManager_commands"

UpdateTask

На выходе атрибуты для обновления задачи

{
  "id": "72f8763b-dee0-4479-a92f-c691d83ae3a0",
  "parentTaskId": "d4ccf42f-3c1c-41e4-a25e-d916627748d7",
  "classCode": "routeEntity",
  "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "number": 1000,
  "title": "Задача 1000",
  "description": "",
  "taskType": "RequestCheck",
  "targetDate": 1664292900000,
  "owner": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "responsible": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "version": 1,
  "statusId": "inProcess"
}

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

true

Обновление задачи.

Команда Путь
sedTaskManager_updateTask Kafka Topic "sedTaskManager_commands"

UpdateTasks

На выходе атрибуты для обновления задач

[
  {
    "id": "72f8763b-dee0-4479-a92f-c691d83ae3a0",
    "parentTaskId": "d4ccf42f-3c1c-41e4-a25e-d916627748d7",
    "classCode": "routeEntity",
    "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
    "number": 1000,
    "title": "Задача 1000",
    "description": "",
    "taskType": "RequestCheck",
    "targetDate": 1664292900000,
    "owner": "72602ae9-66ab-4065-8305-d374ff14a4bf",
    "responsible": "72602ae9-66ab-4065-8305-d374ff14a4bf",
    "data": {},
    "created": 1664292962695,
    "createdBy": "72602ae9-66ab-4065-8305-d374ff14a4bf",
    "modified": 1664292962695,
    "modifiedBy": "72602ae9-66ab-4065-8305-d374ff14a4bf",
    "removed": false,
    "version": 1,
    "statusId": "inProcess"
  }
]

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

true

Обновление задач.

Команда Путь
sedTaskManager_updateTasks Kafka Topic "sedTaskManager_commands"

DeleteTask

На входе ID задачт

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

На выходе признак успешности удаления, в зависимости от конфигурации удаляются и зависимые задачи

true

Удаление задачи.

Команда Путь
sedTaskManager_deleteTask Kafka Topic "sedTaskManager_commands"

DeleteTasks

На входе список ID задач, в зависимости от конфигурации удаляются и зависимые задачи

[
  "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "24404bb3-fc1e-4388-ac4b-9c99beb89e92"
]

На выходе пустое тело ответа

Удаление нескольких задач.

Команда Путь
sedTaskManager_deleteTasks Kafka Topic "sedTaskManager_commands"

RestoreTask

На входе ID задачи

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Восстановление задачи.

Команда Путь
sedTaskManager_restoreTask Kafka Topic "sedTaskManager_commands"

SolveTask

На входе ID задачи, в зависимости от конфигурации меняется статус у зависимых задач

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Решение задачи.

Команда Путь
sedTaskManager_solveTask Kafka Topic "sedTaskManager_commands"

CancelTasks

На входе список ID задач, в зависимости от конфигурации меняется статус у зависимых задач

[
  "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "24404bb3-fc1e-4388-ac4b-9c99beb89e92"
]

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

true

Отмена нескольких задач.

Команда Путь
sedTaskManager_cancelTasks Kafka Topic "sedTaskManager_commands"

ReopenTasks

На входе список ID задач для переоткрытия (меняет статус задачи на New)

[
  "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
  "24404bb3-fc1e-4388-ac4b-9c99beb89e92"
]

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

{}

Переоткрытие нескольких задач.

Команда Путь
sedTaskManager_reopenTasks Kafka Topic "sedTaskManager_commands"

GetTask

На входе ID задачи

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

На выходе атрибуты задачи

{
  "id": "d4ccf42f-3c1c-41e4-a25e-d916627748d7",
  "parentTaskId": null,
  "classCode": "routeEntity",
  "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "number": 1,
  "title": "Задача 1",
  "description": null,
  "taskType": "RequestCheck",
  "targetDate": null,
  "owner": null,
  "responsible": null,
  "created": 1664292962695,
  "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "modified": 1664292962695,
  "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "removed": false,
  "version": 2,
  "statusId": "inProcess",
  "childrenTaskCount": 0
}

Получение задачи.

Команда Путь
sedTaskManager_getTask HTTP POST "/v1/task/get"

ListTask

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "classCode",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

На выходе список задач и их общее количество

{
  "items": [
    {
      "id": "d4ccf42f-3c1c-41e4-a25e-d916627748d7",
      "parentTaskId": null,
      "classCode": "routeEntity",
      "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
      "number": 1,
      "title": "Задача 1",
      "description": "",
      "taskType": "RequestCheck",
      "targetDate": null,
      "owner": null,
      "responsible": null,
      "created": 1664292962695,
      "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "modified": 1664294185010,
      "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "removed": false,
      "version": 2,
      "statusId": "inProcess"
    },
    {
      "id": "72f8763b-dee0-4479-a92f-c691d83ae3a0",
      "parentTaskId": "d4ccf42f-3c1c-41e4-a25e-d916627748d7",
      "classCode": "routeEntity",
      "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
      "number": 1000,
      "title": "Задача 1000",
      "description": "",
      "taskType": "RequestApproval",
      "targetDate": 1664292900000,
      "owner": "72602ae9-66ab-4065-8305-d374ff14a4bf",
      "responsible": "72602ae9-66ab-4065-8305-d374ff14a4bf",
      "created": 1664292847509,
      "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "modified": 1664294570119,
      "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "removed": false,
      "version": 1,
      "statusId": "inProcess",
      "childrenTaskCount": 0
    }
  ],
  "total": 2
}

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

Команда Путь
sedTaskManager_listTask HTTP POST "/v1/task/list"

ListTasksWithAttaches

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "classCode",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

На выходе список задач и их общее количество

{
  "items": [
    {
      "id": "d4ccf42f-3c1c-41e4-a25e-d916627748d7",
      "parentTaskId": null,
      "classCode": "NmdRequest",
      "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
      "number": 1,
      "title": "Задача 1",
      "description": "",
      "taskType": "RequestCheck",
      "targetDate": null,
      "owner": null,
      "responsible": null,
      "attaches": [
        {
          "id": "d4ccf42f-3c1c-41e4-a25e-d916627748d7",
          "service": "service",
          "classCode": "stageHistory",
          "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
          "taskId": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
          "created": 1664292962695,
          "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
          "modified": 1664292962695,
          "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
          "removed": false,
          "version": 2
        }
      ],
      "created": 1664292962695,
      "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "modified": 1664294185010,
      "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "removed": false,
      "version": 2,
      "statusId": "inProcess",
      "childrenTaskCount": 0
    }
  ],
  "total": 1
}

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

Команда Путь
sedTaskManager_listTasksWithAttaches HTTP POST "/v1/task/list-with-attaches"

CreateTaskStatus

На входе атрибуты для создания нового статуса задачи

{
  "id": "solved",
  "ordering": 1,
  "next": "solved",
  "description": "description"
}

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

true

Добавление нового статуса задачи.

Команда Путь
sedTaskManager_createTaskStatus Kafka Topic "sedTaskManager_commands"

UpdateTaskStatus

На входе атрибуты для обновления статуса задачи

{
  "id": "inProcess",
  "ordering": 1,
  "next": "solved",
  "description": "Задача в процессе решения",
  "version": 1
}

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

true

Обновление статуса задачи.

Команда Путь
sedTaskManager_updateTaskStatus Kafka Topic "sedTaskManager_commands"

DeleteTaskStatus

На входе ID статуса задачи

"inProcess"

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

true

Удаление статуса задачи.

Команда Путь
sedTaskManager_deleteTaskStatus Kafka Topic "sedTaskManager_commands"

RestoreTaskStatus

На входе ID статуса задачи

"inProcess"

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

true

Восстановление статуса задачи.

Команда Путь
sedTaskManager_restoreTaskStatus Kafka Topic "sedTaskManager_commands"

GetTaskStatus

На входе ID статуса задачи

"inProcess"

На выходе атрибуты статуса задачи

{
  "id": "inProcess",
  "ordering": 1,
  "next": "solved",
  "description": "Задача в процессе решения",
  "created": 1664292962695,
  "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "modified": 1664292962695,
  "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "removed": false,
  "version": 2
}

Получение статуса задачи.

Команда Путь
sedTaskManager_getTaskStatus HTTP POST "/v1/taskStatus/get"

ListTaskStatus

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "ordering",
    "order": "asc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

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

{
  "items": [
    {
      "id": "inProcess",
      "ordering": 1,
      "next": "solved",
      "description": "Задача в процессе решения",
      "created": 1664292962695,
      "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "modified": 1664292962695,
      "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "removed": false,
      "version": 2
    },
    {
      "id": "solved",
      "ordering": 2,
      "next": null,
      "description": "Задача решена",
      "created": 1664293062695,
      "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "modified": 1664293062695,
      "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "removed": false,
      "version": 1
    }
  ],
  "total": 2
}

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

Команда Путь
sedTaskManager_listTaskStatus HTTP POST "/v1/taskStatus/list"

CreateTaskAttach

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

{
  "service": "service",
  "classCode": "routeEntity",
  "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "taskId": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
}

На выходе ID нового вложения задачи

"d4ccf42f-3c1c-41e4-a25e-d916627748d7"

Добавление нового вложения задачи.

Команда Путь
sedTaskManager_createTaskAttach Kafka Topic "sedTaskManager_commands"

AssignTask

На входе ID задачи и версия

{
  "id": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
  "version": 10
}

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

{}

Назначить себя ответственным за задачу.

Команда Путь
sedTaskManager_assignTask Kafka Topic "sedTaskManager_commands"

TakeOffTask

На входе ID задачи и версия

{
  "id": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
  "version": 10
}

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

{}

Снять с себя ответственность за задачу.

Команда Путь
sedTaskManager_takeOffTask Kafka Topic "sedTaskManager_commands"

AssignTaskToUser

На входе ID задачи и версия

{
  "id": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
  "responsible": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
  "version": 10
}

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

{}

Назначить пользователя ответственным за задачу.

Команда Путь
sedTaskManager_assignTaskToUser Kafka Topic "sedTaskManager_commands"

TakeOffTaskFromUser

На входе ID задачи и версия

{
  "id": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
  "version": 10
}

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

{}

Снять с пользователя ответственность за задачу.

Команда Путь
sedTaskManager_takeOffTaskFromUser Kafka Topic "sedTaskManager_commands"

UpdateTaskAttach

На выходе атрибуты для обновления вложения задачи

{
  "id": "72f8763b-dee0-4479-a92f-c691d83ae3a0",
  "service": "service",
  "classCode": "routeEntity",
  "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "taskId": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "version": 1
}

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

true

Обновление вложения задачи.

Команда Путь
sedTaskManager_updateTaskAttach Kafka Topic "sedTaskManager_commands"

DeleteTaskAttach

На входе ID вложения задачи

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Удаление вложения задачи.

Команда Путь
sedTaskManager_deleteTaskAttach Kafka Topic "sedTaskManager_commands"

RestoreTaskAttach

На входе ID вложения задачи

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

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

true

Восстановление вложения задачи.

Команда Путь
sedTaskManager_restoreTaskAttach Kafka Topic "sedTaskManager_commands"

GetTaskAttach

На входе ID вложения задачи

"24404bb3-fc1e-4388-ac4b-9c99beb89e91"

На выходе атрибуты вложения задачи

{
  "id": "d4ccf42f-3c1c-41e4-a25e-d916627748d7",
  "service": "service",
  "classCode": "routeEntity",
  "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
  "taskId": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "created": 1664292962695,
  "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "modified": 1664292962695,
  "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
  "removed": false,
  "version": 2
}

Получение вложения задачи.

Команда Путь
sedTaskManager_getTaskAttach HTTP POST "/v1/task/get"

ListTaskAttach

На входе параметры поиска, сортировки и пагинации (Search)

{
  "query": "",
  "context": {},
  "sorting": {
    "fieldName": "classCode",
    "order": "desc"
  },
  "paging": {
    "page": 1,
    "count": 5
  }
}

На выходе список вложений задач и их общее количество

{
  "items": [
    {
      "id": "d4ccf42f-3c1c-41e4-a25e-d916627748d7",
      "service": "service",
      "classCode": "routeEntity",
      "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
      "taskId": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "created": 1664292962695,
      "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "modified": 1664294185010,
      "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "removed": false,
      "version": 2
    },
    {
      "id": "72f8763b-dee0-4479-a92f-c691d83ae3a0",
      "service": "service",
      "classCode": "routeEntity",
      "entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
      "taskId": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "created": 1664292847509,
      "createdBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "modified": 1664294570119,
      "modifiedBy": "ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
      "removed": false,
      "version": 1
    }
  ],
  "total": 2
}

Получение списка вложений задач с поиском, сортировкой и пагинацией.

Команда Путь
sedTaskManager_listTaskAttach HTTP POST "/v1/task/list"

UserTaskAnalytics

На вход пустое тело запроса(данные о пользователе берутся из контекста запроса)

На выходе аналитика по задачам пользователя

{
  "total": 124,
  "solved": {
    "count": 32,
    "percent": 25.806451612903224
  },
  "inProcess": {
    "count": 92,
    "percent": 74.19354838709677
  },
  "byClassCode": {
    "RouteEntity": {
      "total": 124,
      "byType": {
        "": {
          "total": 124,
          "solved": {
            "count": 32,
            "percent": 25.806451612903224
          },
          "inProcess": {
            "count": 92,
            "percent": 74.19354838709677
          }
        }
      },
      "solved": {
        "count": 32,
        "percent": 25.806451612903224
      },
      "inProcess": {
        "count": 92,
        "percent": 74.19354838709677
      }
    }
  }
}

Получение аналитики по задачам пользователя.

Команда Путь
sedTaskManager_userTaskAnalytics HTTP POST "/v1/analytics/user"

SearchTaskAnalytics

На входе параметры поиска(Search)(параметры сортировки и пагинации не учитываются)

{
  "query": "responsible",
  "context": {
    "responsible": "72f8763b-dee0-4479-a92f-c691d83ae3a0"
  }
}

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

{
  "total": 124,
  "solved": {
    "count": 32,
    "percent": 25.806451612903224
  },
  "inProcess": {
    "count": 92,
    "percent": 74.19354838709677
  },
  "byClassCode": {
    "RouteEntity": {
      "total": 124,
      "byType": {
        "": {
          "total": 124,
          "solved": {
            "count": 32,
            "percent": 25.806451612903224
          },
          "inProcess": {
            "count": 92,
            "percent": 74.19354838709677
          }
        }
      },
      "solved": {
        "count": 32,
        "percent": 25.806451612903224
      },
      "inProcess": {
        "count": 92,
        "percent": 74.19354838709677
      }
    }
  }
}

Получение аналитики по задачам пользователя.

Команда Путь
sedTaskManager_userTaskAnalytics HTTP POST "/v1/analytics/user"

Объекты сервиса sed-task-manager

TaskListDTO

Поле Тип Обязательное Описание
id UUID да ID
parentTaskId UUID нет ID родительской задачи
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
number Integer да номер задачи
title string да заголовок задачи
description string нет описание задачи
taskType string да тип задачи
targetDate TimeStamp нет дата выполнения
owner UUID нет владелец задачи
responsible UUID нет ответственный по задаче
data Json да дополнительные данные
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да признак удаления
version Integer да версия для оптимистичной блокировки
statusId string да статус задачи
childrenTaskCount Integer да кол-во дочерних задач

Task

Поле Тип Обязательное Описание
id UUID да ID
parentTaskId UUID нет ID родительской задачи
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
number Integer да номер задачи
title string да заголовок задачи
description string нет описание задачи
taskType string да тип задачи
targetDate TimeStamp нет дата выполнения
owner UUID нет владелец задачи
responsible UUID нет ответственный по задаче
data Json да дополнительные данные
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да признак удаления
version Integer да версия для оптимистичной блокировки
statusId string да статус задачи

TaskWithAttaches

Поле Тип Обязательное Описание
id UUID да ID
parentTaskId UUID нет ID родительской задачи
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
number Integer да номер задачи
title string да заголовок задачи
description string нет описание задачи
taskType string да тип задачи
targetDate TimeStamp нет дата выполнения
owner UUID нет владелец задачи
responsible UUID нет ответственный по задаче
data Json да дополнительные данные
attaches TaskAttach[] нет список вложений к задаче
created TimeStamp да дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да признак удаления
version Integer да версия для оптимистичной блокировки
statusId string да статус задачи

TaskUpdateDto

Поле Тип Обязательное Описание
id UUID да ID
parentTaskId UUID нет ID родительской задачи
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
number Integer да номер задачи
title string да заголовок задачи
description string нет описание задачи
taskType string да тип задачи
targetDate TimeStamp нет дата выполнения
owner UUID нет владелец задачи
responsible UUID нет ответственный по задаче
data Json да дополнительные данные
version Integer да версия для оптимистичной блокировки
statusId string да статус задачи

TaskCreateDto

Поле Тип Обязательное Описание
parentTaskId UUID нет ID родительской задачи
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
number Integer да номер задачи
title string да заголовок задачи
description string нет описание задачи
taskType string да тип задачи
targetDate TimeStamp нет дата выполнения
owner UUID нет владелец задачи
responsible UUID нет ответственный по задаче
data Json да дополнительные данные
statusId string да статус задачи

TaskWithAttachByResponsibleCreateDTO

Поле Тип Обязательное Описание
responsible UUID[] да список ответственных по задачам
parentTaskId UUID нет ID родительской задачи
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
number Integer да номер задачи
title string да заголовок задачи
description string нет описание задачи
taskType string да тип задачи
targetDate TimeStamp нет дата выполнения
owner UUID нет владелец задачи
data Json да дополнительные данные
statusId string да статус задачи
service String да Код сервиса (до 32 символов)
taskAttach TaskAttachMinimalDTO нет вложение задачи

TaskWithAttachesCreateDTO

Поле Тип Обязательное Описание
parentTaskId UUID нет ID родительской задачи
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе
number Integer да номер задачи
title string да заголовок задачи
description string нет описание задачи
taskType string да тип задачи
targetDate TimeStamp нет дата выполнения
owner UUID нет владелец задачи
responsible UUID да ответственный по задаче
data Json да дополнительные данные
statusId string да статус задачи
service String да Код сервиса (до 32 символов)
attaches [TaskAttachMinimalDTO] да список вложений к задаче

TaskAttachMinimalDTO

Поле Тип Обязательное Описание
classCode string да код сущности в сервисе
entityId string да ID сущности в сервисе

TaskStatus

Поле Тип Обязательное Описание
id String да ID - Метка статуса (до 32 символов)
ordering Integer да Порядок сортировки
next String нет Следующий статус (до 32 символов)
description String нет Описание статуса
created TimeStamp да Дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да Дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да Признак удаления
version Integer да Версия для оптимистичной блокировки

TaskStatusUpdateDto

Поле Тип Обязательное Описание
id String да ID - Метка статуса (до 32 символов)
ordering Integer да Порядок сортировки
next String нет Следующий статус (до 32 символов)
description String нет Описание статуса
version Integer да версия для оптимистичной блокировки

TaskStatusCreateDto

Поле Тип Обязательное Описание
id String да ID - Метка статуса (до 32 символов)
ordering Integer да Порядок сортировки
next String нет Следующий статус (до 32 символов)
description String нет Описание статуса

TaskAttach

Поле Тип Обязательное Описание
id UUID да ID
service String да Код сервиса (до 32 символов)
classCode String да Тип вложения (до 32 символов)
entityId string да Идентификатор во внешнем сервисе
taskId UUID да идентификатор задачи
created TimeStamp да Дата и время создания
createdBy UUID да ID создавшего запись пользователя
modified TimeStamp да дата и время изменения
modifiedBy UUID да ID изменившего запись пользователя
removed Boolean да признак удаления
version Integer да версия для оптимистичной блокировки

TaskAttachUpdateDto

Поле Тип Обязательное Описание
id UUID да ID
service String да Код сервиса (до 32 символов)
classCode String да Тип вложения (до 32 символов)
entityId string да Идентификатор во внешнем сервисе
taskId UUID да идентификатор задачи
version Integer да версия для оптимистичной блокировки

TaskAttachCreateDto

Поле Тип Обязательное Описание
service String да Код сервиса (до 32 символов)
classCode String да Тип вложения (до 32 символов)
entityId string да Идентификатор во внешнем сервисе
taskId UUID да идентификатор задачи

TaskResponsibleUpdateDTO

Поле Тип Обязательное Описание
id uuid да ID задачи
responsible uuid нет ID ответственного
version int да версия для оптимистичной блокировки

StatusAnalytics

Поле Тип Обязательное Описание
count int да Общее кол-во задач статуса
percent double да Процент задач от общего кол-ва в группе

UserAnalytics

Поле Тип Обязательное Описание
total int да Общее кол-во задач
status StatusAnalytics да Аналитика по статусу
byClassCode ByClassCodeAnalytics да Аналитика по classCode задачи

ByClassCodeAnalytics

Поле Тип Обязательное Описание
total int да Общее кол-во задач
status StatusAnalytics да Аналитика по статусу
byType ByClassCodeAnalytics да Аналитика по taskType задачи, содержание аналогично ByClassCodeAnalytics

Enricher

Позволяет настроить обработчик событий типа EntityObjectEvent на обогащение класса Task. Каждый сконфигурированный Enricher обрабатывает события обновления сущностей с типом entityType, помещаю в поле data у Task json объект с ключом name. Обновляет задачи с помощью Search, который составляется из ключей контекста - searchFields и значения idField (ключ в объекте data у EntityObject, при отсутствии подставляет id объекта). Записывает в data только поля, указанные в fields.

Пример Enricher:

{
  "entityType": "EntityType",
  "name": "someData",
  "idField": "externalId",
  "searchFields": [
    "entityId"
  ],
  "fields": [
    "title"
  ]
}

Данный Enricher отловит события сущностей с типом EntityType, найдёт все задачи с entityId = externalId, из data в EntityObject и сформирует данный json объект, которым обновит поле data в найденных задачах

{
  "someData": {
    "title": "foundTitle"
  }
}
Поле Тип Обязательное Описание
entityType string да Отлавливаемый entityType объекта события
name string да Ключ json объекта, добавляемого в data
idField string нет Ключ id для поиска в data, если не указан используется id от EntityObject
searchFields string[] да Список полей для поиска задач по id
fields string[] да Список полей, добавляемые в Task

sed-libs

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

Обобщенное поле data

Сюда входят трейты для WithData,WithDataRep,WithDataQueries. Реализуют логику фильтрации и сортировки по полям в json.

Применение: вместе с уникальными для сущности фильтрами добавить в makeEvaluationFn makeEvaluationFnDataFields override protected def makeEvaluationFn( table: RouteStageLinkTable )(implicit context: Map[String, FilterQueryContext]): PartialFunction[String, Option[Rep[Boolean]]] = { def routeStageLinkEvaluationFn: PartialFunction[String, Option[Rep[Boolean]]] = { case title @ "title" => queriesFor(title) { case InSetQuery(values) => table.title inSetQuery values } } routeStageLinkEvaluationFn.orElse(makeEvaluationFnDataFields(table)) }

Фильтр для вложенных списков Json-объектов в data

{
  "profiles": [
    {
      "id": "demo",
      "prefix": "D"
    },
    {
      "id": "production",
      "prefix": "P"
    }
  ]
}

В трейте WithDataQueries реализована логика работы со вложенными Json-объектами

Для выполнения запроса по примеру справа со структурой Search нужно использовать префикс dataArrayObj

Для dataArrayObj действуют свои правила фильтрации в силу особенностей реализации работы со списками JSON. Ниже в таблицы условно описаны способы работы с ним

Query Context (сокращенно) Описание
dataArrayObj.profiles.id id: demo Вернутся записи, содержащие объекты с id = demo в списке profiles
dataArrayObj.profiles.id && dataArrayObj.profiles.prefix id: demo, prefix: P Вернутся записи, содержащие объекты с id = demo ИЛИ prefix = P
dataArrayObj.profiles.id_prefix id_prefix: demo_D Вернутся записи, содержащие объекты с id = demo И prefix = D *

*Для фильтрации внутри объекта, используется знак _, который позволяет фильтровать по условию И

Обобщенные поля ExtId (entityId и classCode)

Сюда входят трейты для WithExtId, WithExtIdRep, WithExtIdQueries. Реализуют логику фильтрации и сортировки по полям entityId и classCode.

Применение: вместе с уникальными для сущности фильтрами добавить в makeEvaluationFn makeEvaluationFnExtId override protected def makeEvaluationFn( table: RouteStageLinkTable )(implicit context: Map[String, FilterQueryContext]): PartialFunction[String, Option[Rep[Boolean]]] = { def routeStageLinkEvaluationFn: PartialFunction[String, Option[Rep[Boolean]]] = { case title @ "title" => queriesFor(title) { case InSetQuery(values) => table.title inSetQuery values } } routeStageLinkEvaluationFn.orElse(makeEvaluationFnExtId(table)) }

Пример работы с библиотекой saga-lib

import com.embedika.standart.saga.event.EventService
import com.embedika.standart.saga.{domain, storage}
import com.embedika.standart.saga.storage.StorageService
import com.embedika.standart.saga.builder.SagaDefinitionBuilder
import com.embedika.standart.saga.domain._
import com.embedika.standart.service.extendeddispatcher.ExtendedDispatcher
import com.embedika.verdi.models.command.CommandName
import com.embedika.verdi.models.debug.TracingContext
import com.embedika.verdi.models.error.ErrorResponse
import com.embedika.verdi.models.user.UserContext
import io.circe.Codec
import io.circe.generic.semiauto.deriveCodec

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

package object example {
  // Реализация всех сервисов.
  val storageService: StorageService = ???
  val eventService: EventService     = ???
  val dispatcher: ExtendedDispatcher = ???

  // Контексты.
  implicit val uc: UserContext    = ???
  implicit val tc: TracingContext = ???

  val definitionBuilder = new SagaDefinitionBuilder(storageService, eventService, dispatcher)

  case class SagaStateExample(someValue: Int)
  object SagaStateExample {
    implicit val codec: Codec[SagaStateExample] = deriveCodec
  }

  val sagaDef = definitionBuilder
    .startDefinition[String, SagaStateExample](
      sagaName = SagaName("example"),
    ) // Создание Definition с типом первого шага String, глобальным типом SagaStateExample и названием саги example.
    .stepWithCompensation[Int]( // Добавление шага с компенсацией и выходным типом Int.
      name = StepName("firstStep"),
      action = { (input, context) =>
        val newContext = context.copy(state = context.state.copy(2)) // Изменение глобального контекста.
        val output     = 1                                           // Выходное значение шага.
        Future.successful(Right((output, newContext)))
      },
      compensation = { (output, context) =>
        val newContext = context.copy(state = context.state.copy(3)) // Изменение глобального контекста.
        Future.successful(Right(newContext))
      },
    )
    .stepWithoutCompensation[String]( // Добавление шага без компенсирующего действия.
      name = StepName("secondStep"),
      action = { (input, context) => // Тип input = Int, как тип выходного значения предыдущего шага.
        val newContext = context.copy(state = context.state.copy(4)) // Изменение глобального контекста.
        val output     = "10"                                        // Выходное значение шага.
        Future.successful(Right((output, newContext)))
      },
    )
    .commandStepWithCompensation[String, Int, List[String]]( // Добавление шага-команды с компенсацией.
      name = StepName("thirdStep"),
      actionCommand = CommandName("actionCommand"),
      getActionPayload =
        (in, _) => in.concat("0").toIntOption.getOrElse(0),  // Формирование payload из результата secondStep
      compensationCommand = CommandName("compensationCommand"),
      getCompensatePayload =
        (out, _) => List(out),                               // Формирование payload компенсации из результата выполнения команды actionCommand
    )
    .commandStepWithoutCompensation[String, String]( // Добавление шага-команды без компенсации. Последний шаг саги не должен иметь компенсации, т.к. его нельзя откатить.
      name = StepName("fourthStep"),
      actionCommand = CommandName("actionCommand"),
      getActionPayload = (in, _) => in.concat("payload"),// Формирование payload из результата thirdStep
    )
    .endDefinition                                       // Завершение определения саги.

  // Начальное состояние саги.
  val initialState = SagaStateExample(0)

  // Полный запуск саги
  // Создание экземпляра саги.
  val saga = sagaDef.newSaga(initialState)

  // Запуск саги (все шаги с компенсацией).
  saga.execute("input")

  // Поэтапный запуск саги (использовать для отладки или восстановления сложных ошибок
  val sagaByStep = sagaDef.newSaga(initialState)

  // Запуск следующего шага саги (с возможной компенсацией).
  sagaByStep.executeNextStep("input")
  // Восстановление состояние саги.
  val sagaRestored = sagaDef.restore[Int](sagaByStep.id)
  // Запуск следующего шага.
  sagaRestored.map(_.toOption.get.executeNextStep(1))
}