mirror of
https://github.com/Dvorinka/beszel.git
synced 2026-06-04 13:22:57 +00:00
Initial commit: Beszel fork with Domain Locker integration
This commit is contained in:
@@ -0,0 +1,231 @@
|
||||
package notification
|
||||
|
||||
import "time"
|
||||
|
||||
// Provider types
|
||||
const (
|
||||
ProviderEmail = "email"
|
||||
ProviderWebhook = "webhook"
|
||||
ProviderDiscord = "discord"
|
||||
ProviderSlack = "slack"
|
||||
ProviderTelegram = "telegram"
|
||||
ProviderGotify = "gotify"
|
||||
ProviderPushover = "pushover"
|
||||
)
|
||||
|
||||
// Notification represents a notification provider configuration
|
||||
type Notification struct {
|
||||
ID string `json:"id" db:"id"`
|
||||
Name string `json:"name" db:"name"`
|
||||
Type string `json:"type" db:"type"`
|
||||
IsDefault bool `json:"is_default" db:"is_default"`
|
||||
Settings map[string]interface{} `json:"settings" db:"settings"`
|
||||
UserID string `json:"user" db:"user"`
|
||||
Active bool `json:"active" db:"active"`
|
||||
Created time.Time `json:"created" db:"created"`
|
||||
Updated time.Time `json:"updated" db:"updated"`
|
||||
}
|
||||
|
||||
// MonitorNotification links monitors to notifications
|
||||
type MonitorNotification struct {
|
||||
ID string `json:"id" db:"id"`
|
||||
MonitorID string `json:"monitor" db:"monitor"`
|
||||
NotificationID string `json:"notification" db:"notification"`
|
||||
UserID string `json:"user" db:"user"`
|
||||
Created time.Time `json:"created" db:"created"`
|
||||
}
|
||||
|
||||
// NotificationMessage represents a message to be sent
|
||||
type NotificationMessage struct {
|
||||
Title string
|
||||
Body string
|
||||
MonitorName string
|
||||
MonitorURL string
|
||||
Status string
|
||||
Timestamp time.Time
|
||||
Ping int
|
||||
Message string
|
||||
}
|
||||
|
||||
// EmailSettings for SMTP email notifications
|
||||
type EmailSettings struct {
|
||||
SMTPHost string `json:"smtp_host"`
|
||||
SMTPPort int `json:"smtp_port"`
|
||||
SMTPUser string `json:"smtp_user"`
|
||||
SMTPPassword string `json:"smtp_password"`
|
||||
FromEmail string `json:"from_email"`
|
||||
ToEmail string `json:"to_email"`
|
||||
UseTLS bool `json:"use_tls"`
|
||||
}
|
||||
|
||||
// WebhookSettings for webhook notifications
|
||||
type WebhookSettings struct {
|
||||
URL string `json:"url"`
|
||||
Method string `json:"method"`
|
||||
Headers map[string]string `json:"headers"`
|
||||
BodyTemplate string `json:"body_template"`
|
||||
}
|
||||
|
||||
// DiscordSettings for Discord webhook notifications
|
||||
type DiscordSettings struct {
|
||||
WebhookURL string `json:"webhook_url"`
|
||||
Username string `json:"username"`
|
||||
AvatarURL string `json:"avatar_url"`
|
||||
}
|
||||
|
||||
// SlackSettings for Slack webhook notifications
|
||||
type SlackSettings struct {
|
||||
WebhookURL string `json:"webhook_url"`
|
||||
Channel string `json:"channel"`
|
||||
Username string `json:"username"`
|
||||
}
|
||||
|
||||
// TelegramSettings for Telegram bot notifications
|
||||
type TelegramSettings struct {
|
||||
BotToken string `json:"bot_token"`
|
||||
ChatID string `json:"chat_id"`
|
||||
}
|
||||
|
||||
// GotifySettings for Gotify notifications
|
||||
type GotifySettings struct {
|
||||
ServerURL string `json:"server_url"`
|
||||
AppToken string `json:"app_token"`
|
||||
Priority int `json:"priority"`
|
||||
}
|
||||
|
||||
// PushoverSettings for Pushover notifications
|
||||
type PushoverSettings struct {
|
||||
AppToken string `json:"app_token"`
|
||||
UserKey string `json:"user_key"`
|
||||
Priority int `json:"priority"`
|
||||
Device string `json:"device"`
|
||||
}
|
||||
|
||||
// Provider interface for notification implementations
|
||||
type Provider interface {
|
||||
Send(message *NotificationMessage) error
|
||||
Validate() error
|
||||
}
|
||||
|
||||
// GetSettings returns typed settings based on provider type
|
||||
func (n *Notification) GetSettings() interface{} {
|
||||
switch n.Type {
|
||||
case ProviderEmail:
|
||||
var settings EmailSettings
|
||||
if m, ok := n.Settings["smtp_host"].(string); ok {
|
||||
settings.SMTPHost = m
|
||||
}
|
||||
if m, ok := n.Settings["smtp_port"].(float64); ok {
|
||||
settings.SMTPPort = int(m)
|
||||
}
|
||||
if m, ok := n.Settings["smtp_user"].(string); ok {
|
||||
settings.SMTPUser = m
|
||||
}
|
||||
if m, ok := n.Settings["smtp_password"].(string); ok {
|
||||
settings.SMTPPassword = m
|
||||
}
|
||||
if m, ok := n.Settings["from_email"].(string); ok {
|
||||
settings.FromEmail = m
|
||||
}
|
||||
if m, ok := n.Settings["to_email"].(string); ok {
|
||||
settings.ToEmail = m
|
||||
}
|
||||
if m, ok := n.Settings["use_tls"].(bool); ok {
|
||||
settings.UseTLS = m
|
||||
}
|
||||
return settings
|
||||
case ProviderWebhook:
|
||||
var settings WebhookSettings
|
||||
if m, ok := n.Settings["url"].(string); ok {
|
||||
settings.URL = m
|
||||
}
|
||||
if m, ok := n.Settings["method"].(string); ok {
|
||||
settings.Method = m
|
||||
}
|
||||
if m, ok := n.Settings["headers"].(map[string]interface{}); ok {
|
||||
settings.Headers = make(map[string]string)
|
||||
for k, v := range m {
|
||||
if s, ok := v.(string); ok {
|
||||
settings.Headers[k] = s
|
||||
}
|
||||
}
|
||||
}
|
||||
if m, ok := n.Settings["body_template"].(string); ok {
|
||||
settings.BodyTemplate = m
|
||||
}
|
||||
return settings
|
||||
case ProviderDiscord:
|
||||
var settings DiscordSettings
|
||||
if m, ok := n.Settings["webhook_url"].(string); ok {
|
||||
settings.WebhookURL = m
|
||||
}
|
||||
if m, ok := n.Settings["username"].(string); ok {
|
||||
settings.Username = m
|
||||
}
|
||||
if m, ok := n.Settings["avatar_url"].(string); ok {
|
||||
settings.AvatarURL = m
|
||||
}
|
||||
return settings
|
||||
case ProviderSlack:
|
||||
var settings SlackSettings
|
||||
if m, ok := n.Settings["webhook_url"].(string); ok {
|
||||
settings.WebhookURL = m
|
||||
}
|
||||
if m, ok := n.Settings["channel"].(string); ok {
|
||||
settings.Channel = m
|
||||
}
|
||||
if m, ok := n.Settings["username"].(string); ok {
|
||||
settings.Username = m
|
||||
}
|
||||
return settings
|
||||
case ProviderTelegram:
|
||||
var settings TelegramSettings
|
||||
if m, ok := n.Settings["bot_token"].(string); ok {
|
||||
settings.BotToken = m
|
||||
}
|
||||
if m, ok := n.Settings["chat_id"].(string); ok {
|
||||
settings.ChatID = m
|
||||
}
|
||||
return settings
|
||||
case ProviderGotify:
|
||||
var settings GotifySettings
|
||||
if m, ok := n.Settings["server_url"].(string); ok {
|
||||
settings.ServerURL = m
|
||||
}
|
||||
if m, ok := n.Settings["app_token"].(string); ok {
|
||||
settings.AppToken = m
|
||||
}
|
||||
if m, ok := n.Settings["priority"].(float64); ok {
|
||||
settings.Priority = int(m)
|
||||
}
|
||||
return settings
|
||||
case ProviderPushover:
|
||||
var settings PushoverSettings
|
||||
if m, ok := n.Settings["app_token"].(string); ok {
|
||||
settings.AppToken = m
|
||||
}
|
||||
if m, ok := n.Settings["user_key"].(string); ok {
|
||||
settings.UserKey = m
|
||||
}
|
||||
if m, ok := n.Settings["priority"].(float64); ok {
|
||||
settings.Priority = int(m)
|
||||
}
|
||||
if m, ok := n.Settings["device"].(string); ok {
|
||||
settings.Device = m
|
||||
}
|
||||
return settings
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// NotificationEvent represents a notification sent event
|
||||
type NotificationEvent struct {
|
||||
ID string `json:"id" db:"id"`
|
||||
NotificationID string `json:"notification" db:"notification"`
|
||||
MonitorID string `json:"monitor" db:"monitor"`
|
||||
Status string `json:"status" db:"status"`
|
||||
Message string `json:"message" db:"message"`
|
||||
SentAt time.Time `json:"sent_at" db:"sent_at"`
|
||||
Error string `json:"error" db:"error"`
|
||||
}
|
||||
Reference in New Issue
Block a user