package db import ( "context" "errors" "log/slog" "spend-sparrow/internal/types" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database/sqlite3" _ "github.com/golang-migrate/migrate/v4/source/file" "github.com/jmoiron/sqlx" ) type migrationLogger struct{} func (l migrationLogger) Printf(format string, v ...any) { slog.Info(format, v...) } func (l migrationLogger) Verbose() bool { return false } func RunMigrations(ctx context.Context, db *sqlx.DB, pathPrefix string) error { driver, err := sqlite3.WithInstance(db.DB, &sqlite3.Config{}) if err != nil { slog.ErrorContext(ctx, "Could not create Migration instance", "err", err) return types.ErrInternal } m, err := migrate.NewWithDatabaseInstance( "file://"+pathPrefix+"migration/", "", driver) if err != nil { slog.ErrorContext(ctx, "Could not create migrations instance", "err", err) return types.ErrInternal } m.Log = migrationLogger{} if err = m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { slog.ErrorContext(ctx, "Could not run migrations", "err", err) return types.ErrInternal } return nil }