pull/168/head
hunterlong 2019-04-03 07:23:21 -07:00
parent 5e22c6a17a
commit 76168ce436
7 changed files with 5820 additions and 323 deletions

241
Gopkg.lock generated
View File

@ -1,241 +0,0 @@
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
[[projects]]
branch = "master"
digest = "1:6212ce7f839b40213d1ff75c3df7816c4023faf4d29da630ce1dfdd1ccd5fb02"
name = "github.com/GeertJohan/go.rice"
packages = [
".",
"embedded",
]
pruneopts = "UT"
revision = "0af3f3b09a0a8b391f63ab52ba5ab50f84fabd30"
[[projects]]
digest = "1:f1ec92a2b8473612547f6e13edbc8c8e6cda6c8be9c54b31958aad4a7ccaaa2b"
name = "github.com/ararog/timeago"
packages = ["."]
pruneopts = "UT"
revision = "518814407569bf983ea81e1bf8b550dd4e7b34f3"
version = "0.0.1"
[[projects]]
digest = "1:86b9f9c54fcddec313009ef19073bf0124bbdae3701080c32f67c0c8817b3b7c"
name = "github.com/daaku/go.zipexe"
packages = ["."]
pruneopts = "UT"
revision = "db7cf2ba330f8c2d28b827826e33d6628ea7e9e0"
version = "v1.0.0"
[[projects]]
digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec"
name = "github.com/davecgh/go-spew"
packages = ["spew"]
pruneopts = "UT"
revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
version = "v1.1.1"
[[projects]]
digest = "1:3806f369b846160fcbde19bdcf93790868defe7c58d1bb6bc8d974c5b8f8dc1e"
name = "github.com/go-mail/mail"
packages = ["."]
pruneopts = "UT"
revision = "f59b9b83a4e522098e3d3eb94e6f81850ad6e973"
version = "v2.3.1"
[[projects]]
digest = "1:ec6f9bf5e274c833c911923c9193867f3f18788c461f76f05f62bb1510e0ae65"
name = "github.com/go-sql-driver/mysql"
packages = ["."]
pruneopts = "UT"
revision = "72cd26f257d44c1114970e19afddcd812016007e"
version = "v1.4.1"
[[projects]]
digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96"
name = "github.com/go-yaml/yaml"
packages = ["."]
pruneopts = "UT"
revision = "51d6538a90f86fe93ac480b35f37b2be17fef232"
version = "v2.2.2"
[[projects]]
digest = "1:c79fb010be38a59d657c48c6ba1d003a8aa651fa56b579d959d74573b7dff8e1"
name = "github.com/gorilla/context"
packages = ["."]
pruneopts = "UT"
revision = "08b5f424b9271eedf6f9f0ce86cb9396ed337a42"
version = "v1.1.1"
[[projects]]
digest = "1:ca59b1175189b3f0e9f1793d2c350114be36eaabbe5b9f554b35edee1de50aea"
name = "github.com/gorilla/mux"
packages = ["."]
pruneopts = "UT"
revision = "a7962380ca08b5a188038c69871b8d3fbdf31e89"
version = "v1.7.0"
[[projects]]
digest = "1:e72d1ebb8d395cf9f346fd9cbc652e5ae222dd85e0ac842dc57f175abed6d195"
name = "github.com/gorilla/securecookie"
packages = ["."]
pruneopts = "UT"
revision = "e59506cc896acb7f7bf732d4fdf5e25f7ccd8983"
version = "v1.1.1"
[[projects]]
digest = "1:e5bf52fd66a2e984b57b4c0f2c4ee024ed749a19886246240629998dc0cf31ce"
name = "github.com/gorilla/sessions"
packages = ["."]
pruneopts = "UT"
revision = "f57b7e2d29c6211d16ffa52a0998272f75799030"
version = "v1.1.3"
[[projects]]
digest = "1:ff312c4d510c67954a6fc6a11c9ff72a2b2169584776b7419c7b8c729e2b13ac"
name = "github.com/jinzhu/gorm"
packages = [
".",
"dialects/mysql",
"dialects/postgres",
"dialects/sqlite",
]
pruneopts = "UT"
revision = "472c70caa40267cb89fd8facb07fe6454b578626"
version = "v1.9.2"
[[projects]]
branch = "master"
digest = "1:fd97437fbb6b7dce04132cf06775bd258cce305c44add58eb55ca86c6c325160"
name = "github.com/jinzhu/inflection"
packages = ["."]
pruneopts = "UT"
revision = "04140366298a54a039076d798123ffa108fff46c"
[[projects]]
digest = "1:ecd9aa82687cf31d1585d4ac61d0ba180e42e8a6182b85bd785fcca8dfeefc1b"
name = "github.com/joho/godotenv"
packages = ["."]
pruneopts = "UT"
revision = "23d116af351c84513e1946b527c88823e476be13"
version = "v1.3.0"
[[projects]]
digest = "1:b18ffc558326ebaed3b4a175617f1e12ed4e3f53d6ebfe5ba372a3de16d22278"
name = "github.com/lib/pq"
packages = [
".",
"hstore",
"oid",
]
pruneopts = "UT"
revision = "4ded0e9383f75c197b3a2aaa6d590ac52df6fd79"
version = "v1.0.0"
[[projects]]
digest = "1:4a49346ca45376a2bba679ca0e83bec949d780d4e927931317904bad482943ec"
name = "github.com/mattn/go-sqlite3"
packages = ["."]
pruneopts = "UT"
revision = "c7c4067b79cc51e6dfdcef5c702e74b1e0fa7c75"
version = "v1.10.0"
[[projects]]
digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe"
name = "github.com/pmezard/go-difflib"
packages = ["difflib"]
pruneopts = "UT"
revision = "792786c7400a136282c1664665ae0a8db921c6c2"
version = "v1.0.0"
[[projects]]
branch = "master"
digest = "1:8dd6663207b795abbe94a20d2785c9eb16be59183f5468e8816f98aeda466c7f"
name = "github.com/rendon/testcli"
packages = ["."]
pruneopts = "UT"
revision = "6283090d169f51a2410b4e260341a01c9a4c0ca7"
[[projects]]
digest = "1:9421f6e9e28ef86933e824b5caff441366f2b69bb281085b9dca40e1f27a1602"
name = "github.com/shurcooL/sanitized_anchor_name"
packages = ["."]
pruneopts = "UT"
revision = "7bfe4c7ecddb3666a94b053b422cdd8f5aaa3615"
version = "v1.0.0"
[[projects]]
digest = "1:972c2427413d41a1e06ca4897e8528e5a1622894050e2f527b38ddf0f343f759"
name = "github.com/stretchr/testify"
packages = ["assert"]
pruneopts = "UT"
revision = "ffdc059bfe9ce6a4e144ba849dbedead332c6053"
version = "v1.3.0"
[[projects]]
branch = "master"
digest = "1:9d5b5d543996dd584da1db1e0de1926f3e4c3a8dba0fa2f8db70f3ebee2342e0"
name = "golang.org/x/crypto"
packages = [
"bcrypt",
"blowfish",
]
pruneopts = "UT"
revision = "8dd112bcdc25174059e45e07517d9fc663123347"
[[projects]]
digest = "1:c25289f43ac4a68d88b02245742347c94f1e108c534dda442188015ff80669b3"
name = "google.golang.org/appengine"
packages = ["cloudsql"]
pruneopts = "UT"
revision = "e9657d882bb81064595ca3b56cbe2546bbabf7b1"
version = "v1.4.0"
[[projects]]
branch = "v3"
digest = "1:7388652e2215a3f45d341d58766ed58317971030eb1cbd75f005f96ace8e9196"
name = "gopkg.in/alexcesaro/quotedprintable.v3"
packages = ["."]
pruneopts = "UT"
revision = "2caba252f4dc53eaf6b553000885530023f54623"
[[projects]]
digest = "1:c805e517269b0ba4c21ded5836019ed7d16953d4026cb7d00041d039c7906be9"
name = "gopkg.in/natefinch/lumberjack.v2"
packages = ["."]
pruneopts = "UT"
revision = "a96e63847dc3c67d17befa69c303767e2f84e54f"
version = "v2.1"
[[projects]]
digest = "1:2ee0f15eb0fb04f918db7c2dcf39745f40d69f798ef171610a730e8a56aaa4fd"
name = "gopkg.in/russross/blackfriday.v2"
packages = ["."]
pruneopts = "UT"
revision = "d3b5b032dc8e8927d31a5071b56e14c89f045135"
version = "v2.0.1"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
input-imports = [
"github.com/GeertJohan/go.rice",
"github.com/ararog/timeago",
"github.com/go-mail/mail",
"github.com/go-yaml/yaml",
"github.com/gorilla/mux",
"github.com/gorilla/sessions",
"github.com/jinzhu/gorm",
"github.com/jinzhu/gorm/dialects/mysql",
"github.com/jinzhu/gorm/dialects/postgres",
"github.com/jinzhu/gorm/dialects/sqlite",
"github.com/joho/godotenv",
"github.com/rendon/testcli",
"github.com/stretchr/testify/assert",
"golang.org/x/crypto/bcrypt",
"gopkg.in/natefinch/lumberjack.v2",
"gopkg.in/russross/blackfriday.v2",
]
solver-name = "gps-cdcl"
solver-version = 1

