/
handle_incident_list.go
118 lines (108 loc) · 3.03 KB
/
handle_incident_list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package webstatus
import (
"fmt"
"net/http"
"sort"
"strings"
"github.com/spf13/viper"
"github.com/vogtp/som/pkg/core/cfg"
"github.com/vogtp/som/pkg/core/log"
"github.com/vogtp/som/pkg/visualiser/webstatus/db"
"github.com/vogtp/som/pkg/visualiser/webstatus/db/ent/alert"
"github.com/vogtp/som/pkg/visualiser/webstatus/db/ent/incident"
)
const (
incidentListPath = "/incident/list/"
)
type incidentWeb struct {
*db.IncidentSummary
AlertCount int
}
func (s *WebStatus) handleIncidentList(w http.ResponseWriter, r *http.Request) {
sz := ""
name := ""
idx := strings.Index(r.URL.Path, incidentListPath)
if idx > -1 {
name = r.URL.Path[idx+len(incidentListPath):]
for strings.HasSuffix(name, "/") {
name = name[:len(name)-1]
}
sz = strings.ToLower(name)
}
if len(name) < 1 {
name = "All Szenarios"
}
s.log.Debug("incidents requested", log.Szenario, sz)
common := common("SOM Incidents", r)
ctx := r.Context()
q := s.Ent().IncidentSummary.Query()
if len(sz) > 0 {
q.Where(incident.NameEqualFold(sz))
}
summary, err := q.All(ctx)
if err != nil {
err = fmt.Errorf("Cannot load incidents from DB:\n %v", err)
s.log.Error("Failed loading incident list", log.Error, err)
s.Error(w, r, "Database error incident list", err, http.StatusInternalServerError)
return
}
szenarios, err := s.Ent().Incident.Szenarios(ctx)
if err != nil {
s.log.Warn("Cannot get list of szenarios", log.Error, err)
if szenarios == nil {
szenarios = make([]string, 0)
}
}
var data = struct {
*commonData
PromURL string
Timeformat string
IncidentListPath string
IncidentDetailPath string
Incidents []incidentWeb
Szenarios []string
FilterName string
}{
commonData: common,
FilterName: name,
PromURL: fmt.Sprintf("%v/%v", viper.GetString(cfg.PromURL), viper.GetString(cfg.PromBasePath)),
Timeformat: cfg.TimeFormatString,
IncidentListPath: incidentListPath,
IncidentDetailPath: IncidentDetailPath,
Szenarios: szenarios,
}
filtered := make([]incidentWeb, 0)
for _, sum := range summary {
if sum.Start.Time().After(data.DatePicker.End) {
continue
}
if !sum.End.IsZero() && sum.End.Time().Before(data.DatePicker.Start) {
continue
}
sumWeb := incidentWeb{
IncidentSummary: sum,
AlertCount: 0,
}
if cnt, err := s.dbAccess.Alert.Query().Where(alert.IncidentIDEQ(sum.IncidentID)).Count(ctx); err == nil {
sumWeb.AlertCount = cnt
} else {
s.log.Warn("Cannot get alert count", log.Error, err)
}
filtered = append(filtered, sumWeb)
}
sort.Slice(filtered, func(i, j int) bool {
if filtered[i].End.IsZero() && filtered[j].End.IsZero() {
return filtered[i].Start.After(filtered[j].Start)
}
if filtered[i].End.IsZero() {
return true
}
if filtered[j].End.IsZero() {
return false
}
return filtered[i].Start.After(filtered[j].Start)
})
data.Incidents = filtered
common.Title = fmt.Sprintf("SOM Incidents: %s (%v)", name, len(data.Incidents))
s.render(w, r, "incident_list.gohtml", data)
}