package main import ( "context" "log" "net/http" "os" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/jackc/pgx/v5/pgxpool" "github.com/joho/godotenv" "gosten/csrf" "gosten/pages" "gosten/session" ) func checkEnvEntry(e string) { if os.Getenv(e) == "" { log.Fatalf("Variable '%s' not set", e) } } func checkEnv() { checkEnvEntry("GOSTEN_DSN") checkEnvEntry("GOSTEN_ADDRESS") } func main() { if err := godotenv.Load(); err != nil { log.Fatal("Loading env file: ", err) } checkEnv() db, err := pgxpool.New(context.Background(), os.Getenv("GOSTEN_DSN")) if err != nil { log.Fatal(err) } if err := db.Ping(context.Background()); err != nil { log.Fatal(err) } defer db.Close() pages.Connect(db) router := chi.NewRouter() // A good base middleware stack router.Use(middleware.RequestID) router.Use(middleware.RealIP) router.Use(middleware.CleanPath) router.Use(middleware.Logger) router.Use(middleware.Recoverer) // handlers that DO NOT require authentification router.Handle("/static/*", http.StripPrefix("/static", http.FileServer(http.Dir("static")))) router.Get("/favicon.ico", http.NotFound) appRouter := router.With(csrf.Handler(), session.Handler()) appRouter.Get("/login", pages.Login()) appRouter.Post("/login", pages.HandleLogin) appRouter.Get("/logout", pages.Logout()) authRouter := appRouter.With(pages.RequireAuth) authRouter.Mount("/", pages.Init()) authRouter.Mount("/recur", pages.Recur()) authRouter.Mount("/categories", pages.Categories()) authRouter.NotFound(pages.NotFound()) log.Fatal(http.ListenAndServe(os.Getenv("GOSTEN_ADDRESS"), router)) }