1//go:generate go tool gqlgen generate
2
3// Package graphql contains the root GraphQL http handler
4package graphql
5
6import (
7 "io"
8 "net/http"
9 "time"
10
11 "github.com/99designs/gqlgen/graphql/handler"
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 "github.com/gorilla/websocket"
16 "github.com/vektah/gqlparser/v2/ast"
17
18 "github.com/git-bug/git-bug/api/graphql/graph"
19 "github.com/git-bug/git-bug/api/graphql/resolvers"
20 "github.com/git-bug/git-bug/cache"
21)
22
23// Handler is the root GraphQL http handler
24type Handler struct {
25 http.Handler
26 io.Closer
27}
28
29func NewHandler(mrc *cache.MultiRepoCache, errorOut io.Writer) Handler {
30 rootResolver := resolvers.NewRootResolver(mrc)
31 config := graph.Config{Resolvers: rootResolver}
32
33 h := handler.New(graph.NewExecutableSchema(config))
34
35 h.AddTransport(transport.Websocket{
36 KeepAlivePingInterval: 10 * time.Second,
37 Upgrader: websocket.Upgrader{
38 CheckOrigin: func(r *http.Request) bool { return true },
39 },
40 })
41 h.AddTransport(transport.Options{})
42 h.AddTransport(transport.GET{})
43 h.AddTransport(transport.POST{})
44 h.AddTransport(transport.MultipartForm{})
45
46 h.SetQueryCache(lru.New[*ast.QueryDocument](1000))
47
48 h.Use(extension.Introspection{})
49 h.Use(extension.AutomaticPersistedQuery{
50 Cache: lru.New[string](100),
51 })
52
53 if errorOut != nil {
54 h.Use(&Tracer{Out: errorOut})
55 }
56
57 return Handler{
58 Handler: h,
59 Closer: rootResolver,
60 }
61}