diff --git a/cmd/shoppingbasketapp/command/migrate.go b/cmd/shoppingbasketapp/command/migrate.go index d47dcf0d..9e4bfd5b 100644 --- a/cmd/shoppingbasketapp/command/migrate.go +++ b/cmd/shoppingbasketapp/command/migrate.go @@ -1 +1,52 @@ package command + +import ( + "git.gocasts.ir/ebhomengo/niki/pkg/database/migrator" + "git.gocasts.ir/ebhomengo/niki/pkg/logger" + "github.com/spf13/cobra" +) + +var up bool +var down bool + +var migrateCmd = &cobra.Command{ + Use: "migrate", + Short: "Run database migrations", + Long: `This command runs the database migrations for the shoppingbasket service.`, + Run: func(cmd *cobra.Command, args []string) { + migrate() + }, +} + +func migrate() { + var cfg = loadAppConfig() + + logger.Init(cfg.Logger) + l := logger.L() + + migrationCfg := migrator.Config{ + MysqlConfig: cfg.Mysql, + MigrationPath: cfg.PathOfMigration, + MigrationDBName: "gorp_migrations", + } + + if migrateUp || migrateDown { + mgr := migrator.New(migrationCfg) + if migrateUp { + l.Info("Running migrations up...") + mgr.Up() + l.Info("Migrations up completed.") + } + if migrateDown { + l.Info("Running migrations down...") + mgr.Down() + l.Info("Migrations down completed.") + } + } +} + +func init() { + migrateCmd.Flags().BoolVar(&up, "up", false, "Run migrations up") + migrateCmd.Flags().BoolVar(&down, "down", false, "Run migrations down") + RootCmd.AddCommand(migrateCmd) +} diff --git a/cmd/shoppingbasketapp/command/root.go b/cmd/shoppingbasketapp/command/root.go index e2634743..4dea339d 100644 --- a/cmd/shoppingbasketapp/command/root.go +++ b/cmd/shoppingbasketapp/command/root.go @@ -32,7 +32,7 @@ func loadAppConfig() shoppingbasketapp.Config { if _, err := os.Stat(defaultConfig); err == nil { yamlPath = defaultConfig } else { - yamlPath = filepath.Join(projectRoot, "deploy", "shoppingbasket", "development", "config.local.yml") + yamlPath = filepath.Join(projectRoot, "deploy", "shoppingbasket", "development", "config.yml") } } @@ -45,7 +45,7 @@ func loadAppConfig() shoppingbasketapp.Config { } if err := cfgloader.Load(options, &cfg); err != nil { - log.Fatalf("Failed to load benefactor config: %v", err) + log.Fatalf("Failed to load shoppingbasket config: %v", err) } return cfg diff --git a/cmd/shoppingbasketapp/command/serve.go b/cmd/shoppingbasketapp/command/serve.go index ec67345a..9f4a9196 100644 --- a/cmd/shoppingbasketapp/command/serve.go +++ b/cmd/shoppingbasketapp/command/serve.go @@ -5,10 +5,13 @@ import ( "fmt" "git.gocasts.ir/ebhomengo/niki/pkg/logger" "git.gocasts.ir/ebhomengo/niki/shoppingbasketapp" - "github.com/labstack/gommon/log" "github.com/spf13/cobra" + "log" ) +var migrateUp bool +var migrateDown bool + var ServeCmd = &cobra.Command{ Use: "serve", Short: "Start shoppingbasket service", @@ -19,13 +22,15 @@ var ServeCmd = &cobra.Command{ } func serve() { - var cfg = loadAppConfig() + var cfg shoppingbasketapp.Config = loadAppConfig() logger.Init(cfg.Logger) l := logger.L() l.Info("Starting shoppingbasket service...") + migrate() + ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -39,5 +44,8 @@ func serve() { } func init() { + ServeCmd.Flags().BoolVar(&migrateUp, "migrate-up", false, "Run migrations up before starting the server") + ServeCmd.Flags().BoolVar(&migrateDown, "migrate-down", false, "Run migrations down before starting the server") + ServeCmd.MarkFlagsMutuallyExclusive("migrate-up", "migrate-down") RootCmd.AddCommand(ServeCmd) } diff --git a/deploy/shoppingbasket/development/config.local.yml b/deploy/shoppingbasket/development/config.yml similarity index 77% rename from deploy/shoppingbasket/development/config.local.yml rename to deploy/shoppingbasket/development/config.yml index 62d6ed1d..cca4db38 100644 --- a/deploy/shoppingbasket/development/config.local.yml +++ b/deploy/shoppingbasket/development/config.yml @@ -13,8 +13,8 @@ mysql: repo: cache_kart_key_prefix: "shopping-basket-cart:user_id" - cache_ttl: 864000s # 24h - mysql_ttl: 604800s # 7d + cache_ttl: 2h # 24h + mysql_ttl: 168h # 7d http_server: host: "localhost" @@ -24,10 +24,12 @@ http_server: allow_origins: - "*" +path_of_migration: "./domain/shoppingbasket/repository/migration" + logger: level: "debug" # Can be `debug`, `info`, `warn`, `error` - file_path: "cmd/shoppingbasketapp/logs/service.log" + file_path: "./logs/service.log" use_local_time: true file_max_size_in_mb: 10 file_max_age_in_days: 7 diff --git a/domain/shoppingbasket/service/validator.go b/domain/shoppingbasket/service/validator.go index 8ab07773..d41a7e3d 100644 --- a/domain/shoppingbasket/service/validator.go +++ b/domain/shoppingbasket/service/validator.go @@ -47,8 +47,8 @@ func (v Validate) ValidateRemoveFromCart(req RemoveFromCartRequest) error { const op = "shoppingbasketapp.service.ValidateRemoveFromCart" if err := validation.ValidateStruct(&req, - validation.Field(&req.UserID, validation.Required), - validation.Field(&req.ProductID, validation.Required)); err != nil { + validation.Field(&req.CartID, validation.Required), + validation.Field(&req.ItemID, validation.Required)); err != nil { fieldErrs := make(map[string]interface{}) vErr, ok := err.(validation.Errors) @@ -70,8 +70,8 @@ func (v Validate) ValidateUpdateQuantity(req UpdateQuantityRequest) error { const op = "shoppingbasketapp.service.ValidateUpdateQuantity" if err := validation.ValidateStruct(&req, - validation.Field(&req.UserID, validation.Required), - validation.Field(&req.ProductID, validation.Required), + validation.Field(&req.CartID, validation.Required), + validation.Field(&req.ItemID, validation.Required), validation.Field(&req.Quantity, validation.Required, validation.Min(int(1)))); err != nil { fieldErrs := make(map[string]interface{}) diff --git a/shoppingbasketapp/config.go b/shoppingbasketapp/config.go index 922f3e84..bbe65d3d 100644 --- a/shoppingbasketapp/config.go +++ b/shoppingbasketapp/config.go @@ -9,9 +9,10 @@ import ( ) type Config struct { - Redis redis.Config `koanf:"redis" json:"redis"` - Mysql mysql.Config `koanf:"mysql" json:"mysql"` - Repo repository.Config `koanf:"repo" json:"repo"` - HTTPServer httpserver.Config `koanf:"http_server" json:"http_server"` - Logger logger.Config `koanf:"logger" json:"logger"` + Redis redis.Config `koanf:"redis" json:"redis"` + Mysql mysql.Config `koanf:"mysql" json:"mysql"` + Repo repository.Config `koanf:"repo" json:"repo"` + HTTPServer httpserver.Config `koanf:"http_server" json:"http_server"` + Logger logger.Config `koanf:"logger" json:"logger"` + PathOfMigration string `koanf:"path_of_migration" json:"path_of_migration"` }