mirror of
https://github.com/databasus/databasus.git
synced 2026-04-06 00:32:03 +02:00
121 lines
4.1 KiB
Go
121 lines
4.1 KiB
Go
package notifiers
|
|
|
|
import (
|
|
discord_notifier "databasus-backend/internal/features/notifiers/models/discord"
|
|
"databasus-backend/internal/features/notifiers/models/email_notifier"
|
|
slack_notifier "databasus-backend/internal/features/notifiers/models/slack"
|
|
teams_notifier "databasus-backend/internal/features/notifiers/models/teams"
|
|
telegram_notifier "databasus-backend/internal/features/notifiers/models/telegram"
|
|
webhook_notifier "databasus-backend/internal/features/notifiers/models/webhook"
|
|
"databasus-backend/internal/util/encryption"
|
|
"errors"
|
|
"log/slog"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type Notifier struct {
|
|
ID uuid.UUID `json:"id" gorm:"column:id;primaryKey;type:uuid;default:gen_random_uuid()"`
|
|
WorkspaceID uuid.UUID `json:"workspaceId" gorm:"column:workspace_id;not null;type:uuid;index"`
|
|
Name string `json:"name" gorm:"column:name;not null;type:varchar(255)"`
|
|
NotifierType NotifierType `json:"notifierType" gorm:"column:notifier_type;not null;type:varchar(50)"`
|
|
LastSendError *string `json:"lastSendError" gorm:"column:last_send_error;type:text"`
|
|
|
|
// specific notifier
|
|
TelegramNotifier *telegram_notifier.TelegramNotifier `json:"telegramNotifier" gorm:"foreignKey:NotifierID"`
|
|
EmailNotifier *email_notifier.EmailNotifier `json:"emailNotifier" gorm:"foreignKey:NotifierID"`
|
|
WebhookNotifier *webhook_notifier.WebhookNotifier `json:"webhookNotifier" gorm:"foreignKey:NotifierID"`
|
|
SlackNotifier *slack_notifier.SlackNotifier `json:"slackNotifier" gorm:"foreignKey:NotifierID"`
|
|
DiscordNotifier *discord_notifier.DiscordNotifier `json:"discordNotifier" gorm:"foreignKey:NotifierID"`
|
|
TeamsNotifier *teams_notifier.TeamsNotifier `json:"teamsNotifier,omitempty" gorm:"foreignKey:NotifierID;constraint:OnDelete:CASCADE"`
|
|
}
|
|
|
|
func (n *Notifier) TableName() string {
|
|
return "notifiers"
|
|
}
|
|
|
|
func (n *Notifier) Validate(encryptor encryption.FieldEncryptor) error {
|
|
if n.Name == "" {
|
|
return errors.New("name is required")
|
|
}
|
|
|
|
return n.getSpecificNotifier().Validate(encryptor)
|
|
}
|
|
|
|
func (n *Notifier) Send(
|
|
encryptor encryption.FieldEncryptor,
|
|
logger *slog.Logger,
|
|
heading string,
|
|
message string,
|
|
) error {
|
|
err := n.getSpecificNotifier().Send(encryptor, logger, heading, message)
|
|
|
|
if err != nil {
|
|
lastSendError := err.Error()
|
|
n.LastSendError = &lastSendError
|
|
} else {
|
|
n.LastSendError = nil
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func (n *Notifier) HideSensitiveData() {
|
|
n.getSpecificNotifier().HideSensitiveData()
|
|
}
|
|
|
|
func (n *Notifier) EncryptSensitiveData(encryptor encryption.FieldEncryptor) error {
|
|
return n.getSpecificNotifier().EncryptSensitiveData(encryptor)
|
|
}
|
|
|
|
func (n *Notifier) Update(incoming *Notifier) {
|
|
n.Name = incoming.Name
|
|
n.NotifierType = incoming.NotifierType
|
|
|
|
switch n.NotifierType {
|
|
case NotifierTypeTelegram:
|
|
if n.TelegramNotifier != nil && incoming.TelegramNotifier != nil {
|
|
n.TelegramNotifier.Update(incoming.TelegramNotifier)
|
|
}
|
|
case NotifierTypeEmail:
|
|
if n.EmailNotifier != nil && incoming.EmailNotifier != nil {
|
|
n.EmailNotifier.Update(incoming.EmailNotifier)
|
|
}
|
|
case NotifierTypeWebhook:
|
|
if n.WebhookNotifier != nil && incoming.WebhookNotifier != nil {
|
|
n.WebhookNotifier.Update(incoming.WebhookNotifier)
|
|
}
|
|
case NotifierTypeSlack:
|
|
if n.SlackNotifier != nil && incoming.SlackNotifier != nil {
|
|
n.SlackNotifier.Update(incoming.SlackNotifier)
|
|
}
|
|
case NotifierTypeDiscord:
|
|
if n.DiscordNotifier != nil && incoming.DiscordNotifier != nil {
|
|
n.DiscordNotifier.Update(incoming.DiscordNotifier)
|
|
}
|
|
case NotifierTypeTeams:
|
|
if n.TeamsNotifier != nil && incoming.TeamsNotifier != nil {
|
|
n.TeamsNotifier.Update(incoming.TeamsNotifier)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (n *Notifier) getSpecificNotifier() NotificationSender {
|
|
switch n.NotifierType {
|
|
case NotifierTypeTelegram:
|
|
return n.TelegramNotifier
|
|
case NotifierTypeEmail:
|
|
return n.EmailNotifier
|
|
case NotifierTypeWebhook:
|
|
return n.WebhookNotifier
|
|
case NotifierTypeSlack:
|
|
return n.SlackNotifier
|
|
case NotifierTypeDiscord:
|
|
return n.DiscordNotifier
|
|
case NotifierTypeTeams:
|
|
return n.TeamsNotifier
|
|
default:
|
|
panic("unknown notifier type: " + string(n.NotifierType))
|
|
}
|
|
}
|