/
graphql.go
71 lines (56 loc) · 1.83 KB
/
graphql.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package main
import (
"encoding/json"
"net/http"
"github.com/graphql-go/graphql"
"github.com/graphql-go/handler"
)
func customHandler(schema *graphql.Schema) func(http.ResponseWriter, *http.Request) {
return func(rw http.ResponseWriter, r *http.Request) {
opts := handler.NewRequestOptions(r)
rootValue := map[string]interface{}{
"response": rw,
"request": r,
}
params := graphql.Params{
Schema: *schema,
RequestString: opts.Query,
VariableValues: opts.Variables,
OperationName: opts.OperationName,
RootObject: rootValue,
}
result := graphql.Do(params)
jsonStr, err := json.Marshal(result)
if err != nil {
panic(err)
}
rw.Header().Set("Content-Type", "application/json")
rw.Header().Set("Access-Control-Allow-Credentials", "true")
rw.Header().Set("Access-Control-Allow-Methods", "POST")
rw.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
rw.Header().Set("Access-Control-Allow-Origin", "http://localhost:8080")
rw.Write(jsonStr)
}
}
func main() {
queryType := graphql.ObjectConfig{
Name: "Ping",
Description: "Ping to get pong...",
Fields: graphql.Fields{
"ping": &graphql.Field{
Type: graphql.String,
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
return "pong", nil
},
},
},
}
schema, err := graphql.NewSchema(graphql.SchemaConfig{
Query: graphql.NewObject(queryType),
})
if err != nil {
panic(err)
}
http.HandleFunc("/graphql", customHandler(&schema))
http.ListenAndServe(":8888", nil)
}