Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
162ccf6bfb | ||
|
|
7e3dc49635 |
@@ -10,14 +10,12 @@ import (
|
||||
|
||||
"git.aiterp.net/rpdata/api/graph2"
|
||||
"git.aiterp.net/rpdata/api/internal/auth"
|
||||
"git.aiterp.net/rpdata/api/internal/instrumentation"
|
||||
"git.aiterp.net/rpdata/api/internal/loader"
|
||||
"git.aiterp.net/rpdata/api/internal/store"
|
||||
"git.aiterp.net/rpdata/api/models"
|
||||
"git.aiterp.net/rpdata/api/models/changes"
|
||||
"git.aiterp.net/rpdata/api/models/logs"
|
||||
"github.com/99designs/gqlgen/handler"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -26,13 +24,9 @@ func main() {
|
||||
log.Fatalln("Failed to init store:", err)
|
||||
}
|
||||
|
||||
instrumentation.Register()
|
||||
|
||||
http.Handle("/", handler.Playground("RPData API", "/graphql"))
|
||||
http.Handle("/graphql", queryHandler())
|
||||
|
||||
http.Handle("/metrics", promhttp.Handler())
|
||||
|
||||
go func() {
|
||||
err := logs.RunFullUpdate()
|
||||
if err != nil {
|
||||
@@ -87,8 +81,6 @@ func queryHandler() http.HandlerFunc {
|
||||
return fmt.Errorf("The server failed to serve your request due to an internal error, it has been logged")
|
||||
}),
|
||||
handler.ComplexityLimit(300),
|
||||
handler.RequestMiddleware(instrumentation.RequestMiddleware()),
|
||||
handler.ResolverMiddleware(instrumentation.ResolverMiddleware()),
|
||||
)
|
||||
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
@@ -3,16 +3,14 @@ module git.aiterp.net/rpdata/api
|
||||
go 1.12
|
||||
|
||||
require (
|
||||
github.com/99designs/gqlgen v0.9.0
|
||||
github.com/99designs/gqlgen v0.8.0
|
||||
github.com/agnivade/levenshtein v1.0.1
|
||||
github.com/beorn7/perks v1.0.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4
|
||||
github.com/globalsign/mgo v0.0.0-20180403085842-f76e4f9da92e
|
||||
github.com/go-ini/ini v1.35.0
|
||||
github.com/go-sql-driver/mysql v1.4.0
|
||||
github.com/golang/protobuf v1.3.1 // indirect
|
||||
github.com/gorilla/websocket v1.4.0
|
||||
github.com/graph-gophers/dataloader v0.0.0-20180104184831-78139374585c
|
||||
github.com/hashicorp/golang-lru v0.5.0
|
||||
@@ -22,21 +20,15 @@ require (
|
||||
github.com/opentracing/opentracing-go v1.0.2
|
||||
github.com/pkg/errors v0.8.1
|
||||
github.com/pmezard/go-difflib v1.0.0
|
||||
github.com/prometheus/client_golang v0.9.1
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 // indirect
|
||||
github.com/prometheus/common v0.4.0 // indirect
|
||||
github.com/prometheus/procfs v0.0.0-20190517135640-51af30a78b0e // indirect
|
||||
github.com/sirupsen/logrus v1.2.0
|
||||
github.com/sirupsen/logrus v1.0.5
|
||||
github.com/stretchr/testify v1.3.0
|
||||
github.com/urfave/cli v1.20.0
|
||||
github.com/vektah/gqlparser v1.1.2
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
|
||||
golang.org/x/net v0.0.0-20190514140710-3ec191127204
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a
|
||||
github.com/vektah/gqlparser v1.1.0
|
||||
golang.org/x/crypto v0.0.0-20180411161317-d6449816ce06
|
||||
golang.org/x/net v0.0.0-20180416171110-a35a21de978d
|
||||
golang.org/x/sys v0.0.0-20180416112224-2f57af4873d0
|
||||
golang.org/x/text v0.3.0
|
||||
golang.org/x/tools v0.0.0-20190515012406-7d7faa4812bd
|
||||
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6
|
||||
google.golang.org/appengine v1.1.0
|
||||
gopkg.in/yaml.v2 v2.2.2
|
||||
)
|
||||
|
||||
replace golang.org/x/net => golang.org/x/net v0.0.0-20180416171110-a35a21de978d
|
||||
|
||||
@@ -4,42 +4,24 @@ github.com/99designs/gqlgen v0.8.0 h1:ZBteuSgeeFwn+mztjDqQZQdVa9pqslmPnDeCovcnc0
|
||||
github.com/99designs/gqlgen v0.8.0/go.mod h1:st7qHA6ssU3uRZkmv+wzrzgX4srvIqEIdE5iuRW8GhE=
|
||||
github.com/99designs/gqlgen v0.8.3 h1:I6bMglXNKkn4KlvkSMzqZw53e1N2FF9Gud4NmsOxqiA=
|
||||
github.com/99designs/gqlgen v0.8.3/go.mod h1:aLyJw9xUgdJxZ8EqNQxo2pGFhXXJ/hq8t7J4yn8TgI4=
|
||||
github.com/99designs/gqlgen v0.9.0 h1:g1arBPML74Vqv0L3Q+TqIhGXLspV+2MYtRLkBxuZrlE=
|
||||
github.com/99designs/gqlgen v0.9.0/go.mod h1:HrrG7ic9EgLPsULxsZh/Ti+p0HNWgR3XRuvnD0pb5KY=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/agnivade/levenshtein v1.0.0 h1:q+77q31bLT5jhN3BHKA1276nUEdbz7XjDa0o5dRKcZ0=
|
||||
github.com/agnivade/levenshtein v1.0.0/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
|
||||
github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ=
|
||||
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||
github.com/globalsign/mgo v0.0.0-20180403085842-f76e4f9da92e h1:hmrbHva/wKD6X4M7pgHVbg/KfVV1wwgr1NEkQaVD3rU=
|
||||
github.com/globalsign/mgo v0.0.0-20180403085842-f76e4f9da92e/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
|
||||
github.com/go-chi/chi v3.3.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
|
||||
github.com/go-ini/ini v1.35.0 h1:D/my3+xOfqZMkJpciRcyqU7XMBUgiZa9qXjZIa8uv2k=
|
||||
github.com/go-ini/ini v1.35.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=
|
||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/mux v1.6.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
@@ -51,21 +33,14 @@ github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCO
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/jmoiron/sqlx v0.0.0-20180614180643-0dae4fefe7c0 h1:5B0uxl2lzNRVkJVg+uGHxWtRt4C0Wjc6kJKo5XYx8xE=
|
||||
github.com/jmoiron/sqlx v0.0.0-20180614180643-0dae4fefe7c0/go.mod h1:IiEW3SEiiErVyFdH8NTuWjSifiEQKUoyK3LNqr2kCHU=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/minio/minio-go v0.0.0-20180409193742-3d2d02921f05 h1:YEyFCqmHcmbcTLqZ7yEAg7VIUat6PuDzGbIctZy888k=
|
||||
github.com/minio/minio-go v0.0.0-20180409193742-3d2d02921f05/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8=
|
||||
github.com/mitchellh/go-homedir v0.0.0-20161203194507-b8bc1bf76747 h1:eQox4Rh4ewJF+mqYPxCkmBAirRnPaHEB26UkNuPyjlk=
|
||||
github.com/mitchellh/go-homedir v0.0.0-20161203194507-b8bc1bf76747/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/mapstructure v0.0.0-20180203102830-a4e142e9c047/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
||||
github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg=
|
||||
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||
@@ -74,38 +49,18 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v0.9.1 h1:K47Rk0v/fkEfwfQet2KWhscE0cJzjgCCDBG2KHZoVno=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8=
|
||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
|
||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY=
|
||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.0-20190517135640-51af30a78b0e h1:zK8d1aZ+gw/Ne4uMfZTFRxj08PUOp+gGwm4HWUeGI1k=
|
||||
github.com/prometheus/procfs v0.0.0-20190517135640-51af30a78b0e/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
||||
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
|
||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
|
||||
github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
|
||||
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/vektah/dataloaden v0.2.0/go.mod h1:vxM6NuRlgiR0M6wbVTJeKp9vQIs81ZMfCYO+4yq/jbE=
|
||||
github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e/go.mod h1:/HUdMve7rvxZma+2ZELQeNh88+003LL7Pf/CZ089j8U=
|
||||
github.com/vektah/gqlparser v0.0.0-20180831041411-14e83ae06ec1 h1:FYOXUtr3sYR9shto7Q/aQ1B0Onyk77aws9wGOORiz+I=
|
||||
github.com/vektah/gqlparser v0.0.0-20180831041411-14e83ae06ec1/go.mod h1:K4QdSSpS2XiHHwzb18kWh3iBljB8rLC8okGXsnQy3Nc=
|
||||
github.com/vektah/gqlparser v1.1.0 h1:3668p2gUlO+PiS81x957Rpr3/FPRWG6cxgCXAvTS1hw=
|
||||
@@ -114,37 +69,17 @@ github.com/vektah/gqlparser v1.1.2 h1:ZsyLGn7/7jDNI+y4SEhI4yAxRChlv15pUHMjijT+e6
|
||||
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
|
||||
golang.org/x/crypto v0.0.0-20180411161317-d6449816ce06 h1:EOqG0JqGlLr+punVB69jvWCv/ErZKGlC7PMdyHfv+Bc=
|
||||
golang.org/x/crypto v0.0.0-20180411161317-d6449816ce06/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/net v0.0.0-20180404174746-b3c676e531a6/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180416171110-a35a21de978d h1:O2P57H5Cc+d+DJos+iweraI9rmzMYwV+45vkZdDY0Oo=
|
||||
golang.org/x/net v0.0.0-20180416171110-a35a21de978d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a h1:gOpx8G595UYyvj8UK4+OFyY4rx037g3fmfhe5SasG3U=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190514140710-3ec191127204 h1:4yG6GqBtw9C+UrLp6s2wtSniayy/Vd/3F7ffLE427XI=
|
||||
golang.org/x/net v0.0.0-20190514140710-3ec191127204/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180416112224-2f57af4873d0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5 h1:mzjBh+S5frKOsOBobWIMAbXavqjmgO17k/2puhcFR94=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/tools v0.0.0-20180911133044-677d2ff680c1 h1:dzEuQYa6+a3gROnSlgly5ERUm4SZKJt+dh+4iSbO+bI=
|
||||
golang.org/x/tools v0.0.0-20180911133044-677d2ff680c1/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6 h1:iZgcI2DDp6zW5v9Z/5+f0NuqoxNdmzg4hivjk2WLXpY=
|
||||
golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190515012406-7d7faa4812bd h1:oMEQDWVXVNpceQoVd1JN3CQ7LYJJzs5qWqZIUcxXHHw=
|
||||
golang.org/x/tools v0.0.0-20190515012406-7d7faa4812bd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
|
||||
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo "# Generated by stiching together the files under schema/ – DO NOT EDIT" >generated.gql
|
||||
cat schema/root.gql schema/**/*.gql >>generated.gql
|
||||
+1
-3
@@ -1,6 +1,4 @@
|
||||
schema:
|
||||
- schema/root.gql
|
||||
- schema/types/*.gql
|
||||
schema: generated.gql
|
||||
|
||||
exec:
|
||||
filename: generated.go
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
graphql "github.com/99designs/gqlgen/graphql"
|
||||
)
|
||||
|
||||
//go:generate ./combine.sh
|
||||
//go:generate go run github.com/99designs/gqlgen -v
|
||||
|
||||
// New creates a new GraphQL schema.
|
||||
|
||||
@@ -10,31 +10,16 @@ import (
|
||||
|
||||
/// Queries
|
||||
|
||||
func (r *resolver) Changes(ctx context.Context, filter *changes.Filter) ([]*models.Change, error) {
|
||||
changes, err := changes.List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
changes2 := make([]*models.Change, len(changes))
|
||||
for i := range changes {
|
||||
changes2[i] = &changes[i]
|
||||
}
|
||||
|
||||
return changes2, nil
|
||||
func (r *resolver) Changes(ctx context.Context, filter *changes.Filter) ([]models.Change, error) {
|
||||
return changes.List(filter)
|
||||
}
|
||||
|
||||
/// Subscriptions
|
||||
|
||||
func (r *subscriptionResolver) Changes(ctx context.Context, keys []*models.ChangeKey) (<-chan *models.Change, error) {
|
||||
func (r *subscriptionResolver) Changes(ctx context.Context, keys []models.ChangeKey) (<-chan *models.Change, error) {
|
||||
if len(keys) == 0 {
|
||||
return nil, errors.New("At least one key is required for a subscription")
|
||||
}
|
||||
|
||||
keys2 := make([]models.ChangeKey, len(keys))
|
||||
for i := range keys {
|
||||
keys2[i] = *keys[i]
|
||||
}
|
||||
|
||||
return changes.Subscribe(ctx, keys2, false), nil
|
||||
return changes.Subscribe(ctx, keys, false), nil
|
||||
}
|
||||
|
||||
@@ -23,18 +23,8 @@ func (r *resolver) Channel(ctx context.Context, name string) (*models.Channel, e
|
||||
return &channel, nil
|
||||
}
|
||||
|
||||
func (r *resolver) Channels(ctx context.Context, filter *channels.Filter) ([]*models.Channel, error) {
|
||||
channels, err := channels.List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
channels2 := make([]*models.Channel, len(channels))
|
||||
for i := range channels {
|
||||
channels2[i] = &channels[i]
|
||||
}
|
||||
|
||||
return channels2, nil
|
||||
func (r *resolver) Channels(ctx context.Context, filter *channels.Filter) ([]models.Channel, error) {
|
||||
return channels.List(filter)
|
||||
}
|
||||
|
||||
// Mutations
|
||||
|
||||
@@ -36,18 +36,8 @@ func (r *resolver) Character(ctx context.Context, id *string, nick *string) (*mo
|
||||
}
|
||||
}
|
||||
|
||||
func (r *resolver) Characters(ctx context.Context, filter *characters.Filter) ([]*models.Character, error) {
|
||||
characters, err := characters.List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
characters2 := make([]*models.Character, len(characters))
|
||||
for i := range characters {
|
||||
characters2[i] = &characters[i]
|
||||
}
|
||||
|
||||
return characters2, nil
|
||||
func (r *resolver) Characters(ctx context.Context, filter *characters.Filter) ([]models.Character, error) {
|
||||
return characters.List(filter)
|
||||
}
|
||||
|
||||
// Mutations
|
||||
|
||||
+2
-12
@@ -17,7 +17,7 @@ func (r *resolver) File(ctx context.Context, id string) (*models.File, error) {
|
||||
return &file, nil
|
||||
}
|
||||
|
||||
func (r *resolver) Files(ctx context.Context, filter *files.Filter) ([]*models.File, error) {
|
||||
func (r *resolver) Files(ctx context.Context, filter *files.Filter) ([]models.File, error) {
|
||||
token := auth.TokenFromContext(ctx)
|
||||
|
||||
if filter == nil {
|
||||
@@ -33,17 +33,7 @@ func (r *resolver) Files(ctx context.Context, filter *files.Filter) ([]*models.F
|
||||
filter.Public = &trueValue
|
||||
}
|
||||
|
||||
files, err := files.List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
files2 := make([]*models.File, len(files))
|
||||
for i := range files {
|
||||
files2[i] = &files[i]
|
||||
}
|
||||
|
||||
return files2, nil
|
||||
return files.List(filter)
|
||||
}
|
||||
|
||||
var trueValue = true
|
||||
|
||||
+5
-10
@@ -29,7 +29,7 @@ func (r *resolver) Log(ctx context.Context, id string) (*models.Log, error) {
|
||||
return &log, nil
|
||||
}
|
||||
|
||||
func (r *resolver) Logs(ctx context.Context, filter *logs.Filter) ([]*models.Log, error) {
|
||||
func (r *resolver) Logs(ctx context.Context, filter *logs.Filter) ([]models.Log, error) {
|
||||
logs, err := logs.List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -56,12 +56,7 @@ func (r *resolver) Logs(ctx context.Context, filter *logs.Filter) ([]*models.Log
|
||||
}
|
||||
}
|
||||
|
||||
logs2 := make([]*models.Log, len(logs))
|
||||
for i := range logs {
|
||||
logs2[i] = &logs[i]
|
||||
}
|
||||
|
||||
return logs2, nil
|
||||
return logs, nil
|
||||
}
|
||||
|
||||
// Mutations
|
||||
@@ -107,7 +102,7 @@ func (r *mutationResolver) AddLog(ctx context.Context, input input.LogAddInput)
|
||||
return &log, nil
|
||||
}
|
||||
|
||||
func (r *mutationResolver) ImportLog(ctx context.Context, input input.LogImportInput) ([]*models.Log, error) {
|
||||
func (r *mutationResolver) ImportLog(ctx context.Context, input input.LogImportInput) ([]models.Log, error) {
|
||||
token := auth.TokenFromContext(ctx)
|
||||
if !token.Authenticated() || !token.Permitted("log.add") {
|
||||
return nil, errors.New("You are not permitted to add logs")
|
||||
@@ -133,7 +128,7 @@ func (r *mutationResolver) ImportLog(ctx context.Context, input input.LogImportI
|
||||
return nil, err
|
||||
}
|
||||
|
||||
newLogs := make([]*models.Log, 0, len(results))
|
||||
newLogs := make([]models.Log, 0, len(results))
|
||||
for _, result := range results {
|
||||
go func(result logs.ImportedLog) {
|
||||
changes.Submit("Log", "add", token.UserID, true, changekeys.Many(result.Log), result.Log)
|
||||
@@ -145,7 +140,7 @@ func (r *mutationResolver) ImportLog(ctx context.Context, input input.LogImportI
|
||||
log = result.Log
|
||||
}
|
||||
|
||||
newLogs = append(newLogs, &log)
|
||||
newLogs = append(newLogs, log)
|
||||
}
|
||||
|
||||
return newLogs, nil
|
||||
|
||||
+4
-19
@@ -25,7 +25,7 @@ func (r *resolver) Post(ctx context.Context, id string) (*models.Post, error) {
|
||||
return &post, nil
|
||||
}
|
||||
|
||||
func (r *resolver) Posts(ctx context.Context, filter *posts.Filter) ([]*models.Post, error) {
|
||||
func (r *resolver) Posts(ctx context.Context, filter *posts.Filter) ([]models.Post, error) {
|
||||
// Some sanity checks to avoid querying an insame amount of posts.
|
||||
if filter == nil {
|
||||
filter = &posts.Filter{Limit: 256}
|
||||
@@ -43,17 +43,7 @@ func (r *resolver) Posts(ctx context.Context, filter *posts.Filter) ([]*models.P
|
||||
}
|
||||
}
|
||||
|
||||
posts, err := posts.List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
posts2 := make([]*models.Post, len(posts))
|
||||
for i := range posts {
|
||||
posts2[i] = &posts[i]
|
||||
}
|
||||
|
||||
return posts2, nil
|
||||
return posts.List(filter)
|
||||
}
|
||||
|
||||
// Mutation
|
||||
@@ -119,7 +109,7 @@ func (r *mutationResolver) EditPost(ctx context.Context, input input.PostEditInp
|
||||
return &post, nil
|
||||
}
|
||||
|
||||
func (r *mutationResolver) MovePost(ctx context.Context, input input.PostMoveInput) ([]*models.Post, error) {
|
||||
func (r *mutationResolver) MovePost(ctx context.Context, input input.PostMoveInput) ([]models.Post, error) {
|
||||
token := auth.TokenFromContext(ctx)
|
||||
if !token.Authenticated() || !token.Permitted("post.move") {
|
||||
return nil, errors.New("You are not permitted to edit logs")
|
||||
@@ -144,12 +134,7 @@ func (r *mutationResolver) MovePost(ctx context.Context, input input.PostMoveInp
|
||||
changes.Submit("Post", "move", token.UserID, true, changekeys.Many(log, posts), posts)
|
||||
}()
|
||||
|
||||
posts2 := make([]*models.Post, len(posts))
|
||||
for i := range posts {
|
||||
posts2[i] = &posts[i]
|
||||
}
|
||||
|
||||
return posts2, nil
|
||||
return posts, nil
|
||||
}
|
||||
|
||||
func (r *mutationResolver) RemovePost(ctx context.Context, input input.PostRemoveInput) (*models.Post, error) {
|
||||
|
||||
+5
-20
@@ -24,7 +24,7 @@ func (r *resolver) Story(ctx context.Context, id string) (*models.Story, error)
|
||||
return &story, nil
|
||||
}
|
||||
|
||||
func (r *resolver) Stories(ctx context.Context, filter *stories.Filter) ([]*models.Story, error) {
|
||||
func (r *resolver) Stories(ctx context.Context, filter *stories.Filter) ([]models.Story, error) {
|
||||
if filter != nil {
|
||||
if filter.Unlisted != nil && *filter.Unlisted == true {
|
||||
token := auth.TokenFromContext(ctx)
|
||||
@@ -38,17 +38,7 @@ func (r *resolver) Stories(ctx context.Context, filter *stories.Filter) ([]*mode
|
||||
}
|
||||
}
|
||||
|
||||
stories, err := stories.List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
stories2 := make([]*models.Story, len(stories))
|
||||
for i := range stories {
|
||||
stories2[i] = &stories[i]
|
||||
}
|
||||
|
||||
return stories2, nil
|
||||
return stories.List(filter)
|
||||
}
|
||||
|
||||
// Mutations
|
||||
@@ -76,12 +66,7 @@ func (r *mutationResolver) AddStory(ctx context.Context, input input.StoryAddInp
|
||||
listed := input.Listed != nil && *input.Listed
|
||||
open := input.Open != nil && *input.Open
|
||||
|
||||
tags := make([]models.Tag, len(input.Tags))
|
||||
for i := range input.Tags {
|
||||
tags[i] = *input.Tags[i]
|
||||
}
|
||||
|
||||
story, err := stories.Add(input.Name, author, input.Category, listed, open, tags, time.Now(), fictionalDate)
|
||||
story, err := stories.Add(input.Name, author, input.Category, listed, open, input.Tags, time.Now(), fictionalDate)
|
||||
if err != nil {
|
||||
return nil, errors.New("Failed to add story: " + err.Error())
|
||||
}
|
||||
@@ -109,7 +94,7 @@ func (r *mutationResolver) AddStoryTag(ctx context.Context, input input.StoryTag
|
||||
}
|
||||
}
|
||||
|
||||
story, err = stories.AddTag(story, *input.Tag)
|
||||
story, err = stories.AddTag(story, input.Tag)
|
||||
if err != nil {
|
||||
return nil, errors.New("Failed to add story: " + err.Error())
|
||||
}
|
||||
@@ -137,7 +122,7 @@ func (r *mutationResolver) RemoveStoryTag(ctx context.Context, input input.Story
|
||||
}
|
||||
}
|
||||
|
||||
story, err = stories.RemoveTag(story, *input.Tag)
|
||||
story, err = stories.RemoveTag(story, input.Tag)
|
||||
if err != nil {
|
||||
return nil, errors.New("Failed to add story: " + err.Error())
|
||||
}
|
||||
|
||||
+2
-12
@@ -7,16 +7,6 @@ import (
|
||||
"git.aiterp.net/rpdata/api/models/tags"
|
||||
)
|
||||
|
||||
func (r *resolver) Tags(ctx context.Context) ([]*models.Tag, error) {
|
||||
tags, err := tags.List()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tags2 := make([]*models.Tag, len(tags))
|
||||
for i := range tags {
|
||||
tags2[i] = &tags[i]
|
||||
}
|
||||
|
||||
return tags2, nil
|
||||
func (r *resolver) Tags(ctx context.Context) ([]models.Tag, error) {
|
||||
return tags.List()
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
|
||||
/// Queries
|
||||
|
||||
func (r *resolver) UnknownNicks(ctx context.Context, filter *input.UnknownNicksFilter) ([]*models.UnknownNick, error) {
|
||||
func (r *resolver) UnknownNicks(ctx context.Context, filter *input.UnknownNicksFilter) ([]models.UnknownNick, error) {
|
||||
limit := 100
|
||||
if filter != nil {
|
||||
if filter.Limit > 0 {
|
||||
@@ -19,15 +19,5 @@ func (r *resolver) UnknownNicks(ctx context.Context, filter *input.UnknownNicksF
|
||||
}
|
||||
}
|
||||
|
||||
nicks, err := unknownnicks.List(limit)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
nicks2 := make([]*models.UnknownNick, len(nicks))
|
||||
for i := range nicks {
|
||||
nicks2[i] = &nicks[i]
|
||||
}
|
||||
|
||||
return nicks2, nil
|
||||
return unknownnicks.List(limit)
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package types
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
|
||||
"git.aiterp.net/rpdata/api/graph2/input"
|
||||
"git.aiterp.net/rpdata/api/models"
|
||||
@@ -17,8 +16,6 @@ func (r *changeResolver) Objects(ctx context.Context, obj *models.Change) ([]inp
|
||||
for _, object := range objects {
|
||||
if changeObject, ok := object.(input.ChangeObject); ok {
|
||||
results = append(results, changeObject)
|
||||
} else {
|
||||
log.Printf("Type %T needs ChangeObject impl", object)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-12
@@ -19,7 +19,7 @@ func (r *chapterResolver) FictionalDate(ctx context.Context, chapter *models.Cha
|
||||
return &chapter.FictionalDate, nil
|
||||
}
|
||||
|
||||
func (r *chapterResolver) Comments(ctx context.Context, chapter *models.Chapter, limit *int) ([]*models.Comment, error) {
|
||||
func (r *chapterResolver) Comments(ctx context.Context, chapter *models.Chapter, limit *int) ([]models.Comment, error) {
|
||||
limitValue := 0
|
||||
if limit != nil {
|
||||
if *limit < 0 {
|
||||
@@ -33,17 +33,7 @@ func (r *chapterResolver) Comments(ctx context.Context, chapter *models.Chapter,
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
comments, err := comments.ListChapterID(chapter.ID, limitValue)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
comments2 := make([]*models.Comment, len(comments))
|
||||
for i := range comments {
|
||||
comments2[i] = &comments[i]
|
||||
}
|
||||
|
||||
return comments2, nil
|
||||
return comments.ListChapterID(chapter.ID, limitValue)
|
||||
}
|
||||
|
||||
// ChapterResolver is a resolver
|
||||
|
||||
+8
-24
@@ -20,37 +20,21 @@ func (r *logResolver) Channel(ctx context.Context, log *models.Log) (*models.Cha
|
||||
return loader.Channel("name", log.ChannelName)
|
||||
}
|
||||
|
||||
func (r *logResolver) Characters(ctx context.Context, log *models.Log) ([]*models.Character, error) {
|
||||
func (r *logResolver) Characters(ctx context.Context, log *models.Log) ([]models.Character, error) {
|
||||
loader := loader.FromContext(ctx)
|
||||
if loader == nil {
|
||||
return nil, errors.New("no loader")
|
||||
}
|
||||
|
||||
characters, err := loader.Characters("id", log.CharacterIDs...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
characters2 := make([]*models.Character, len(characters))
|
||||
for i := range characters {
|
||||
characters2[i] = &characters[i]
|
||||
}
|
||||
|
||||
return characters2, nil
|
||||
return loader.Characters("id", log.CharacterIDs...)
|
||||
}
|
||||
|
||||
func (r *logResolver) Posts(ctx context.Context, log *models.Log, kinds []string) ([]*models.Post, error) {
|
||||
posts, err := posts.List(&posts.Filter{LogID: &log.ShortID, Kind: kinds, Limit: 0})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
posts2 := make([]*models.Post, len(posts))
|
||||
for i := range posts {
|
||||
posts2[i] = &posts[i]
|
||||
}
|
||||
|
||||
return posts2, nil
|
||||
func (r *logResolver) Posts(ctx context.Context, log *models.Log, kinds []string) ([]models.Post, error) {
|
||||
return posts.List(&posts.Filter{
|
||||
LogID: &log.ShortID,
|
||||
Kind: kinds,
|
||||
Limit: 0,
|
||||
})
|
||||
}
|
||||
|
||||
// LogResolver is a resolver
|
||||
|
||||
+2
-12
@@ -19,18 +19,8 @@ func (r *storyResolver) FictionalDate(ctx context.Context, story *models.Story)
|
||||
return &story.FictionalDate, nil
|
||||
}
|
||||
|
||||
func (r *storyResolver) Chapters(ctx context.Context, story *models.Story) ([]*models.Chapter, error) {
|
||||
chapters, err := chapters.ListStoryID(story.ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
chapters2 := make([]*models.Chapter, len(chapters))
|
||||
for i := range chapters {
|
||||
chapters2[i] = &chapters[i]
|
||||
}
|
||||
|
||||
return chapters2, nil
|
||||
func (r *storyResolver) Chapters(ctx context.Context, story *models.Story) ([]models.Chapter, error) {
|
||||
return chapters.ListStoryID(story.ID)
|
||||
}
|
||||
|
||||
// StoryResolver is a resolver
|
||||
|
||||
@@ -1,346 +0,0 @@
|
||||
package instrumentation
|
||||
|
||||
import (
|
||||
"context"
|
||||
"reflect"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/99designs/gqlgen/graphql"
|
||||
prometheusclient "github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
const (
|
||||
existStatusFailure = "failure"
|
||||
exitStatusSuccess = "success"
|
||||
)
|
||||
|
||||
var latencyMapMutex sync.Mutex
|
||||
var latencyMap = make(map[string]float64, 128)
|
||||
|
||||
type ctxKeyType string
|
||||
|
||||
var ctxKey = ctxKeyType("metricglobal")
|
||||
|
||||
var (
|
||||
requestStartedCounter prometheusclient.Counter
|
||||
requestCompletedCounter prometheusclient.Counter
|
||||
requestFailureCounter *prometheusclient.CounterVec
|
||||
requestSuccessCounter *prometheusclient.CounterVec
|
||||
requestComplexityHisto prometheusclient.Histogram
|
||||
resolverStartedCounter *prometheusclient.CounterVec
|
||||
resolverCompletedCounter *prometheusclient.CounterVec
|
||||
timeToResolveField *prometheusclient.HistogramVec
|
||||
timeToHandleRequest *prometheusclient.HistogramVec
|
||||
timeToHandleRequestQueryMAvg *prometheusclient.GaugeVec
|
||||
timeToHandleRequestQueryTotal *prometheusclient.CounterVec
|
||||
responseSizeMAvg *prometheusclient.GaugeVec
|
||||
responseSizeTotal *prometheusclient.CounterVec
|
||||
)
|
||||
|
||||
// Globals is monitoring data.
|
||||
type Globals struct {
|
||||
sync.Mutex
|
||||
|
||||
Queries []string
|
||||
Failed bool
|
||||
}
|
||||
|
||||
// Register registers the prometheus metrics.
|
||||
func Register() {
|
||||
requestStartedCounter = prometheusclient.NewCounter(
|
||||
prometheusclient.CounterOpts{
|
||||
Name: "graphql_request_started_total",
|
||||
Help: "Total number of requests started on the graphql server.",
|
||||
},
|
||||
)
|
||||
|
||||
requestCompletedCounter = prometheusclient.NewCounter(
|
||||
prometheusclient.CounterOpts{
|
||||
Name: "graphql_request_completed_total",
|
||||
Help: "Total number of requests completed on the graphql server.",
|
||||
},
|
||||
)
|
||||
|
||||
requestFailureCounter = prometheusclient.NewCounterVec(
|
||||
prometheusclient.CounterOpts{
|
||||
Name: "graphql_request_failures",
|
||||
Help: "Number of requests with either success or failure status.",
|
||||
},
|
||||
[]string{"queries"},
|
||||
)
|
||||
requestSuccessCounter = prometheusclient.NewCounterVec(
|
||||
prometheusclient.CounterOpts{
|
||||
Name: "graphql_request_successes",
|
||||
Help: "Number of requests with either success or failure status.",
|
||||
},
|
||||
[]string{"queries"},
|
||||
)
|
||||
|
||||
requestComplexityHisto = prometheusclient.NewHistogram(
|
||||
prometheusclient.HistogramOpts{
|
||||
Name: "graphql_request_complexity",
|
||||
Help: "The complexity value of incoming queries.",
|
||||
Buckets: prometheusclient.LinearBuckets(100, 25, 9),
|
||||
},
|
||||
)
|
||||
|
||||
resolverStartedCounter = prometheusclient.NewCounterVec(
|
||||
prometheusclient.CounterOpts{
|
||||
Name: "graphql_resolver_started_total",
|
||||
Help: "Total number of resolver started on the graphql server.",
|
||||
},
|
||||
[]string{"object", "field"},
|
||||
)
|
||||
|
||||
resolverCompletedCounter = prometheusclient.NewCounterVec(
|
||||
prometheusclient.CounterOpts{
|
||||
Name: "graphql_resolver_completed_total",
|
||||
Help: "Total number of resolver completed on the graphql server.",
|
||||
},
|
||||
[]string{"object", "field"},
|
||||
)
|
||||
|
||||
timeToResolveField = prometheusclient.NewHistogramVec(prometheusclient.HistogramOpts{
|
||||
Name: "graphql_resolver_duration_ms",
|
||||
Help: "The time taken to resolve a field by graphql server.",
|
||||
Buckets: prometheusclient.ExponentialBuckets(1, 2, 11),
|
||||
}, []string{"exitStatus"})
|
||||
|
||||
timeToHandleRequest = prometheusclient.NewHistogramVec(prometheusclient.HistogramOpts{
|
||||
Name: "graphql_request_duration_ms",
|
||||
Help: "The time taken to handle a request by graphql server.",
|
||||
Buckets: prometheusclient.ExponentialBuckets(1, 2, 11),
|
||||
}, []string{"exitStatus"})
|
||||
|
||||
timeToHandleRequestQueryMAvg = prometheusclient.NewGaugeVec(
|
||||
prometheusclient.GaugeOpts{
|
||||
Name: "graphql_request_query_duration_mavg_ms",
|
||||
Help: "Moving average of graphql request query duration for a query set.",
|
||||
},
|
||||
[]string{"queries"},
|
||||
)
|
||||
timeToHandleRequestQueryTotal = prometheusclient.NewCounterVec(
|
||||
prometheusclient.CounterOpts{
|
||||
Name: "graphql_request_query_duration_total_ms",
|
||||
Help: "Total duration spent responding to a query.",
|
||||
},
|
||||
[]string{"queries"},
|
||||
)
|
||||
|
||||
responseSizeMAvg = prometheusclient.NewGaugeVec(
|
||||
prometheusclient.GaugeOpts{
|
||||
Name: "graphql_response_size_mavg_bytes",
|
||||
Help: "Moving average of graphql response size for a query set.",
|
||||
},
|
||||
[]string{"queries"},
|
||||
)
|
||||
responseSizeTotal = prometheusclient.NewCounterVec(
|
||||
prometheusclient.CounterOpts{
|
||||
Name: "graphql_response_size_total_bytes",
|
||||
Help: "Total bytes of response data to a query.",
|
||||
},
|
||||
[]string{"queries"},
|
||||
)
|
||||
|
||||
prometheusclient.MustRegister(
|
||||
requestStartedCounter,
|
||||
requestCompletedCounter,
|
||||
requestSuccessCounter,
|
||||
requestFailureCounter,
|
||||
requestComplexityHisto,
|
||||
resolverStartedCounter,
|
||||
resolverCompletedCounter,
|
||||
timeToResolveField,
|
||||
timeToHandleRequest,
|
||||
timeToHandleRequestQueryMAvg,
|
||||
timeToHandleRequestQueryTotal,
|
||||
responseSizeMAvg,
|
||||
responseSizeTotal,
|
||||
)
|
||||
}
|
||||
|
||||
// UnRegister unregisters
|
||||
func UnRegister() {
|
||||
prometheusclient.Unregister(requestStartedCounter)
|
||||
prometheusclient.Unregister(requestCompletedCounter)
|
||||
prometheusclient.Unregister(requestSuccessCounter)
|
||||
prometheusclient.Unregister(requestFailureCounter)
|
||||
prometheusclient.Unregister(requestComplexityHisto)
|
||||
prometheusclient.Unregister(resolverStartedCounter)
|
||||
prometheusclient.Unregister(resolverCompletedCounter)
|
||||
prometheusclient.Unregister(timeToResolveField)
|
||||
prometheusclient.Unregister(timeToHandleRequest)
|
||||
prometheusclient.Unregister(timeToHandleRequestQueryMAvg)
|
||||
prometheusclient.Unregister(timeToHandleRequestQueryTotal)
|
||||
prometheusclient.Unregister(responseSizeMAvg)
|
||||
prometheusclient.Unregister(responseSizeTotal)
|
||||
}
|
||||
|
||||
// ResolverMiddleware is a resolver middleware that logs metrics for prometheus.
|
||||
func ResolverMiddleware() graphql.FieldMiddleware {
|
||||
return func(ctx context.Context, next graphql.Resolver) (interface{}, error) {
|
||||
rctx := graphql.GetResolverContext(ctx)
|
||||
|
||||
resolverStartedCounter.WithLabelValues(rctx.Object, rctx.Field.Name).Inc()
|
||||
|
||||
observerStart := time.Now()
|
||||
|
||||
path := rctx.Path()
|
||||
if len(path) == 1 {
|
||||
if globals, ok := ctx.Value(ctxKey).(*Globals); ok {
|
||||
globals.Lock()
|
||||
if rctx.Field.Field != nil {
|
||||
globals.Queries = append(globals.Queries, rctx.Field.Name+"("+argsLabel(rctx.Args)+")")
|
||||
} else if name, ok := path[0].(string); ok {
|
||||
globals.Queries = append(globals.Queries, name)
|
||||
}
|
||||
globals.Unlock()
|
||||
}
|
||||
}
|
||||
|
||||
res, err := next(ctx)
|
||||
|
||||
var exitStatus string
|
||||
if err != nil {
|
||||
exitStatus = existStatusFailure
|
||||
|
||||
if globals, ok := ctx.Value(ctxKey).(*Globals); ok {
|
||||
globals.Lock()
|
||||
globals.Failed = true
|
||||
globals.Unlock()
|
||||
}
|
||||
} else {
|
||||
exitStatus = exitStatusSuccess
|
||||
}
|
||||
|
||||
exitStatusLabel := prometheusclient.Labels{"exitStatus": exitStatus}
|
||||
timeToResolveField.With(exitStatusLabel).Observe(float64(time.Since(observerStart).Nanoseconds() / int64(time.Millisecond)))
|
||||
|
||||
resolverCompletedCounter.WithLabelValues(rctx.Object, rctx.Field.Name).Inc()
|
||||
|
||||
return res, err
|
||||
}
|
||||
}
|
||||
|
||||
// RequestMiddleware is a request middleware that logs metrics for prometheus. It looks busy, but the
|
||||
// overhead is less than 10µs.
|
||||
func RequestMiddleware() graphql.RequestMiddleware {
|
||||
return func(ctx context.Context, next func(ctx context.Context) []byte) []byte {
|
||||
requestStartedCounter.Inc()
|
||||
|
||||
// Store some values in a global context.
|
||||
globals := Globals{}
|
||||
|
||||
// Measure the time to serve the request
|
||||
observerStart := time.Now()
|
||||
res := next(context.WithValue(ctx, ctxKey, &globals))
|
||||
observedDuration := time.Since(observerStart)
|
||||
observedDurationMS := float64(observedDuration.Nanoseconds()) / float64(time.Millisecond)
|
||||
|
||||
reqCtx := graphql.GetRequestContext(ctx)
|
||||
|
||||
// exitStatus label
|
||||
exitStatusLabel := prometheusclient.Labels{"exitStatus": exitStatusSuccess}
|
||||
if globals.Failed {
|
||||
exitStatusLabel["exitStatus"] = existStatusFailure
|
||||
}
|
||||
|
||||
// queries label
|
||||
sort.Strings(globals.Queries)
|
||||
queriesStr := strings.Join(globals.Queries, ";")
|
||||
queriesLabel := prometheusclient.Labels{
|
||||
"queries": queriesStr,
|
||||
}
|
||||
|
||||
// Write metrics
|
||||
timeToHandleRequest.With(exitStatusLabel).Observe(observedDurationMS)
|
||||
requestCompletedCounter.Inc()
|
||||
if len(globals.Queries) > 0 {
|
||||
if globals.Failed {
|
||||
requestFailureCounter.With(queriesLabel).Inc()
|
||||
} else {
|
||||
requestSuccessCounter.With(queriesLabel).Inc()
|
||||
}
|
||||
|
||||
timeToHandleRequestQueryMAvg.With(queriesLabel).Set(movingAvgLatency("ms:"+queriesStr, observedDurationMS))
|
||||
timeToHandleRequestQueryTotal.With(queriesLabel).Add(observedDurationMS)
|
||||
responseSizeMAvg.With(queriesLabel).Set(movingAvgLatency("bytes:"+queriesStr, float64(len(res))))
|
||||
responseSizeTotal.With(queriesLabel).Add(float64(len(res)))
|
||||
}
|
||||
requestComplexityHisto.Observe(float64(reqCtx.OperationComplexity))
|
||||
|
||||
return res
|
||||
}
|
||||
}
|
||||
|
||||
func movingAvgLatency(key string, sample float64) float64 {
|
||||
latencyMapMutex.Lock()
|
||||
latency, ok := latencyMap[key]
|
||||
if ok {
|
||||
latency = (latency * 0.9) + (sample * 0.1)
|
||||
latencyMap[key] = latency
|
||||
} else {
|
||||
latencyMap[key] = sample
|
||||
latency = sample
|
||||
}
|
||||
latencyMapMutex.Unlock()
|
||||
|
||||
return latency
|
||||
}
|
||||
|
||||
func argsLabel(args map[string]interface{}) string {
|
||||
result := ""
|
||||
|
||||
for key, value := range args {
|
||||
if len(result) > 0 {
|
||||
result += ","
|
||||
}
|
||||
|
||||
result = key
|
||||
|
||||
rv := reflect.ValueOf(value)
|
||||
for rv.Kind() == reflect.Ptr {
|
||||
rv = rv.Elem()
|
||||
}
|
||||
|
||||
if rv.Kind() != reflect.Struct {
|
||||
continue
|
||||
}
|
||||
|
||||
result += "{"
|
||||
|
||||
first := true
|
||||
for i := 0; i < rv.NumField(); i++ {
|
||||
rf := rv.Field(i)
|
||||
if (rf.Kind() == reflect.Ptr || rf.Kind() == reflect.Interface) && rf.IsNil() {
|
||||
continue
|
||||
}
|
||||
|
||||
rtf := rv.Type().Field(i)
|
||||
|
||||
// Empty limits are as good as no limit
|
||||
if rtf.Name == "Limit" && rf.Type().Kind() == reflect.Int && rf.Int() <= 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
if !first {
|
||||
result += ","
|
||||
}
|
||||
first = false
|
||||
|
||||
jsonTag := rtf.Tag.Get("json")
|
||||
if jsonTag != "" {
|
||||
result += jsonTag
|
||||
} else {
|
||||
result += strings.ToLower(rtf.Name[0:1]) + rtf.Name[1:]
|
||||
}
|
||||
}
|
||||
|
||||
result += "}"
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
+8
-8
@@ -33,28 +33,28 @@ func (change *Change) Objects() []interface{} {
|
||||
data := make([]interface{}, 0, len(change.Logs)+len(change.Characters)+len(change.Channels)+len(change.Posts)+len(change.Stories)+len(change.Tags)+len(change.Chapters)+len(change.Comments))
|
||||
|
||||
for _, log := range change.Logs {
|
||||
data = append(data, &log)
|
||||
data = append(data, log)
|
||||
}
|
||||
for _, channel := range change.Channels {
|
||||
data = append(data, &channel)
|
||||
data = append(data, channel)
|
||||
}
|
||||
for _, character := range change.Characters {
|
||||
data = append(data, &character)
|
||||
data = append(data, character)
|
||||
}
|
||||
for _, post := range change.Posts {
|
||||
data = append(data, &post)
|
||||
data = append(data, post)
|
||||
}
|
||||
for _, story := range change.Stories {
|
||||
data = append(data, &story)
|
||||
data = append(data, story)
|
||||
}
|
||||
for _, tag := range change.Tags {
|
||||
data = append(data, &tag)
|
||||
data = append(data, tag)
|
||||
}
|
||||
for _, chapter := range change.Chapters {
|
||||
data = append(data, &chapter)
|
||||
data = append(data, chapter)
|
||||
}
|
||||
for _, comment := range change.Comments {
|
||||
data = append(data, &comment)
|
||||
data = append(data, comment)
|
||||
}
|
||||
|
||||
return data
|
||||
|
||||
Reference in New Issue
Block a user