2022-07-09 13:25:27 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2022-07-09 15:39:04 +02:00
|
|
|
"database/sql"
|
2022-07-09 13:25:27 +02:00
|
|
|
"log"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
2022-07-09 15:39:04 +02:00
|
|
|
"time"
|
2022-07-09 13:25:27 +02:00
|
|
|
|
2022-07-09 15:39:04 +02:00
|
|
|
_ "github.com/lib/pq"
|
|
|
|
|
|
|
|
"git.sr.ht/~sircmpwn/getopt"
|
2022-07-09 13:25:27 +02:00
|
|
|
"github.com/99designs/gqlgen/graphql/handler"
|
|
|
|
"github.com/99designs/gqlgen/graphql/playground"
|
2022-07-09 15:39:04 +02:00
|
|
|
"github.com/go-chi/chi"
|
|
|
|
"github.com/go-chi/chi/middleware"
|
2022-07-14 19:10:14 +02:00
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
2022-07-14 19:10:18 +02:00
|
|
|
promcollectors "github.com/prometheus/client_golang/prometheus/collectors"
|
2022-07-14 19:10:14 +02:00
|
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
2022-07-09 13:25:27 +02:00
|
|
|
|
2022-07-09 15:39:04 +02:00
|
|
|
"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"
|
|
|
|
)
|
2022-07-09 13:25:27 +02:00
|
|
|
|
|
|
|
func main() {
|
2022-07-09 15:39:04 +02:00
|
|
|
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
|
|
|
|
}
|
2022-07-09 13:25:27 +02:00
|
|
|
}
|
|
|
|
|
2022-07-09 15:39:04 +02:00
|
|
|
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)
|
|
|
|
}
|
2022-07-14 19:10:18 +02:00
|
|
|
prometheus.DefaultRegisterer.Register(promcollectors.NewDBStatsCollector(db, "main"))
|
2022-07-09 15:39:04 +02:00
|
|
|
|
|
|
|
schema := generated.NewExecutableSchema(generated.Config{
|
|
|
|
Resolvers: &graph.Resolver{},
|
|
|
|
})
|
|
|
|
srv := handler.NewDefaultServer(schema)
|
2022-07-09 13:25:27 +02:00
|
|
|
|
2022-07-09 15:39:04 +02:00
|
|
|
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"))
|
|
|
|
}
|
2022-07-09 13:25:27 +02:00
|
|
|
|
2022-07-14 19:10:14 +02:00
|
|
|
router.Handle("/metrics", promhttp.HandlerFor(prometheus.DefaultGatherer, promhttp.HandlerOpts{
|
|
|
|
MaxRequestsInFlight: 10,
|
|
|
|
Timeout: 10 * time.Second,
|
|
|
|
EnableOpenMetrics: true,
|
|
|
|
}))
|
|
|
|
|
2022-07-09 15:39:04 +02:00
|
|
|
log.Printf("Running server on %s", port)
|
|
|
|
log.Fatal(http.ListenAndServe(port, router))
|
2022-07-09 13:25:27 +02:00
|
|
|
}
|