Standart
Описание команд всех библиотек и сервисов, которые входят в состав Standart.
Список версий
16.0.0
- Добавлен сервис аналитики analytics
15.0.0
- Добавлен ReadyStatus в BasicServicePreparer и RegistrationAndHealthModule. Статус Ready назначается только после инициализации всех обязательных компонентов приложения
- Библиотеки Verdi обновлены до версии 3.1.0
13.1.1
sed-comment
- Добавлен токен COMMENT_SHOULD_CHECK_SNAPSHOT, который начинает учитывать снэпшотные стадии - у предыдущих стадий скрываются кнопки действий
- Добавлен isSnapshot в ответы к комментариям FRGU-2461
13.1.0
- Добавлена команда sedTaskManager_deleteTaskAttaches
- Изменён формат ответа команды sedTaskManager_createTaskWithAttachByResponsible, команда возвращает кортеж из списка созданных задач и вложений
- Добавлено каскадное удаление вложений при удалении задачи
- Обновлено verdi до 1.11.7
- Добавлены команды в клиент сервиса job-scheduler
- Добавлена команда создания выходных в сервисе job-scheduler
sed-comment
- Добавлена иконка обязательности поля для отрицательной резолюции FRGU-2351
- Добавлена возможность проверки прав на комментирование FRGU-690
- Добавлен токен для выполнения действия при нажатии на ФИО пользователя в комментарии FRGU-2462 -Убраны кнопки для взаимодействия с комментариями атрибутов предыдущих стадий -Добавлен инпут isSnapshot(комментарий предыдих стадий) для компонента std-comment-snippet-container -Аналогично другим кнопкам, если нет прав, вместо дизейбла добавлено скрытие кнопки голосования FRGU-2461 -Скорректировано обновление данных и перерисовка внутри компонента std-comment-snippet-container FRGU-896
- Добавлен токен COMMENT_FILTER_FUNCTION для фильтрации комментариев FRGU-2421
@standart/components - Добавлено событие close для PopoverComponent. - Добавлена возможность управлять закрытием элемента с AttachedOverlayDirective при клике за его границу. FRGU-2374 - Добавлена функция isPresentPredicate - Добавлен оператор controlValue FRGU-690
12.2.0
- Добавлена библиотека для работы с сагами - saga-lib
- Добавлена команда jsch_validateConditions
- Добавлена команда jsch_scheduleDateAuto
- В sedComment добавлена команда sedComment_deleteCommentInternal
- Добавлена команда jsch_getDurationDraftReserve
- STND-92 Неправильные настройки health check
- Добавлены команды jsch_createLimitGroup, jsch_updateLimitGroup, jsch_restoreLimitGroup, jsch_deleteLimitGroup, jsch_getLimitGroup, jsch_listLimitGroup
- Добавлена команда jsch_scheduleDateGet
- Добавлена команда jsch_scheduleDateReplaceInternal
- Переработан трейт с Handler
- Удалён LoggableStageTF и заменено его использование в логировании в Handler
- Трейт WithTracingUserContext отмечен Deprecation и заменён в трейтах на его реализацию
13.0.0
- Обновление Verdi 1.12
12.0.1
job-scheduler
- Добавлены actions: ManageScheduleDate (https://jira.dev.embedika.ru/browse/SEDNMD-3379)
12.0.0
job-scheduler
- Добавлены actions: EditPlanCalendarSettings, DeletePlanCalendarSettings
- Добавлены actions: ManageScheduleDate (https://jira.dev.embedika.ru/browse/SEDNMD-3379)
- Добавлено чтение топика entityObjectEvent
11.3.1
sed-task-manager - Доработка TaskEnricher, для работы с несколькими полями
11.3.0
- Обновление verdi 1.11.6
job-scheduler
- Добавлены action: ViewPlanCalendarSettings, ViewPlanCalendar
11.2.0
job-scheduler
- Реализованы команды:
- jsch_createSubjectOnObjectGroupLimit
- jsch_updateSubjectOnObjectGroupLimit
- jsch_deleteSubjectOnObjectGroupLimit
- jsch_listSubjectOnObjectGroupLimit
- jsch_scheduleDateDraft
- jsch_scheduleDateApply
- jsch_scheduleDateRevert
- jsch_scheduleDateReplace
- jsch_scheduleDateStats
11.1.4
- STND-92 Неправильные настройки health check
11.1.3
- Исправлена работа метода UserClientImpl#changeUserStatus
11.1.0
- Обновление verdi 1.11.5
- В TechConstantsRegistrar заменён вызов registerConstant на внутреннюю команду registerConstantInternal
- Обновление сервисов и библиотек Cursor/Verdi до версии 1.11.5 FRGU-1901
11.0.2
- В клиент mon добавлены команды registerUser и changeUserStatus
11.0.1
- Добавлено сравнение картинок при слиянии документов
11.0.0
@standart/comment
- Добавлены новые токены для передачи компонентов со стороны проекта
COMMENT_SNIPPET_HEADER_COMPONENT- Кастомный компонент шапки комментарияCOMMENT_REPLY_ADDITIONAL_CONTENT_COMPONENT- Компонент, дополняющий контент ответа на комментарийCOMMENT_REPLY_CREATE_MODAL_STATE- Сервис, позволяющий передать стейт для модалки ответа на комментарий. Это дает возможность прикреплятьdataк ответу на комментарий по аналогии с обычными комментариями. SEDNMD-2994
- [BreakingChanges] Изменен интерфейс
CommentData- удалено полеemployeeSEDNMD-2994 - [BreakingChanges] Изменен интерфейс
Comment- теперь это дженерик с параметромT(по умолчаниюCommentData), а полеdataтеперь типT - [BreakingChanges] Изменен интерфейс
CommentWithThreadData- теперь это дженерик с параметромT(по умолчаниюCommentData), а полеcommentDataтеперь типTSEDNMD-2994 CommentApiServiceтеперь дженерик с параметромT(по умолчаниюCommentData) SEDNMD-2994
10.5.0
- Обновление vedi 1.11.4 STND-75
job-scheduler - Добавлен сервис нагрузки SEDNMD-3113
10.4.0
- Обновление сервисов и библиотек Cursor/Verdi до версии 1.11.2 STND-63
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
- Добавлены операторы
andиorдля логического объединения спискаObservableFRGU-1613 - Исправлена XSS уязвимость в компоненте RecordComponent FRGU-1654
- Добавлены операторы
notиinverseдля инверсии булевых значений потоков. FRGU-1026
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
- verdi 1.11.3
sed-task-manager
- Добавлены команды: AssignTask, TakeOffTask, AssignTaskToUser, TakeOffTaskFromUser
- Добавлены AuthorizeKafka и JournalKafka Handlers
- Добавлена команда ReopenTask
iua-adapter
- Микросервис для работы с ИУА СМЭВ
standart-libs
- Библиотека для работы с iua-adapter: iua-adapter-client
- Библиотека для конвертации xml в json и обратно: transformer-lib
Версия 10.2.0
hierarchy-entities
- [BlockingChanges] Добавлен трейт с пакетными командами в стандарт
- Добавлены пакетные команды в сервис иерархий SEDNMD-2982
standart-libs
- Добавлены сортировки по умолчанию, раньше по ним пе фильтровалось. STND-58
- com.embedika.standart.service.BaseClient.sendCommandAsync Завершается на финальных стадиях SEDNMD-3029
@standart/components
- Добавлена функция handleAsyncRequest для обработки асинхронных запросов FRGU-1522
- В методе SearchFilter.create добавлен необязательный аргумент для создания фильтров через ||
- Доработан SearchFilter.merge, метод может принимать неограниченное количество аргументов FRGU-1523
Версия 10.1.0
standart-libs
- Добавлены типы для работы с типизированным RouteStage
- Добавлен класс для получения из routeClient типизированного RouteStage
- Добавлен JsonHelper
- Добавлен chimney 1.3.0 SEDNMD-2648
- Поправлено применение несколько значений в фильтре FRGU-1476
ui-libs
- В npm-пакете "@standart/comment" добавлена возможность комментировать атрибуты массивов объектов FRGU-1196
Версия 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
- Изменён запрос sedComment_listThreadsWithComments на использование SQLFilterComponent, исправлено подставление значения через #$ на $
- Изменён конфиг sedTaskManager_searchTaskAnalytics, добавлены переменные ANALYTICS_DATA_ALLOWED и ANALYTICS_DATA_ALLOWED_FIELDS для защиты от подстановки инъекции в название поля FRGU-1352
- Отображение даты (modified, created) комментариев и сортировка настраивается в зависимости от проекта
- Добавлены новые токены для настройки, их необходимо прокидывать в каждом проекте отдельно COMMENT_DATE_KEY - Поле для отображения даты комментария + ключ для сортировки комментариев COMMENT_SORTING_DROPDOWN_ITEMS- Список опций для сортировки в компоненте std-comment-sorting COMMENT_SORTING_OPTION_DEFAULT- Опция для сортировки по умолчанию COMMENT_SORTING_MAP- Словарь, сопоставляющий sortingOption из std-comment-sorting с Sorting, для сортировки на сервере COMMENT_SORTER_MAP- Словарь сопоставляющий sortingOption из std-comment-sorting с функциями для локальной сортировки
- Сделана сортировка comment.modified для listThreadsWithCommentsFlat FRGU-1358
standart-libs
- Убран у модуля boot зависимость на worddocumentprocessor STND-53
- Обновление сервисов и библиотек Cursor/Verdi до версии 1.11 FRGU-1464
ui-libs
- Изменены основные интерфейсы, связанные с RecordComponent, RecordRendererComponent Добавлены новые функции recordRendererReadonly, recordRendererEditable, recordRendererContext для создания через ts-файлы. Добавлены пайпы record, recordHref, recordLink для создания через html-шаблоны STND-50
- Обновление сервисов и библиотек Cursor/Verdi до версии 1.11 FRGU-1465
Версия 9.0.0
standart-libs
- LiveTechConstantsClient изменён на LiveTechConstantsClientTF
- FRGU-1089
- Обновление сервисов и библиотек Cursor/Verdi до снэпшотной версии 1.11 STND-45
ui-libs
- Обновление сервисов и библиотек Cursor/Verdi до версии 1.11 STND-46
Версия 8.0.5
hierarchy-entities
- Добавлен трейт с пакетными командами в стандарт
Добавлены пакетные команды в сервис иерархий SEDNMD-2982 standart-libs
Добавлены сортировки по умолчанию, раньше по ним пе фильтровалось. STND-58
com.embedika.standart.service.BaseClient.sendCommandAsync Завершается на финальных стадиях SEDNMD-3029
Версия 8.0.4
-обновлено verdi/cursor до 1.10.1 SEDNMD-3026
Версия 8.0.1
hierarchy-entities
- Связаны поля HierarchyEntityObject.hierarchyEntityId и HierarchyEntity.id через foreign key.
- Добавлена команда deleteHierarchyEntity в клиент. STND-51
Версия 8.0.0
standart-libs
- Дополнения: Добавлена новая либа document-merger и модуль DocumentMergerModule.
- Несовместимые изменения: Изменено название и расположение модулей, отвечающих за чтение команд и событий из kafka: standart-libs/standart-boot-lib/src/main/scala/com/embedika/standart/boot/tf/modules/KafkaConsumerModule.scala → standart-libs/standart-boot-lib/src/main/scala/com/embedika/standart/boot/tf/modules/kafka/KafkaCommandsConsumerModule.scala standart-libs/standart-boot-lib/src/main/scala/com/embedika/standart/boot/tf/modules/KafkaEventsConsumerModule.scala → standart-libs/standart-boot-lib/src/main/scala/com/embedika/standart/boot/tf/modules/kafka/KafkaEventsConsumerModule.scala SEDNMD-2672
sed-comment
- Добавлена возможность прокидывать buttonStyles, dropdownStyles в sed-comment/std-comment-sorting
- Добавлен фильтр removed: false в sed-route/std-solution-list, чтобы скрыть удалённые решения на стадии
- Добавлены токены COMMENT_SORTING_DROPDOWN_STYLE, COMMENT_SORTING_BUTTON_STYLE для возможности конфигурировать стили компонента std-comment-sorting. STND-28
Версия 7.2.0
sed-comment
- Проставленные резолюции не зависят от COMMENT_REACTION_MODE(Режим, позволяющий оставлять реакции на комментарий, проставлять резолюции) и отображаются всегда при наличии FRGU-748
sedTaskManager
- Добавлена команда UpdateTasks
- Добавлен custom.conf SEDNMD-2341
Версия 7.1.0
sed-comment
- дополнено DTO данными modified + modifiedBy
- добавлен фильтр c.modified FRGU-971
ui-libs
- Добавлен токен CAN_DO_COMMENT_ACTION для отображения кнопки контекстного меню с действиями по комментарию FRGU-690
sedTaskManager
- Реализована универсальная команда для построения аналитики задач с фильтрами по полям Task(в том числе по полям data) "sedTaskManager_searchTaskAnalytics" FRGU-1112
Версия 7.0.1
standart-libs
- Изменена команда авторизации с sed_authorize на oberto_AuthorizeV2 STND-34
Версия 7.0.0
Обновлено до версии 1.10.0 Cursor/Verdi
hierarchy-entities
- Возможность поиска по тексту в команде отображения дерева
- Возможность запроса корневых сущностей SEDNMD-2774
sed-comment
- Добавлены экшены CreateVote, DeleteVote, UpdateVote, DeleteComment FRGU-987
sed-route
- Поправлен запрос для клонирования маршрута - чтобы можно было делать переходы с одного маршрута на предыдущий FRGU-1037
ui-libs
- Добавлена возможность фильтрации по не совпадению - фильтр negation FRGU-989
- Добавлена кнопка "Комментарии в веб-просмотре" для прямого перехода к документу из секции комментариев FRGU-1101
- В @standart/route добавлен конструктор маршрутов STND-6
standart-libs
- Добавлен tf Kafka консьюмер для событий FRGU-1072
- В клиенте mon прописан infinitPaging в запросе пользователей по группе SEDNMD-2782
- Клиент для расчета срока стадии FRGU-1079
Версия 6.3.0
standart-libs
- Добавлен метод в userClient для получения списка пользователей с info с полем data FRGU-977
ui-libs
- Добавлен Generic-параметр для RouteStageData FRGU-958
- для Observable disabled$ убран пайп filter и в map пайпе учтено, что измененный комментарий не должен быть идентичен изначальному SEDNMD-2618
Версия 6.2.0
standart-conf
Добавлен payload в логи для случаев когда команда с ошибкой завершилась FRGU-109
standart-libs
- Добавлен сервис провайдер атрибутов и интерфейсы для него, dsl для составление условий в политиках SEDNMD-2497
- в QueryExtensionComponent добавлена обязательная сортировка по id SEDNMD-2290
- Рефакторинг SEDNMD-2661
Версия 6.1.0
Обновлено до версии 1.9.1 Cursor/Verdi
hierarchy-entities
В клиент сервиса иерархии вынесена команда hierarchyEntities_listHierarchy SEDNMD-2664 Доработка запроса для выбора модели - Поддержка серверной части
sed-comment
Добавлена команда для кол-ва комментариев с резолюциями FRGU-707
sed-route
Миграция для старых данных FRGU-870
standart-libs
- Добавлены новые миграционные TF классы SEDNMD-2659 Сервис для поддержки CRUD директорий
- Добавлен клиент файловой системы для F[_] и подвинуты модули для более удобного его использования SEDNMD-2665 Обработка приходящих шаблонов из КИС БА
Версия 6.0.0
Доработан процесс сборки и публикации в проектах FRGU-766
Изменено расположение http-модулей для более простой поддержки сервисов, имеющих эндпоинты помимо verdi-команд SEDNMD-2623
sed-comment
- Добавлена новая внутренняя команда sedComment_threadRelationProcessAttribute SEDNMD-2497 Рефакторинг прав
- Переименована сортировка в комментариях FRGU-235 Переименовать сортировку "Сначала с отрицательной оценкой"
sed-route
- Добавлена команда для асинхронного обновления RouteStage
- Добавлены ретраи, чтобы ничего не умирало от нагрузки
- OutOfMemoryError в миграции, переход на потоковую обработку
- Поменялся способ хранения поля number в поле data у сущности RouteStage, кроме номера для отображения там теперь содержится ещё и номер для сортировки, присутствующий у всех стадий, в том числе не имеющих номера для отображения FRGU-807 SEDNMD-2538 Неправильно сортируются стадии без номера
- Изменилась структура данных Stage.data. фронт изменил отображение номеров стадий в соответствии с новой структурой FRGU-808 Неправильно сортируются стадии без номера
Версия 5.0.0
- Доработка api сервисов Стандарт
sed-comment
- команда sedComment_addComment переименована в sedComment_createCommentWithThread, для лучшей удобочитаемости
sed-task-manager
команда sedTaskManager_сreateTaskWithAttaches - изменила формат, теперь в ней передается список задач c аттачами, для множественного создания
добавлена команда sedTaskManager_createTaskWithAttachByResponsible - она является старой версией команды sedTaskManager_сreateTaskWithAttaches, с немного измененным форматом
добавлена команда sedTaskManager_userTaskAnalytics для получение аналитики по задачам пользователя - обобщённая система обогащения задач
sed-route
Добавлены команды для смены стадии у routeEntity - sedroute_changeRouteEntityStage sedroute_changeRouteEntityStageByEntity
Добавлены команды для смены маршрута у routeEntity - sedroute_changeRouteEntityRouteVersion sedroute_changeRouteEntityRouteVersionByEntity
Добавлен в Стандарт тип перехода стадии, который уже был. Чтобы в одном месте все находилось.
FRGU-606 Выделение логики из crud команд FRGU-635 Комментирование атрибутов отображать на всех стадиях FRGU-649 Поиск и фильтрация списка задач SEDNMD-2547 Типы переходов routeStageLink
- Доработка Open Search
В OpenSearchStorageClient добавлено поле index в DeleteByQueryRequest
Версия 4.0.0
- Все библиотеки объединены в standart-libs(standart-system-lib и standart-client-libs удалены)
- Изменено расположение объектов и классов согласно их функционалу
- Удален гпн-сэд специфичный код
- Удален излишний и неиспользуемый код
- Оптимизированы зависимости библиотек
- Обновлено до Angular 17
- Убран запрос к cnmd-api-adapter для получения данных пользователя. Вместо него сделан конфигурируемый обобщенный клиент с параметрами
FRGU-595 Обновиться до Angular 17 FRGU-608 Оптимизировать библиотеки Стандарта FRGU-609 Почистить библиотеки Стандарт от не используемого кода FRGU-610 Почистить зависимости сервисов Стандарт
Обновлено до версии 1.9 Cursor/Verdi
Версия 3.0.0
Обновлено до версии 1.8.2 Cursor/Verdi
sed-route
- Доработка
Добавлен параметр для управления уведомлением на стадии SEDNMD-2433 Изменить уведомление "Изменение стадии маршрута"
UI-libs-sed-comment
- Исправление багов FRGU-520 Комментирование атрибутов
Версия 2.2.0
sed-comment
- Доработка
- FRGU-519 Реализована возможность привязывать комментарии к атрибутам.
- FRGU-519 Доработка listThreads для отображения кол-ва комментариев
- Исправление бага SEDNMD-2389 При открытии модалки для добавления коммента/ответа срабатывает валидация
sed-route
- Доработка
SEDNMD-2401 Модальное окно выбора решения в Запросах маршрутов
sed-libs
- Доработка
- В библиотеке standart-storage-lib добавлены общие трейты для Queries для того, чтобы была возможность фильтроваться и сортировать по Search не наследуясь от трейта Modifiable FRGU-514 Интерфейс Управления миграциями
- Создан обобщенный клиент хранилища. Добавлена возможность перехода от использования только ElasticSearch на переключаемый между ElasticSearch и OpenSearch FRGU-495 Добавить поддержку sed-analytic и sed-report поддержку openSearch
UI-libs
- Доработка
В либе добавлен раздел комментирования атрибутов FRGU-520 Комментирование атрибутов
Версия 2.1.0
sed-comment
Доработка SEDNMD-2315 Вынести проставление резолюций в отдельную команду
Исправление бага
SEDNMD-2321 Не происходит переход к комментарию фрагмента файла документа
SEDNMD-2354 У комментария слетает привязка к фрагменту текста файла документа
sed-components
Добавление новых компонентов (popover, control-error), директив (control-error, popover, loader), сервиса catalog.store SEDNMD-2331 Исследовать вынесение общего кода фронта в Standart
Исправление бага SEDNMD-2338 При нажатии ENTER модальные окна открываются одно на другом
sed-route
- Создание библиотеки SEDNMD-2331 Исследовать вынесение общего кода фронта в Standart
Версия 2.0.0
Обновлено до версии 1.8 Cursor/Verdi
- Добавлен функционал лицензирования (сервисы apigateway и oberto)
- Добавлено разлогинивание пользователя при его блокировке
- Подняты версии библиотек mon
Список изменений:
Verdi: Версия 1.8 Cursor: Версия 1.8
Версия 1.0.1
Добавлен на фронте option-dependencies, чтобы либы не зависили сами от себя
Версия 1.0.0
Вынесен общий код из СЭД в общий репозиторий Standart
Общая библиотека:
- sed-libs - ранее "gpn-libs"
Сервисы:
- sed-task-manager - сервис задач
- sed-route - сервис маршрутов
- sed-comment - ранее "gpn-comment" - сервис комментариев
Созданы UI-библиотеки:
- sed-comment
- sed-components - вынесены общие модели, функции, директивы, пайпы и компонентыю Планируется ее постепенное наполнение
Переименованы команды сервиса комментариев
analytics: сервис аналитики
Сервис читает события EntityObjectEvent и формирует представления по заданным настройкам, по полученным представлением можно строить аналитику трёх видов - Сводная таблица, круговая диаграмма и гистограмма. Настройки аналитики хранятся в виджетах и могут быть настроены.
Команды могут приходить как по HTTP, так и через Kafka в топик analytics_commands.
Сервис разбит на несколько модулей, в виде sbt проектов:
domainв котором содержатся все доменные модели и их различные представления.commandsв котором содержатся все, что связано с командами, их описанием и обработчиками.storageсодержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.serviceсодержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.bootсодержит зависимости и описание для сборки и запуска сервиса.
Информацию по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/analytics_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- ANALYTICS_DB_HOST
- ANALYTICS_DB_PORT
- ANALYTICS_DB_NAME
- ANALYTICS_DB_USER
- ANALYTICS_DB_PASSWORD
Запуск из консоли с помощью 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_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 |
Формат 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, то желательно поменять
следующие переменные:
ANALYTICS_LOGGING_SRC_IP, для параметраsrcв логахANALYTICS_LOGGING_SRC_HOST, для параметраshostв логахANALYTICS_LOGGING_DST_IP, для параметраdstв логах
В файле 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",
"entityObjectFilter": {
"key": "status",
"values": [
"Removed"
]
},
"fields": []
}
]
}
На выходе создаётся предсталвение с название Registry, с колонками id, name и isDraft, колонка id берётся из id сущности Registry, колонка name обновляется по событиям обновления сущности Registry с полем status равным New или InProcess. Колонка isDraft обновляется при событии обновления сущности AnotherRegistry и берётся из колонки draft . Запись удаляется из представления по событию обновления поля status = Removed у сущности Registry.
- Input: ViewInfo
- Output: Пустое тело ответа
| Команда | Тип |
|---|---|
| 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"
}
}
- Input: Widget
- Output: Пустое тело ответа
| Команда | Тип |
|---|---|
| analytics_importWidget | Kafka |
GetAnalytics
Получает аналитику по заданному виджету.
- Input: AnalyticsInput
- Output: Chart]
На входе название виджета и 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
}
]
},
"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": []
}
],
"chartType": "PieChart"
}
| Команда | Тип |
|---|---|
| analytics_getAnalytics | HTTP |
Сущности сервиса 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 | да | Настройки виджета |
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 - выбор конкретных столбцов из представления
- GroupBy - группировка по столбцам представления
- Filter - фильтрация представления
- MathExpression - создание новой колонки посредством математического выражения
- Aggregate - аггрегация данных
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, HistSettings
PieChartSettings
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| columns | string[] | да | Колонки для построения круговой диаграммы |
HistSettings
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| columns | string[] | да | Колонки для построения гистограммы |
| agg | Aggregate | да | Колонка для финальной агрегации |
AnalyticsInput
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| widget | string | да | Название виджета |
| search | Search | нет | Search для фильтрации/пагинации/сортировки |
Chart
Тип графика для аналитики:
Summary
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| tableData | TableInfo | да | Информация о таблице |
TableInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| columns | ShortColumnInfo[] | да | Информация о колонках |
| rows | Map[String, Json][] | да | Строки таблицы |
ShortColumnInfo
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| name | string | да | Название колонки |
| isMultiple | boolean | да | Признак, что колонка является массивом |
| displayName | string | да | Человекочитаемое название колонки, для вывода на фронт |
| dataType | string | да | Тип данных колонки DataType |
PieChart
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| values | PieChartValue[] | да | Информация о диаграмме |
PieChartValue
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| value | json | да | Значение части диаграммы |
| count | integer | да | Число таких значений |
| percentOfParent | integer | да | Процент от родительского уровня |
| percentOfTotal | integer | да | Процент от общего уровня |
| subLayers | PieChartValue[] | да | Дорчерние уровни (если мультигруппировка) |
Hist
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| values | HistValue[] | да | Информация о диаграмме |
HistValue
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| key | string | да | Ключ значения диаграммы |
| valueOpt | json | нет | Значение (есть только у последнего уровня) |
| subLayers | HistValue[] | да | Дорчерние уровни (если мультигруппировка) |
crypto-service: сервис для примера
Сервис принимает запросы для работы с игроками и командами. Состояние хранится в PostgreSQL.
Команды могут приходить как по HTTP, так и через Kafka в топик crypto_service_commands.
Сервис разбит на несколько модулей, в виде sbt проектов:
domainв котором содержатся все доменные модели и их различные представления.commandsв котором содержатся все, что связано с командами, их описанием и обработчиками.storageсодержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.serviceсодержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.bootсодержит зависимости и описание для сборки и запуска сервиса.
Информацию по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/cryptoservice_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- CRYPTO_SERVICE_DB_HOST
- CRYPTO_SERVICE_DB_PORT
- CRYPTO_SERVICE_DB_NAME
- CRYPTO_SERVICE_DB_USER
- CRYPTO_SERVICE_DB_PASSWORD
Запуск из консоли с помощью 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_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, то желательно поменять
следующие переменные:
CRYPTO_SERVICE_LOGGING_SRC_IP, для параметраsrcв логахCRYPTO_SERVICE_LOGGING_SRC_HOST, для параметраshostв логахCRYPTO_SERVICE_LOGGING_DST_IP, для параметраdstв логах
В файле src/main/resources/logback.xml можно поменять class path для основного класса приложения
(переменная projectMainClassPath), если это необходимо.
Список команд сервиса crypto-service
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
В сервисе реализованы следующие команды
CreateSignature
Создает новую подпись, сохраняет переданный контент в .sig файл, связывает подпись и внешнюю сущность.
- Input: SignatureCreateDTO
- Output: Signature
| Команда | Тип |
|---|---|
| cryptoservice_createSignature | Kafka |
DeleteSignature
Удаляет подпись
- Input: [String]
- Output: -
| Команда | Тип |
|---|---|
| cryptoservice_deleteSignature | Kafka |
DeleteSignaturesByEntity
Удаляет подпись
- Input: ExtId
- Output: -
| Команда | Тип |
|---|---|
| cryptoservice_deleteSignaturesByEntity | Kafka |
GetSignature
Возвращает подпись по Id.
- Input: [String]
- Output: Signature
| Команда | Тип |
|---|---|
| cryptoservice_getSignature | HTTP |
GetEntityWithSignatures
Возвращает внешнюю сущность со всеми связанными подписями.
- Input: ExtId
- Output: EntityWithSignature
| Команда | Тип |
|---|---|
| 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 проектов:
- domain, в котором содержатся все доменные модели и их различные представления.
- commands, в котором содержатся всё, что связано с командами, их описанием и обработчиками.
- storage, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.
- service, содержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.
- boot, содержит зависимости и описание для сборки и запуска сервиса.
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/hierarchyentities - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- HIERARCHY_ENTITIES_DB_HOST
- HIERARCHY_ENTITIES_DB_PORT
- HIERARCHY_ENTITIES_DB_NAME
- HIERARCHY_ENTITIES_DB_USER
- HIERARCHY_ENTITIES_DB_PASSWORD
Запуск из консоли с помощью 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_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
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
В сервисе реализованы следующие команды:
- Создание иерархичной сущности
- Обновление иерархичной сущности
- Удаление иерархичной сущности
- Восстановление иерархичной сущности
- Получение иерархичной сущности по ID
- Список иерархичных сущностей
- Создание объекта иерархий
- Создание объектов иерархий пакетное
- Обновление объекта иерархий
- Обновление объектов иерархий пакетное
- Удаление объекта иерархий
- Удаление объекта иерархий с обработкой детей
- Удаление объектов иерархий пакетное
- Удаление объектов иерархий пакетное с обработкой детей
- Восстановление объекта иерархий
- Получение объекта иерархий по ID
- Список объектов иерархий
CreateHierarchyEntity
На входе атрибуты для создания иерархичной сущности
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description",
"data": {
"someInfo": "info"
}
}
На выходе ID новой задачи
"HierarchyEntityId"
Добавление новой иерархичной сущности.
- Input: HierarchyEntityCreateDTO
- Output: Id созданной задачи
| Команда | Путь |
|---|---|
| hierarchyEntities_createHierarchyEntity | Kafka Topic "hierarchyEntities_commands" |
UpdateHierarchyEntity
На выходе атрибуты для обновления иерархичной сущности
{
"id": "HierarchyEntityId",
"title": "title",
"description": "description",
"data": {
"someInfo": "info"
},
"version": 1
}
На выходе признак успешности обновления
true
Обновление иерархичной сущности.
- Input: HierarchyEntityUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| hierarchyEntities_updateHierarchyEntity | Kafka Topic "hierarchyEntities_commands" |
DeleteHierarchyEntity
На входе ID иерархичной сущности
"hierarchyEntityId"
На выходе признак успешности удаления
true
Удаление иерархичной сущности.
- Input: ID иерархичной сущности
- Output: Boolean
| Команда | Путь |
|---|---|
| hierarchyEntities_deleteHierarchyEntity | Kafka Topic "hierarchyEntities_commands" |
RestoreHierarchyEntity
На входе ID иерархичной сущности
"hierarchyEntityId"
На выходе признак успешности восстановления
true
Восстановление иерархичной сущности.
- Input: ID иерархичной сущности
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение иерархичной сущности.
- Input: UUID задачи
- Output: HierarchyEntity
| Команда | Путь |
|---|---|
| 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
}
Получение списка иерархичных сущностей с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[HierarchyEntity]
| Команда | Путь |
|---|---|
| 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"
Добавление нового объекта иерархий.
- Input: HierarchyEntityObjectCreateDTO
- Output: Id объекта иерархий
| Команда | Путь |
|---|---|
| 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"
]
Добавление нового объекта иерархий.
- Input: HierarchyEntityObjectCreateDTO[]
- Output: UUID[] список Id объектов иерархий, порядок в списке возвращаемых идентификаторов соответствует порядку списка DTO
| Команда | Путь |
|---|---|
| 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
Обновление объекта иерархий.
- Input: HierarchyEntityObjectUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
Обновление объекта иерархий.
- Input: HierarchyEntityObjectUpdateDTO[]
- Output: Boolean
| Команда | Путь |
|---|---|
| hierarchyEntities_updateHierarchyEntityObjectBatch | HTTP POST "/v1/hierarchy-entity-object/update-batch" |
DeleteHierarchyEntityObject
На входе ID объекта иерархий
"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
На выходе признак успешности удаления
true
Удаление объекта иерархий.
- Input: ID объекта иерархий
- Output: Boolean
| Команда | Путь |
|---|---|
| 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"
]
Удаление объекта иерархий с обработкой детей.
- Input: HierarchyEntityObjectDeleteWithChildrenCheckDTO
- Output: Option[HierarchyEntityObject[]]
| Команда | Путь |
|---|---|
| hierarchyEntities_deleteHierarchyEntityObjectWithChildrenCheck | Kafka Topic "hierarchyEntities_commands" |
DeleteHierarchyEntityObjectBatch
На входе список ID объектов иерархий
[
"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e",
"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
]
На выходе признак успешности удаления
true
Удаление объекта иерархий пакетное.
- Input: список ID объектов иерархий
- Output: Boolean
| Команда | Путь |
|---|---|
| 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"
]
Удаление объекта иерархий пакетное с обработкой детей.
- Input: HierarchyEntityObjectDeleteBatchWithChildrenCheckDTO
- Output: Option[HierarchyEntityObject[]]
| Команда | Путь |
|---|---|
| hierarchyEntities_deleteHierarchyEntityObjectBatchWithChildrenCheck | Kafka Topic "hierarchyEntities_commands" |
RestoreHierarchyEntityObject
На входе ID объекта иерархий
"ccdeecc5-ff63-4c98-80d6-bab044cc5f1e"
На выходе признак успешности восстановления
true
Восстановление объекта иерархий.
- Input: ID объекта иерархий
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение объекта иерархий.
- Input: UUID объекта иерархий
- Output: HierarchyEntityObject
| Команда | Путь |
|---|---|
| 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
}
Получение списка объектов иерархий с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[HierarchyEntityObject]
| Команда | Путь |
|---|---|
| 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
}
Получение списка объектов иерархий с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[HierarchyEntityObjectExtendedDTO]
| Команда | Путь |
|---|---|
| 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 проектов:
domainв котором содержатся все доменные модели и их различные представления.commandsв котором содержатся все, что связано с командами, их описанием и обработчиками.storageсодержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.serviceсодержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.bootсодержит зависимости и описание для сборки и запуска сервиса.
Информацию по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/iuaadapter_db - База ИУА по указанному в конфиге адресу
- Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- IUA_ADAPTER_DB_HOST
- IUA_ADAPTER_DB_PORT
- IUA_ADAPTER_DB_NAME
- IUA_ADAPTER_DB_USER
- IUA_ADAPTER_DB_PASSWORD
- IUA_ADAPTER_SMEVDB_HOST
- IUA_ADAPTER_SMEVDB_PORT
- IUA_ADAPTER_SMEVDB_NAME
- IUA_ADAPTER_SMEVDB_USER
- IUA_ADAPTER_SMEVDB_PASSWORD
Запуск из консоли с помощью 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_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 ИУА) |
Формат 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, то желательно поменять
следующие переменные:
IUA_ADAPTER_LOGGING_SRC_IP, для параметраsrcв логахIUA_ADAPTER_LOGGING_SRC_HOST, для параметраshostв логахIUA_ADAPTER_LOGGING_DST_IP, для параметраdstв логах
В файле 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-преобразования в сервис, а также проверяет их на предоставленных тестовых данных
- Input: Transformation[]
- Output: {}
| Команда | Тип |
|---|---|
| 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 проектов:
domainв котором содержатся все доменные модели и их различные представления.commandsв котором содержатся все, что связано с командами, их описанием и обработчиками.storageсодержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.serviceсодержит сервисы бизнес логики, которые определяют правила взаимодействия компонентов между собой.bootсодержит зависимости и описание для сборки и запуска сервиса.
Информацию по добавлению команд можно прочитать в описании шаблона
Локальный запуск
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/jobscheduler_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- JSCH_DB_HOST
- JSCH_DB_PORT
- JSCH_DB_NAME
- JSCH_DB_USER
- JSCH_DB_PASSWORD
Запуск из консоли с помощью 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_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 | Количество дней резерва в черновике |
Формат 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, то желательно поменять
следующие переменные:
JSCH_LOGGING_SRC_IP, для параметраsrcв логахJSCH_LOGGING_SRC_HOST, для параметраshostв логахJSCH_LOGGING_DST_IP, для параметраdstв логах
В файле src/main/resources/logback.xml можно поменять class path для основного класса приложения
(переменная projectMainClassPath), если это необходимо.
Список команд сервиса job-scheduler
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
В сервисе реализованны команды:
ScheduleDateApply
На входе id брони
{
"jobScheduleDateId": "cfccfbe8-b957-4a29-81c3-3405cd497983"
}
На выходе пустой объект
{}
Снимает с брони статус "черновик" по id.
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_scheduleDateApply | Kafka Topic "job_scheduler_commands" |
- На входе: JobScheduleDateDTO
- На выходе: пустой объект
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" |
- На входе: JobScheduleDateDTO
- На выходе: UUID
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" |
- На входе: JobScheduleDateReplaceDTO
- На выходе: UUID
ScheduleDateRevert
На входе субъект, объект
{
"subject": {
"classCode": "UserGroup",
"entityId": "jobDescriptionCoordinating"
},
"objectGroupClass": "Plan",
"scheduledObjectId": "8ec1c616-79f5-4485-a49d-aef0a35fad81"
}
На выходе пустой объект
{}
Удаляет бронь (помечает запись удаленной).
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_scheduleDateRevert | Kafka Topic "job_scheduler_commands" |
- На входе: JobScheduleEntityDTO
- На выходе: пустой объект
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" |
- На входе: [Search]
- На выходе: PageJobScheduleDateStatsDTO
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| 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" |
- На входе: IdDTO
- На выходе: JobScheduleDateDTO
ScheduleDateAuto
Поиск ближайшей свободной даты
На входе Условия ограничений для субъекта и группы объектов
{
"subject": {
"classCode": "jobDescriptionCoordinating",
"entityId": "user2"
},
"objectGroupClass": "Plan",
"conditions": [
{
"cond1": "condValue2"
}
]
}
На выходе дата в формате TimeStamp
1740423600000
Поиск ближайшей свободной даты, подходящей под условия.
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_scheduleDateAuto | Kafka Topic "job_scheduler_commands" |
- На входе: JobScheduleDateAutoDTO
- На выходе: TimeStamp
ValidateConditions
Проверка условий ограничений
На входе Условия ограничений для субъекта и группы объектов
{
"subject": {
"classCode": "jobDescriptionCoordinating",
"entityId": "user2"
},
"objectGroupClass": "Plan",
"conditions": [
{
"cond1": "condValue2"
}
]
}
На выходе true
true
Проверка существует ли ограничение с указанными условиями
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_validateConditions | Kafka Topic "job_scheduler_commands" |
- На входе: ValidateConditionsDTO
- На выходе: true
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" |
- На входе: LimitGroupCreateDTO
- На выходе: UUID
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" |
- На входе: LimitGroupUpdateDTO
- На выходе: UUID
DeleteLimitGroup
Удаление (мягкое) группы ограничений.
На входе идентификатор группы ограничений
{
"id": "1c9f3d58-3382-4e1f-a2a1-935a45b7116d"
}
На выходе true
true
Удаляет существующее ограничение
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_deleteLimitGroup | Kafka Topic "job_scheduler_commands" |
- На входе: IdDTO
- На выходе: true
RestoreLimitGroup
Восстановление группы ограничений после удаления.
На входе идентификатор группы ограничений
{
"id": "1c9f3d58-3382-4e1f-a2a1-935a45b7116d"
}
На выходе true
true
Удаляет существующее ограничение
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_restoreLimitGroup | Kafka Topic "job_scheduler_commands" |
- На входе: IdDTO
- На выходе: true
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" |
- На входе: UUID
- На выходе: ListLimitGroupDTO
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 |
- На входе: Search
- На выходе: Page[ListLimitGroupDTO]
Доступные поля для фильтрации: и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| 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 |
- На входе: Search
- На выходе: Page[Limit]
Доступные поля для фильтрации: и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| 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" |
- На входе: пустой объект
- На выходе: FiniteDuration
CreateCalendar
На входе информация о календаре
{
"default": false,
"data": {}
}
На выходе идентификатор календаря
"89618431-e33d-4721-a7ea-e53638ec6d93"
Создание календаря
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_createCalendar | Kafka Topic "job_scheduler_commands" |
- На входе: CreateCalendarDTO
- На выходе: UUID
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" |
- На входе: [Search]
- На выходе: PageJobScheduleDate
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| 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" |
- На входе: UUID
- На выходе: UUID
DeleteCalendar
На входе идентификатор календаря
"89618431-e33d-4721-a7ea-e53638ec6d93"
На выходе пустой объект
{}
Удаление календаря
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_deleteCalendar | Kafka Topic "job_scheduler_commands" |
- На входе: UUID
- На выходе: -
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" |
- На входе: [Search]
- На выходе: PageCalendar
UpdateCalendar
На входе информация для обновления календаря
{
"id": "86dbe83e-9fc5-4241-a064-a82c0d4dace2",
"default": false,
"data": {}
}
На выходе пустой объект
{}
Обновление календаря
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_updateCalendar | Kafka Topic "job_scheduler_commands" |
- На входе: UpdateCalendarDTO
- На выходе: UUID
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" |
- На входе: UUID
- На выходе: Calendar
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" |
- На входе: -
- На выходе: Calendar
CreateWeekendDay
На входе информация для создания выходного дня
{
"date": 1734613104998,
"name": "Вторник",
"calendarId": "83e5fdb3-fa84-49b7-b6b6-6c2b457bcd27"
}
На выходе идентификатор выходного дня
"f7dff8d8-27c6-47b4-a6c9-733e15c2d3e3"
Создание выходного дня
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_createWeekendDay | Kafka Topic "job_scheduler_commands" |
- На входе: CreateWeekendDTO
- На выходе: UUID
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" |
- На входе: SeqCreateWeekendDTO
- На выходе: Int
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" |
- На входе: ModifyWeekendBatchDTO
- На выходе: -
DeleteWeekendDay
На входе информация для создания выходных дней
"185cc749-a26b-43de-9467-d3a5b5b5be12"
На выходе пустой объект
{}
Удаление выходного дня
Поддерживается синхронный и асинхронный вызов.
| Команда | Путь |
|---|---|
| jsch_deleteWeekendDay | Kafka Topic "job_scheduler_commands" |
- На входе: UUID
- На выходе: -
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" |
- На входе: [Search]
- На выходе: PageWeekend
Доступные поля для фильтрации и виды фильтров по ним:
| Поле | Виды фильтров |
|---|---|
| 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" |
- На входе: SubjectIdentity
- На выходе: Subject
Объекты сервиса 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 проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все команды, их описание и обработчики: kafka-handlers & http-routes.store, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логии, которые определяют правила взаимодействия компонентов между собой.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Локальный запуск сервиса sed-comment
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/sed-comment_db - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf Добавлены необходимые переменные окружения:
- SED_COMMENT_DB_HOST
- SED_COMMENT_DB_PORT
- SED_COMMENT_DB_NAME
- SED_COMMENT_DB_USER
- SED_COMMENT_DB_PASSWORD
Запуск из консоли с помощью 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_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.
В сервисе реализованны следующие команды:
- Создание треда
- Обновление треда
- Удаление треда
- Пакетное удаление тредов по entityId
- Восстановление треда
- Получение треда
- Список тредов
- ОБновление привязки у группы тредов
- Создание комментария
- Обновление комментария
- Удаление комментария
- Восстановление комментария
- Получение комментария
- Список комментариев
- Добавление комментария с созданием треда
- Получение количества комментариев без резолюции
CreateThread
На входе атрибуты для создания нового треда
{
"classCode": "TextSnippet",
"entityId": "00000000-0000-0000-0000-000000000001",
"data": {
"someData": "someValue"
}
}
На выходе ID нового треда
"df193075-26c5-4d7a-8ff4-dbdf596223b6"
Добавление нового треда.
- Input: ThreadCreateDTO
- Output: UUID созданного треда
| Команда | Путь |
|---|---|
| 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
Обновление треда.
- Input: ThreadUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedComment_updateThread | HTTP POST "/v1/thread/update" |
DeleteThread
На входе ID треда
"df193075-26c5-4d7a-8ff4-dbdf596223b6"
На выходе признак успешности удаления
true
Удаление треда.
- Input: UUID треда
- Output: Boolean
| Команда | Путь |
|---|---|
| sedComment_deleteThread | HTTP POST "/v1/thread/delete" |
DeleteThreadsByEntityId
На входе список Id entityId
["df193075-26c5-4d7a-8ff4-dbdf596223b6","00000000-0000-0000-0000-000000000000"]
На выходе признак успешности удаления
true
Удаление тредов по entityId.
- Input: список Id entityId
- Output: Boolean
| Команда | Путь |
|---|---|
| sedComment_deleteThreadsByEntityId | Kafka topic "sed_comment_commands" |
RestoreThread
На входе ID треда
"df193075-26c5-4d7a-8ff4-dbdf596223b6"
На выходе признак успешности восстановления
true
Восстановление треда.
- Input: UUID задачи
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение треда.
- Input: UUID треда
- Output: ThreadWithCommentsCountDTO
| Команда | Путь |
|---|---|
| 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
}
Получение списка тредов с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[ThreadWithCommentsCountDTO]
| Команда | Путь |
|---|---|
| sedComment_listThreads | HTTP POST "/v1/thread/list" |
CreateComment
На входе атрибуты для создания нового комментария
{
"threadId": "3207d03e-ae46-40c4-8a47-eb83cad385d7",
"comment": "Содержательный комментарий",
"data": {
"someData": "someValue"
}
}
На выходе ID нового комментария
"6d9edc57-cc78-4b95-850f-159cb38361df"
Добавление нового комментария.
- Input: CommentCreateDTO
- Output: UUID созданного комментария
| Команда | Путь |
|---|---|
| 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"
}
Добавление нового комментария.
- Input: CreateCommentWithThreadDTO
- Output: CreateCommentWithThreadResult
| Команда | Путь |
|---|---|
| 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
Получение количества комментариев без резолюции.
- Input: SeqExternalEntityIds
- Output: Int
| Команда | Путь |
|---|---|
| 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" используется отдельная команда.
- Input: CommentUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedComment_updateComment | HTTP POST "/v1/comment/update" |
SetCommentResolution
На выходе атрибуты для оставления резолюции
{
"commentId": "6d9edc57-cc78-4b95-850f-159cb38361df",
"version": 1,
"resolution": {
"someData": "someValue"
}
}
На выходе признак успешности обновления
true
Проставление резолюции.
- Input: SetCommentResolutionDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedComment_setCommentResolution | HTTP POST "/v1/comment/set-comment-resolution" |
DeleteComment
На входе ID комментария
"6d9edc57-cc78-4b95-850f-159cb38361df"
На выходе признак успешности удаления
true
Удаление комментария.
- Input: UUID комментария
- Output: Boolean
| Команда | Путь |
|---|---|
| sedComment_deleteComment | HTTP POST "/v1/comment/delete" |
RestoreComment
На входе ID комментария
"6d9edc57-cc78-4b95-850f-159cb38361df"
На выходе признак успешности восстановления
true
Восстановление комментария.
- Input: UUID комментария
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение комментария.
- Input: UUID комментария
- Output: Comment
| Команда | Путь |
|---|---|
| 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
}
Получение списка комментариев с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[Comment]
| Команда | Путь |
|---|---|
| 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
}
Получение количества комментариев к сущностям
- Input: Search
- Output: [Map[String, Int]]
| Команда | Путь |
|---|---|
| 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
}
]
Получение списка тредов с комментариями.
- Input: Search
- Output: Page[ThreadWithCommentsDTO]
| Команда | Путь |
|---|---|
| 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
}
]
Получение плоского списка комментариев.
- Input: Search
- Output: Page[CommentDTO]
| Команда | Путь |
|---|---|
| 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
Изменения привязки у группы тредов.
- Input: ThreadBatchUpdateEntityIdDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| 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"
Добавление нового голоса.
- Input: VoteCreateDTO
- Output: UUID созданного голоса
| Команда | Путь |
|---|---|
| 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
Обновление комментария.
- Input: VoteUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedComment_updateVote | HTTP POST "/v1/vote/update" |
DeleteVote
На входе ID голоса
"6d9edc57-cc78-4b95-850f-159cb38361df"
На выходе признак успешности удаления
true
Удаление голоса.
- Input: UUID голоса
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение списка комментариев с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[Comment]
| Команда | Путь |
|---|---|
| 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 проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все команды, их описание и обработчики: kafka-handlers & http-routes.store, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логии, которые определяют правила взаимодействия компонентов между собой.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Локальный запуск сервиса 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_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.
В сервисе реализованны следующие команды:
- Создание маршрута сущности
- Обновление маршрута сущности
- Изменение стадии маршрута
- Изменение стадии маршрута по данным сущности
- Изменение версии маршрута у маршрута сущности
- Изменение версии маршрута у маршрута сущности по данным сущности
- Удаление маршрута сущности
- Удаление маршрутов сущности
- Восстановление маршрута сущности
- Получение маршрута сущности по ID
- Список маршрутов сущности
- Создание маршрута
- Клонирование маршрута с изменениями
- Обновление маршрута
- Удаление маршрута
- Восстановление маршрута
- Получение маршрута по ID
- Список маршрутов
- Создание стадии маршрута
- Обновление стадии маршрута
- Удаление стадии маршрута
- Удаление стадий маршрутов
- Восстановление стадии маршрута
- Получение стадии маршрута по ID
- Список стадий маршрутов
- Создание перехода между стадиями маршрута
- Обновление перехода между стадиями маршрута
- Удаление перехода между стадиями маршрута
- Удаление переходов между стадиями маршрута
- Восстановление перехода между стадиями маршрута
- Получение перехода между стадиями маршрута по ID
- Список переходов между стадиями маршрутов
- Создание версии маршрута
- Клонирование версии маршрута с изменениями
- Публикация версии маршрута
- Отмена публикации версии маршрута
- Удаление версии маршрута
- Удаление версий маршрутов
- Каскадное удаление версий маршрутов
- Восстановление версии маршрута
- Получение версии маршрута по ID
- Получение актуальной версии маршрута по routeID
- Список версий маршрутов
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
}
Добавление нового маршрута сущности.
- Input: RouteEntityCreateDTO
- Output: RouteEntity
| Команда | Путь |
|---|---|
| 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" для оптимистичной блокировки.
- Input: RouteEntityUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_updateRouteEntity | Kafka Topic "sedroute_commands" |
ChangeRouteEntityStage
На входе атрибуты для изменения стадии маршрута сущности
{
"routeEntityId": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
"routeStageLinkId": "00000000-0000-0000-0000-000000000001"
}
На выходе пустое тело ответа
Изменение стадии маршрута.
- Input: ChangeRouteEntityStageDTO
- Output: Unit
| Команда | Путь |
|---|---|
| sedroute_changeRouteEntityStage | Kafka Topic "sedroute_commands" |
ChangeRouteEntityStageByEntity
На входе атрибуты для изменения стадии маршрута сущности по данным сущности
{
"classCode": "classCode",
"entityId": "24404bb3-fc1e-4388-ac4b-9c99beb89e91",
"routeStageLinkId": "00000000-0000-0000-0000-000000000001"
}
На выходе пустое тело ответа
Изменение стадии маршрута.
- Input: ChangeRouteEntityStageByEntityDTO
- Output: Unit
| Команда | Путь |
|---|---|
| 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"
}
На выходе пустое тело ответа
Изменение версии маршрута у маршрута сущности.
- Input: ChangeRouteEntityRouteVersionDTO
- Output: Unit
| Команда | Путь |
|---|---|
| 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"
}
На выходе пустое тело ответа
Изменение версии маршрута у маршрута сущности.
- Input: ChangeRouteEntityRouteVersionByEntityDTO
- Output: Unit
| Команда | Путь |
|---|---|
| sedroute_changeRouteEntityStageByEntity | Kafka Topic "sedroute_commands" |
DeleteRouteEntity
На входе ID маршрута сущности
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности удаления
true
Удаление маршрута сущности.
- Input: UUID маршрута сущности
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteRouteEntity | Kafka Topic "sedroute_commands" |
DeleteBatchRouteEntity
На входе список ID маршрутов сущности
["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]
На выходе признак успешности удаления
true
Удаление маршрутов сущности.
- Input: Seq[UUID] маршрутов сущности
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteBatchRouteEntity | Kafka Topic "sedroute_commands" |
RestoreRouteEntity
На входе ID маршрута сущности
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности восстановления
true
Восстановление маршрута сущности.
- Input: UUID маршрута сущности
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение маршрута сущности.
- Input: UUID маршрута сущности
- Output: RouteEntity
| Команда | Путь |
|---|---|
| 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
}
Получение списка маршрутов сущностей с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[RouteEntity]
| Команда | Путь |
|---|---|
| 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
}
Добавление нового маршрута.
- Input: RouteCreateDTO
- Output: Route
| Команда | Путь |
|---|---|
| sedroute_createRoute | Kafka Topic "sedroute_commands" |
UpdateRoute
На входе атрибуты для обновления маршрута
{
"id": "route",
"title": "title",
"description": "description",
"data": {
},
"version": 1
}
На выходе признак успешности обновления
true
Обновление маршрута. Принимает "version" для оптимистичной блокировки.
- Input: RouteUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_updateRoute | Kafka Topic "sedroute_commands" |
DeleteRoute
На входе id маршрута
"01"
На выходе признак успешности удаления
true
Удаление маршрута.
- Input: ID маршрута
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteRoute | Kafka Topic "sedroute_commands" |
RestoreRoute
На входе id маршрута
"route"
На выходе признак успешности восстановления
true
Восстановление маршрута.
- Input: ID маршрута
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение маршрута.
- Input: ID маршрута
- Output: Route
| Команда | Путь |
|---|---|
| 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
}
Получение списка маршрутов с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[Route]
| Команда | Путь |
|---|---|
| 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"
Добавление новой стадии маршрута.
- Input: RouteStageCreateDTO
- Output: RouteStage
| Команда | Путь |
|---|---|
| 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
- Input: RouteCloneWithChangesDTO
- Output: RouteIdWithVersionId
| Команда | Путь |
|---|---|
| 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" для оптимистичной блокировки.
- Input: RouteStageUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_updateRouteStage | Kafka Topic "sedroute_commands" |
DeleteRouteStage
На входе ID стадии маршрута
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности удаления
true
Удаление стадии маршрута.
- Input: UUID стадии маршрута
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteRouteStage | Kafka Topic "sedroute_commands" |
DeleteBatchRouteStage
На входе список ID стадий маршрутов
["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]
На выходе признак успешности удаления
true
Удаление стадий маршрутов.
- Input: Seq[UUID] стадий маршрутов
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteBatchRouteStage | Kafka Topic "sedroute_commands" |
RestoreRouteStage
На входе ID стадии маршрута
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности восстановления
true
Восстановление стадии маршрута.
- Input: UUID стадии маршрута
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение стадии маршрута.
- Input: UUID маршрута
- Output: RouteStage
| Команда | Путь |
|---|---|
| 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
}
Получение списка стадий маршрутов с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[RouteStage]
| Команда | Путь |
|---|---|
| sedroute_listRouteStage | HTTP POST "/v1/routeStage/list" |
CreateRouteStageLink
На входе атрибуты для создания нового перехода между маршрутами
{
"title": "title",
"stageFrom": "00000000-0000-0000-0000-000000000000",
"stageTo": "00000000-0000-0000-0000-000000000001",
"conditions": {
"data": "data"
}
}
На выходе ID нового перехода между маршрутами
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
Добавление нового перехода между маршрутами.
- Input: RouteStageLinkCreateDTO
- Output: RouteStageLink
| Команда | Путь |
|---|---|
| sedroute_createRouteStageLink | Kafka Topic "sedroute_commands" |
UpdateRouteStageLink
На входе атрибуты для обновления перехода между маршрутами.
{
"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" для оптимистичной блокировки.
- Input: RouteStageLinkUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_updateRouteStageLink | Kafka Topic "sedroute_commands" |
DeleteRouteStageLink
На входе ID перехода между маршрутами
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности удаления
true
Удаление перехода между маршрутами.
- Input: UUID перехода между маршрутами
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteRouteStageLink | Kafka Topic "sedroute_commands" |
DeleteBatchRouteStageLink
На входе список ID переходов между маршрутами
["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]
На выходе признак успешности удаления
true
Удаление переходов между маршрутами.
- Input: Seq[UUID] переходов между маршрутами
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteBatchRouteStageLink | Kafka Topic "sedroute_commands" |
RestoreRouteStageLink
На входе ID перехода между маршрутами
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности восстановления
true
Восстановление перехода между маршрутами.
- Input: UUID перехода между маршрутами
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_restoreRouteStageLink | Kafka Topic "sedroute_commands" |
GetRouteStageLink
На входе 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
}
Получение перехода между маршрутами.
- Input: UUID перехода между маршрутами
- Output: RouteStageLink
| Команда | Путь |
|---|---|
| sedroute_getRouteStageLink | HTTP POST "/v1/routeStageLink/get" |
ListRouteStageLink
На входе параметры поиска, сортировки и пагинации (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
}
Получение списка переходов между маршрутами с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[RouteStageLink]
| Команда | Путь |
|---|---|
| sedroute_listRouteStageLink | HTTP POST "/v1/routeStageLink/list" |
CreateRouteVersion
На входе атрибуты для создания новой версии маршрута
{
"routeId": "routeId",
"number": "1.0",
"draft": true
}
На выходе ID новой версии маршрута
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
Добавление новой версии маршрута.
- Input: RouteVersionCreateDTO
- Output: RouteVersion
| Команда | Путь |
|---|---|
| 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
- Input: RouteVersionCloneWithChangesDTO
- Output: UUID
| Команда | Путь |
|---|---|
| sedroute_cloneRouteVersionWithChanges | Kafka Topic "sedroute_commands" |
PublishRouteVersion
На входе ID версии маршрута
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности публикации
true
Публикация версии маршрута.
- Input: UUID версии маршрута
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_publishRouteVersion | Kafka Topic "sedroute_commands" |
UnpublishRouteVersion
На входе ID версии маршрута
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности снятия с публикации
true
Отмена публикации версии маршрута.
- Input: UUID версии маршрута
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_unPublishRouteVersion | Kafka Topic "sedroute_commands" |
DeleteRouteVersion
На входе ID версии маршрута
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности удаления
true
Удаление версии маршрута.
- Input: UUID версии маршрута
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteRouteVersion | Kafka Topic "sedroute_commands" |
DeleteBatchRouteVersion
На входе список ID версий маршрутов
["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]
На выходе признак успешности удаления
true
Удаление версий маршрутов.
- Input: Seq[UUID] версий маршрутов
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteBatchRouteVersion | Kafka Topic "sedroute_commands" |
DeleteBatchRouteVersionCascade
На входе список ID версий маршрутов
["24404bb3-fc1e-4388-ac4b-9c99beb89e91", "b12f0065-cb3e-4816-a037-f465d8bafdef"]
На выходе признак успешности удаления
true
Каскадное удаление версий маршрутов (помечает removed также сущности RouteStage и RouteStageLink).
- Input: Seq[UUID] версий маршрутов
- Output: Boolean
| Команда | Путь |
|---|---|
| sedroute_deleteBatchRouteVersionCascade | Kafka Topic "sedroute_commands" |
RestoreRouteVersion
На входе ID версии маршрута
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности восстановления
true
Восстановление версии маршрута.
- Input: UUID версии маршрута
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение маршрута.
- Input: UUID версии маршрута
- Output: RouteVersion
| Команда | Путь |
|---|---|
| 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 маршрута.
- Input: ID маршрута
- Output: RouteVersion
| Команда | Путь |
|---|---|
| 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
}
Получение списка версий маршрутов с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[Route]
| Команда | Путь |
|---|---|
| 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 | нет | Версия для оптимистичной блокировки |
RouteStageLink
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
| 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 проектов:
domain, в котором содержатся все доменные модели и их различные представления.commands, в котором содержатся все команды, их описание и обработчики: kafka-handlers & http-routes.store, содержит сервисы для сохранения и чтения их разных хранилищ доменных моделей.service, содержит сервисы бизнес логии, которые определяют правила взаимодействия компонентов между собой.boot, содержит зависимости и описание для сборки и запуска сервиса.
Информация по добавлению команд можно прочитать в описании шаблона
Локальный запуск сервиса sed-task-manager
При запуске сервиса ожидается, что уже развернута необходимая инфраструктура:
- PostgreSQL база по адресу
localhost:5432/sed-task-manager - Kafka по адресу
localhost:9092 - Consul по адресу
localhost:8500 - Адрес Kafka будет указан в
application.conf - Добавлены необходимые переменные окружения:
- SED_TASK_MANAGER_DB_HOST
- SED_TASK_MANAGER_DB_PORT
- SED_TASK_MANAGER_DB_NAME
- SED_TASK_MANAGER_DB_USER
- SED_TASK_MANAGER_DB_PASSWORD
Запуск из консоли с помощью 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_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
В описании команд используется путь/route для отправки команды в сам сервис, а не в ApiGateway. В качестве Input-а для команд, сервис всегда ожидает CommandRequest (как и любой другой сервис, принимающий команды), так что в описании команды указано лишь описание поля payload для CommandRequest.
Команды сервиса:
- Создание задачи
- Создание задач c вложением по списку ответственных
- Создание задач c вложениями
- Обновление задачи
- Обновление задач
- Удаление задачи
- Удаление нескольких задач
- Восстановление задачи
- Решение задачи
- Отмена нескольких задач
- Переоткрытие нескольких задач
- Получение задачи по ID
- Список задач
- Список задач с вложениями
- Создание статуса задачи
- Обновление статуса задачи
- Удаление статуса задачи
- Восстановление статуса задачи
- Получение статуса задачи по ID
- Список статусов задачи
- Создание вложения задачи
- Обновление вложения задачи
- Удаление вложения задачи
- Восстановление вложения задачи
- Получение вложения задачи по ID
- Список вложений задач
CreateTask
На входе атрибуты для создания новой задачи
{
"classCode": "routeEntity",
"entityId": "72602ae9-66ab-4065-8305-d374ff14a4bf",
"number": 1,
"title": "Задача 1",
"taskType": "RequestCheck",
"statusId": "inProcess"
}
На выходе ID новой задачи
"d4ccf42f-3c1c-41e4-a25e-d916627748d7"
Добавление новой задачи.
- Input: TaskCreateDTO
- Output: UUID созданной задачи
| Команда | Путь |
|---|---|
| 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"
}
}
На выходе пустое тело ответа
Добавление новых задач с вложением по списку ответственных.
- Input: TaskWithAttachByResponsibleCreateDTO
- Output: Unit
| Команда | Путь |
|---|---|
| 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
Обновление задачи.
- Input: TaskUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
Обновление задач.
- Input: SeqTask
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_updateTasks | Kafka Topic "sedTaskManager_commands" |
DeleteTask
На входе ID задачт
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности удаления, в зависимости от конфигурации удаляются и зависимые задачи
true
Удаление задачи.
- Input: UUID задачи
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_deleteTask | Kafka Topic "sedTaskManager_commands" |
DeleteTasks
На входе список ID задач, в зависимости от конфигурации удаляются и зависимые задачи
[
"24404bb3-fc1e-4388-ac4b-9c99beb89e91",
"24404bb3-fc1e-4388-ac4b-9c99beb89e92"
]
На выходе пустое тело ответа
Удаление нескольких задач.
- Input: список UUID задач
- Output: Unit
| Команда | Путь |
|---|---|
| sedTaskManager_deleteTasks | Kafka Topic "sedTaskManager_commands" |
RestoreTask
На входе ID задачи
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности восстановления
true
Восстановление задачи.
- Input: UUID задачи
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_restoreTask | Kafka Topic "sedTaskManager_commands" |
SolveTask
На входе ID задачи, в зависимости от конфигурации меняется статус у зависимых задач
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности решения задачи
true
Решение задачи.
- Input: UUID задачи
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_solveTask | Kafka Topic "sedTaskManager_commands" |
CancelTasks
На входе список ID задач, в зависимости от конфигурации меняется статус у зависимых задач
[
"24404bb3-fc1e-4388-ac4b-9c99beb89e91",
"24404bb3-fc1e-4388-ac4b-9c99beb89e92"
]
На выходе признак успешности отмены всех задач
true
Отмена нескольких задач.
- Input: список UUID задач
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_cancelTasks | Kafka Topic "sedTaskManager_commands" |
ReopenTasks
На входе список ID задач для переоткрытия (меняет статус задачи на New)
[
"24404bb3-fc1e-4388-ac4b-9c99beb89e91",
"24404bb3-fc1e-4388-ac4b-9c99beb89e92"
]
На выходе ничего
{}
Переоткрытие нескольких задач.
- Input: список UUID задач
- Output: Unit
| Команда | Путь |
|---|---|
| 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
}
Получение задачи.
- Input: UUID задачи
- Output: TaskListDTO
| Команда | Путь |
|---|---|
| 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
}
Получение списка задач с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[TaskListDTO]
| Команда | Путь |
|---|---|
| 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
}
Получение списка задач с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[TaskWithAttaches]
| Команда | Путь |
|---|---|
| sedTaskManager_listTasksWithAttaches | HTTP POST "/v1/task/list-with-attaches" |
CreateTaskStatus
На входе атрибуты для создания нового статуса задачи
{
"id": "solved",
"ordering": 1,
"next": "solved",
"description": "description"
}
На выходе признак успешности создания
true
Добавление нового статуса задачи.
- Input: TaskStatusCreateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_createTaskStatus | Kafka Topic "sedTaskManager_commands" |
UpdateTaskStatus
На входе атрибуты для обновления статуса задачи
{
"id": "inProcess",
"ordering": 1,
"next": "solved",
"description": "Задача в процессе решения",
"version": 1
}
На выходе признак успешности обновления
true
Обновление статуса задачи.
- Input: TaskStatusUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_updateTaskStatus | Kafka Topic "sedTaskManager_commands" |
DeleteTaskStatus
На входе ID статуса задачи
"inProcess"
На выходе признак успешности удаления
true
Удаление статуса задачи.
- Input: String ID статуса задачи
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_deleteTaskStatus | Kafka Topic "sedTaskManager_commands" |
RestoreTaskStatus
На входе ID статуса задачи
"inProcess"
На выходе признак успешности восстановления
true
Восстановление статуса задачи.
- Input: String ID статуса задачи
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение статуса задачи.
- Input: String ID статуса задачи
- Output: TaskStatus
| Команда | Путь |
|---|---|
| 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
}
Получение списка задач с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[TaskStatus]
| Команда | Путь |
|---|---|
| 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"
Добавление нового вложения задачи.
- Input: TaskAttachCreateDTO
- Output: UUID созданной задачи
| Команда | Путь |
|---|---|
| sedTaskManager_createTaskAttach | Kafka Topic "sedTaskManager_commands" |
AssignTask
На входе ID задачи и версия
{
"id": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
"version": 10
}
На выходе ничего
{}
Назначить себя ответственным за задачу.
- Input: TaskResponsibleUpdateDTO
- Output: Unit
| Команда | Путь |
|---|---|
| sedTaskManager_assignTask | Kafka Topic "sedTaskManager_commands" |
TakeOffTask
На входе ID задачи и версия
{
"id": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
"version": 10
}
На выходе ничего
{}
Снять с себя ответственность за задачу.
- Input: TaskResponsibleUpdateDTO
- Output: Unit
| Команда | Путь |
|---|---|
| sedTaskManager_takeOffTask | Kafka Topic "sedTaskManager_commands" |
AssignTaskToUser
На входе ID задачи и версия
{
"id": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
"responsible": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
"version": 10
}
На выходе ничего
{}
Назначить пользователя ответственным за задачу.
- Input: TaskResponsibleUpdateDTO
- Output: Unit
| Команда | Путь |
|---|---|
| sedTaskManager_assignTaskToUser | Kafka Topic "sedTaskManager_commands" |
TakeOffTaskFromUser
На входе ID задачи и версия
{
"id": "2db203b1-86f0-4ae8-86f3-a41aaeeef80b",
"version": 10
}
На выходе ничего
{}
Снять с пользователя ответственность за задачу.
- Input: TaskResponsibleUpdateDTO
- Output: Unit
| Команда | Путь |
|---|---|
| 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
Обновление вложения задачи.
- Input: TaskAttachUpdateDTO
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_updateTaskAttach | Kafka Topic "sedTaskManager_commands" |
DeleteTaskAttach
На входе ID вложения задачи
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности удаления
true
Удаление вложения задачи.
- Input: UUID вложения задачи
- Output: Boolean
| Команда | Путь |
|---|---|
| sedTaskManager_deleteTaskAttach | Kafka Topic "sedTaskManager_commands" |
RestoreTaskAttach
На входе ID вложения задачи
"24404bb3-fc1e-4388-ac4b-9c99beb89e91"
На выходе признак успешности восстановления
true
Восстановление вложения задачи.
- Input: UUID вложения задачи
- Output: Boolean
| Команда | Путь |
|---|---|
| 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
}
Получение вложения задачи.
- Input: UUID вложения задачи
- Output: TaskAttach
| Команда | Путь |
|---|---|
| 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
}
Получение списка вложений задач с поиском, сортировкой и пагинацией.
- Input: Search
- Output: Page[TaskAttach]
| Команда | Путь |
|---|---|
| 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
}
}
}
}
Получение аналитики по задачам пользователя.
- Input: -
- Output: userAnalytics[]
| Команда | Путь |
|---|---|
| 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
}
}
}
}
Получение аналитики по задачам пользователя.
- Input: Null
- Output: userAnalytics[]
| Команда | Путь |
|---|---|
| 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
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)) }
Обобщенные поля 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))
}