package main import ( "log" "net/http" "time" "git.vdhsn.com/adam/bodytrack/internal/handlers" "git.vdhsn.com/adam/bodytrack/internal/services" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/kelseyhightower/envconfig" ) type APIConfig struct { Host string JWT_Secret string PG_Host string PG_Username string PG_Password string } func main() { var cfg APIConfig envconfig.MustProcess("bodytrack_api", &cfg) services.InitJWT(cfg.JWT_Secret) r := chi.NewRouter() r.Use(middleware.Logger) r.Use(middleware.Recoverer) db, err := services.Connect(cfg.PG_Host, cfg.PG_Username, cfg.PG_Password) if err != nil { log.Fatal(err) } handlers := []handlers.ApiHandler{ handlers.UserHandler{Conn: db}, handlers.Stats{Conn: db}, } r.Use(middleware.RequestID) r.Use(middleware.RealIP) r.Use(middleware.Timeout(60 * time.Second)) r.Use(func(h http.Handler) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { r.Header.Set("Content-Type", "application/json; utf-8") h.ServeHTTP(rw, r) }) }) r.Route("/v1/api/", func(inner chi.Router) { for _, h := range handlers { if err := h.Subscribe(inner); err != nil { log.Fatal(err) } } }) log.Fatal(http.ListenAndServe(":3000", r)) }