@@ -7,12 +7,17 @@ import (
77 "strings"
88 "time"
99
10+ "github.com/99designs/gqlgen/graphql/handler"
11+
12+ "github.com/99designs/gqlgen/graphql/handler/extension"
13+ "github.com/99designs/gqlgen/graphql/handler/lru"
14+ "github.com/99designs/gqlgen/graphql/handler/transport"
15+
1016 gqlgen "github.com/99designs/gqlgen/graphql"
11- "github.com/99designs/gqlgen/handler"
1217 "github.com/aristat/golang-example-app/app/logger"
1318 "github.com/aristat/golang-example-app/generated/graphql"
1419 "github.com/go-chi/chi"
15- "github.com/vektah/gqlparser/gqlerror"
20+ "github.com/vektah/gqlparser/v2/ gqlerror"
1621)
1722
1823const (
@@ -36,46 +41,55 @@ func (g *GraphQL) Use(router *chi.Mux) {
3641
3742// Routers
3843func (g * GraphQL ) Routers (router chi.Router ) {
39- options := []handler.Option {
40- handler .IntrospectionEnabled (g .cfg .Introspection ),
41- handler .RecoverFunc (func (ctx context.Context , err interface {}) error {
42- g .log .Alert ("unhandled panic, err: %v" , logger .Args (err ))
43- return nil
44- }),
45- handler .ErrorPresenter (func (ctx context.Context , e error ) * gqlerror.Error {
46- if e != nil {
47- g .log .Alert ("recover on middleware, err: %v" , logger .Args (e ))
48- goto done
49- }
50- e = errInternalServer
51- done:
52- return gqlgen .DefaultErrorPresenter (ctx , e )
53- }),
44+ srv := handler .New (graphql .NewExecutableSchema (* g .resolver ))
45+
46+ srv .AddTransport (transport.Websocket {
47+ KeepAlivePingInterval : 10 * time .Second ,
48+ })
49+ srv .AddTransport (transport.Options {})
50+ srv .AddTransport (transport.GET {})
51+ srv .AddTransport (transport.POST {})
52+ srv .AddTransport (transport.MultipartForm {})
53+
54+ srv .SetQueryCache (lru .New (1000 ))
55+
56+ if g .cfg .Introspection {
57+ srv .Use (extension.Introspection {})
5458 }
59+ srv .Use (extension.AutomaticPersistedQuery {
60+ Cache : lru .New (100 ),
61+ })
62+
63+ srv .SetRecoverFunc (func (ctx context.Context , err interface {}) error {
64+ g .log .Alert ("unhandled panic, err: %v" , logger .Args (err ))
65+ return nil
66+ })
67+ srv .SetErrorPresenter (func (ctx context.Context , e error ) * gqlerror.Error {
68+ if e != nil {
69+ g .log .Alert ("recover on middleware, err: %v" , logger .Args (e ))
70+ goto done
71+ }
72+ e = errInternalServer
73+ done:
74+ return gqlgen .DefaultErrorPresenter (ctx , e )
75+ })
5576
5677 if g .cfg .Debug {
57- router .Handle ("/" , handler .Playground (g .cfg .Name , "/query" ))
58- options = append (options , handler .RequestMiddleware (func (ctx context.Context , next func (ctx context.Context ) []byte ) []byte {
78+ srv .AroundResponses (func (ctx context.Context , next gqlgen.ResponseHandler ) * gqlgen.Response {
5979 startTime := time .Now ()
60- rc := gqlgen .GetRequestContext (ctx )
80+ rc := gqlgen .GetOperationContext (ctx )
6181 resp := next (ctx )
62- e := strings .ReplaceAll (rc .Errors .Error (), "\n " , " " )
6382 g .log .Debug ("\n VARS:\n %+v\n QUERY:\n %v\n RESPONSE:\n %v\n ERROR:\n %v\n " ,
64- logger .Args (rc .Variables , strings .TrimRight (rc .RawQuery , "\n " ), string (resp ), e ),
83+ logger .Args (rc .Variables , strings .TrimRight (rc .RawQuery , "\n " ), string (resp . Data ), resp . Errors ),
6584 logger .WithFields (logger.Fields {
6685 "time" : time .Since (startTime ).String (),
6786 }),
6887 )
6988 return resp
70- }))
89+ })
7190 }
7291
73- router .Handle ("/query" ,
74- handler .GraphQL (
75- graphql .NewExecutableSchema (* g .resolver ),
76- options ... ,
77- ),
78- )
92+ router .Handle ("/query" , srv )
7993}
8094
8195// Config
0 commit comments