package main import ( "net/http" "tercul/internal/adapters/graphql" "tercul/internal/observability" "tercul/internal/platform/auth" "github.com/99designs/gqlgen/graphql/handler" ) // NewServer creates a new GraphQL server with the given resolver func NewServer(resolver *graphql.Resolver) http.Handler { c := graphql.Config{Resolvers: resolver} c.Directives.Binding = graphql.Binding srv := handler.NewDefaultServer(graphql.NewExecutableSchema(c)) // Create a mux to handle GraphQL endpoint only (no playground here; served separately in production) mux := http.NewServeMux() mux.Handle("/query", srv) return mux } // NewServerWithAuth creates a new GraphQL server with authentication and observability middleware func NewServerWithAuth(resolver *graphql.Resolver, jwtManager *auth.JWTManager, metrics *observability.Metrics) http.Handler { c := graphql.Config{Resolvers: resolver} c.Directives.Binding = graphql.Binding // Create the server with the custom error presenter srv := handler.NewDefaultServer(graphql.NewExecutableSchema(c)) srv.SetErrorPresenter(graphql.NewErrorPresenter()) // Create a middleware chain var chain http.Handler chain = srv chain = auth.GraphQLAuthMiddleware(jwtManager)(chain) chain = metrics.PrometheusMiddleware(chain) chain = observability.TracingMiddleware(chain) chain = observability.RequestIDMiddleware(chain) // Create a mux to handle GraphQL endpoint mux := http.NewServeMux() mux.Handle("/query", chain) return mux }