Files
2026-07-13 12:31:02 +08:00

71 lines
2.1 KiB
Go

package monitoring
import (
"log"
"service-operation/notification"
"service-operation/pocketbase"
)
// NotificationMonitor handles notification logic for the monitoring service
type NotificationMonitor struct {
notifier *notification.ServiceNotifier
lastStatuses map[string]string // Track last known status for each service
}
// NewNotificationMonitor creates a new notification monitor
func NewNotificationMonitor(pbClient *pocketbase.PocketBaseClient) *NotificationMonitor {
return &NotificationMonitor{
notifier: notification.NewServiceNotifier(pbClient),
lastStatuses: make(map[string]string),
}
}
// CheckAndNotify checks if notification should be sent and sends it
func (nm *NotificationMonitor) CheckAndNotify(service pocketbase.Service, currentStatus string) {
// Skip if no notification configured
if service.NotificationID == "" {
return
}
// Get last known status
lastStatus, exists := nm.lastStatuses[service.ID]
// Send notification if:
// 1. This is the first check (no previous status)
// 2. Status has changed
// 3. Service is currently down (always notify for down status)
shouldNotify := !exists || lastStatus != currentStatus || currentStatus == "down"
if shouldNotify {
log.Printf("Sending notification for service %s: %s -> %s", service.Name, lastStatus, currentStatus)
// Send notification using custom method
if err := nm.notifier.NotifyCustom(
service.NotificationID,
service.TemplateID,
service.Name,
currentStatus,
nm.formatStatusMessage(service, currentStatus),
); err != nil {
log.Printf("Failed to send notification: %v", err)
}
}
// Update last known status
nm.lastStatuses[service.ID] = currentStatus
}
// formatStatusMessage creates a formatted message for the status change
func (nm *NotificationMonitor) formatStatusMessage(service pocketbase.Service, status string) string {
switch status {
case "up":
return "Service is now operational"
case "down":
return "Service is currently unavailable"
case "warning":
return "Service is experiencing issues"
default:
return "Service status has changed"
}
}