package main import ( "database/sql" "log" "net/http" "git.squidspirit.com/squid/blog.git/backend/internal/adapter/repository" "git.squidspirit.com/squid/blog.git/backend/internal/application" "git.squidspirit.com/squid/blog.git/backend/internal/framework/api/graph" "git.squidspirit.com/squid/blog.git/backend/internal/framework/db/postgres" "git.squidspirit.com/squid/blog.git/backend/internal/pkg/env" "github.com/99designs/gqlgen/graphql/handler" "github.com/99designs/gqlgen/graphql/handler/extension" "github.com/99designs/gqlgen/graphql/handler/lru" "github.com/99designs/gqlgen/graphql/handler/transport" "github.com/99designs/gqlgen/graphql/playground" _ "github.com/lib/pq" "github.com/vektah/gqlparser/v2/ast" ) func main() { db, err := postgres.Connect(env.GetDSN()) if err != nil { log.Fatal(err) } initGraphqlHandler(createResolver(db)) port := env.GetPort() log.Printf("connect to http://localhost:%s/ for GraphQL playground", port) log.Fatal(http.ListenAndServe(":"+port, nil)) } func initGraphqlHandler(resolver *graph.Resolver) *handler.Server { srv := handler.New(graph.NewExecutableSchema(graph.Config{Resolvers: resolver})) srv.AddTransport(transport.Options{}) srv.AddTransport(transport.GET{}) srv.AddTransport(transport.POST{}) srv.SetQueryCache(lru.New[*ast.QueryDocument](1000)) srv.Use(extension.Introspection{}) srv.Use(extension.AutomaticPersistedQuery{ Cache: lru.New[string](100), }) http.Handle("/", playground.Handler("GraphQL playground", "/query")) http.Handle("/query", srv) return srv } func createResolver(db *sql.DB) *graph.Resolver { postRepo := repository.NewPostRepo(postgres.NewPostDBService(db)) return &graph.Resolver{ GetAllPostsUseCase: application.NewGetAllPostsUseCase(postRepo), } }