@startuml
skinparam shadowing false
skinparam DatabaseBackgroundColor white
skinparam DatabaseBorderColor #2688d4
skinparam QueueBackgroundColor white
skinparam QueueBorderColor #2688d4
skinparam NoteBackgroundColor white
skinparam NoteBorderColor #2688d4
skinparam sequence {
    ArrowColor #2688d4
    ActorBorderColor #2688d4
    LifeLineBorderColor #2688d4
    ParticipantBorderColor #2688d4
    ParticipantBackgroundColor white
    BoxBorderColor #2688d4
    BoxBackgroundColor white
}

queue "'email-channel-notifications'\n Kafka Topic" as email_notifications_kafka_topic
box "User notification service"
  participant "Email Channel \nNotification Subscriber" as email_channel_notification_subscriber
  participant "Audit Service" as audit_service
end box
participant "Mail server" as mail_server
queue "'audit-events'\n Kafka Topic" as audit_events_kafka_topic
queue "'email-channel-notifications.DLT'\n Kafka Topic" as email_notifications_dlt_kafka_topic

alt Sending notifications
  loop Making N attempts to send according to the settings in case of a notification processing error
  email_channel_notification_subscriber -> email_notifications_kafka_topic: Reading a \nrequest to send a notification
  note left
  {
    "context": {
      "system": "Low-code Platform",
      "application": "<bpms.app.name>",
      "businessProcess": "<optional>",
      "businessProcessDefinitionId": "<optional>",
      "businessProcessInstanceId": "<optional>",
      "businessActivity": "<optional>",
      "businessActivityInstanceId": "<optional>"
    },
    "notification": {
      "subject": "<notification subject>",
      "message": "<notification message>"
    },
    "recipient": {
      "email": "<User email>"
    }
  }
  end note

  activate email_channel_notification_subscriber
    email_channel_notification_subscriber -> email_channel_notification_subscriber: Building a notification object \nfrom the send request data
    email_channel_notification_subscriber -> mail_server: Sending email notification
      note left
        {
            "to": {email},
            "subject": {subject},
            "text:": {message}
        }
      end note
      mail_server --> email_channel_notification_subscriber: The notification has been sent
      email_channel_notification_subscriber -> email_channel_notification_subscriber: Processing the result of sending a notification
      alt In case of sending error
        email_channel_notification_subscriber --> email_notifications_kafka_topic
      end

      email_channel_notification_subscriber -> email_channel_notification_subscriber: Formation of an audit event
      email_channel_notification_subscriber -> audit_service: Recording of the audit event **SEND_USER_NOTIFICATION** (success)
      note left
      {
        "notification": {
          "channel:": "email",
          "subject": "<Notification header>",
          "message": "<ПовіNotification>",
          "recipient": {
            "id": "<User ID - optional>",
            "email": "<User Email>"
          }
        }
      }
      end note
      audit_service -> audit_events_kafka_topic: Publication of an audit event
      audit_events_kafka_topic --> audit_service
      audit_service --> email_channel_notification_subscriber: OK
      email_channel_notification_subscriber --> email_notifications_kafka_topic: The event has been processed: ACK
  end
else Повідомлення не відправлено
    email_channel_notification_subscriber -> email_notifications_dlt_kafka_topic: Event publications in Dead Letter Topic
    email_notifications_dlt_kafka_topic --> email_channel_notification_subscriber
    email_channel_notification_subscriber --> email_notifications_kafka_topic: The event has been processed: ACK
end
deactivate email_channel_notification_subscriber
@enduml