You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
statping/handlers/services.go

319 lines
6.5 KiB

package handlers
import (
"github.com/gorilla/mux"
"github.com/statping/statping/database"
"github.com/statping/statping/types/errors"
"github.com/statping/statping/types/failures"
"github.com/statping/statping/types/hits"
"github.com/statping/statping/types/services"
"github.com/statping/statping/utils"
"net/http"
)
type serviceOrder struct {
Id int64 `json:"service"`
Order int `json:"order"`
}
func findService(r *http.Request) (*services.Service, error) {
vars := mux.Vars(r)
id := utils.ToInt(vars["id"])
servicer, err := services.Find(id)
if err != nil {
return nil, err
}
if !servicer.Public.Bool && !IsReadAuthenticated(r) {
return nil, errors.NotAuthenticated
}
return servicer, nil
}
func reorderServiceHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var newOrder []*serviceOrder
if err := DecodeJSON(r, &newOrder); err != nil {
sendErrorJson(err, w, r)
return
}
for _, s := range newOrder {
service, err := services.Find(s.Id)
if err != nil {
sendErrorJson(err, w, r)
return
}
service.Order = s.Order
service.Update()
}
returnJson(newOrder, w, r)
}
func apiServiceHandler(r *http.Request) interface{} {
srv, err := findService(r)
if err != nil {
return err
}
srv = srv.UpdateStats()
return *srv
}
func apiCreateServiceHandler(w http.ResponseWriter, r *http.Request) {
var service *services.Service
if err := DecodeJSON(r, &service); err != nil {
sendErrorJson(err, w, r)
return
}
if err := service.Create(); err != nil {
sendErrorJson(err, w, r)
return
}
go services.ServiceCheckQueue(service, true)
sendJsonAction(service, "create", w, r)
}
type servicePatchReq struct {
Online bool `json:"online"`
Issue string `json:"issue,omitempty"`
Latency int64 `json:"latency,omitempty"`
}
func apiServicePatchHandler(w http.ResponseWriter, r *http.Request) {
service, err := findService(r)
if err != nil {
sendErrorJson(err, w, r)
return
}
var req servicePatchReq
if err := DecodeJSON(r, &req); err != nil {
sendErrorJson(err, w, r)
return
}
service.Online = req.Online
service.Latency = req.Latency
issueDefault := "Service was triggered to be offline"
if req.Issue != "" {
issueDefault = req.Issue
}
if !req.Online {
services.RecordFailure(service, issueDefault, "trigger")
} else {
services.RecordSuccess(service)
}
if err := service.Update(); err != nil {
sendErrorJson(err, w, r)
return
}
sendJsonAction(service, "update", w, r)
}
func apiServiceUpdateHandler(w http.ResponseWriter, r *http.Request) {
service, err := findService(r)
if err != nil {
sendErrorJson(err, w, r)
return
}
if err := DecodeJSON(r, &service); err != nil {
sendErrorJson(err, w, r)
return
}
if err := service.Update(); err != nil {
sendErrorJson(err, w, r)
return
}
go service.CheckService(true)
sendJsonAction(service, "update", w, r)
}
func apiServiceDataHandler(w http.ResponseWriter, r *http.Request) {
service, err := findService(r)
if err != nil {
sendErrorJson(err, w, r)
return
}
groupQuery, err := database.ParseQueries(r, service.AllHits())
if err != nil {
sendErrorJson(err, w, r)
return
}
objs, err := groupQuery.GraphData(database.ByAverage("latency", 1000))
if err != nil {
sendErrorJson(err, w, r)
return
}
returnJson(objs, w, r)
}
func apiServiceFailureDataHandler(w http.ResponseWriter, r *http.Request) {
service, err := findService(r)
if err != nil {
sendErrorJson(err, w, r)
return
}
groupQuery, err := database.ParseQueries(r, service.AllFailures())
if err != nil {
sendErrorJson(err, w, r)
return
}
objs, err := groupQuery.GraphData(database.ByCount)
if err != nil {
sendErrorJson(err, w, r)
return
}
returnJson(objs, w, r)
}
func apiServicePingDataHandler(w http.ResponseWriter, r *http.Request) {
service, err := findService(r)
if err != nil {
sendErrorJson(err, w, r)
return
}
groupQuery, err := database.ParseQueries(r, service.AllHits())
if err != nil {
sendErrorJson(err, w, r)
return
}
objs, err := groupQuery.GraphData(database.ByAverage("ping_time", 1000))
if err != nil {
sendErrorJson(err, w, r)
return
}
returnJson(objs, w, r)
}
func apiServiceTimeDataHandler(w http.ResponseWriter, r *http.Request) {
service, err := findService(r)
if err != nil {
sendErrorJson(err, w, r)
return
}
groupHits, err := database.ParseQueries(r, service.AllHits())
if err != nil {
sendErrorJson(err, w, r)
return
}
groupFailures, err := database.ParseQueries(r, service.AllFailures())
if err != nil {
sendErrorJson(err, w, r)
return
}
var allFailures []*failures.Failure
var allHits []*hits.Hit
if err := groupHits.Find(&allHits); err != nil {
sendErrorJson(err, w, r)
return
}
if err := groupFailures.Find(&allFailures); err != nil {
sendErrorJson(err, w, r)
return
}
uptimeData, err := service.UptimeData(allHits, allFailures)
if err != nil {
sendErrorJson(err, w, r)
return
}
returnJson(uptimeData, w, r)
}
func apiServiceHitsDeleteHandler(w http.ResponseWriter, r *http.Request) {
service, err := findService(r)
if err != nil {
sendErrorJson(err, w, r)
return
}
if err := service.AllHits().DeleteAll(); err != nil {
sendErrorJson(err, w, r)
return
}
sendJsonAction(service, "delete", w, r)
}
func apiServiceDeleteHandler(w http.ResponseWriter, r *http.Request) {
service, err := findService(r)
if err != nil {
sendErrorJson(err, w, r)
return
}
err = service.Delete()
if err != nil {
sendErrorJson(err, w, r)
return
}
sendJsonAction(service, "delete", w, r)
}
func apiAllServicesHandler(r *http.Request) interface{} {
var srvs []services.Service
for _, v := range services.AllInOrder() {
if !v.Public.Bool && !IsUser(r) {
continue
}
srvs = append(srvs, v)
}
return srvs
}
func servicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {
service, err := findService(r)
if err != nil {
sendErrorJson(err, w, r)
return
}
if err := service.AllFailures().DeleteAll(); err != nil {
sendErrorJson(err, w, r)
return
}
sendJsonAction(service, "delete_failures", w, r)
}
func apiServiceFailuresHandler(r *http.Request) interface{} {
service, err := findService(r)
if err != nil {
return err
}
var fails []*failures.Failure
query, err := database.ParseQueries(r, service.AllFailures())
if err != nil {
return err
}
query.Find(&fails)
return fails
}
func apiServiceHitsHandler(r *http.Request) interface{} {
service, err := findService(r)
if err != nil {
return err
}
var hts []*hits.Hit
query, err := database.ParseQueries(r, service.AllHits())
if err != nil {
return err
}
query.Find(&hts)
return hts
}