Детали задачи
-
История
-
Решение: Готово
-
High
-
Не заполнено
-
Не заполнено
-
Не заполнено
Описание
Добавить поддержку произвольных отправителей для нотификаций.
- Добавить два новых интерфейса и Enum:
// Комментарии относятся только к интерфейсу NotificationSender enum class NotificationSenderSendStatus { SENT, // Уведомление отправлено. Дальнейшая обработка не требуется BLOCKED, // Отправка уведомления заблокирована. Дальнейшая обработка не требуется SKIPPED // Уведомление не обработано текущим Sender'ом. Нужно использовать следующий. }
interface NotificationSender<T> { // T - это тип конфигурации для отправки fun sendNotification(notification: FitNotification, config: T): NotificationSenderSendStatus // отправка уведомления fun getNotificationType(): NotificationType // тип нотификации (email или push уведомление) fun getSenderType(): String // тип Sender'а. Это значение является связкой между конфигурацией Sender'а (или другими словами - инстансом Sender'а) и конкретной Java реализацией интерфейса NotificationSender }
interface NotificationSenderService { // Получить атрибуты, которые нужно загрузить из документа или additionalMeta при отправке уведомления // На данный момент атрибуты следует получать только из поля condition в конфигурации для инстанса Sender'а. fun getModel(): Set<String> // атрибуты, которые нужно получить // Получив из этого метода статус мы отправляем событие SENT/BLOCKED/SKIPPED или ERROR если возникла ошибка // Так же этот статус отправляется в таблицу нотификаций (см. NotificationState) fun sendNotification(notification: FitNotification): NotificationSenderSendStatus }
2. Добавить новую сущность конфигурации NotificationsSenderDto
- репозиторий
- entity
- сервис
- RecordsDAO
- Новый артефакт “notification/sender“ с типом “json“ и реализацию EcosArtifactHandler
Поля:
{ "id": String, "notificationType": String, // Тип нотификаций (например EMAIL_NOTIFICATION. см. NotificationType) "condition": Predicate, // условие, при котором будет активен данный инстанс "templates": RecordRef[] // шаблоны, для которых будет активен данный инстанс. Если список пустой, то фильтрация по шаблонам отсутствуе (подходит для всех), "enabled": Boolean // включен или нет текущий инстанс Sender'а "order": Float // порядок Sender'а. Важен если для отправки письма подходит несколько Sender'ов "senderType": String // то же что и NotificationSender.getSenderType, "senderConfig": ObjectData // конфигурация сендера (см. п.3 с описанием конфига для одного из типа Sender'ов') }
3. Добавить новый тип сендера “command“ с конфигурацией
{ "targetApp": String // приложение, в котором нужно исполнить команду "commandType": String // тип команды }
В ответе от команды ожидаем следующий объект:
{ "status": NotificationSenderSendStatus }
Если статуса нет, то кидаем ошибку
4. В NotificationTemplateRecords для атрибута multiModelAttributes добавить вызов сервиса NotificationSenderService.getModel. Примерно так:
@get:AttName("multiModelAttributes") val multiModel: Set<String> get() = let { val attributes = mutableSetOf<String>() this.model?.forEach { (_, dataValue) -> attributes.add(dataValue) } addAttributesRecursive(this.multiTemplateConfig, attributes) attributes.addAll(sendersService.getModel()) // этой строчки сейчас нету return attributes; }
5. EmailNotificationProvider переделать, чтобы он реализовывал интерфейс NotificationSender<T>
6. Переименовать ru.citeck.ecos.notifications.domain.notification.service.NotificationSender в NotificationSenderServiceImpl и реализовать интерфейс NotificationSenderService
Вложенные файлы
Связи запроса
- blocks
-
ECOSCOM-4718 Add decision table support for notifications sender
-
- New
-
- causes
-
ECOSCOM-4883 Documentation. Notification update
-
- Готово
-
- mentioned on