mirror of https://github.com/statping/statping
parent
30d70cb6ac
commit
ff887d9e51
|
@ -1,6 +1,9 @@
|
||||||
|
# 0.90.19
|
||||||
|
- Fixed private Services from showing in API (/api/services and /api/services/{id})
|
||||||
|
- Removed unused code
|
||||||
|
|
||||||
# 0.90.18
|
# 0.90.18
|
||||||
- Added service type gRPC, you can now check on gRPC services. (limited)
|
- Added service type gRPC, you can now check on gRPC services. (limited)
|
||||||
-
|
|
||||||
|
|
||||||
# 0.90.17
|
# 0.90.17
|
||||||
- Fixed notification fields for frontend
|
- Fixed notification fields for frontend
|
||||||
|
|
|
@ -238,6 +238,8 @@
|
||||||
delete s.online_24_hours
|
delete s.online_24_hours
|
||||||
s.check_interval = parseInt(s.check_interval)
|
s.check_interval = parseInt(s.check_interval)
|
||||||
|
|
||||||
|
window.console.log(s)
|
||||||
|
|
||||||
if (s.id) {
|
if (s.id) {
|
||||||
await this.updateService(s)
|
await this.updateService(s)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -23,10 +23,6 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
serverDomain = "http://localhost:18888"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
dir string
|
dir string
|
||||||
)
|
)
|
||||||
|
@ -180,13 +176,14 @@ func TestMainApiRoutes(t *testing.T) {
|
||||||
// Name: "Prometheus Export Metrics",
|
// Name: "Prometheus Export Metrics",
|
||||||
// URL: "/metrics",
|
// URL: "/metrics",
|
||||||
// Method: "GET",
|
// Method: "GET",
|
||||||
|
// BeforeTest: SetTestENV,
|
||||||
// ExpectedStatus: 200,
|
// ExpectedStatus: 200,
|
||||||
// ExpectedContains: []string{
|
// ExpectedContains: []string{
|
||||||
// `Statping Totals`,
|
// `Statping Totals`,
|
||||||
// `total_failures`,
|
// `total_failures`,
|
||||||
// `Golang Metrics`,
|
// `Golang Metrics`,
|
||||||
// },
|
// },
|
||||||
//}
|
//},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, v := range tests {
|
for _, v := range tests {
|
||||||
|
@ -198,6 +195,26 @@ func TestMainApiRoutes(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//func TestExportSettings(t *testing.T) {
|
||||||
|
// data, err := ExportSettings()
|
||||||
|
// require.Nil(t, err)
|
||||||
|
// assert.Len(t, data, 50)
|
||||||
|
//
|
||||||
|
// var exportData ExportData
|
||||||
|
// err = json.Unmarshal(data, &exportData)
|
||||||
|
// require.Nil(t, err)
|
||||||
|
//
|
||||||
|
// assert.Len(t, exportData.Services, 4)
|
||||||
|
// assert.Len(t, exportData.Messages, 4)
|
||||||
|
// assert.Len(t, exportData.Checkins, 2)
|
||||||
|
// assert.Len(t, exportData.Groups, 1)
|
||||||
|
//
|
||||||
|
// assert.Equal(t, "Updated Core", exportData.Core.Name)
|
||||||
|
// assert.True(t, exportData.Core.Setup)
|
||||||
|
// assert.NotEmpty(t, exportData.Core.ApiKey)
|
||||||
|
// assert.NotEmpty(t, exportData.Core.ApiSecret)
|
||||||
|
//}
|
||||||
|
|
||||||
type HttpFuncTest func(*testing.T) error
|
type HttpFuncTest func(*testing.T) error
|
||||||
|
|
||||||
// HTTPTest contains all the parameters for a HTTP Unit Test
|
// HTTPTest contains all the parameters for a HTTP Unit Test
|
||||||
|
|
|
@ -180,7 +180,7 @@ func removeJwtToken(w http.ResponseWriter) {
|
||||||
http.SetCookie(w, &http.Cookie{
|
http.SetCookie(w, &http.Cookie{
|
||||||
Name: cookieKey,
|
Name: cookieKey,
|
||||||
Value: "",
|
Value: "",
|
||||||
Expires: time.Now().UTC(),
|
Expires: utils.Now(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
package handlers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Error struct {
|
|
||||||
err error
|
|
||||||
code int
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e Error) Error() string {
|
|
||||||
return e.err.Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
NewError = func(e error) Error {
|
|
||||||
return Error{
|
|
||||||
err: e,
|
|
||||||
code: http.StatusInternalServerError,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NotFound = func(err error) Error {
|
|
||||||
return Error{
|
|
||||||
err: errors.Wrap(err, "not found"),
|
|
||||||
code: http.StatusNotFound,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Unauthorized = func(e error) Error {
|
|
||||||
return Error{
|
|
||||||
err: e,
|
|
||||||
code: http.StatusUnauthorized,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func RespondError(w http.ResponseWriter, err Error) {
|
|
||||||
output := apiResponse{
|
|
||||||
Status: "error",
|
|
||||||
Error: err.Error(),
|
|
||||||
}
|
|
||||||
w.Header().Set("Content-Type", "application/json")
|
|
||||||
w.WriteHeader(err.code)
|
|
||||||
json.NewEncoder(w).Encode(output)
|
|
||||||
}
|
|
|
@ -1,7 +1,6 @@
|
||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"github.com/statping/statping/source"
|
"github.com/statping/statping/source"
|
||||||
"github.com/statping/statping/types/core"
|
"github.com/statping/statping/types/core"
|
||||||
"github.com/statping/statping/utils"
|
"github.com/statping/statping/utils"
|
||||||
|
@ -14,56 +13,11 @@ var (
|
||||||
basePath = "/"
|
basePath = "/"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CustomResponseWriter struct {
|
|
||||||
body []byte
|
|
||||||
statusCode int
|
|
||||||
header http.Header
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewCustomResponseWriter() *CustomResponseWriter {
|
|
||||||
return &CustomResponseWriter{
|
|
||||||
header: http.Header{},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *CustomResponseWriter) Header() http.Header {
|
|
||||||
return w.header
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *CustomResponseWriter) Write(b []byte) (int, error) {
|
|
||||||
w.body = b
|
|
||||||
// implement it as per your requirement
|
|
||||||
return 0, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *CustomResponseWriter) WriteHeader(statusCode int) {
|
|
||||||
w.statusCode = statusCode
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseForm(r *http.Request) url.Values {
|
func parseForm(r *http.Request) url.Values {
|
||||||
r.ParseForm()
|
r.ParseForm()
|
||||||
return r.PostForm
|
return r.PostForm
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseGet(r *http.Request) url.Values {
|
|
||||||
r.ParseForm()
|
|
||||||
return r.Form
|
|
||||||
}
|
|
||||||
|
|
||||||
func decodeRequest(r *http.Request, object interface{}) error {
|
|
||||||
decoder := json.NewDecoder(r.Body)
|
|
||||||
defer r.Body.Close()
|
|
||||||
return decoder.Decode(&object)
|
|
||||||
}
|
|
||||||
|
|
||||||
type parsedObject struct {
|
|
||||||
Error Error
|
|
||||||
}
|
|
||||||
|
|
||||||
func serviceFromID(r *http.Request, object interface{}) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var handlerFuncs = func(w http.ResponseWriter, r *http.Request) template.FuncMap {
|
var handlerFuncs = func(w http.ResponseWriter, r *http.Request) template.FuncMap {
|
||||||
return template.FuncMap{
|
return template.FuncMap{
|
||||||
"VERSION": func() string {
|
"VERSION": func() string {
|
||||||
|
|
|
@ -205,10 +205,13 @@ func IsUser(r *http.Request) bool {
|
||||||
if os.Getenv("GO_ENV") == "test" {
|
if os.Getenv("GO_ENV") == "test" {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
_, err := getJwtToken(r)
|
tk, err := getJwtToken(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if err := tk.Valid(); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,11 @@ func sendLog(next http.Handler) http.Handler {
|
||||||
func scoped(handler func(r *http.Request) interface{}) http.Handler {
|
func scoped(handler func(r *http.Request) interface{}) http.Handler {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
data := handler(r)
|
data := handler(r)
|
||||||
|
err, ok := data.(error)
|
||||||
|
if ok {
|
||||||
|
sendErrorJson(err, w, r)
|
||||||
|
return
|
||||||
|
}
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
json.NewEncoder(w).Encode(scope{data: data, scope: ScopeName(r)})
|
json.NewEncoder(w).Encode(scope{data: data, scope: ScopeName(r)})
|
||||||
})
|
})
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
package handlers
|
package handlers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/statping/statping/database"
|
"github.com/statping/statping/database"
|
||||||
|
@ -66,6 +67,10 @@ func apiServiceHandler(r *http.Request) interface{} {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
user := IsUser(r)
|
||||||
|
if !srv.Public.Bool && !user {
|
||||||
|
return errors.New("not authenticated")
|
||||||
|
}
|
||||||
srv = srv.UpdateStats()
|
srv = srv.UpdateStats()
|
||||||
return *srv
|
return *srv
|
||||||
}
|
}
|
||||||
|
@ -203,7 +208,16 @@ func apiServiceDeleteHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiAllServicesHandler(r *http.Request) interface{} {
|
func apiAllServicesHandler(r *http.Request) interface{} {
|
||||||
return services.AllInOrder()
|
user := IsUser(r)
|
||||||
|
fmt.Println("user: ", user)
|
||||||
|
var srvs []services.Service
|
||||||
|
for _, v := range services.AllInOrder() {
|
||||||
|
if !v.Public.Bool && !user {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
srvs = append(srvs, v)
|
||||||
|
}
|
||||||
|
return srvs
|
||||||
}
|
}
|
||||||
|
|
||||||
func servicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {
|
func servicesDeleteFailuresHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
|
@ -39,7 +39,7 @@ func TestApiServiceRoutes(t *testing.T) {
|
||||||
Method: "GET",
|
Method: "GET",
|
||||||
ExpectedContains: []string{`"name":"Google"`},
|
ExpectedContains: []string{`"name":"Google"`},
|
||||||
ExpectedStatus: 200,
|
ExpectedStatus: 200,
|
||||||
ResponseLen: 5,
|
ResponseLen: 4,
|
||||||
BeforeTest: UnsetTestENV,
|
BeforeTest: UnsetTestENV,
|
||||||
FuncTest: func(t *testing.T) error {
|
FuncTest: func(t *testing.T) error {
|
||||||
count := len(services.Services())
|
count := len(services.Services())
|
||||||
|
@ -55,14 +55,15 @@ func TestApiServiceRoutes(t *testing.T) {
|
||||||
Method: "GET",
|
Method: "GET",
|
||||||
ExpectedContains: []string{`"name":"Google"`},
|
ExpectedContains: []string{`"name":"Google"`},
|
||||||
ExpectedStatus: 200,
|
ExpectedStatus: 200,
|
||||||
|
BeforeTest: UnsetTestENV,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "Statping Private Service 1",
|
Name: "Statping Private Service 1",
|
||||||
URL: "/api/services/1",
|
URL: "/api/services/2",
|
||||||
Method: "GET",
|
Method: "GET",
|
||||||
ExpectedContains: []string{`"name":"Google"`},
|
ExpectedContains: []string{`"error":"not authenticated"`},
|
||||||
ExpectedStatus: 200,
|
ExpectedStatus: 200,
|
||||||
BeforeTest: SetTestENV,
|
BeforeTest: UnsetTestENV,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "Statping Service 1 with Private responses",
|
Name: "Statping Service 1 with Private responses",
|
||||||
|
|
|
@ -18,6 +18,7 @@ func Samples() error {
|
||||||
Timeout: 10,
|
Timeout: 10,
|
||||||
Order: 1,
|
Order: 1,
|
||||||
GroupId: 1,
|
GroupId: 1,
|
||||||
|
Public: null.NewNullBool(true),
|
||||||
Permalink: null.NewNullString("google"),
|
Permalink: null.NewNullString("google"),
|
||||||
VerifySSL: null.NewNullBool(true),
|
VerifySSL: null.NewNullBool(true),
|
||||||
NotifyAfter: 3,
|
NotifyAfter: 3,
|
||||||
|
@ -36,6 +37,7 @@ func Samples() error {
|
||||||
Method: "GET",
|
Method: "GET",
|
||||||
Timeout: 20,
|
Timeout: 20,
|
||||||
Order: 2,
|
Order: 2,
|
||||||
|
Public: null.NewNullBool(false),
|
||||||
Permalink: null.NewNullString("statping_github"),
|
Permalink: null.NewNullString("statping_github"),
|
||||||
VerifySSL: null.NewNullBool(true),
|
VerifySSL: null.NewNullBool(true),
|
||||||
NotifyAfter: 1,
|
NotifyAfter: 1,
|
||||||
|
|
|
@ -91,6 +91,12 @@ func TestSaveFile(t *testing.T) {
|
||||||
assert.Nil(t, SaveFile(Directory+"/test.txt", []byte("testing saving a file")))
|
assert.Nil(t, SaveFile(Directory+"/test.txt", []byte("testing saving a file")))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOpenFile(t *testing.T) {
|
||||||
|
f, err := OpenFile(Directory + "/test.txt")
|
||||||
|
require.Nil(t, err)
|
||||||
|
assert.Equal(t, "testing saving a file", f)
|
||||||
|
}
|
||||||
|
|
||||||
func TestFileExists(t *testing.T) {
|
func TestFileExists(t *testing.T) {
|
||||||
assert.True(t, FileExists(Directory+"/test.txt"))
|
assert.True(t, FileExists(Directory+"/test.txt"))
|
||||||
assert.False(t, FileExists(Directory+"fake.txt"))
|
assert.False(t, FileExists(Directory+"fake.txt"))
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
0.90.18
|
0.90.19
|
||||||
|
|
Loading…
Reference in New Issue