Skip to content

Commit 976f8b4

Browse files
committed
Updated graphql package
1 parent 3d43ea7 commit 976f8b4

File tree

8 files changed

+530
-619
lines changed

8 files changed

+530
-619
lines changed

README.md

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
# Golang Example Application
44

5-
65
# Table of Contents
76

87
- [Overview](#overview)
@@ -30,13 +29,13 @@ Commands list:
3029
3. Health check service - this service is needed to show how convenient to understand on which of the services an error occurred in jaeger
3130
4. Oauth client - this service is needed to show a simple example of http client and server, for example oauth2 server
3231
5. Migrate - commands for migration
33-
6. Jwt - commands for generate jwt token
32+
6. JWT - commands for generate JWT token
3433

3534
# Package list
3635

3736
Packages which use in this example project
3837

39-
1. [sql-migrate](https://github.com/rubenv/sql-migrate) - sql migrations
38+
1. [sql-migrate](https://github.com/rubenv/sql-migrate) - SQL migrations
4039
2. [wire](https://github.com/google/wire) - dependency Injection
4140
3. [viper](https://github.com/spf13/viper) - environment configuration
4241
4. [cobra](https://github.com/spf13/cobra) - create commands
@@ -264,12 +263,6 @@ mutation createUser {
264263
}
265264
```
266265

267-
# Deprecated version
268-
269-
[Deprecated version](https://github.com/Aristat/golang-example-app/tree/gin-example)
270-
271-
Usage only `gin` package and oauth2 client/server mechanic
272-
273266
# Testing
274267
```
275268
export APP_WD=go_path to project_path/resources or project_path/artifacts - needed for load templates

app/common/graphql.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import (
55
"fmt"
66
"net/http"
77

8+
"github.com/vektah/gqlparser/v2/gqlerror"
9+
810
"github.com/99designs/gqlgen/graphql"
9-
"github.com/vektah/gqlparser/gqlerror"
1011
)
1112

12-
func SendGraphqlError(w http.ResponseWriter, code int, errors ...*gqlerror.Error) {
13+
func SendGraphqlError(w http.ResponseWriter, code int, errors gqlerror.List) {
1314
w.Header().Set("Content-Type", "application/json")
1415
w.WriteHeader(code)
1516
b, err := json.Marshal(&graphql.Response{Errors: errors})
@@ -20,5 +21,5 @@ func SendGraphqlError(w http.ResponseWriter, code int, errors ...*gqlerror.Error
2021
}
2122

2223
func SendGraphqlErrorf(w http.ResponseWriter, code int, format string, args ...interface{}) {
23-
SendGraphqlError(w, code, &gqlerror.Error{Message: fmt.Sprintf(format, args...)})
24+
SendGraphqlError(w, code, gqlerror.List{{Message: fmt.Sprintf(format, args...)}})
2425
}

app/graphql/graphql.go

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1823
const (
@@ -36,46 +41,55 @@ func (g *GraphQL) Use(router *chi.Mux) {
3641

3742
// Routers
3843
func (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("\nVARS:\n%+v\nQUERY:\n%v\nRESPONSE:\n%v\nERROR:\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

app/logger/middleware.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"strings"
66
"time"
77

8-
"github.com/davecgh/go-spew/spew"
98
"google.golang.org/grpc"
109
)
1110

@@ -24,7 +23,7 @@ func UnaryClientInterceptor(log Logger, enable bool) grpc.UnaryClientInterceptor
2423
e = strings.ReplaceAll(err.Error(), "\n", "")
2524
}
2625

27-
log.Debug("\nQUERY UnaryClient:\n\nData: %v\n\nERROR:\n%v\n\n", Args(spew.Sdump(req), e), WithFields(Fields{
26+
log.Debug("\nQUERY UnaryClient:\n\nData: %v\n\nERROR:\n%v\n\n", Args(req, e), WithFields(Fields{
2827
"time": time.Since(startTime).String(),
2928
}))
3029

@@ -69,7 +68,7 @@ func UnaryServerInterceptor(log Logger, enable bool) grpc.UnaryServerInterceptor
6968
e = strings.ReplaceAll(err.Error(), "\n", "")
7069
}
7170

72-
log.Debug("\nQUERY UnaryServer:\n\nFullMethod: %v\nData: %v\nRESPONSE:\n\nData: %v\nERROR:\n%v\n", Args(info.FullMethod, spew.Sdump(req), spew.Sdump(res), e), WithFields(Fields{
71+
log.Debug("\nQUERY UnaryServer:\n\nFullMethod: %v\nData: %v\nRESPONSE:\n\nData: %v\nERROR:\n%v\n", Args(info.FullMethod, req, res, e), WithFields(Fields{
7372
"time": time.Since(startTime).String(),
7473
}))
7574

docker-compose-start.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/bin/bash
2+
3+
docker-compose rm
4+
GOOS=linux GOARCH=amd64 make build
5+
REMOVE_CONTAINERS=on DOCKER_IMAGE=golang-example-app TAG=development make docker-image
6+
docker-compose up

0 commit comments

Comments
 (0)