From 501af58e668999bbf7ad15f67f42eb7a5344dfb1 Mon Sep 17 00:00:00 2001 From: rogeecn Date: Sat, 22 Mar 2025 18:23:26 +0800 Subject: [PATCH] feat: add transformer for model --- cmd/gen_model.go | 20 ++++++++----------- pkg/ast/model/generage.go | 17 +++++++++++++++- pkg/ast/model/transformer.go | 9 +++++++++ .../project/app/requests/pagination.go.tpl | 4 ++-- templates/project/buf.gen.yaml.tpl | 10 +++++----- templates/project/database/transform.yaml.tpl | 16 ++++++++------- 6 files changed, 49 insertions(+), 27 deletions(-) create mode 100644 pkg/ast/model/transformer.go diff --git a/cmd/gen_model.go b/cmd/gen_model.go index 26d8e9d..b0161f4 100644 --- a/cmd/gen_model.go +++ b/cmd/gen_model.go @@ -17,6 +17,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" + "go.ipao.vip/atomctl/pkg/ast/model" astModel "go.ipao.vip/atomctl/pkg/ast/model" pgDatabase "go.ipao.vip/atomctl/pkg/postgres" "go.ipao.vip/atomctl/pkg/utils/gomod" @@ -43,11 +44,6 @@ func commandGenModelE(cmd *cobra.Command, args []string) error { return errors.Wrap(err, "get db") } - type Transformer struct { - Ignores []string `mapstructure:"ignores"` - Types map[string]map[string]string `mapstructure:"types"` - } - v := viper.New() v.SetConfigType("yaml") v.SetConfigFile("database/transform.yaml") @@ -56,8 +52,8 @@ func commandGenModelE(cmd *cobra.Command, args []string) error { return err } - var conf Transformer - if err := v.Unmarshal(&conf); err != nil { + var transformer model.Transformer + if err := v.Unmarshal(&transformer); err != nil { return err } @@ -85,7 +81,7 @@ func commandGenModelE(cmd *cobra.Command, args []string) error { UseTable(func(table metadata.Table) template.TableSQLBuilder { tbl := template.DefaultTableSQLBuilder(table) - if lo.Contains(conf.Ignores, table.Name) { + if lo.Contains(transformer.Ignores.Jet, table.Name) { tbl.Skip = true log.Infof("Skip table %s", table.Name) } @@ -93,7 +89,7 @@ func commandGenModelE(cmd *cobra.Command, args []string) error { }). UseEnum(func(meta metadata.Enum) template.EnumSQLBuilder { enum := template.DefaultEnumSQLBuilder(meta) - if lo.Contains(conf.Ignores, meta.Name) { + if lo.Contains(transformer.Ignores.Jet, meta.Name) { enum.Skip = true log.Infof("Skip enum %s", meta.Name) } @@ -105,7 +101,7 @@ func commandGenModelE(cmd *cobra.Command, args []string) error { DefaultModel(). UseTable(func(table metadata.Table) template.TableModel { tbl := template.DefaultTableModel(table) - if lo.Contains(conf.Ignores, table.Name) { + if lo.Contains(transformer.Ignores.Jet, table.Name) { tbl.Skip = true log.Infof("Skip table %s", table.Name) return tbl @@ -121,7 +117,7 @@ func commandGenModelE(cmd *cobra.Command, args []string) error { return defaultTableModelField } - fields, ok := conf.Types[table.Name] + fields, ok := transformer.Types[table.Name] if !ok { return defaultTableModelField } @@ -169,5 +165,5 @@ func commandGenModelE(cmd *cobra.Command, args []string) error { if err := os.Rename(dataPath, "database/schemas"); err != nil { return err } - return astModel.Generate(generatedTables) + return astModel.Generate(generatedTables, transformer) } diff --git a/pkg/ast/model/generage.go b/pkg/ast/model/generage.go index 2639b88..ab955a8 100644 --- a/pkg/ast/model/generage.go +++ b/pkg/ast/model/generage.go @@ -4,6 +4,7 @@ import ( _ "embed" "fmt" "html/template" + "log" "os" "path/filepath" "strings" @@ -22,7 +23,7 @@ type TableModelParam struct { PascalTable string // User } -func Generate(tables []string) error { +func Generate(tables []string, transformer Transformer) error { baseDir := "app/models" tableTpl := template.Must(template.New("model").Parse(string(tableTpl))) @@ -30,6 +31,11 @@ func Generate(tables []string) error { items := []TableModelParam{} for _, table := range tables { + if lo.Contains(transformer.Ignores.Model, table) { + log.Printf("[WARN] skip model %s\n", table) + continue + } + items = append(items, TableModelParam{ CamelTable: lo.CamelCase(table), PascalTable: lo.PascalCase(table), @@ -68,7 +74,16 @@ func Generate(tables []string) error { continue } + if strings.HasSuffix(name, "_test.go") { + continue + } + baseName := strings.TrimSuffix(name, filepath.Ext(name)) + if lo.Contains(transformer.Ignores.Model, baseName) { + log.Printf("[WARN] skip model %s\n", baseName) + continue + } + if !lo.Contains(tables, baseName) { items = append(items, TableModelParam{ CamelTable: lo.CamelCase(baseName), diff --git a/pkg/ast/model/transformer.go b/pkg/ast/model/transformer.go new file mode 100644 index 0000000..50d43f3 --- /dev/null +++ b/pkg/ast/model/transformer.go @@ -0,0 +1,9 @@ +package model + +type Transformer struct { + Ignores struct { + Jet []string `mapstructure:"jet"` + Model []string `mapstructure:"model"` + } `mapstructure:"ignores"` + Types map[string]map[string]string `mapstructure:"types"` +} diff --git a/templates/project/app/requests/pagination.go.tpl b/templates/project/app/requests/pagination.go.tpl index af0cdef..e98528d 100644 --- a/templates/project/app/requests/pagination.go.tpl +++ b/templates/project/app/requests/pagination.go.tpl @@ -4,8 +4,8 @@ import "github.com/samber/lo" type Pager struct { Pagination `json:",inline"` - Total int64 `json:"total"` - Items interface{} `json:"items"` + Total int64 `json:"total"` + Items any `json:"items"` } type Pagination struct { diff --git a/templates/project/buf.gen.yaml.tpl b/templates/project/buf.gen.yaml.tpl index 3f96699..ee40bed 100644 --- a/templates/project/buf.gen.yaml.tpl +++ b/templates/project/buf.gen.yaml.tpl @@ -11,11 +11,11 @@ plugins: - local: protoc-gen-go out: pkg/proto opt: paths=source_relative - - local: protoc-gen-grpc-gateway - out: pkg/proto - opt: - - paths=source_relative - - generate_unbound_methods=true + #- local: protoc-gen-grpc-gateway + # out: pkg/proto + # opt: + # - paths=source_relative + # - generate_unbound_methods=true - local: protoc-gen-go-grpc out: pkg/proto opt: paths=source_relative diff --git a/templates/project/database/transform.yaml.tpl b/templates/project/database/transform.yaml.tpl index 8c65047..b80f25e 100755 --- a/templates/project/database/transform.yaml.tpl +++ b/templates/project/database/transform.yaml.tpl @@ -1,11 +1,13 @@ ignores: - - migrations - - river_leader - - river_job - - river_client - - river_client_queue - - river_queue -# types: + jet: + - migrations + - river_leader + - river_job + - river_client + - river_client_queue + - river_queue + model: +types: # users: # table name # meta: UserMeta # meta: Json[UserMeta]