Skip to content

Commit 9590d4a

Browse files
migrations added
1 parent 4b6c3c6 commit 9590d4a

File tree

6 files changed

+111
-4
lines changed

6 files changed

+111
-4
lines changed

Makefile

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,18 @@ tools:
5353
go install github.com/air-verse/air@latest
5454
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
5555

56-
# Database migrations (example)
56+
# Database migrations
5757
migrate-up:
58-
migrate -path internal/database/migrations -database $(DATABASE_URL) up
58+
migrate -path internal/database/migrations -database "$(DATABASE_URL)" up
5959

6060
migrate-down:
61-
migrate -path internal/database/migrations -database $(DATABASE_URL) down
61+
migrate -path internal/database/migrations -database "$(DATABASE_URL)" down 1
62+
63+
migrate-force:
64+
migrate -path internal/database/migrations -database "$(DATABASE_URL)" force $(VERSION)
65+
66+
migrate-create:
67+
migrate create -ext sql -dir internal/database/migrations -seq $(NAME)
6268

6369
docker-up:
6470
docker-compose -f $(DOCKER_COMPOSE_FILE) up -d
@@ -99,5 +105,10 @@ ghcr-compose-generate:
99105
@sed -i '' '/# build:/a\'$$'\n'' image: $(GHCR_IMAGE):$(DOCKER_TAG)' docker/docker-compose.ghcr.yml
100106
@echo "Generated docker/docker-compose.ghcr.yml for QA sharing"
101107

108+
# Generate mocks
102109
mocks:
103-
mockgen -source=internal/repository/interfaces.go -destination=internal/repository/mocks/mock_repositories.go
110+
mockgen -source=internal/repository/interfaces.go -destination=internal/repository/mocks/mock_repositories.go
111+
112+
# Generate swagger docs
113+
swagger:
114+
swag init -g cmd/server/main.go -o ./docs

go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ require (
3232
github.com/go-playground/locales v0.14.1 // indirect
3333
github.com/go-playground/universal-translator v0.18.1 // indirect
3434
github.com/goccy/go-json v0.10.5 // indirect
35+
github.com/hashicorp/errwrap v1.1.0 // indirect
36+
github.com/hashicorp/go-multierror v1.1.1 // indirect
3537
github.com/jackc/pgpassfile v1.0.0 // indirect
3638
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
3739
github.com/jackc/pgx/v5 v5.6.0 // indirect
@@ -40,6 +42,7 @@ require (
4042
github.com/json-iterator/go v1.1.12 // indirect
4143
github.com/klauspost/cpuid/v2 v2.2.11 // indirect
4244
github.com/leodido/go-urn v1.4.0 // indirect
45+
github.com/lib/pq v1.10.9 // indirect
4346
github.com/mailru/easyjson v0.7.6 // indirect
4447
github.com/mattn/go-isatty v0.0.20 // indirect
4548
github.com/mattn/go-sqlite3 v1.14.22 // indirect
@@ -77,6 +80,7 @@ require (
7780
github.com/gin-contrib/cors v1.7.6
7881
github.com/gin-gonic/gin v1.10.1
7982
github.com/golang-jwt/jwt/v5 v5.3.0
83+
github.com/golang-migrate/migrate/v4 v4.19.0
8084
github.com/jinzhu/inflection v1.0.0 // indirect
8185
github.com/jinzhu/now v1.1.5 // indirect
8286
github.com/prometheus/client_golang v1.23.2

go.sum

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,18 @@ github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
5353
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
5454
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
5555
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
56+
github.com/golang-migrate/migrate/v4 v4.19.0 h1:RcjOnCGz3Or6HQYEJ/EEVLfWnmw9KnoigPSjzhCuaSE=
57+
github.com/golang-migrate/migrate/v4 v4.19.0/go.mod h1:9dyEcu+hO+G9hPSw8AIg50yg622pXJsoHItQnDGZkI0=
5658
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
5759
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
5860
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
5961
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
6062
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
63+
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
64+
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
65+
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
66+
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
67+
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
6168
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
6269
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
6370
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
@@ -89,6 +96,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
8996
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
9097
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
9198
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
99+
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
100+
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
92101
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
93102
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
94103
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=

internal/database/migrate.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package database
2+
3+
import (
4+
"github.com/nevzattalhaozcan/forgotten/pkg/logger"
5+
6+
"github.com/golang-migrate/migrate/v4"
7+
"github.com/golang-migrate/migrate/v4/database/postgres"
8+
_ "github.com/golang-migrate/migrate/v4/source/file"
9+
"gorm.io/gorm"
10+
)
11+
12+
func RunMigrations(db *gorm.DB, migrationsPath string) error {
13+
sqlDB, err := db.DB()
14+
if err != nil {
15+
return err
16+
}
17+
18+
driver, err := postgres.WithInstance(sqlDB, &postgres.Config{})
19+
if err != nil {
20+
return err
21+
}
22+
23+
m, err := migrate.NewWithDatabaseInstance(
24+
"file://"+migrationsPath,
25+
"postgres",
26+
driver,
27+
)
28+
if err != nil {
29+
return err
30+
}
31+
32+
if err := m.Up(); err != nil && err != migrate.ErrNoChange {
33+
return err
34+
}
35+
36+
logger.Info("Database migrations completed successfully")
37+
return nil
38+
}
39+
40+
func RollbackMigrations(db *gorm.DB, migrationsPath string, steps int) error {
41+
sqlDB, err := db.DB()
42+
if err != nil {
43+
return err
44+
}
45+
46+
driver, err := postgres.WithInstance(sqlDB, &postgres.Config{})
47+
if err != nil {
48+
return err
49+
}
50+
51+
m, err := migrate.NewWithDatabaseInstance(
52+
"file://"+migrationsPath,
53+
"postgres",
54+
driver,
55+
)
56+
if err != nil {
57+
return err
58+
}
59+
60+
if err := m.Steps(-steps); err != nil {
61+
return err
62+
}
63+
64+
logger.Info("Database rollback completed successfully")
65+
return nil
66+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP TABLE IF EXISTS users;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CREATE TABLE IF NOT EXISTS users (
2+
id SERIAL PRIMARY KEY,
3+
username VARCHAR(50) UNIQUE NOT NULL,
4+
email VARCHAR(255) UNIQUE NOT NULL,
5+
password_hash VARCHAR(255) NOT NULL,
6+
first_name VARCHAR(50) NOT NULL,
7+
last_name VARCHAR(50) NOT NULL,
8+
is_active BOOLEAN DEFAULT TRUE,
9+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
10+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
11+
deleted_at TIMESTAMP WITH TIME ZONE
12+
);
13+
14+
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
15+
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
16+
CREATE INDEX IF NOT EXISTS idx_users_deleted_at ON users(deleted_at);

0 commit comments

Comments
 (0)