mirror of https://github.com/statping/statping
165 lines
3.4 KiB
Go
165 lines
3.4 KiB
Go
package handlers
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/gorilla/mux"
|
|
"github.com/statping/statping/types/downtimes"
|
|
"github.com/statping/statping/types/services"
|
|
"github.com/statping/statping/utils"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
func findDowntime(r *http.Request) (*downtimes.Downtime, error) {
|
|
vars := mux.Vars(r)
|
|
id := utils.ToInt(vars["id"])
|
|
downtime, err := downtimes.Find(id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return downtime, nil
|
|
}
|
|
|
|
func apiAllDowntimesForServiceHandler(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
serviceId := utils.ToInt(vars["service_id"])
|
|
|
|
ninetyDaysAgo := time.Now().Add(time.Duration(-90*24) * time.Hour)
|
|
|
|
downtime, err := downtimes.FindByService(serviceId, ninetyDaysAgo, time.Now())
|
|
if err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
sendJsonAction(downtime, "fetch", w, r)
|
|
}
|
|
|
|
func apiCreateDowntimeHandler(w http.ResponseWriter, r *http.Request) {
|
|
var downtime *downtimes.Downtime
|
|
if err := DecodeJSON(r, &downtime); err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
|
|
s, err := services.FindFirstFromDB(downtime.ServiceId)
|
|
if err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
|
|
downtime.Type = "manual"
|
|
downtime.Id = zeroInt64
|
|
|
|
if err := downtime.Create(); err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
|
|
if downtime.End == nil {
|
|
updateFields := map[string]interface{}{
|
|
"online": false,
|
|
"current_downtime": downtime.Id,
|
|
"manual_downtime": true,
|
|
}
|
|
|
|
if err := s.UpdateSpecificFields(updateFields); err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
}
|
|
|
|
sendJsonAction(downtime, "create", w, r)
|
|
}
|
|
|
|
func apiDowntimeHandler(w http.ResponseWriter, r *http.Request) {
|
|
downtime, err := findDowntime(r)
|
|
if downtime == nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
sendJsonAction(downtime, "fetch", w, r)
|
|
}
|
|
|
|
func apiPatchDowntimeHandler(w http.ResponseWriter, r *http.Request) {
|
|
downtime, err := findDowntime(r)
|
|
if err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
var req downtimes.Downtime
|
|
if err := DecodeJSON(r, &req); err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
|
|
s, err := services.FindFirstFromDB(downtime.ServiceId)
|
|
if err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
|
|
if downtime.End != nil && req.End == nil {
|
|
fmt.Errorf("Cannot reopen a downtime!")
|
|
}
|
|
|
|
if downtime.End == nil && req.End != nil {
|
|
updateFields := map[string]interface{}{
|
|
"online": true,
|
|
"failure_counter": 0,
|
|
"current_downtime": 0,
|
|
"manual_downtime": false,
|
|
}
|
|
|
|
if err := s.UpdateSpecificFields(updateFields); err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
}
|
|
|
|
downtime.Start = req.Start
|
|
downtime.End = req.End
|
|
downtime.Type = "manual"
|
|
downtime.Failures = req.Failures
|
|
downtime.SubStatus = req.SubStatus
|
|
|
|
if err := downtime.Update(); err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
|
|
sendJsonAction(downtime, "update", w, r)
|
|
}
|
|
|
|
func apiDeleteDowntimeHandler(w http.ResponseWriter, r *http.Request) {
|
|
downtime, err := findDowntime(r)
|
|
if err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
if downtime.End == nil {
|
|
s2, err := services.FindFirstFromDB(downtime.ServiceId)
|
|
if err != nil {
|
|
fmt.Errorf("Error updating service")
|
|
}
|
|
s2.LastProcessingTime = zeroTime
|
|
s2.Online = true
|
|
s2.FailureCounter = 0
|
|
s2.CurrentDowntime = 0
|
|
s2.ManualDowntime = false
|
|
|
|
if err := s2.Update(); err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
}
|
|
|
|
err = downtime.Delete()
|
|
if err != nil {
|
|
sendErrorJson(err, w, r)
|
|
return
|
|
}
|
|
|
|
sendJsonAction(downtime, "delete", w, r)
|
|
}
|