View File

@ -1,82 +0,0 @@
# Gopkg.toml example
#
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
# name = "github.com/user/project"
# version = "1.0.0"
#
# [[constraint]]
# name = "github.com/user/project2"
# branch = "dev"
# source = "github.com/myfork/project2"
#
# [[override]]
# name = "github.com/x/y"
# version = "2.4.0"
#
# [prune]
# non-go = false
# go-tests = true
# unused-packages = true
[[constraint]]
branch = "master"
name = "github.com/GeertJohan/go.rice"
[[constraint]]
name = "github.com/ararog/timeago"
version = "0.0.1"
[[constraint]]
name = "github.com/go-mail/mail"
version = "2.3.1"
[[constraint]]
name = "github.com/go-yaml/yaml"
version = "2.2.2"
[[constraint]]
name = "github.com/gorilla/mux"
version = "1.7.0"
[[constraint]]
name = "github.com/gorilla/sessions"
version = "1.1.3"
[[constraint]]
name = "github.com/jinzhu/gorm"
version = "1.9.2"
[[constraint]]
name = "github.com/joho/godotenv"
version = "1.3.0"
[[constraint]]
branch = "master"
name = "github.com/rendon/testcli"
[[constraint]]
name = "github.com/stretchr/testify"
version = "1.3.0"
[[constraint]]
branch = "master"
name = "golang.org/x/crypto"
[[constraint]]
name = "gopkg.in/natefinch/lumberjack.v2"
version = "2.1.0"
[[constraint]]
name = "gopkg.in/russross/blackfriday.v2"
version = "2.0.1"
[prune]
go-tests = true
unused-packages = true

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,31 @@
# .gqlgen.yml example
#
# Refer to https://gqlgen.com/config/
# for detailed .gqlgen.yml documentation.
schema:
- schema.graphql
exec:
filename: generated.go
model:
filename: models_gen.go
models:
Group:
model: github.com/hunterlong/statping/types.Group
Service:
model: github.com/hunterlong/statping/types.Service
User:
model: github.com/hunterlong/statping/types.User
Failure:
model: github.com/hunterlong/statping/types.Failure
Checkin:
model: github.com/hunterlong/statping/types.Checkin
CheckinHit:
model: github.com/hunterlong/statping/types.CheckinHit
ID:
model:
- github.com/99designs/gqlgen/graphql.Int64
struct_tag: json
resolver:
filename: resolver.go
type: Resolver

