package main import ( "database/sql" "log" "net/http" "os" "time" _ "github.com/lib/pq" "git.sr.ht/~sircmpwn/getopt" "github.com/99designs/gqlgen/graphql/handler" "github.com/99designs/gqlgen/graphql/playground" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" "git.sr.ht/~sircmpwn/searchhut/config" "git.sr.ht/~sircmpwn/searchhut/database" "git.sr.ht/~sircmpwn/searchhut/graph" "git.sr.ht/~sircmpwn/searchhut/graph/generated" ) func main() { debug := false opts, _, err := getopt.Getopts(os.Args, "d") if err != nil { log.Fatal(err) } for _, opt := range opts { switch opt.Option { case 'd': debug = true } } conf := config.Load() port, ok := conf.Get("searchhut::api", "bind") if !ok { port = ":8080" } connstr, ok := conf.Get("searchhut", "connection-string") if !ok { log.Fatal("Configuration missing connection string") } db, err := sql.Open("postgres", connstr) if err != nil { log.Fatal(err) } schema := generated.NewExecutableSchema(generated.Config{ Resolvers: &graph.Resolver{}, }) srv := handler.NewDefaultServer(schema) router := chi.NewRouter() router.Use(database.Middleware(db)) router.Use(middleware.RealIP) router.Use(middleware.Logger) router.Use(middleware.Timeout(10 * time.Second)) router.Handle("/query", srv) if debug { router.Handle("/", playground.Handler("GraphQL playground", "/query")) } log.Printf("Running server on %s", port) log.Fatal(http.ListenAndServe(port, router)) }