119 lines
2.7 KiB
Go
119 lines
2.7 KiB
Go
package migration
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/go-gormigrate/gormigrate/v2"
|
|
"pet-house.com/core/seed"
|
|
"pet-house.com/core/server/database"
|
|
)
|
|
|
|
// MigrationCmd migration cmd
|
|
// MigrationCollection migration collections
|
|
// SeedCollection data seed collection
|
|
type MigrationCmd struct {
|
|
MigrationCollection []*gormigrate.Migration
|
|
SeedCollection []seed.SeedFunc
|
|
}
|
|
|
|
// New MigrationCmd
|
|
func New() *MigrationCmd {
|
|
mc := &MigrationCmd{
|
|
MigrationCollection: nil,
|
|
SeedCollection: nil,
|
|
}
|
|
|
|
return mc
|
|
}
|
|
|
|
// AddMigration add *gormigrate.Migration
|
|
func (mc *MigrationCmd) AddMigration(m ...*gormigrate.Migration) {
|
|
mc.MigrationCollection = append(mc.MigrationCollection, m...)
|
|
}
|
|
|
|
// MigrationLen length of MigrationCollection
|
|
func (mc *MigrationCmd) MigrationLen() int {
|
|
return len(mc.MigrationCollection)
|
|
}
|
|
|
|
// AddSeed add SeedFunc
|
|
func (mc *MigrationCmd) AddSeed(sf ...seed.SeedFunc) {
|
|
mc.SeedCollection = append(mc.SeedCollection, sf...)
|
|
}
|
|
|
|
// SeedlLen length of SeedCollection
|
|
func (mc *MigrationCmd) SeedlLen() int {
|
|
return len(mc.SeedCollection)
|
|
}
|
|
|
|
// Refresh refresh migration
|
|
func (mc *MigrationCmd) Refresh() error {
|
|
if mc.getFirstMigration() == "" {
|
|
return nil
|
|
}
|
|
err := mc.rollbackTo(mc.getFirstMigration())
|
|
if !errors.Is(gormigrate.ErrMigrationIDDoesNotExist, err) && err != nil {
|
|
return err
|
|
}
|
|
return mc.Migrate()
|
|
}
|
|
|
|
// rollbackTo roolback migration to migrationId
|
|
func (mc *MigrationCmd) rollbackTo(migrationId string) error {
|
|
return mc.gormigrate().RollbackTo(migrationId)
|
|
}
|
|
|
|
// Rollback roolback migrations
|
|
func (mc *MigrationCmd) Rollback(migrationId string) error {
|
|
if mc.MigrationLen() == 0 {
|
|
return nil
|
|
}
|
|
if migrationId == "" {
|
|
err := mc.rollbackLast()
|
|
if !errors.Is(gormigrate.ErrMigrationIDDoesNotExist, err) && err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
err := mc.rollbackTo(migrationId)
|
|
if !errors.Is(gormigrate.ErrMigrationIDDoesNotExist, err) && err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// rollbackLast roolback the lasted migration
|
|
func (mc *MigrationCmd) rollbackLast() error {
|
|
return mc.gormigrate().RollbackLast()
|
|
}
|
|
|
|
// Migrate exec migration cmd
|
|
func (mc *MigrationCmd) Migrate() error {
|
|
m := mc.gormigrate()
|
|
err := m.Migrate()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Seed seed data into database
|
|
func (mc *MigrationCmd) Seed() error {
|
|
if mc.SeedCollection == nil {
|
|
return nil
|
|
}
|
|
return seed.Seed(mc.SeedCollection...)
|
|
}
|
|
|
|
// getFirstMigration get first migration's id
|
|
func (mc *MigrationCmd) getFirstMigration() string {
|
|
if mc.MigrationLen() == 0 {
|
|
return ""
|
|
}
|
|
return mc.MigrationCollection[0].ID
|
|
}
|
|
|
|
// gormigrate create *gormigrate.Gormigrate
|
|
func (mc *MigrationCmd) gormigrate() *gormigrate.Gormigrate {
|
|
return gormigrate.New(database.Instance(), gormigrate.DefaultOptions, mc.MigrationCollection)
|
|
}
|