db-migrator.go
101 строка · 2.5 Кб
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 action10
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/raoptimus/db-migrator.go/internal/dal/entity"17"github.com/urfave/cli/v2"18)
19
20type Redo struct {21service MigrationService
22fileNameBuilder FileNameBuilder
23interactive bool24}
25
26func NewRedo(27service MigrationService,28fileNameBuilder FileNameBuilder,29interactive bool,30) *Redo {31return &Redo{32service: service,33fileNameBuilder: fileNameBuilder,34interactive: interactive,35}36}
37
38func (r *Redo) Run(ctx *cli.Context) error {39limit, err := args.ParseStepStringOrDefault(ctx.Args().Get(0), minLimit)40if err != nil {41return err42}43
44migrations, err := r.service.Migrations(ctx.Context, limit)45if err != nil {46return err47}48
49migrationsCount := migrations.Len()50if migrationsCount == 0 {51console.SuccessLn("No migration has been done before.")52return nil53}54
55console.Warnf(56"Total %d %s to be redone: \n",57migrationsCount,58console.NumberPlural(migrationsCount, "migration", "migrations"),59)60
61printMigrations(migrations, false)62
63question := fmt.Sprintf("Redo the above %d %s?",64migrationsCount, console.NumberPlural(migrationsCount, "migration", "migrations"),65)66if r.interactive && !console.Confirm(question) {67return nil68}69
70reversedMigrations := make(entity.Migrations, 0, migrationsCount)71for i := range migrations {72migration := &migrations[i]73fileName, safely := r.fileNameBuilder.Down(migration.Version, false)74
75if err := r.service.RevertFile(ctx.Context, migration, fileName, safely); err != nil {76console.ErrorLn("Migration failed. The rest of the migrations are canceled.")77return err78}79
80reversedMigrations = append(reversedMigrations, migrations[i])81}82
83for i := migrationsCount - 1; i >= 0; i-- {84migration := &reversedMigrations[i]85fileName, safely := r.fileNameBuilder.Up(migration.Version, false)86
87if err := r.service.ApplyFile(ctx.Context, migration, fileName, safely); err != nil {88console.ErrorLn("Migration failed. The rest of the migrations are canceled.\n")89return err90}91}92
93console.Warnf(94"%d %s redone.",95migrationsCount,96console.NumberPlural(migrationsCount, migrationWas, migrationsWere),97)98console.SuccessLn("Migration redone successfully.\n")99
100return nil101}
102