View File

@ -0,0 +1,133 @@
package graphql
import (
"context"
"github.com/hunterlong/statping/core"
"github.com/hunterlong/statping/types"
)
// THIS CODE IS A STARTING POINT ONLY. IT WILL NOT BE UPDATED WITH SCHEMA CHANGES.
type Resolver struct{}
func (r *Resolver) Checkin() CheckinResolver {
return &checkinResolver{r}
}
func (r *Resolver) Group() GroupResolver {
return &groupResolver{r}
}
func (r *Resolver) Query() QueryResolver {
return &queryResolver{r}
}
func (r *Resolver) Service() ServiceResolver {
return &serviceResolver{r}
}
func (r *Resolver) User() UserResolver {
return &userResolver{r}
}
type checkinResolver struct{ *Resolver }
func (r *checkinResolver) Service(ctx context.Context, obj *types.Checkin) (*types.Service, error) {
panic("not implemented")
}
func (r *checkinResolver) Failures(ctx context.Context, obj *types.Checkin) ([]*types.Failure, error) {
panic("not implemented")
}
type groupResolver struct{ *Resolver }
func (r *groupResolver) Public(ctx context.Context, obj *types.Group) (bool, error) {
return obj.Public.Bool, nil
}
type queryResolver struct{ *Resolver }
func (r *queryResolver) Group(ctx context.Context, id int64) (*types.Group, error) {
group := core.SelectGroup(id)
return group.Group, nil
}
func (r *queryResolver) Groups(ctx context.Context) ([]*types.Group, error) {
all := core.SelectGroups(true, true)
var objs []*types.Group
for _, v := range all {
objs = append(objs, v.Group)
}
return objs, nil
}
func (r *queryResolver) Checkin(ctx context.Context, id int64) (*types.Checkin, error) {
panic("not implemented")
}
func (r *queryResolver) Checkins(ctx context.Context) ([]*types.Checkin, error) {
panic("not implemented")
}
func (r *queryResolver) User(ctx context.Context, id int64) (*types.User, error) {
user, err := core.SelectUser(id)
return user.User, err
}
func (r *queryResolver) Users(ctx context.Context) ([]*types.User, error) {
all, err := core.SelectAllUsers()
var objs []*types.User
for _, v := range all {
objs = append(objs, v.User)
}
return objs, err
}
type userResolver struct{ *Resolver }
func (r *userResolver) Admin(ctx context.Context, obj *types.User) (bool, error) {
return obj.Admin.Bool, nil
}
type serviceResolver struct{ *Resolver }
func (r *queryResolver) Service(ctx context.Context, id int64) (*types.Service, error) {
service := core.SelectService(id)
return service.Service, nil
}
func (r *queryResolver) Services(ctx context.Context) ([]*types.Service, error) {
all := core.Services()
var objs []*types.Service
for _, v := range all {
objs = append(objs, v.Select())
}
return objs, nil
}
func (r *serviceResolver) Expected(ctx context.Context, obj *types.Service) (string, error) {
return obj.Expected.String, nil
}
func (r *serviceResolver) PostData(ctx context.Context, obj *types.Service) (string, error) {
return obj.PostData.String, nil
}
func (r *serviceResolver) AllowNotifications(ctx context.Context, obj *types.Service) (bool, error) {
return obj.AllowNotifications.Bool, nil
}
func (r *serviceResolver) Public(ctx context.Context, obj *types.Service) (bool, error) {
return obj.Public.Bool, nil
}
func (r *serviceResolver) Headers(ctx context.Context, obj *types.Service) (string, error) {
return obj.Headers.String, nil
}
func (r *serviceResolver) Permalink(ctx context.Context, obj *types.Service) (string, error) {
return obj.Permalink.String, nil
}
func (r *serviceResolver) Online24Hours(ctx context.Context, obj *types.Service) (float64, error) {
return float64(obj.Online24Hours), nil
}
func (r *serviceResolver) Failures(ctx context.Context, obj *types.Service) ([]*types.Failure, error) {
all := obj.Failures
var objs []*types.Failure
for _, v := range all {
objs = append(objs, v.Select())
}
return objs, nil
}
func (r *serviceResolver) Group(ctx context.Context, obj *types.Service) (*types.Group, error) {
group := core.SelectGroup(int64(obj.GroupId))
return group.Group, nil
}

