Added migration mgmt with goose.

This commit is contained in:
2025-06-04 02:36:09 -05:00
parent 9e59d05efe
commit fa5be206cb
13 changed files with 297 additions and 66 deletions

110
cmd/migrate.go Normal file
View File

@ -0,0 +1,110 @@
package cmd
import (
"context"
"log/slog"
"git.coopcloud.tech/wiki-cafe/member-console/internal/db"
"git.coopcloud.tech/wiki-cafe/member-console/internal/logging"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var migrateCmd = &cobra.Command{
Use: "migrate",
Short: "Database migration commands",
Long: "Run database migrations up, down, or check status",
}
var migrateUpCmd = &cobra.Command{
Use: "up",
Short: "Run all pending migrations",
Long: "Apply all pending database migrations",
RunE: func(cmd *cobra.Command, args []string) error {
logger := slog.Default()
if logging.AppLogger != nil {
logger = logging.AppLogger
}
dbDSN := viper.GetString("db-dsn")
config := db.DefaultDBConfig(dbDSN)
database, err := db.Connect(context.Background(), logger, config)
if err != nil {
logger.Error("failed to connect to database", slog.Any("error", err))
return err
}
defer database.Close()
if err := db.RunMigrations(database); err != nil {
logger.Error("failed to run migrations", slog.Any("error", err))
return err
}
logger.Info("migrations completed successfully")
return nil
},
}
var migrateDownCmd = &cobra.Command{
Use: "down",
Short: "Rollback the last migration",
Long: "Rollback the most recently applied migration",
RunE: func(cmd *cobra.Command, args []string) error {
logger := slog.Default()
if logging.AppLogger != nil {
logger = logging.AppLogger
}
dbDSN := viper.GetString("db-dsn")
config := db.DefaultDBConfig(dbDSN)
database, err := db.Connect(context.Background(), logger, config)
if err != nil {
logger.Error("failed to connect to database", slog.Any("error", err))
return err
}
defer database.Close()
if err := db.RollbackMigration(database); err != nil {
logger.Error("failed to rollback migration", slog.Any("error", err))
return err
}
logger.Info("migration rollback completed successfully")
return nil
},
}
var migrateStatusCmd = &cobra.Command{
Use: "status",
Short: "Show migration status",
Long: "Display the status of all migrations",
RunE: func(cmd *cobra.Command, args []string) error {
logger := slog.Default()
if logging.AppLogger != nil {
logger = logging.AppLogger
}
dbDSN := viper.GetString("db-dsn")
config := db.DefaultDBConfig(dbDSN)
database, err := db.Connect(context.Background(), logger, config)
if err != nil {
logger.Error("failed to connect to database", slog.Any("error", err))
return err
}
defer database.Close()
if err := db.MigrationStatus(database); err != nil {
logger.Error("failed to get migration status", slog.Any("error", err))
return err
}
return nil
},
}
func init() {
migrateCmd.AddCommand(migrateUpCmd)
migrateCmd.AddCommand(migrateDownCmd)
migrateCmd.AddCommand(migrateStatusCmd)
rootCmd.AddCommand(migrateCmd)
}