package main import ( "context" "go-postgres-gorm-chi-starter/model" "log" "net/http" "time" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "gorm.io/driver/postgres" "gorm.io/gorm" ) func main() { // Get the database connection dsn := "host=localhost user=golang password=golang dbname=golang port=5432 sslmode=disable TimeZone=Europe/Belgrade" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatalf("Error connecting to the database: %v", err) } // Migrations db.AutoMigrate(&model.User{}) router := chi.NewRouter() // Middleware router.Use(middleware.RequestID) router.Use(middleware.RealIP) router.Use(middleware.Logger) router.Use(middleware.Recoverer) router.Use(middleware.Timeout(60 * time.Second)) router.Use(ApiCtx(db)) // Routes router.Get("/", func(w http.ResponseWriter, r *http.Request) { // Extract the database connection from the context ctx := r.Context() db := ctx.Value("db").(*gorm.DB) // Send the database name as a response w.Header().Set("Content-Type", "text/plain") w.Write([]byte(db.Name())) }) // Start server log.Println("Starting server on :8080") http.ListenAndServe(":8080", router) } func ApiCtx(db *gorm.DB) func(next http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), "db", db) next.ServeHTTP(w, r.WithContext(ctx)) }) } }