db-migrator.go

Форк
0
96 строк · 2.2 Кб
1
/**
2
 * This file is part of the raoptimus/db-migrator.go library
3
 *
4
 * @copyright Copyright (c) Evgeniy Urvantsev
5
 * @license https://github.com/raoptimus/db-migrator.go/blob/master/LICENSE.md
6
 * @link https://github.com/raoptimus/db-migrator.go
7
 */
8

9
package action
10

11
import (
12
	"fmt"
13

14
	"github.com/raoptimus/db-migrator.go/internal/args"
15
	"github.com/raoptimus/db-migrator.go/internal/console"
16
	"github.com/urfave/cli/v2"
17
)
18

19
type Downgrade struct {
20
	service         MigrationService
21
	fileNameBuilder FileNameBuilder
22
	interactive     bool
23
}
24

25
func NewDowngrade(
26
	service MigrationService,
27
	fileNameBuilder FileNameBuilder,
28
	interactive bool,
29
) *Downgrade {
30
	return &Downgrade{
31
		service:         service,
32
		fileNameBuilder: fileNameBuilder,
33
		interactive:     interactive,
34
	}
35
}
36

37
func (d *Downgrade) Run(ctx *cli.Context) error {
38
	limit, err := args.ParseStepStringOrDefault(ctx.Args().Get(0), minLimit)
39
	if err != nil {
40
		return err
41
	}
42

43
	migrations, err := d.service.Migrations(ctx.Context, limit)
44
	if err != nil {
45
		return err
46
	}
47

48
	migrationsCount := migrations.Len()
49
	if migrationsCount == 0 {
50
		console.SuccessLn("No migration has been done before.")
51
		return nil
52
	}
53

54
	console.Warnf(
55
		"Total %d %s to be reverted: \n",
56
		migrationsCount,
57
		console.NumberPlural(migrationsCount, "migration", "migrations"),
58
	)
59

60
	printMigrations(migrations, false)
61

62
	reverted := 0
63
	question := fmt.Sprintf("RevertFile the above %d %s?",
64
		migrationsCount,
65
		console.NumberPlural(migrationsCount, "migration", "migrations"),
66
	)
67
	if d.interactive && !console.Confirm(question) {
68
		return nil
69
	}
70

71
	for i := range migrations {
72
		migration := &migrations[i]
73
		fileName, safely := d.fileNameBuilder.Down(migration.Version, false)
74

75
		if err := d.service.RevertFile(ctx.Context, migration, fileName, safely); err != nil {
76
			console.Errorf(
77
				"%d from %d %s reverted.\n"+
78
					"Migration failed. The rest of the migrations are canceled.\n",
79
				reverted,
80
				migrationsCount,
81
				console.NumberPlural(reverted, migrationWas, migrationsWere),
82
			)
83
			return err
84
		}
85

86
		reverted++
87
	}
88

89
	console.Successf(
90
		"%d %s reverted\n",
91
		migrationsCount,
92
		console.NumberPlural(migrationsCount, migrationWas, migrationsWere),
93
	)
94
	console.SuccessLn("Migrated down successfully\n")
95
	return nil
96
}
97

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.