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  }