mirror of https://github.com/statping/statping
building
parent
7d097eb16e
commit
c0d76eb891
|
@ -168,8 +168,6 @@ func (c *Checkin) Create() (int64, error) {
|
||||||
log.Warnln(err)
|
log.Warnln(err)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
service := SelectService(c.ServiceId)
|
|
||||||
service.Checkins = append(service.Checkins, c)
|
|
||||||
c.Start()
|
c.Start()
|
||||||
go CheckinRoutine(c)
|
go CheckinRoutine(c)
|
||||||
return c.Id, err
|
return c.Id, err
|
||||||
|
|
|
@ -195,7 +195,7 @@ func insertSampleGroups() error {
|
||||||
func insertSampleCheckins() error {
|
func insertSampleCheckins() error {
|
||||||
s1 := SelectService(1)
|
s1 := SelectService(1)
|
||||||
checkin1 := &types.Checkin{
|
checkin1 := &types.Checkin{
|
||||||
ServiceId: s1.Id,
|
ServiceId: s1.Model().Id,
|
||||||
Interval: 300,
|
Interval: 300,
|
||||||
GracePeriod: 300,
|
GracePeriod: 300,
|
||||||
}
|
}
|
||||||
|
@ -206,7 +206,7 @@ func insertSampleCheckins() error {
|
||||||
|
|
||||||
s2 := SelectService(1)
|
s2 := SelectService(1)
|
||||||
checkin2 := &types.Checkin{
|
checkin2 := &types.Checkin{
|
||||||
ServiceId: s2.Id,
|
ServiceId: s2.Model().Id,
|
||||||
Interval: 900,
|
Interval: 900,
|
||||||
GracePeriod: 300,
|
GracePeriod: 300,
|
||||||
}
|
}
|
||||||
|
@ -240,7 +240,7 @@ func InsertSampleHits() error {
|
||||||
sg.Add(1)
|
sg.Add(1)
|
||||||
service := SelectService(i)
|
service := SelectService(i)
|
||||||
seed := time.Now().UnixNano()
|
seed := time.Now().UnixNano()
|
||||||
log.Infoln(fmt.Sprintf("Adding %v sample hit records to service %v", SampleHits, service.Name))
|
log.Infoln(fmt.Sprintf("Adding %v sample hit records to service %v", SampleHits, service.Model().Name))
|
||||||
createdAt := sampleStart
|
createdAt := sampleStart
|
||||||
p := utils.NewPerlin(2., 2., 10, seed)
|
p := utils.NewPerlin(2., 2., 10, seed)
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -249,7 +249,7 @@ func InsertSampleHits() error {
|
||||||
latency := p.Noise1D(hi / 500)
|
latency := p.Noise1D(hi / 500)
|
||||||
createdAt = createdAt.Add(60 * time.Second)
|
createdAt = createdAt.Add(60 * time.Second)
|
||||||
hit := &types.Hit{
|
hit := &types.Hit{
|
||||||
Service: service.Id,
|
Service: service.Model().Id,
|
||||||
CreatedAt: createdAt,
|
CreatedAt: createdAt,
|
||||||
Latency: latency,
|
Latency: latency,
|
||||||
}
|
}
|
||||||
|
@ -527,14 +527,14 @@ func InsertLargeSampleData() error {
|
||||||
func insertFailureRecords(since time.Time, amount int) {
|
func insertFailureRecords(since time.Time, amount int) {
|
||||||
for i := int64(14); i <= 15; i++ {
|
for i := int64(14); i <= 15; i++ {
|
||||||
service := SelectService(i)
|
service := SelectService(i)
|
||||||
log.Infoln(fmt.Sprintf("Adding %v Failure records to service %v", amount, service.Name))
|
log.Infoln(fmt.Sprintf("Adding %v Failure records to service %v", amount, service.Model().Name))
|
||||||
createdAt := since
|
createdAt := since
|
||||||
|
|
||||||
for fi := 1; fi <= amount; fi++ {
|
for fi := 1; fi <= amount; fi++ {
|
||||||
createdAt = createdAt.Add(2 * time.Minute)
|
createdAt = createdAt.Add(2 * time.Minute)
|
||||||
|
|
||||||
failure := &types.Failure{
|
failure := &types.Failure{
|
||||||
Service: service.Id,
|
Service: service.Model().Id,
|
||||||
Issue: "testing right here",
|
Issue: "testing right here",
|
||||||
CreatedAt: createdAt,
|
CreatedAt: createdAt,
|
||||||
}
|
}
|
||||||
|
@ -548,14 +548,14 @@ func insertFailureRecords(since time.Time, amount int) {
|
||||||
func insertHitRecords(since time.Time, amount int) {
|
func insertHitRecords(since time.Time, amount int) {
|
||||||
for i := int64(1); i <= 15; i++ {
|
for i := int64(1); i <= 15; i++ {
|
||||||
service := SelectService(i)
|
service := SelectService(i)
|
||||||
log.Infoln(fmt.Sprintf("Adding %v hit records to service %v", amount, service.Name))
|
log.Infoln(fmt.Sprintf("Adding %v hit records to service %v", amount, service.Model().Name))
|
||||||
createdAt := since
|
createdAt := since
|
||||||
p := utils.NewPerlin(2, 2, 5, time.Now().UnixNano())
|
p := utils.NewPerlin(2, 2, 5, time.Now().UnixNano())
|
||||||
for hi := 1; hi <= amount; hi++ {
|
for hi := 1; hi <= amount; hi++ {
|
||||||
latency := p.Noise1D(float64(hi / 10))
|
latency := p.Noise1D(float64(hi / 10))
|
||||||
createdAt = createdAt.Add(1 * time.Minute)
|
createdAt = createdAt.Add(1 * time.Minute)
|
||||||
hit := &types.Hit{
|
hit := &types.Hit{
|
||||||
Service: service.Id,
|
Service: service.Model().Id,
|
||||||
CreatedAt: createdAt.UTC(),
|
CreatedAt: createdAt.UTC(),
|
||||||
Latency: latency,
|
Latency: latency,
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,11 +35,11 @@ func Services() []database.Servicer {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SelectService returns a *core.Service from in memory
|
// SelectService returns a *core.Service from in memory
|
||||||
func SelectService(id int64) *types.Service {
|
func SelectService(id int64) database.Servicer {
|
||||||
for _, s := range Services() {
|
for _, s := range Services() {
|
||||||
if s.Model().Id == id {
|
if s.Model().Id == id {
|
||||||
fmt.Println("service: ", s.Model())
|
fmt.Println("service: ", s.Model())
|
||||||
return s.Model()
|
return s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -23,6 +23,12 @@ func (f *FailureObj) All() []*types.Failure {
|
||||||
return fails
|
return fails
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AllFailures() int {
|
||||||
|
var amount int
|
||||||
|
database.Failures().Count(&amount)
|
||||||
|
return amount
|
||||||
|
}
|
||||||
|
|
||||||
func (f *FailureObj) DeleteAll() error {
|
func (f *FailureObj) DeleteAll() error {
|
||||||
query := database.Exec(`DELETE FROM failures WHERE service = ?`, f.o.Id)
|
query := database.Exec(`DELETE FROM failures WHERE service = ?`, f.o.Id)
|
||||||
return query.Error()
|
return query.Error()
|
||||||
|
|
|
@ -40,10 +40,7 @@ func apiCheckinHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
out := checkin.Model()
|
out := checkin.Model()
|
||||||
|
returnJson(out, w, r)
|
||||||
out.Hits = checkin.Hits()
|
|
||||||
out.Failures = checkin.Failures(32)
|
|
||||||
returnJson(checkin, w, r)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkinCreateHandler(w http.ResponseWriter, r *http.Request) {
|
func checkinCreateHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -69,8 +66,8 @@ func checkinCreateHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
func checkinHitHandler(w http.ResponseWriter, r *http.Request) {
|
func checkinHitHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
checkin := core.SelectCheckin(vars["api"])
|
checkin, err := database.CheckinByKey(vars["api"])
|
||||||
if checkin == nil {
|
if err != nil {
|
||||||
sendErrorJson(fmt.Errorf("checkin %v was not found", vars["api"]), w, r)
|
sendErrorJson(fmt.Errorf("checkin %v was not found", vars["api"]), w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -81,20 +78,14 @@ func checkinHitHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
From: ip,
|
From: ip,
|
||||||
CreatedAt: utils.Now().UTC(),
|
CreatedAt: utils.Now().UTC(),
|
||||||
}
|
}
|
||||||
checkinHit := core.ReturnCheckinHit(hit)
|
newCheck, err := database.Create(hit)
|
||||||
if checkin.Last() == nil {
|
|
||||||
checkin.Start()
|
|
||||||
go checkin.Routine()
|
|
||||||
}
|
|
||||||
_, err := checkinHit.Create()
|
|
||||||
checkin.Hits = append(checkin.Hits, checkinHit.CheckinHit)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(fmt.Errorf("checkin %v was not found", vars["api"]), w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
checkin.Failing = false
|
checkin.Failing = false
|
||||||
checkin.LastHit = utils.Timezoner(utils.Now().UTC(), core.CoreApp.Timezone)
|
checkin.LastHit = utils.Timezoner(utils.Now().UTC(), core.CoreApp.Timezone)
|
||||||
sendJsonAction(checkinHit, "update", w, r)
|
sendJsonAction(newCheck.Id, "update", w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkinDeleteHandler(w http.ResponseWriter, r *http.Request) {
|
func checkinDeleteHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
|
@ -16,17 +16,14 @@
|
||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/dgrijalva/jwt-go"
|
"github.com/dgrijalva/jwt-go"
|
||||||
"github.com/hunterlong/statping/core"
|
"github.com/hunterlong/statping/core"
|
||||||
"github.com/hunterlong/statping/core/notifier"
|
|
||||||
"github.com/hunterlong/statping/source"
|
"github.com/hunterlong/statping/source"
|
||||||
"github.com/hunterlong/statping/utils"
|
"github.com/hunterlong/statping/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -149,28 +146,28 @@ func logsLineHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func exportHandler(w http.ResponseWriter, r *http.Request) {
|
//func exportHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
var notifiers []*notifier.Notification
|
// var notifiers []*notifier.Notification
|
||||||
for _, v := range core.CoreApp.Notifications {
|
// for _, v := range core.CoreApp.Notifications {
|
||||||
notifier := v.(notifier.Notifier)
|
// notifier := v.(notifier.Notifier)
|
||||||
notifiers = append(notifiers, notifier.Select())
|
// notifiers = append(notifiers, notifier.Select())
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
export, _ := core.ExportSettings()
|
// export, _ := core.ExportSettings()
|
||||||
|
//
|
||||||
mime := http.DetectContentType(export)
|
// mime := http.DetectContentType(export)
|
||||||
fileSize := len(string(export))
|
// fileSize := len(string(export))
|
||||||
|
//
|
||||||
w.Header().Set("Content-Type", mime)
|
// w.Header().Set("Content-Type", mime)
|
||||||
w.Header().Set("Content-Disposition", "attachment; filename=export.json")
|
// w.Header().Set("Content-Disposition", "attachment; filename=export.json")
|
||||||
w.Header().Set("Expires", "0")
|
// w.Header().Set("Expires", "0")
|
||||||
w.Header().Set("Content-Transfer-Encoding", "binary")
|
// w.Header().Set("Content-Transfer-Encoding", "binary")
|
||||||
w.Header().Set("Content-Length", strconv.Itoa(fileSize))
|
// w.Header().Set("Content-Length", strconv.Itoa(fileSize))
|
||||||
w.Header().Set("Content-Control", "private, no-transform, no-store, must-revalidate")
|
// w.Header().Set("Content-Control", "private, no-transform, no-store, must-revalidate")
|
||||||
|
//
|
||||||
http.ServeContent(w, r, "export.json", utils.Now(), bytes.NewReader(export))
|
// http.ServeContent(w, r, "export.json", utils.Now(), bytes.NewReader(export))
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
|
|
||||||
type JwtClaim struct {
|
type JwtClaim struct {
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
|
|
|
@ -20,7 +20,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/hunterlong/statping/core"
|
"github.com/hunterlong/statping/core"
|
||||||
"github.com/hunterlong/statping/types"
|
"github.com/hunterlong/statping/database"
|
||||||
"github.com/hunterlong/statping/utils"
|
"github.com/hunterlong/statping/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
@ -29,15 +29,7 @@ import (
|
||||||
func apiAllGroupHandler(r *http.Request) interface{} {
|
func apiAllGroupHandler(r *http.Request) interface{} {
|
||||||
auth, admin := IsUser(r), IsAdmin(r)
|
auth, admin := IsUser(r), IsAdmin(r)
|
||||||
groups := core.SelectGroups(admin, auth)
|
groups := core.SelectGroups(admin, auth)
|
||||||
return joinGroups(groups)
|
return groups
|
||||||
}
|
|
||||||
|
|
||||||
func joinGroups(groups []*core.Group) []*types.Group {
|
|
||||||
var g []*types.Group
|
|
||||||
for _, v := range groups {
|
|
||||||
g = append(g, v.Group)
|
|
||||||
}
|
|
||||||
return g
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// apiGroupHandler will show a single group
|
// apiGroupHandler will show a single group
|
||||||
|
@ -61,7 +53,7 @@ func apiGroupUpdateHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
decoder := json.NewDecoder(r.Body)
|
decoder := json.NewDecoder(r.Body)
|
||||||
decoder.Decode(&group)
|
decoder.Decode(&group)
|
||||||
_, err := group.Update()
|
err := database.Update(group)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
|
@ -78,7 +70,7 @@ func apiCreateGroupHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, err = group.Create()
|
_, err = database.Create(group)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
|
@ -94,7 +86,7 @@ func apiGroupDeleteHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
sendErrorJson(errors.New("group not found"), w, r)
|
sendErrorJson(errors.New("group not found"), w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err := group.Delete()
|
err := database.Delete(group)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
|
@ -115,7 +107,7 @@ func apiGroupReorderHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
for _, g := range newOrder {
|
for _, g := range newOrder {
|
||||||
group := core.SelectGroup(g.Id)
|
group := core.SelectGroup(g.Id)
|
||||||
group.Order = g.Order
|
group.Order = g.Order
|
||||||
group.Update()
|
database.Update(group)
|
||||||
}
|
}
|
||||||
returnJson(newOrder, w, r)
|
returnJson(newOrder, w, r)
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ package handlers
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/hunterlong/statping/core"
|
"github.com/hunterlong/statping/core"
|
||||||
|
"github.com/hunterlong/statping/database"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
@ -34,11 +35,12 @@ import (
|
||||||
|
|
||||||
func prometheusHandler(w http.ResponseWriter, r *http.Request) {
|
func prometheusHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
metrics := []string{}
|
metrics := []string{}
|
||||||
system := fmt.Sprintf("statping_total_failures %v\n", core.CountFailures())
|
allFails := database.AllFailures()
|
||||||
system += fmt.Sprintf("statping_total_services %v", len(core.CoreApp.Services))
|
system := fmt.Sprintf("statping_total_failures %v\n", allFails)
|
||||||
|
system += fmt.Sprintf("statping_total_services %v", len(core.Services()))
|
||||||
metrics = append(metrics, system)
|
metrics = append(metrics, system)
|
||||||
for _, ser := range core.CoreApp.Services {
|
for _, ser := range core.Services() {
|
||||||
v := ser.Select()
|
v := ser.Model()
|
||||||
online := 1
|
online := 1
|
||||||
if !v.Online {
|
if !v.Online {
|
||||||
online = 0
|
online = 0
|
||||||
|
|
|
@ -115,7 +115,6 @@ func Router() *mux.Router {
|
||||||
// API SERVICE Routes
|
// API SERVICE Routes
|
||||||
api.Handle("/api/services", scoped(apiAllServicesHandler)).Methods("GET")
|
api.Handle("/api/services", scoped(apiAllServicesHandler)).Methods("GET")
|
||||||
api.Handle("/api/services", authenticated(apiCreateServiceHandler, false)).Methods("POST")
|
api.Handle("/api/services", authenticated(apiCreateServiceHandler, false)).Methods("POST")
|
||||||
api.Handle("/api/services_test", authenticated(apiTestServiceHandler, false)).Methods("POST")
|
|
||||||
api.Handle("/api/services/{id}", scoped(apiServiceHandler)).Methods("GET")
|
api.Handle("/api/services/{id}", scoped(apiServiceHandler)).Methods("GET")
|
||||||
api.Handle("/api/reorder/services", authenticated(reorderServiceHandler, false)).Methods("POST")
|
api.Handle("/api/reorder/services", authenticated(reorderServiceHandler, false)).Methods("POST")
|
||||||
api.Handle("/api/services/{id}/running", authenticated(apiServiceRunningHandler, false)).Methods("POST")
|
api.Handle("/api/services/{id}/running", authenticated(apiServiceRunningHandler, false)).Methods("POST")
|
||||||
|
@ -129,7 +128,7 @@ func Router() *mux.Router {
|
||||||
api.Handle("/api/services/{id}/hits_data", cached("30s", "application/json", apiServiceDataHandler)).Methods("GET")
|
api.Handle("/api/services/{id}/hits_data", cached("30s", "application/json", apiServiceDataHandler)).Methods("GET")
|
||||||
api.Handle("/api/services/{id}/failure_data", cached("30s", "application/json", apiServiceFailureDataHandler)).Methods("GET")
|
api.Handle("/api/services/{id}/failure_data", cached("30s", "application/json", apiServiceFailureDataHandler)).Methods("GET")
|
||||||
api.Handle("/api/services/{id}/ping_data", cached("30s", "application/json", apiServicePingDataHandler)).Methods("GET")
|
api.Handle("/api/services/{id}/ping_data", cached("30s", "application/json", apiServicePingDataHandler)).Methods("GET")
|
||||||
api.Handle("/api/services/{id}/heatmap", cached("30s", "application/json", apiServiceHeatmapHandler)).Methods("GET")
|
//api.Handle("/api/services/{id}/heatmap", cached("30s", "application/json", apiServiceHeatmapHandler)).Methods("GET")
|
||||||
|
|
||||||
// API INCIDENTS Routes
|
// API INCIDENTS Routes
|
||||||
api.Handle("/api/incidents", readOnly(apiAllIncidentsHandler, false)).Methods("GET")
|
api.Handle("/api/incidents", readOnly(apiAllIncidentsHandler, false)).Methods("GET")
|
||||||
|
|
|
@ -18,43 +18,14 @@ package handlers
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/hunterlong/statping/core"
|
"github.com/hunterlong/statping/core"
|
||||||
"github.com/hunterlong/statping/database"
|
"github.com/hunterlong/statping/database"
|
||||||
"github.com/hunterlong/statping/types"
|
"github.com/hunterlong/statping/types"
|
||||||
"github.com/hunterlong/statping/utils"
|
"github.com/hunterlong/statping/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func renderServiceChartsHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
services := core.CoreApp.Services
|
|
||||||
w.Header().Set("Content-Type", "text/javascript")
|
|
||||||
w.Header().Set("Cache-Control", "max-age=60")
|
|
||||||
|
|
||||||
end := utils.Now().UTC()
|
|
||||||
start := utils.Now().Add((-24 * 7) * time.Hour).UTC()
|
|
||||||
var srvs []*core.Service
|
|
||||||
for _, s := range services {
|
|
||||||
srvs = append(srvs, s.(*core.Service))
|
|
||||||
}
|
|
||||||
out := struct {
|
|
||||||
Services []*core.Service
|
|
||||||
Start int64
|
|
||||||
End int64
|
|
||||||
}{srvs, start.Unix(), end.Unix()}
|
|
||||||
|
|
||||||
executeJSResponse(w, r, "charts.js", out)
|
|
||||||
}
|
|
||||||
|
|
||||||
func servicesHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
data := map[string]interface{}{
|
|
||||||
"Services": core.CoreApp.Services,
|
|
||||||
}
|
|
||||||
ExecuteResponse(w, r, "services.gohtml", data, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
type serviceOrder struct {
|
type serviceOrder struct {
|
||||||
Id int64 `json:"service"`
|
Id int64 `json:"service"`
|
||||||
Order int `json:"order"`
|
Order int `json:"order"`
|
||||||
|
@ -66,20 +37,20 @@ func reorderServiceHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
decoder := json.NewDecoder(r.Body)
|
decoder := json.NewDecoder(r.Body)
|
||||||
decoder.Decode(&newOrder)
|
decoder.Decode(&newOrder)
|
||||||
for _, s := range newOrder {
|
for _, s := range newOrder {
|
||||||
service := core.SelectService(s.Id)
|
service := core.SelectService(s.Id).Model()
|
||||||
service.Order = s.Order
|
service.Order = s.Order
|
||||||
service.Update(false)
|
database.Update(service)
|
||||||
}
|
}
|
||||||
returnJson(newOrder, w, r)
|
returnJson(newOrder, w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiServiceHandler(r *http.Request) interface{} {
|
func apiServiceHandler(r *http.Request) interface{} {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
servicer := core.SelectService(utils.ToInt(vars["id"]))
|
servicer := core.SelectService(utils.ToInt(vars["id"])).Model()
|
||||||
if servicer == nil {
|
if servicer == nil {
|
||||||
return errors.New("service not found")
|
return errors.New("service not found")
|
||||||
}
|
}
|
||||||
return *servicer.Select()
|
return *servicer
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiCreateServiceHandler(w http.ResponseWriter, r *http.Request) {
|
func apiCreateServiceHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -90,13 +61,12 @@ func apiCreateServiceHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
newService := core.ReturnService(service)
|
_, err = database.Create(service)
|
||||||
_, err = newService.Create(true)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
sendJsonAction(newService, "create", w, r)
|
sendJsonAction(service, "create", w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiTestServiceHandler(w http.ResponseWriter, r *http.Request) {
|
func apiTestServiceHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -108,13 +78,12 @@ func apiTestServiceHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
newService := core.ReturnService(service)
|
_, err = database.Create(service)
|
||||||
_, err = newService.Create(true)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
sendJsonAction(newService, "create", w, r)
|
sendJsonAction(service, "create", w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiServiceUpdateHandler(w http.ResponseWriter, r *http.Request) {
|
func apiServiceUpdateHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -126,18 +95,19 @@ func apiServiceUpdateHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
decoder := json.NewDecoder(r.Body)
|
decoder := json.NewDecoder(r.Body)
|
||||||
decoder.Decode(&service)
|
decoder.Decode(&service)
|
||||||
err := service.Update(true)
|
err := database.Update(service)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
go service.Check(true)
|
go core.CheckService(service, true)
|
||||||
sendJsonAction(service, "update", w, r)
|
sendJsonAction(service, "update", w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiServiceRunningHandler(w http.ResponseWriter, r *http.Request) {
|
func apiServiceRunningHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
service := core.SelectService(utils.ToInt(vars["id"]))
|
srv := core.SelectService(utils.ToInt(vars["id"]))
|
||||||
|
service := srv.Model()
|
||||||
if service == nil {
|
if service == nil {
|
||||||
sendErrorJson(errors.New("service not found"), w, r)
|
sendErrorJson(errors.New("service not found"), w, r)
|
||||||
return
|
return
|
||||||
|
@ -200,52 +170,6 @@ type dataXyMonth struct {
|
||||||
Data []*dataXy `json:"data"`
|
Data []*dataXy `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiServiceHeatmapHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
vars := mux.Vars(r)
|
|
||||||
service := core.SelectService(utils.ToInt(vars["id"]))
|
|
||||||
if service == nil {
|
|
||||||
sendErrorJson(errors.New("service data not found"), w, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var monthOutput []*dataXyMonth
|
|
||||||
|
|
||||||
start := service.CreatedAt
|
|
||||||
//now := utils.Now()
|
|
||||||
|
|
||||||
sY, sM, _ := start.Date()
|
|
||||||
|
|
||||||
var date time.Time
|
|
||||||
|
|
||||||
month := int(sM)
|
|
||||||
maxMonth := 12
|
|
||||||
|
|
||||||
for year := int(sY); year <= utils.Now().Year(); year++ {
|
|
||||||
|
|
||||||
if year == utils.Now().Year() {
|
|
||||||
maxMonth = int(utils.Now().Month())
|
|
||||||
}
|
|
||||||
|
|
||||||
for m := month; m <= maxMonth; m++ {
|
|
||||||
|
|
||||||
var output []*dataXy
|
|
||||||
|
|
||||||
for day := 1; day <= 31; day++ {
|
|
||||||
date = time.Date(year, time.Month(m), day, 0, 0, 0, 0, time.UTC)
|
|
||||||
failures, _ := service.TotalFailuresOnDate(date)
|
|
||||||
output = append(output, &dataXy{day, int(failures)})
|
|
||||||
}
|
|
||||||
|
|
||||||
thisDate := fmt.Sprintf("%v-%v-01 00:00:00", year, m)
|
|
||||||
monthOutput = append(monthOutput, &dataXyMonth{thisDate, output})
|
|
||||||
}
|
|
||||||
|
|
||||||
month = 1
|
|
||||||
|
|
||||||
}
|
|
||||||
returnJson(monthOutput, w, r)
|
|
||||||
}
|
|
||||||
|
|
||||||
func apiServiceDeleteHandler(w http.ResponseWriter, r *http.Request) {
|
func apiServiceDeleteHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
service := core.SelectService(utils.ToInt(vars["id"]))
|
service := core.SelectService(utils.ToInt(vars["id"]))
|
||||||
|
@ -253,7 +177,7 @@ func apiServiceDeleteHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
sendErrorJson(errors.New("service not found"), w, r)
|
sendErrorJson(errors.New("service not found"), w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err := service.Delete()
|
err := database.Delete(service)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
|
@ -266,23 +190,27 @@ func apiAllServicesHandler(r *http.Request) interface{} {
|
||||||
return joinServices(services)
|
return joinServices(services)
|
||||||
}
|
}
|
||||||
|
|
||||||
func joinServices(srvs []types.ServiceInterface) []*types.Service {
|
func joinServices(srvs []database.Servicer) []*types.Service {
|
||||||
var services []*types.Service
|
var services []*types.Service
|
||||||
for _, v := range srvs {
|
for _, v := range srvs {
|
||||||
services = append(services, v.Select())
|
services = append(services, v.Model())
|
||||||
}
|
}
|
||||||
return services
|
return services
|
||||||
}
|
}
|
||||||
|
|
||||||
func servicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {
|
func servicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
service := core.SelectService(utils.ToInt(vars["id"]))
|
srv, err := database.Service(utils.ToInt(vars["id"]))
|
||||||
if service == nil {
|
if err != nil {
|
||||||
sendErrorJson(errors.New("service not found"), w, r)
|
sendErrorJson(errors.New("service not found"), w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
service.DeleteFailures()
|
err = srv.Failures().DeleteAll()
|
||||||
sendJsonAction(service, "delete_failures", w, r)
|
if err != nil {
|
||||||
|
sendErrorJson(err, w, r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sendJsonAction(srv.Model(), "delete_failures", w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiServiceFailuresHandler(r *http.Request) interface{} {
|
func apiServiceFailuresHandler(r *http.Request) interface{} {
|
||||||
|
|
|
@ -18,6 +18,7 @@ package handlers
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/hunterlong/statping/core"
|
"github.com/hunterlong/statping/core"
|
||||||
|
"github.com/hunterlong/statping/database"
|
||||||
"github.com/hunterlong/statping/types"
|
"github.com/hunterlong/statping/types"
|
||||||
"github.com/hunterlong/statping/utils"
|
"github.com/hunterlong/statping/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -106,13 +107,13 @@ func processSetupHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
admin := core.ReturnUser(&types.User{
|
admin := &types.User{
|
||||||
Username: config.Username,
|
Username: config.Username,
|
||||||
Password: config.Password,
|
Password: config.Password,
|
||||||
Email: config.Email,
|
Email: config.Email,
|
||||||
Admin: types.NewNullBool(true),
|
Admin: types.NewNullBool(true),
|
||||||
})
|
}
|
||||||
admin.Create()
|
database.Create(admin)
|
||||||
|
|
||||||
if sample {
|
if sample {
|
||||||
if err = core.SampleData(); err != nil {
|
if err = core.SampleData(); err != nil {
|
||||||
|
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/hunterlong/statping/core"
|
"github.com/hunterlong/statping/core"
|
||||||
|
"github.com/hunterlong/statping/database"
|
||||||
"github.com/hunterlong/statping/types"
|
"github.com/hunterlong/statping/types"
|
||||||
"github.com/hunterlong/statping/utils"
|
"github.com/hunterlong/statping/utils"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -107,11 +108,10 @@ func apiCreateUsersHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
newUser := core.ReturnUser(user)
|
_, err = database.Create(user)
|
||||||
_, err = newUser.Create()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrorJson(err, w, r)
|
sendErrorJson(err, w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
sendJsonAction(newUser, "create", w, r)
|
sendJsonAction(user, "create", w, r)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue