Загрузить изображение для проекта: 'Citeck Community'
  1. Citeck Community
  2. ECOSCOM-4679

Add notification senders support in notifications app

    XMLWordДля печати

Детали задачи

    • Icon: История История
    • Решение: Готово
    • Icon: High High
    • Community 4.0rc4
    • Не заполнено
    • Не заполнено
    • Не заполнено

    Описание

      Добавить поддержку произвольных отправителей для нотификаций.

      1. Добавить два новых интерфейса и 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

      Вложенные файлы

        Активность

          Люди

            elena.shushunova@citeck.ru Elena Shushunova
            pavel.simonov@citeck.ru Pavel Simonov
            Голоса:
            0 Голосовать за эту задачу
            Наблюдатели:
            3 Начать наблюдение за этой задачей

            Даты

              Создано:
              Обновленo:
              Дата решения:

              Учет времени

                Оценка:
                Первоначальная оценка - 1 неделя
                1w
                Осталось:
                0m
                Затрачено:
                Незатраченное время
                Не определено