github.com/wawandco/ox@v0.13.6-0.20230809142027-913b3d837f2a/plugins/tools/db/reset.go (about) 1 package db 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 8 "github.com/gobuffalo/pop/v6" 9 "github.com/spf13/pflag" 10 "github.com/wawandco/ox/internal/log" 11 "github.com/wawandco/ox/plugins/core" 12 ) 13 14 type ResetCommand struct { 15 connectionName string 16 // Other plugins that will run when reset is invoked 17 resetters []Resetter 18 19 flags *pflag.FlagSet 20 } 21 22 func (d ResetCommand) Name() string { 23 return "reset" 24 } 25 26 func (d ResetCommand) HelpText() string { 27 return "resets database specified in GO_ENV or --conn" 28 } 29 30 func (d ResetCommand) ParentName() string { 31 return "database" 32 } 33 34 func (d *ResetCommand) Run(ctx context.Context, root string, args []string) error { 35 conn := pop.Connections[d.connectionName] 36 if conn == nil { 37 return ErrConnectionNotFound 38 } 39 40 dial := conn.Dialect 41 if dial == nil { 42 return errors.New("provided connection is not a Resetter") 43 } 44 45 err := dial.DropDB() 46 if err != nil { 47 log.Warnf("could not drop database: %v\n", err) 48 } 49 log.Info("Database dropped") 50 51 err = dial.CreateDB() 52 if err != nil { 53 log.Errorf("could not create database: %v\n", err) 54 return err 55 } 56 log.Info("Database created") 57 58 for _, resetter := range d.resetters { 59 err := resetter.Reset(ctx, conn) 60 if err != nil { 61 log.Errorf("could not run resetter: %v\n", err) 62 return err 63 } 64 } 65 66 return nil 67 } 68 69 // RunBeforeTests will be invoked to reset the test database before 70 // tests run. 71 func (d *ResetCommand) RunBeforeTest(ctx context.Context, root string, args []string) error { 72 if len(pop.Connections) == 0 { 73 err := pop.LoadConfigFile() 74 if err != nil { 75 return fmt.Errorf("error on reset.RunBeforeTest: %w", err) 76 } 77 } 78 79 conn := pop.Connections["test"] 80 if conn == nil { 81 return ErrConnectionNotFound 82 } 83 84 resetter := conn.Dialect 85 if resetter == nil { 86 return errors.New("provided connection is not a Resetter") 87 } 88 89 err := resetter.DropDB() 90 if err != nil { 91 log.Warnf("could not drop database: %v\n", err) 92 } 93 94 return resetter.CreateDB() 95 } 96 97 func (d *ResetCommand) ParseFlags(args []string) { 98 d.flags = pflag.NewFlagSet(d.Name(), pflag.ContinueOnError) 99 d.flags.Usage = func() {} 100 d.flags.StringVarP(&d.connectionName, "conn", "", "development", "the name of the connection to use") 101 d.flags.Parse(args) //nolint:errcheck,we don't care hence the flag 102 } 103 104 func (d *ResetCommand) Flags() *pflag.FlagSet { 105 return d.flags 106 } 107 108 func (d *ResetCommand) Receive(pls []core.Plugin) { 109 for _, plugin := range pls { 110 ptool, ok := plugin.(Resetter) 111 if !ok { 112 continue 113 } 114 115 d.resetters = append(d.resetters, ptool) 116 } 117 } 118 119 // Resetter is something that should be run on reset. 120 type Resetter interface { 121 Reset(context.Context, *pop.Connection) error 122 }