Files
member-console/cmd/migrate.go

111 lines
2.8 KiB
Go

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)
}