diff --git a/handlers/downtimes.go b/handlers/downtimes.go index c9f26670..a409b535 100644 --- a/handlers/downtimes.go +++ b/handlers/downtimes.go @@ -93,7 +93,7 @@ func apiAllDowntimesForServiceHandler(w http.ResponseWriter, r *http.Request) { serviceId := utils.ToInt(vars["service_id"]) ninetyDaysAgo := time.Now().Add(time.Duration(-90*24) * time.Hour) - downtime, err := downtimes.FindByService(serviceId, ninetyDaysAgo, time.Now()) + downtime, err := downtimes.FindByServiceAndDuration(serviceId, ninetyDaysAgo, time.Now()) if err != nil { sendErrorJson(err, w, r) return diff --git a/handlers/services.go b/handlers/services.go index e4640de4..3c93d593 100644 --- a/handlers/services.go +++ b/handlers/services.go @@ -545,12 +545,23 @@ func apiAllServicesStatusHandler(w http.ResponseWriter, r *http.Request) { t = query.Get("time") } var srvs []services.ServiceWithDowntime - dtime := findAllDowntimes(t) + servicesList := services.AllInOrder() m := make(map[int64]downtimes.Downtime) - for i := 0; i < len(dtime); i += 1 { - m[dtime[i].ServiceId] = dtime[i] + if t == "" { + for _, v := range servicesList { + if v.Online == false { + downtime := downtimes.FindLatestDowntimeOfService(v.Id) + m[v.Id] = downtime + } + } + } else { + dtime := findAllDowntimes(t) + for i := 0; i < len(dtime); i += 1 { + m[dtime[i].ServiceId] = dtime[i] + } } - for _, v := range services.AllInOrder() { + + for _, v := range servicesList { var serviceDowntimeVar services.ServiceWithDowntime serviceDowntimeVar.Service = v if vv, ok := m[v.Id]; ok == true { diff --git a/types/downtimes/database.go b/types/downtimes/database.go index 0c12c90e..ab4e237f 100644 --- a/types/downtimes/database.go +++ b/types/downtimes/database.go @@ -53,10 +53,10 @@ func (c *Downtime) BeforeUpdate() error { return c.Validate() } -func FindByService(service int64, start time.Time, end time.Time) (*[]Downtime, error) { +func FindByServiceAndDuration(service int64, start time.Time, end time.Time) (*[]Downtime, error) { var downtime []Downtime - q := db.Where("service = ? and start BETWEEN ? AND ? ", service, start, end) - q = q.Order("id ASC ").Find(&downtime) + q := db.Where("service = ? and start BETWEEN ? AND ?", service, start, end) + q = q.Order("id ASC").Find(&downtime) return &downtime, q.Error() } @@ -67,6 +67,13 @@ func FindDowntime(timeVar time.Time) []Downtime { return downtime } +func FindLatestDowntimeOfService(service int64) Downtime { + var downtime Downtime + q := db.Where("service = ?", service) + q = q.Order("start desc").First(&downtime) + return downtime +} + func FindAll(vars map[string]string) (*[]Downtime, error) { var downtime []Downtime var start time.Time diff --git a/types/services/methods.go b/types/services/methods.go index b4ac3be7..78555ef3 100644 --- a/types/services/methods.go +++ b/types/services/methods.go @@ -68,7 +68,7 @@ func (s Service) Duration() time.Duration { func (s Service) DowntimeData(start time.Time, end time.Time) (*UptimeSeries, *[]downtimes.Downtime, error) { - downtimesList, _ := downtimes.FindByService(s.Id, start, end) + downtimesList, _ := downtimes.FindByServiceAndDuration(s.Id, start, end) response := &UptimeSeries{ Start: start,