Initial commit

This commit is contained in:
yan.y
2024-03-27 23:25:08 +08:00
commit 0884384e91
127 changed files with 9353 additions and 0 deletions
+118
View File
@@ -0,0 +1,118 @@
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)
}
+133
View File
@@ -0,0 +1,133 @@
package migration
import (
"github.com/go-gormigrate/gormigrate/v2"
"pet-house.com/core/g"
"pet-house.com/core/server/database"
"pet-house.com/core/server/zap_server"
"testing"
"gorm.io/gorm"
)
type Test struct {
gorm.Model
}
var id = "20211214120700_create_tests_table"
var m = &gormigrate.Migration{
ID: id,
Migrate: func(tx *gorm.DB) error {
return tx.AutoMigrate(&Test{})
},
Rollback: func(tx *gorm.DB) error {
return tx.Migrator().DropTable("tests")
},
}
func TestAddMigration(t *testing.T) {
migrate := New()
t.Run("migrate add migration", func(t *testing.T) {
migrate.AddMigration(m)
l := migrate.MigrationLen()
if l != 1 {
t.Errorf("MigrationLen want %d but get %d", 1, l)
}
})
}
type testSeed struct{}
func (ts *testSeed) Init() error {
return nil
}
func TestAddSeed(t *testing.T) {
migrate := New()
t.Run("migrate add seed", func(t *testing.T) {
migrate.AddSeed(&testSeed{})
l := migrate.SeedlLen()
if l != 1 {
t.Errorf("SeedlLen want %d but get %d", 1, l)
}
})
}
func TestMigrate(t *testing.T) {
defer zap_server.Remove()
defer database.Remove()
database.CONFIG.Path = g.TestMysqlAddr
database.CONFIG.Password = g.TestMysqlPwd
migrate := New()
migrate.AddMigration(m)
t.Run("migrate migrate", func(t *testing.T) {
err := migrate.Migrate()
if err != nil {
t.Error(err.Error())
}
})
}
func TestRollback(t *testing.T) {
defer zap_server.Remove()
defer database.Remove()
database.CONFIG.Path = g.TestMysqlAddr
database.CONFIG.Password = g.TestMysqlPwd
migrate := New()
t.Run("migrate rollback no migrate with id", func(t *testing.T) {
err := migrate.Rollback(id)
if err != nil {
t.Error(err.Error())
}
})
t.Run("migrate rollback no migrate without id", func(t *testing.T) {
err := migrate.Rollback("")
if err != nil {
t.Error(err.Error())
}
})
migrate.AddMigration(m)
err := migrate.Migrate()
if err != nil {
t.Error(err.Error())
}
t.Run("migrate rollback after migrate with id", func(t *testing.T) {
err := migrate.Rollback(id)
if err != nil {
t.Error(err.Error())
}
})
t.Run("migrate rollback after migrate without id", func(t *testing.T) {
err := migrate.Rollback("")
if err != nil {
t.Error(err.Error())
}
})
}
func TestRefresh(t *testing.T) {
defer zap_server.Remove()
defer database.Remove()
database.CONFIG.Path = g.TestMysqlAddr
database.CONFIG.Password = g.TestMysqlPwd
migrate := New()
t.Run("migrate refresh no migrate", func(t *testing.T) {
err := migrate.Refresh()
if err != nil {
t.Error(err.Error())
}
})
migrate.AddMigration(m)
err := migrate.Migrate()
if err != nil {
t.Error(err.Error())
}
t.Run("migrate refresh after migrate", func(t *testing.T) {
err := migrate.Refresh()
if err != nil {
t.Error(err.Error())
}
})
}