// Copyright (c) 2025 Probo Inc . // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY // AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR // OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR // PERFORMANCE OF THIS SOFTWARE. package gqlutils import ( "context" "net/http" "github.com/99designs/gqlgen/graphql" "github.com/99designs/gqlgen/graphql/handler" "github.com/99designs/gqlgen/graphql/handler/extension" "github.com/99designs/gqlgen/graphql/handler/transport" "go.gearno.de/kit/log" ) type Handler struct { gqlhandler *handler.Server } var ( mb int64 = 1024 * 1024 postTransport = transport.POST{} optionsTransport = transport.Options{} multipartTransport = transport.MultipartForm{ MaxMemory: 32 * mb, MaxUploadSize: 50 * mb, } introspectionExtension = extension.Introspection{} ) func NewHandler[S graphql.ExecutableSchema](executableSchema S, logger *log.Logger) *Handler { handler := handler.New(executableSchema) handler.AddTransport(postTransport) handler.AddTransport(optionsTransport) handler.AddTransport(multipartTransport) handler.Use(introspectionExtension) handler.Use(NewTracingExtension(logger)) handler.SetRecoverFunc(RecoverFunc) return &Handler{gqlhandler: handler} } func (gqlh *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { gqlh.gqlhandler.ServeHTTP(w, r) } func (gqlh *Handler) Use(extension graphql.HandlerExtension) { gqlh.gqlhandler.Use(extension) } func (gqlh *Handler) AroundOperations(f func(ctx context.Context, next graphql.OperationHandler) graphql.ResponseHandler) { gqlh.gqlhandler.AroundOperations(f) }