Files
yovision/Bell/server/app/bell/evaluation/service.go
T

51 lines
1.5 KiB
Go

package evaluation
import (
"context"
"errors"
"github.com/google/uuid"
"gorm.io/gorm"
)
var ErrEventNotFound = errors.New("事件不存在")
type EventResults struct {
Evaluations []Evaluation `json:"evaluations"`
Alerts []AlertLink `json:"alerts"`
}
type AlertLink struct {
ID string `json:"id"`
Summary string `json:"summary"`
Status string `json:"status"`
Severity string `json:"severity"`
Location string `json:"location"`
}
type Service struct{ DB *gorm.DB }
func NewService(db *gorm.DB) Service { return Service{DB: db} }
func (s Service) ForEvent(ctx context.Context, eventID string) (EventResults, error) {
if _, err := uuid.Parse(eventID); err != nil {
return EventResults{}, ErrEventNotFound
}
var count int64
if err := s.DB.WithContext(ctx).Table("bell_events").Where("id = ?", eventID).Count(&count).Error; err != nil {
return EventResults{}, err
}
if count == 0 {
return EventResults{}, ErrEventNotFound
}
result := EventResults{Evaluations: make([]Evaluation, 0), Alerts: make([]AlertLink, 0)}
if err := s.DB.WithContext(ctx).Where("event_id = ?", eventID).Order("evaluated_at, rule_id").Find(&result.Evaluations).Error; err != nil {
return EventResults{}, err
}
err := s.DB.WithContext(ctx).Table("bell_alerts a").
Select("a.id, a.summary, a.status, a.severity, a.location").
Joins("JOIN bell_alert_events ae ON ae.alert_id = a.id").
Where("ae.event_id = ?", eventID).Order("a.created_at, a.id").Scan(&result.Alerts).Error
return result, err
}