Parcourir la source

feat(command): make factory 命令

runningwater il y a 6 mois
Parent
commit
4fa71acec3

+ 1 - 0
app/cmd/make/make.go

@@ -72,6 +72,7 @@ func init() {
 		CmdMakeAPIController,
 		CmdMakeRequest,
 		CmdMakeMigration,
+		CmdMakeFactory,
 	)
 }
 

+ 22 - 0
app/cmd/make/make_factory.go

@@ -0,0 +1,22 @@
+package make
+
+import (
+	"fmt"
+
+	"github.com/spf13/cobra"
+)
+
+var CmdMakeFactory = &cobra.Command{
+	Use:   "factory",
+	Short: "Create model's factory file, example: make factory user",
+	Run:   runMakeFactory,
+	Args:  cobra.ExactArgs(1),
+}
+
+func runMakeFactory(cmd *cobra.Command, args []string) {
+	model := makeModelFromString(args[0])
+
+	filePath := fmt.Sprintf("database/factories/%s_factory.go", model.PackageName)
+
+	createFileFromTpl(filePath, "factory", model)
+}

+ 22 - 0
app/cmd/make/tpls/factory.tpl

@@ -0,0 +1,22 @@
+// Package factories 存放 {{PackageName}} 工厂方法
+package factories
+
+import (
+	"github.com/bxcodec/faker/v4"
+	"github.com/runningwater/gohub/app/models/{{PackageName}}"
+)
+
+func Make{{StructNamePlural}}(times int) []{{PackageName}}.{{StructName}} {
+	var objs []{{PackageName}}.{{StructName}}
+
+	// 设置唯一值, 如 {{StructName}} 模型中的某个字段需要唯一
+	faker.SetGenerateUniqueValues(true)
+
+	for range times {
+		model := {{PackageName}}.{{StructName}}{
+			// FIXME()
+		}
+		objs = append(objs, model)
+	}
+	return objs
+}

+ 13 - 0
database/seeders/seeder.go

@@ -0,0 +1,13 @@
+// Package seeders 存放数据填充文件
+package seeders
+
+import "github.com/runningwater/gohub/pkg/seed"
+
+func Initialize() {
+	// 触发加载本目录下所有文件中的 Init 方法
+
+	// 设置按顺序执行的 Seeder
+	seed.SetRunOrder([]string{
+		"UsersTableSeeder",
+	})
+}

+ 32 - 0
database/seeders/users_seeder.go

@@ -0,0 +1,32 @@
+package seeders
+
+import (
+	"fmt"
+
+	"github.com/runningwater/gohub/database/factories"
+	"github.com/runningwater/gohub/pkg/console"
+	"github.com/runningwater/gohub/pkg/logger"
+	"github.com/runningwater/gohub/pkg/seed"
+	"gorm.io/gorm"
+)
+
+func init() {
+	// 添加 Seeder
+	seed.Add("UsersTableSeeder", usersTableSeederFun)
+}
+
+func usersTableSeederFun(db *gorm.DB) {
+	// 创建 10 个用户对象
+	users := factories.MakeUsers(10)
+
+	// 批量插入到数据库
+	result := db.Table("users").Create(&users)
+
+	if err := result.Error; err != nil {
+		logger.LogIf(err)
+		return
+	}
+
+	// 打印成功信息
+	console.Success(fmt.Sprintf("Table [%v] %v rows seeded", result.Statement.Table, result.RowsAffected))
+}

+ 31 - 0
pkg/seed/seeder.go

@@ -0,0 +1,31 @@
+// Package seed 存放数据库填充数据
+package seed
+
+import "gorm.io/gorm"
+
+// 存放所有 Seeder
+var seedrs []Seeder
+
+// 按排序执行的 Seeder 数组
+var orderedSeederNames []string
+
+type SeederFunc func(*gorm.DB)
+
+// Seeder 对应每一个 database/seeders 目录下的 Seeder 文件
+type Seeder struct {
+	Name string
+	Func SeederFunc
+}
+
+// AddSeeder 添加一个 Seeder
+func Add(name string, fn SeederFunc) {
+	seedrs = append(seedrs, Seeder{
+		Name: name,
+		Func: fn,
+	})
+}
+
+// SetRunOrder 设置 按顺序执行的 Seeder 数组
+func SetRunOrder(names []string) {
+	orderedSeederNames = names
+}