diff --git a/app/cmd/cmds/genModels.go b/app/cmd/cmds/genModels.go new file mode 100644 index 0000000..5eeb371 --- /dev/null +++ b/app/cmd/cmds/genModels.go @@ -0,0 +1,25 @@ +package cmds + +import ( + "context" + "log/slog" + "time" + + "git.ma-al.com/goc_daniel/b2b/app/db" + genmodels "git.ma-al.com/goc_daniel/b2b/app/utils/genModels" + "github.com/spf13/cobra" +) + +var generateModelsCmd = &cobra.Command{ + Use: "genmodels", + Short: "generate input database models", + Run: func(cmd *cobra.Command, args []string) { + ctx, cancel := context.WithTimeout(context.Background(), time.Minute*5) + defer cancel() + + err := genmodels.New(db.Get()).GormGenModels(ctx) + if err != nil { + slog.Error("Error performing work: " + err.Error()) + } + }, +} diff --git a/app/cmd/cmds/startServer.go b/app/cmd/cmds/startServer.go new file mode 100644 index 0000000..c23d8b2 --- /dev/null +++ b/app/cmd/cmds/startServer.go @@ -0,0 +1,60 @@ +package cmds + +import ( + "log" + "os" + + "git.ma-al.com/goc_daniel/b2b/app/delivery/web" + "git.ma-al.com/goc_daniel/b2b/app/service/langsService" + "git.ma-al.com/goc_daniel/b2b/app/utils/version" + "github.com/spf13/cobra" +) + +var ( + rootCmd = &cobra.Command{ + Use: "b2b", + Short: "This is set of tools for b2b application", + Run: func(cmd *cobra.Command, args []string) { + + if versionFlag, _ := cmd.Flags().GetBool("version"); versionFlag { + log.Println(version.String()) + return + } + + // Create and setup the server + server := web.New() + + // Configure routes + if err := server.Setup(); err != nil { + log.Fatalf("Failed to setup server: %v", err) + } + + // Load translations on startup + if err := langsService.LangSrv.LoadTranslations(); err != nil { + log.Printf("Warning: Failed to load translations on startup: %v", err) + } else { + log.Println("Translations loaded successfully on startup") + } + + // Start the server + if err := server.Run(); err != nil { + log.Fatalf("Failed to start server: %v", err) + } + + }, + } +) + +func Execute() error { + + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } + return nil +} + +func init() { + rootCmd.Flags().BoolP("version", "v", false, "show version and exit") + rootCmd.AddCommand(generateModelsCmd) +} diff --git a/app/cmd/main.go b/app/cmd/main.go index 420f44c..90d58c2 100644 --- a/app/cmd/main.go +++ b/app/cmd/main.go @@ -1,41 +1,9 @@ package main import ( - "flag" - "log" - - "git.ma-al.com/goc_daniel/b2b/app/delivery/web" - "git.ma-al.com/goc_daniel/b2b/app/service/langsService" - "git.ma-al.com/goc_daniel/b2b/app/utils/version" + "git.ma-al.com/goc_daniel/b2b/app/cmd/cmds" ) func main() { - // Check for version subcommand - versionFlag := flag.Bool("version", false, "Show version information") - flag.Parse() - - if *versionFlag { - log.Println(version.String()) - return - } - - // Create and setup the server - server := web.New() - - // Configure routes - if err := server.Setup(); err != nil { - log.Fatalf("Failed to setup server: %v", err) - } - - // Load translations on startup - if err := langsService.LangSrv.LoadTranslations(); err != nil { - log.Printf("Warning: Failed to load translations on startup: %v", err) - } else { - log.Println("Translations loaded successfully on startup") - } - - // Start the server - if err := server.Run(); err != nil { - log.Fatalf("Failed to start server: %v", err) - } + cmds.Execute() } diff --git a/app/model/countries.go b/app/model/countries.go index 6ad933f..49f775f 100644 --- a/app/model/countries.go +++ b/app/model/countries.go @@ -6,8 +6,12 @@ type Country struct { Name string `gorm:"column:name" json:"name"` Flag string `gorm:"size:16;not null;column:flag" json:"flag"` CurrencyID uint `gorm:"column:id_currency" json:"currency_id"` - CurrencyISOCode string `gorm:"column:currency_iso_code" json:"currency_iso_code"` - CurrencyName string `gorm:"column:currency_name" json:"currency_name"` + CurrencyISOCode string `gorm:"column:iso_code" json:"currency_iso_code"` + CurrencyName string `gorm:"column:name" json:"currency_name"` + // PSCountryID int `gorm:"column:id_country" json:"ps_country_id"` + // PSCountry *PSCountry `gorm:"foreignKey:PSCountryID;references:ID" json:"ps_country"` + PSCurrencyID uint `gorm:"column:currency" json:"currency"` + PSCurrency *PSCurrency `gorm:"foreignKey:PSCurrencyID;references:currency_id" json:"ps_currency"` } func (Country) TableName() string { @@ -15,10 +19,13 @@ func (Country) TableName() string { } type PSCountry struct { - ID uint `gorm:"primaryKey;column:id_country" json:"id"` CurrencyID uint `gorm:"column:id_currency" json:"currency_id"` } func (PSCountry) TableName() string { return "ps_country" } + +type PSCurrency struct { + Currency int `gorm:"column:currency" json:"currency"` +} diff --git a/app/service/menuService/menuService.go b/app/service/menuService/menuService.go index d0f3d09..004132b 100644 --- a/app/service/menuService/menuService.go +++ b/app/service/menuService/menuService.go @@ -79,6 +79,7 @@ func (s *MenuService) createTree(index int, all_categories *([]model.ScannedCate } func (s *MenuService) GetRoutes(id_lang uint) ([]model.Route, error) { + return s.routesRepo.GetRoutes(id_lang) } diff --git a/app/utils/genModels/genModels.go b/app/utils/genModels/genModels.go new file mode 100644 index 0000000..6f7d43f --- /dev/null +++ b/app/utils/genModels/genModels.go @@ -0,0 +1,188 @@ +package genmodels + +import ( + "context" + "fmt" + "os" + "path/filepath" + "strings" + + "gorm.io/gen" + "gorm.io/gen/field" + "gorm.io/gorm" +) + +const GENERATED_FILES_FOLDER = "./app/model/prestadb" +const GENERATED_MODEL_PKG = "prestadb" + +type GormGenModels struct { + db *gorm.DB +} + +func New(db *gorm.DB) *GormGenModels { + return &GormGenModels{ + db: db, + } +} + +func (m *GormGenModels) GormGenModels(ctx context.Context) error { + // Use gorm gen to generate models + g := gen.NewGenerator(gen.Config{ + OutPath: GENERATED_FILES_FOLDER, + ModelPkgPath: GENERATED_MODEL_PKG, + Mode: gen.WithoutContext, + }) + + g.UseDB(m.db) + + // Get all table names from the database and filter for 'ps_' prefix + tableNames, err := m.db.Migrator().GetTables() + if err != nil { + return fmt.Errorf("failed to get table list: %w", err) + } + + // Generate models only for tables with 'ps_' prefix + // Use gen.FieldRelateModel to add foreign key relations + for _, tableName := range tableNames { + if strings.HasPrefix(tableName, "ps_") { + g.GenerateModel(tableName, gen.FieldRelateModel(field.BelongsTo, "*", nil, &field.RelateConfig{})) + } + } + + g.Execute() + + // Post-process: remove query/DO files and keep only model files + if err := m.cleanupGeneratedFiles(); err != nil { + return fmt.Errorf("failed to cleanup generated files: %w", err) + } + + return nil +} + +func (m *GormGenModels) cleanupGeneratedFiles() error { + // Files to remove (query/DO code) + filesToRemove := []string{ + "gen.go", + "do.go", + "_gen.go", + } + + // Directory to clean + dir := GENERATED_FILES_FOLDER + if !strings.HasPrefix(dir, "./") { + dir = "./" + dir + } + + // Get absolute path if needed + absDir, err := filepath.Abs(dir) + if err != nil { + return err + } + + // Remove query files + for _, fileName := range filesToRemove { + filePath := filepath.Join(absDir, fileName) + if _, err := os.Stat(filePath); err == nil { + if err := os.Remove(filePath); err != nil { + return fmt.Errorf("failed to remove %s: %w", filePath, err) + } + fmt.Printf("Removed: %s\n", filePath) + } + } + + // Rename ps_*.gen.go to *.go (e.g., ps_category.gen.go -> category.go) + files, err := os.ReadDir(absDir) + if err != nil { + return err + } + + for _, file := range files { + name := file.Name() + // Check if it's a generated model file like ps_category.gen.go + if strings.HasSuffix(name, ".gen.go") && strings.HasPrefix(name, "ps_") { + oldPath := filepath.Join(absDir, name) + // Extract name: ps_category.gen.go -> category + baseName := strings.TrimSuffix(name, ".gen.go") + baseName, _ = strings.CutPrefix(baseName, "ps_") + newPath := filepath.Join(absDir, baseName+".go") + + // Read file content + content, err := os.ReadFile(oldPath) + if err != nil { + return err + } + + // Remove package prestadb imports that reference generated DO + // and clean up the code + content = m.cleanModelContent(content) + + // Write to new file + if err := os.WriteFile(newPath, content, 0644); err != nil { + return err + } + + // Remove old file + if err := os.Remove(oldPath); err != nil { + return err + } + + fmt.Printf("Renamed: %s -> %s\n", oldPath, newPath) + } + } + + return nil +} + +func (m *GormGenModels) cleanModelContent(content []byte) []byte { + result := string(content) + + // Remove imports that are only needed for query code + // Keep "gorm.io/gorm/schema" for TableName method + lines := strings.Split(result, "\n") + var newLines []string + importStarted := false + importEnded := false + + for _, line := range lines { + trimmed := strings.TrimSpace(line) + + // Track import block + if trimmed == "import (" { + importStarted = true + newLines = append(newLines, line) + continue + } + if importStarted && trimmed == ")" { + importEnded = true + importStarted = false + newLines = append(newLines, line) + continue + } + + // Inside import block, remove query-related imports + if importStarted && !importEnded { + // Skip these imports as they're only for query code + if strings.Contains(trimmed, "\"gorm.io/gen\"") || + strings.Contains(trimmed, "\"gorm.io/gen/field\"") || + strings.Contains(trimmed, "\"gorm.io/plugin/dbresolver\"") || + strings.Contains(trimmed, "gen.DO") { + continue + } + } + + // Remove DO (Data Object) type definitions + if strings.Contains(trimmed, "type psCategoryDo struct") || + strings.HasPrefix(trimmed, "func (p psCategoryDo)") { + continue + } + + newLines = append(newLines, line) + } + + result = strings.Join(newLines, "\n") + + // Also remove the psCategoryDo references in methods + result = strings.ReplaceAll(result, "psCategoryDo", "") + + return []byte(result) +} diff --git a/go.mod b/go.mod index 53d022d..9c568fb 100644 --- a/go.mod +++ b/go.mod @@ -14,9 +14,13 @@ require ( github.com/meilisearch/meilisearch-go v0.36.1 github.com/openai/openai-go/v3 v3.28.0 github.com/samber/lo v1.53.0 + github.com/spf13/cobra v1.9.1 + go.opentelemetry.io/otel/trace v1.36.0 golang.org/x/crypto v0.48.0 golang.org/x/oauth2 v0.36.0 google.golang.org/api v0.247.0 + gorm.io/cli/gorm v0.2.4 + gorm.io/gen v0.3.26 gorm.io/gorm v1.31.1 ) @@ -30,6 +34,8 @@ require ( github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.15.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect @@ -39,13 +45,18 @@ require ( go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect go.opentelemetry.io/otel v1.36.0 // indirect go.opentelemetry.io/otel/metric v1.36.0 // indirect - go.opentelemetry.io/otel/trace v1.36.0 // indirect + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect + golang.org/x/mod v0.33.0 // indirect golang.org/x/time v0.12.0 // indirect + golang.org/x/tools v0.42.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect google.golang.org/grpc v1.74.2 // indirect google.golang.org/protobuf v1.36.7 // indirect + gorm.io/datatypes v1.2.4 // indirect + gorm.io/hints v1.1.0 // indirect + gorm.io/plugin/dbresolver v1.6.2 // indirect ) require ( diff --git a/go.sum b/go.sum index 6b02711..62ad2ea 100644 --- a/go.sum +++ b/go.sum @@ -29,6 +29,7 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -60,6 +61,7 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/gofiber/fiber/v3 v3.1.0 h1:1p4I820pIa+FGxfwWuQZ5rAyX0WlGZbGT6Hnuxt6hKY= @@ -70,6 +72,10 @@ github.com/gofiber/utils/v2 v2.0.2 h1:ShRRssz0F3AhTlAQcuEj54OEDtWF7+HJDwEi/aa6QL github.com/gofiber/utils/v2 v2.0.2/go.mod h1:+9Ub4NqQ+IaJoTliq5LfdmOJAA/Hzwf4pXOxOa3RrJ0= github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -84,10 +90,22 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 h1:L0QtFUgDarD7Fpv9jeVMgy/+Ec0mtnmYuImjTz6dtDA= +github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= @@ -109,8 +127,13 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/meilisearch/meilisearch-go v0.36.1 h1:mJTCJE5g7tRvaqKco6DfqOuJEjX+rRltDEnkEC02Y0M= github.com/meilisearch/meilisearch-go v0.36.1/go.mod h1:hWcR0MuWLSzHfbz9GGzIr3s9rnXLm1jqkmHkJPbUSvM= +github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE= +github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= github.com/openai/openai-go/v3 v3.28.0 h1:2+FfrCVMdGXSQrBv1tLWtokm+BU7+3hJ/8rAHPQ63KM= @@ -126,6 +149,7 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/samber/lo v1.53.0 h1:t975lj2py4kJPQ6haz1QMgtId2gtmfktACxIXArw3HM= github.com/samber/lo v1.53.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= @@ -135,9 +159,14 @@ github.com/shamaton/msgpack/v3 v3.1.0/go.mod h1:DcQG8jrdrQCIxr3HlMYkiXdMhK+KfN2C github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.3.2 h1:EDL9mgf4NzwMXCTfaxSD/o/a5fxDw/xL9nkU28JjdBg= github.com/skeema/knownhosts v1.3.2/go.mod h1:bEg3iQAuw+jyiw+484wwFJoKSLwcfd7fqRy+N0QTiow= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -183,6 +212,10 @@ go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= @@ -208,6 +241,8 @@ golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= +golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= google.golang.org/api v0.247.0 h1:tSd/e0QrUlLsrwMKmkbQhYVa109qIintOls2Wh6bngc= google.golang.org/api v0.247.0/go.mod h1:r1qZOPmxXffXg6xS5uhx16Fa/UFY8QU/K4bfKrnvovM= google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= @@ -228,9 +263,36 @@ gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/cli/gorm v0.2.4 h1:YHANGrb/4QW0NHPhAYe10MNCAEy4eEaVuNCG+ZFoAR0= +gorm.io/cli/gorm v0.2.4/go.mod h1:0f2nP1SL74He9Yq7aghHw04aWGigI+7MYRu5yikPhy8= +gorm.io/datatypes v1.2.4 h1:uZmGAcK/QZ0uyfCuVg0VQY1ZmV9h1fuG0tMwKByO1z4= +gorm.io/datatypes v1.2.4/go.mod h1:f4BsLcFAX67szSv8svwLRjklArSHAvHLeE3pXAS5DZI= +gorm.io/driver/mysql v1.4.3/go.mod h1:sSIebwZAVPiT+27jK9HIwvsqOGKx3YMPmrA3mBJR10c= gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg= gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo= +gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= +gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= +gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8= +gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ= +gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8= +gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0= +gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig= +gorm.io/gen v0.3.26 h1:sFf1j7vNStimPRRAtH4zz5NiHM+1dr6eA9aaRdplyhY= +gorm.io/gen v0.3.26/go.mod h1:a5lq5y3w4g5LMxBcw0wnO6tYUCdNutWODq5LrIt75LE= +gorm.io/gen v0.3.27 h1:ziocAFLpE7e0g4Rum69pGfB9S6DweTxK8gAun7cU8as= +gorm.io/gen v0.3.27/go.mod h1:9zquz2xD1f3Eb/eHq4oLn2z6vDVvQlCY5S3uMBLv4EA= +gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0= +gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= +gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw= +gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y= +gorm.io/plugin/dbresolver v1.5.0 h1:XVHLxh775eP0CqVh3vcfJtYqja3uFl5Wr3cKlY8jgDY= +gorm.io/plugin/dbresolver v1.5.0/go.mod h1:l4Cn87EHLEYuqUncpEeTC2tTJQkjngPSD+lo8hIvcT0= +gorm.io/plugin/dbresolver v1.6.2 h1:F4b85TenghUeITqe3+epPSUtHH7RIk3fXr5l83DF8Pc= +gorm.io/plugin/dbresolver v1.6.2/go.mod h1:tctw63jdrOezFR9HmrKnPkmig3m5Edem9fdxk9bQSzM= diff --git a/i18n/migrations/20260302163110_menus_routes.sql b/i18n/migrations/20260302163110_menus_routes.sql new file mode 100644 index 0000000..db5cf89 --- /dev/null +++ b/i18n/migrations/20260302163110_menus_routes.sql @@ -0,0 +1,34 @@ +-- +goose Up +-- -- create routes table +-- CREATE TABLE IF NOT EXISTS b2b_routes ( +-- id INT AUTO_INCREMENT PRIMARY KEY, +-- name VARCHAR(255) NOT NULL UNIQUE, +-- path VARCHAR(255) NULL, +-- component VARCHAR(255) NOT NULL COMMENT 'path to component file', +-- layout VARCHAR(50) DEFAULT 'default' COMMENT "'default' | 'empty'", +-- meta JSON DEFAULT '{}', +-- is_active BOOLEAN DEFAULT TRUE, +-- sort_order INT DEFAULT 0, +-- parent_id INT NULL, + +-- CONSTRAINT fk_parent +-- FOREIGN KEY (parent_id) +-- REFERENCES b2b_routes(id) +-- ON DELETE SET NULL +-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- INSERT IGNORE INTO b2b_routes +-- (name, path, component, layout, meta, is_active, sort_order, parent_id) +-- VALUES +-- ('root', '', '', 'default', '{"trans": "route.root"}', 0, 0, 0), +-- ('home', '', '@/views/HomeView.vue', 'default', '{"trans": "route.home"}', 1, 0, 0), +-- ('login', 'login', '@/views/LoginView.vue', 'empty', '{"guest":true}', 1, 2, NULL), +-- ('register', 'register', '@/views/RegisterView.vue', 'empty', '{"guest":true}', 1, 3, NULL), +-- ('password-recovery', 'password-recovery', '@/views/PasswordRecoveryView.vue', 'empty', '{"guest":true}', 1, 4, NULL), +-- ('reset-password', 'reset-password', '@/views/ResetPasswordView.vue', 'empty', '{"guest":true}', 1, 5, NULL), +-- ('verify-email', 'verify-email', '@/views/VerifyEmailView.vue', 'empty', '{"guest":true}', 1, 6, NULL); + +-- +goose Down + +-- DROP TABLE IF EXISTS b2b_routes; +