db-migrator.go
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
9package action
10
11import (
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
19type Downgrade struct {
20service MigrationService
21fileNameBuilder FileNameBuilder
22interactive bool
23}
24
25func NewDowngrade(
26service MigrationService,
27fileNameBuilder FileNameBuilder,
28interactive bool,
29) *Downgrade {
30return &Downgrade{
31service: service,
32fileNameBuilder: fileNameBuilder,
33interactive: interactive,
34}
35}
36
37func (d *Downgrade) Run(ctx *cli.Context) error {
38limit, err := args.ParseStepStringOrDefault(ctx.Args().Get(0), minLimit)
39if err != nil {
40return err
41}
42
43migrations, err := d.service.Migrations(ctx.Context, limit)
44if err != nil {
45return err
46}
47
48migrationsCount := migrations.Len()
49if migrationsCount == 0 {
50console.SuccessLn("No migration has been done before.")
51return nil
52}
53
54console.Warnf(
55"Total %d %s to be reverted: \n",
56migrationsCount,
57console.NumberPlural(migrationsCount, "migration", "migrations"),
58)
59
60printMigrations(migrations, false)
61
62reverted := 0
63question := fmt.Sprintf("RevertFile the above %d %s?",
64migrationsCount,
65console.NumberPlural(migrationsCount, "migration", "migrations"),
66)
67if d.interactive && !console.Confirm(question) {
68return nil
69}
70
71for i := range migrations {
72migration := &migrations[i]
73fileName, safely := d.fileNameBuilder.Down(migration.Version, false)
74
75if err := d.service.RevertFile(ctx.Context, migration, fileName, safely); err != nil {
76console.Errorf(
77"%d from %d %s reverted.\n"+
78"Migration failed. The rest of the migrations are canceled.\n",
79reverted,
80migrationsCount,
81console.NumberPlural(reverted, migrationWas, migrationsWere),
82)
83return err
84}
85
86reverted++
87}
88
89console.Successf(
90"%d %s reverted\n",
91migrationsCount,
92console.NumberPlural(migrationsCount, migrationWas, migrationsWere),
93)
94console.SuccessLn("Migrated down successfully\n")
95return nil
96}
97