hunterlong/statup

View on GitHub
handlers/services.go

Summary

Maintainability
B
6 hrs
Test Coverage
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
}