refactor(notification): use new queue package (#9360)

# Which Problems Are Solved

The recently introduced notification queue have potential race conditions.

# How the Problems Are Solved

Current code is refactored to use the queue package, which is safe in
regards of concurrency.

# Additional Changes

- the queue is included in startup
- improved code quality of queue

# Additional Context

- closes https://github.com/zitadel/zitadel/issues/9278
This commit is contained in:
Silvan
2025-02-27 11:49:12 +01:00
committed by GitHub
parent 83614562a2
commit 444f682e25
45 changed files with 1936 additions and 2818 deletions

View File

@@ -39,7 +39,7 @@ func SendEmail(
translator *i18n.Translator,
user *query.NotifyUser,
colors *query.LabelPolicy,
triggeringEvent eventstore.Event,
triggeringEventType eventstore.EventType,
) Notify {
return func(
urlTmpl string,
@@ -66,7 +66,7 @@ func SendEmail(
data,
args,
allowUnverifiedNotificationChannel,
triggeringEvent,
triggeringEventType,
)
}
}
@@ -102,7 +102,9 @@ func SendSMS(
translator *i18n.Translator,
user *query.NotifyUser,
colors *query.LabelPolicy,
triggeringEvent eventstore.Event,
triggeringEventType eventstore.EventType,
instanceID string,
jobID string,
generatorInfo *senders.CodeGeneratorInfo,
) Notify {
return func(
@@ -124,7 +126,9 @@ func SendSMS(
data,
args,
allowUnverifiedNotificationChannel,
triggeringEvent,
triggeringEventType,
instanceID,
jobID,
generatorInfo,
)
}
@@ -135,7 +139,7 @@ func SendJSON(
webhookConfig webhook.Config,
channels ChannelChains,
serializable interface{},
triggeringEvent eventstore.Event,
triggeringEventType eventstore.EventType,
) Notify {
return func(_ string, _ map[string]interface{}, _ string, _ bool) error {
return handleWebhook(
@@ -143,7 +147,7 @@ func SendJSON(
webhookConfig,
channels,
serializable,
triggeringEvent,
triggeringEventType,
)
}
}
@@ -153,7 +157,7 @@ func SendSecurityTokenEvent(
setConfig set.Config,
channels ChannelChains,
token any,
triggeringEvent eventstore.Event,
triggeringEventType eventstore.EventType,
) Notify {
return func(_ string, _ map[string]interface{}, _ string, _ bool) error {
return handleSecurityTokenEvent(
@@ -161,7 +165,7 @@ func SendSecurityTokenEvent(
setConfig,
channels,
token,
triggeringEvent,
triggeringEventType,
)
}
}

View File

@@ -13,11 +13,11 @@ func handleSecurityTokenEvent(
setConfig set.Config,
channels ChannelChains,
token any,
triggeringEvent eventstore.Event,
triggeringEventType eventstore.EventType,
) error {
message := &messages.Form{
Serializable: token,
TriggeringEvent: triggeringEvent,
Serializable: token,
TriggeringEventType: triggeringEventType,
}
setChannels, err := channels.SecurityTokenEvent(ctx, setConfig)
if err != nil {

View File

@@ -23,7 +23,7 @@ func generateEmail(
data templates.TemplateData,
args map[string]interface{},
lastEmail bool,
triggeringEvent eventstore.Event,
triggeringEventType eventstore.EventType,
) error {
emailChannels, config, err := channels.Email(ctx)
logging.OnError(err).Error("could not create email channel")
@@ -38,10 +38,10 @@ func generateEmail(
}
if config.SMTPConfig != nil {
message := &messages.Email{
Recipients: []string{recipient},
Subject: data.Subject,
Content: html.UnescapeString(template),
TriggeringEvent: triggeringEvent,
Recipients: []string{recipient},
Subject: data.Subject,
Content: html.UnescapeString(template),
TriggeringEventType: triggeringEventType,
}
return emailChannels.HandleMessage(message)
}
@@ -52,7 +52,7 @@ func generateEmail(
}
contextInfo := map[string]interface{}{
"recipientEmailAddress": recipient,
"eventType": triggeringEvent.Type(),
"eventType": triggeringEventType,
"provider": config.ProviderConfig,
}
@@ -62,7 +62,7 @@ func generateEmail(
TemplateData: data,
Args: caseArgs,
},
TriggeringEvent: triggeringEvent,
TriggeringEventType: triggeringEventType,
}
webhookChannels, err := channels.Webhook(ctx, *config.WebhookConfig)
if err != nil {

View File

@@ -28,7 +28,9 @@ func generateSms(
data templates.TemplateData,
args map[string]interface{},
lastPhone bool,
triggeringEvent eventstore.Event,
triggeringEventType eventstore.EventType,
instanceID string,
jobID string,
generatorInfo *senders.CodeGeneratorInfo,
) error {
smsChannels, config, err := channels.SMS(ctx)
@@ -51,7 +53,10 @@ func generateSms(
SenderPhoneNumber: number,
RecipientPhoneNumber: recipient,
Content: data.Text,
TriggeringEvent: triggeringEvent,
TriggeringEventType: triggeringEventType,
InstanceID: instanceID,
JobID: jobID,
UserID: user.ID,
}
err = smsChannels.HandleMessage(message)
if err != nil {
@@ -70,7 +75,7 @@ func generateSms(
}
contextInfo := map[string]interface{}{
"recipientPhoneNumber": recipient,
"eventType": triggeringEvent.Type(),
"eventType": triggeringEventType,
"provider": config.ProviderConfig,
}
@@ -80,7 +85,7 @@ func generateSms(
Args: caseArgs,
ContextInfo: contextInfo,
},
TriggeringEvent: triggeringEvent,
TriggeringEventType: triggeringEventType,
}
webhookChannels, err := channels.Webhook(ctx, *config.WebhookConfig)
if err != nil {

View File

@@ -13,11 +13,11 @@ func handleWebhook(
webhookConfig webhook.Config,
channels ChannelChains,
serializable interface{},
triggeringEvent eventstore.Event,
triggeringEventType eventstore.EventType,
) error {
message := &messages.JSON{
Serializable: serializable,
TriggeringEvent: triggeringEvent,
Serializable: serializable,
TriggeringEventType: triggeringEventType,
}
webhookChannels, err := channels.Webhook(ctx, webhookConfig)
if err != nil {