diff --git a/cmd/sh-api/main.go b/cmd/sh-api/main.go index a3d7150..3b658bf 100644 --- a/cmd/sh-api/main.go +++ b/cmd/sh-api/main.go @@ -1,29 +1,71 @@ package main import ( + "database/sql" "log" "net/http" "os" + "time" - "git.sr.ht/~sircmpwn/searchhut/graph" - "git.sr.ht/~sircmpwn/searchhut/graph/generated" + _ "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" ) -const defaultPort = "8080" - func main() { - port := os.Getenv("PORT") - if port == "" { - port = defaultPort + 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 + } } - srv := handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{Resolvers: &graph.Resolver{}})) + conf := config.Load() + port, ok := conf.Get("searchhut::api", "bind") + if !ok { + port = ":8080" + } - http.Handle("/", playground.Handler("GraphQL playground", "/query")) - http.Handle("/query", srv) + connstr, ok := conf.Get("searchhut", "connection-string") + if !ok { + log.Fatal("Configuration missing connection string") + } - log.Printf("connect to http://localhost:%s/ for GraphQL playground", port) - log.Fatal(http.ListenAndServe(":"+port, nil)) + 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)) } diff --git a/config.example.ini b/config.example.ini index 0cb3740..e216868 100644 --- a/config.example.ini +++ b/config.example.ini @@ -10,10 +10,10 @@ user-agent= [searchhut::api] # -# The port to bind the API service to. -port=8080 +# The address to bind the API service to. +bind=:8080 [searchhut::web] # -# The port to bind the web service to. -port=8081 +# The address to bind the web service to. +bind=:8081 diff --git a/go.mod b/go.mod index fa9714f..9b6497b 100644 --- a/go.mod +++ b/go.mod @@ -12,9 +12,11 @@ require ( ) require ( + git.sr.ht/~sircmpwn/getopt v1.0.0 // indirect github.com/agnivade/levenshtein v1.1.1 // indirect github.com/andybalholm/cascadia v1.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect + github.com/go-chi/chi v1.5.4 // indirect github.com/go-shiori/dom v0.0.0-20210627111528-4e4722cd0d65 // indirect github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28 // indirect github.com/gorilla/websocket v1.5.0 // indirect diff --git a/go.sum b/go.sum index 12ab3ff..119f8cc 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +git.sr.ht/~sircmpwn/getopt v1.0.0 h1:/pRHjO6/OCbBF4puqD98n6xtPEgE//oq5U8NXjP7ROc= +git.sr.ht/~sircmpwn/getopt v1.0.0/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= github.com/99designs/gqlgen v0.17.12 h1:lH/H5dTYCY5eLNRKXeq22l0wFMavpOnN6v9GAIw+fxY= github.com/99designs/gqlgen v0.17.12/go.mod h1:w1brbeOdqVyNJI553BGwtwdVcYu1LKeYE1opLWN9RgQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -37,6 +39,8 @@ github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+ github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= +github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=