From 7eb464272ef6e43aac3f79dc65fcf598c9c23603 Mon Sep 17 00:00:00 2001 From: Darius Rapalis Date: Tue, 11 Mar 2025 18:13:22 +0200 Subject: [PATCH] DATABASE! --- .gitignore | 3 ++- go.mod | 6 ++++++ go.sum | 6 ++++++ internal/database/CreateUser.sql.go | 28 ++++++++++++++++++++++++++ internal/database/db.go | 31 +++++++++++++++++++++++++++++ internal/database/models.go | 18 +++++++++++++++++ main.go | 21 +++++++++++++++++++ sql/queries/CreateUser.sql | 4 ++++ sql/schema/001_users.sql | 10 ++++++++++ sqlc.yaml | 8 ++++++++ 10 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 go.sum create mode 100644 internal/database/CreateUser.sql.go create mode 100644 internal/database/db.go create mode 100644 internal/database/models.go create mode 100644 sql/queries/CreateUser.sql create mode 100644 sql/schema/001_users.sql create mode 100644 sqlc.yaml diff --git a/.gitignore b/.gitignore index fca352e..0656bac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .idea -out \ No newline at end of file +out +.env diff --git a/go.mod b/go.mod index 2e5598d..6961458 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,9 @@ module github.com/rdarius/go-http-server go 1.23.6 + +require ( + github.com/google/uuid v1.6.0 // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/lib/pq v1.10.9 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..63c8b5f --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= diff --git a/internal/database/CreateUser.sql.go b/internal/database/CreateUser.sql.go new file mode 100644 index 0000000..d989368 --- /dev/null +++ b/internal/database/CreateUser.sql.go @@ -0,0 +1,28 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.28.0 +// source: CreateUser.sql + +package database + +import ( + "context" +) + +const createUser = `-- name: CreateUser :one +INSERT INTO users (id, created_at, updated_at, email) +VALUES (gen_random_uuid(), NOW(), NOW(), $1) +RETURNING id, created_at, updated_at, email +` + +func (q *Queries) CreateUser(ctx context.Context, email string) (User, error) { + row := q.db.QueryRowContext(ctx, createUser, email) + var i User + err := row.Scan( + &i.ID, + &i.CreatedAt, + &i.UpdatedAt, + &i.Email, + ) + return i, err +} diff --git a/internal/database/db.go b/internal/database/db.go new file mode 100644 index 0000000..bad7c4b --- /dev/null +++ b/internal/database/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.28.0 + +package database + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/database/models.go b/internal/database/models.go new file mode 100644 index 0000000..40b659e --- /dev/null +++ b/internal/database/models.go @@ -0,0 +1,18 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.28.0 + +package database + +import ( + "time" + + "github.com/google/uuid" +) + +type User struct { + ID uuid.UUID + CreatedAt time.Time + UpdatedAt time.Time + Email string +} diff --git a/main.go b/main.go index f78708b..33bf220 100644 --- a/main.go +++ b/main.go @@ -1,15 +1,22 @@ package main import ( + "database/sql" "encoding/json" "fmt" + "github.com/joho/godotenv" + _ "github.com/lib/pq" + "github.com/rdarius/go-http-server/internal/database" + "log" "net/http" + "os" "regexp" "sync/atomic" ) type apiConfig struct { fileserverHits atomic.Int32 + db database.Queries } func (cfg *apiConfig) middlewareMetricsInc(next http.Handler) http.Handler { @@ -108,9 +115,23 @@ func validateChirpHandler(w http.ResponseWriter, r *http.Request) { } func main() { + err := godotenv.Load() + if err != nil { + log.Fatal("Error loading .env file") + } + + dbURL := os.Getenv("DB_URL") + + db, err := sql.Open("postgres", dbURL) + if err != nil { + log.Fatal(err) + } apiCfg := &apiConfig{} + dbQueries := database.New(db) + apiCfg.db = *dbQueries + mux := http.NewServeMux() mux.HandleFunc("GET /api/healthz", readinessHandler) diff --git a/sql/queries/CreateUser.sql b/sql/queries/CreateUser.sql new file mode 100644 index 0000000..6378eb9 --- /dev/null +++ b/sql/queries/CreateUser.sql @@ -0,0 +1,4 @@ +-- name: CreateUser :one +INSERT INTO users (id, created_at, updated_at, email) +VALUES (gen_random_uuid(), NOW(), NOW(), $1) +RETURNING *; \ No newline at end of file diff --git a/sql/schema/001_users.sql b/sql/schema/001_users.sql new file mode 100644 index 0000000..09ba992 --- /dev/null +++ b/sql/schema/001_users.sql @@ -0,0 +1,10 @@ +-- +goose Up +CREATE TABLE users( + id UUID PRIMARY KEY, + created_at TIMESTAMP not null DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP not null DEFAULT CURRENT_TIMESTAMP, + email TEXT not null +); + +-- +goose Down +DROP TABLE users; \ No newline at end of file diff --git a/sqlc.yaml b/sqlc.yaml new file mode 100644 index 0000000..c20ea46 --- /dev/null +++ b/sqlc.yaml @@ -0,0 +1,8 @@ +version: "2" +sql: + - schema: "sql/schema" + queries: "sql/queries" + engine: "postgresql" + gen: + go: + out: "internal/database" \ No newline at end of file