View File

@ -0,0 +1,97 @@
schema {
query: Query
}
type Query {
service(id: ID!): Service
services: [Service]!
group(id: ID!): Group
groups: [Group]!
user(id: ID!): User
users: [User]!
checkin(id: ID!): Checkin
checkins: [Checkin]!
}
type Service {
id: ID!
name: String!
domain: String!
expected: String!
expected_status: Int!
interval: Int!
type: String!
method: String!
post_data: String!
port: Int!
timeout: Int!
order_id: Int!
allow_notifications: Boolean!
public: Boolean!
group: Group!
headers: String!
permalink: String!
online: Boolean!
latency: Float!
ping_time: Float!
online_24_hours: Float!
avg_response: String!
status_code: Int!
last_success: Time!
failures: [Failure]
created_at: Time!
updated_at: Time!
}
type Checkin {
id: ID!
service: Service!
name: String!
interval: Int!
grace: Int!
api_key: String!
failing: Boolean!
last_hit: Time!
failures: [Failure]
hits: [CheckinHit]
created_at: Time!
updated_at: Time!
}
type CheckinHit {
id: ID!
from: String!
created_at: Time!
}
type Group {
id: ID!
name: String!
public: Boolean!
order_id: Int!
created_at: Time!
updated_at: Time!
}
type User {
id: ID!
username: String!
email: String!
api_key: String!
api_secret: String!
admin: Boolean!
created_at: Time!
updated_at: Time!
}
type Failure {
id: ID!
issue: String!
method: String!
method_id: Int!
error_code: Int!
ping: Float!
created_at: Time!
}
scalar Time

View File

@ -17,9 +17,11 @@ package handlers
import (
"fmt"
"github.com/99designs/gqlgen/handler"
"github.com/gorilla/mux"
"github.com/gorilla/sessions"
"github.com/hunterlong/statping/core"
"github.com/hunterlong/statping/handlers/graphql"
"github.com/hunterlong/statping/source"
"github.com/hunterlong/statping/utils"
"net/http"
@ -65,6 +67,9 @@ func Router() *mux.Router {
r.Handle("/logs", authenticated(logsHandler, true))
r.Handle("/logs/line", readOnly(logsLineHandler, true))
// GRAPHQL Route
r.Handle("/graphql", authenticated(handler.GraphQL(graphql.NewExecutableSchema(graphql.Config{Resolvers: &graphql.Resolver{}})), true))
// USER Routes
r.Handle("/users", readOnly(usersHandler, true)).Methods("GET")
r.Handle("/user/{id}", authenticated(usersEditHandler, true)).Methods("GET")