Детали задачи
-
История
-
Решение: Готово
-
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