From cfe65135d833ab6c7d20d7fedfc1780684630e89 Mon Sep 17 00:00:00 2001 From: Zvonimir Rudinski Date: Thu, 13 Jun 2024 02:06:01 +0200 Subject: [PATCH] add go gorm chi postgres starter --- .../go-postgresql-gorm-chi-starter/.gitignore | 1 + .../docker-compose.yml | 10 ++++ .../go-postgresql-gorm-chi-starter/go.mod | 19 ++++++ .../go-postgresql-gorm-chi-starter/go.sum | 31 ++++++++++ .../go-postgresql-gorm-chi-starter/main.go | 58 +++++++++++++++++++ .../model/user.go | 11 ++++ 6 files changed, 130 insertions(+) create mode 100644 web/other/go-postgresql-gorm-chi-starter/.gitignore create mode 100644 web/other/go-postgresql-gorm-chi-starter/docker-compose.yml create mode 100644 web/other/go-postgresql-gorm-chi-starter/go.mod create mode 100644 web/other/go-postgresql-gorm-chi-starter/go.sum create mode 100644 web/other/go-postgresql-gorm-chi-starter/main.go create mode 100644 web/other/go-postgresql-gorm-chi-starter/model/user.go diff --git a/web/other/go-postgresql-gorm-chi-starter/.gitignore b/web/other/go-postgresql-gorm-chi-starter/.gitignore new file mode 100644 index 0000000..36e8de7 --- /dev/null +++ b/web/other/go-postgresql-gorm-chi-starter/.gitignore @@ -0,0 +1 @@ +go-postgres-gorm-chi-starter diff --git a/web/other/go-postgresql-gorm-chi-starter/docker-compose.yml b/web/other/go-postgresql-gorm-chi-starter/docker-compose.yml new file mode 100644 index 0000000..032fe9d --- /dev/null +++ b/web/other/go-postgresql-gorm-chi-starter/docker-compose.yml @@ -0,0 +1,10 @@ +services: + postgres: + image: postgres:16 + restart: always + environment: + POSTGRES_USER: golang + POSTGRES_PASSWORD: golang + POSTGRES_DB: golang + ports: + - 5432:5432 diff --git a/web/other/go-postgresql-gorm-chi-starter/go.mod b/web/other/go-postgresql-gorm-chi-starter/go.mod new file mode 100644 index 0000000..56b37a7 --- /dev/null +++ b/web/other/go-postgresql-gorm-chi-starter/go.mod @@ -0,0 +1,19 @@ +module go-postgres-gorm-chi-starter + +go 1.22.4 + +require github.com/go-chi/chi/v5 v5.0.12 + +require ( + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.6.0 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/text v0.16.0 // indirect + gorm.io/driver/postgres v1.5.9 // indirect + gorm.io/gorm v1.25.10 // indirect +) diff --git a/web/other/go-postgresql-gorm-chi-starter/go.sum b/web/other/go-postgresql-gorm-chi-starter/go.sum new file mode 100644 index 0000000..be8aee2 --- /dev/null +++ b/web/other/go-postgresql-gorm-chi-starter/go.sum @@ -0,0 +1,31 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= +github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8= +gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= +gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= diff --git a/web/other/go-postgresql-gorm-chi-starter/main.go b/web/other/go-postgresql-gorm-chi-starter/main.go new file mode 100644 index 0000000..b728883 --- /dev/null +++ b/web/other/go-postgresql-gorm-chi-starter/main.go @@ -0,0 +1,58 @@ +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)) + }) + } +} diff --git a/web/other/go-postgresql-gorm-chi-starter/model/user.go b/web/other/go-postgresql-gorm-chi-starter/model/user.go new file mode 100644 index 0000000..c967b81 --- /dev/null +++ b/web/other/go-postgresql-gorm-chi-starter/model/user.go @@ -0,0 +1,11 @@ +package model + +import "gorm.io/gorm" + +type User struct { + gorm.Model + Name string + Email string `gorm:"unique"` + Password string + Phone *string // Nullable +}