diff --git a/cmd/bun/main.go b/cmd/bun/main.go index a9f2836..d941aed 100644 --- a/cmd/bun/main.go +++ b/cmd/bun/main.go @@ -1,6 +1,7 @@ -package main +package migration import ( + "context" "fmt" "log" "os" @@ -13,37 +14,73 @@ import ( "github.com/urfave/cli/v2" ) -func main() { - - currentDir, err := os.Getwd() - if err != nil { - panic(err) - } - - envFilePath := filepath.Join(currentDir, ".env") +func RunMigrations() { + currentDir, err := os.Getwd() + if err != nil { + panic(err) + } + + envFilePath := filepath.Join(currentDir, ".env") + utils.LoadEnv(envFilePath) + dsn := os.Getenv("DB_URL") + + db, err := utils.SetupDBConnection(dsn) + if err != nil { + log.Fatalf("failed to connect to the database: %v", err) + os.Exit(1) + } + defer db.Close() + + migrator := migrate.NewMigrator(db, migrations.Migrations) + + err = migrator.Init(context.Background()) + if err != nil { + log.Fatalf("failed to initialize migration tables: %v", err) + } + + err = runMigrate(migrator) + if err != nil { + log.Fatalf("failed to run migrations: %v", err) + } +} - utils.LoadEnv(envFilePath) +func runMigrate(migrator *migrate.Migrator) error { + ctx := context.Background() + if err := migrator.Lock(ctx); err != nil { + return err + } + defer migrator.Unlock(ctx) // nolint: errcheck + + group, err := migrator.Migrate(ctx) + if err != nil { + return err + } + if group.IsZero() { + fmt.Println("there are no new migrations to run (database is up to date)") + return nil + } + fmt.Printf("migrated to %s\n", group) + return nil +} - dsn := os.Getenv("DB_URL") +func RegisterCLICommands() *cli.App { + dsn := os.Getenv("DB_URL") + db, err := utils.SetupDBConnection(dsn) + if err != nil { + log.Fatalf("failed to connect to the database: %v", err) + } + defer db.Close() - db, err := utils.SetupDBConnection(dsn) - if err != nil { - log.Fatalf("failed to connect to the database: %v", err) - os.Exit(1) - } + migrator := migrate.NewMigrator(db, migrations.Migrations) - app := &cli.App{ - Name: "bun", + app := &cli.App{ + Name: "bun", + Commands: []*cli.Command{ + newDBCommand(migrator), + }, + } - Commands: []*cli.Command{ - newDBCommand(migrate.NewMigrator(db, migrations.Migrations)), - }, - } - if err := app.Run(os.Args); err != nil { - log.Fatal(err) - } - - defer db.Close() + return app } func newDBCommand(migrator *migrate.Migrator) *cli.Command { @@ -193,4 +230,4 @@ func newDBCommand(migrator *migrate.Migrator) *cli.Command { }, }, } -} +} \ No newline at end of file diff --git a/main.go b/main.go index bf38aa0..b7727d5 100644 --- a/main.go +++ b/main.go @@ -5,21 +5,24 @@ import ( "log" "os" + migration "github.com/Real-Dev-Squad/tiny-site-backend/cmd/bun" "github.com/Real-Dev-Squad/tiny-site-backend/routes" "github.com/Real-Dev-Squad/tiny-site-backend/utils" ) func main() { - utils.LoadEnv(".env") - dsn := os.Getenv("DB_URL") - db, err := utils.SetupDBConnection(dsn) - if err != nil { - log.Fatalf("failed to connect to the database: %v", err) - os.Exit(1) - } + utils.LoadEnv(".env") + dsn := os.Getenv("DB_URL") + db, err := utils.SetupDBConnection(dsn) + if err != nil { + log.Fatalf("failed to connect to the database: %v", err) + os.Exit(1) + } - port := flag.String("port", os.Getenv("PORT"), "server address to listen on") - flag.Parse() + migration.RunMigrations() - routes.Listen("0.0.0.0:"+*port, db) + port := flag.String("port", os.Getenv("PORT"), "server address to listen on") + flag.Parse() + + routes.Listen("0.0.0.0:"+*port, db) }