added migration in cmd layer

This commit is contained in:
mzfarshad 2026-05-05 22:30:35 +03:30
parent 12af65bcd4
commit ef60a6516d
6 changed files with 78 additions and 16 deletions

View File

@ -1 +1,52 @@
package command 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)
}

View File

@ -32,7 +32,7 @@ func loadAppConfig() shoppingbasketapp.Config {
if _, err := os.Stat(defaultConfig); err == nil { if _, err := os.Stat(defaultConfig); err == nil {
yamlPath = defaultConfig yamlPath = defaultConfig
} else { } 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 { 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 return cfg

View File

@ -5,10 +5,13 @@ import (
"fmt" "fmt"
"git.gocasts.ir/ebhomengo/niki/pkg/logger" "git.gocasts.ir/ebhomengo/niki/pkg/logger"
"git.gocasts.ir/ebhomengo/niki/shoppingbasketapp" "git.gocasts.ir/ebhomengo/niki/shoppingbasketapp"
"github.com/labstack/gommon/log"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"log"
) )
var migrateUp bool
var migrateDown bool
var ServeCmd = &cobra.Command{ var ServeCmd = &cobra.Command{
Use: "serve", Use: "serve",
Short: "Start shoppingbasket service", Short: "Start shoppingbasket service",
@ -19,13 +22,15 @@ var ServeCmd = &cobra.Command{
} }
func serve() { func serve() {
var cfg = loadAppConfig() var cfg shoppingbasketapp.Config = loadAppConfig()
logger.Init(cfg.Logger) logger.Init(cfg.Logger)
l := logger.L() l := logger.L()
l.Info("Starting shoppingbasket service...") l.Info("Starting shoppingbasket service...")
migrate()
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
@ -39,5 +44,8 @@ func serve() {
} }
func init() { 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) RootCmd.AddCommand(ServeCmd)
} }

View File

@ -13,8 +13,8 @@ mysql:
repo: repo:
cache_kart_key_prefix: "shopping-basket-cart:user_id" cache_kart_key_prefix: "shopping-basket-cart:user_id"
cache_ttl: 864000s # 24h cache_ttl: 2h # 24h
mysql_ttl: 604800s # 7d mysql_ttl: 168h # 7d
http_server: http_server:
host: "localhost" host: "localhost"
@ -24,10 +24,12 @@ http_server:
allow_origins: allow_origins:
- "*" - "*"
path_of_migration: "./domain/shoppingbasket/repository/migration"
logger: logger:
level: "debug" # Can be `debug`, `info`, `warn`, `error` level: "debug" # Can be `debug`, `info`, `warn`, `error`
file_path: "cmd/shoppingbasketapp/logs/service.log" file_path: "./logs/service.log"
use_local_time: true use_local_time: true
file_max_size_in_mb: 10 file_max_size_in_mb: 10
file_max_age_in_days: 7 file_max_age_in_days: 7

View File

@ -47,8 +47,8 @@ func (v Validate) ValidateRemoveFromCart(req RemoveFromCartRequest) error {
const op = "shoppingbasketapp.service.ValidateRemoveFromCart" const op = "shoppingbasketapp.service.ValidateRemoveFromCart"
if err := validation.ValidateStruct(&req, if err := validation.ValidateStruct(&req,
validation.Field(&req.UserID, validation.Required), validation.Field(&req.CartID, validation.Required),
validation.Field(&req.ProductID, validation.Required)); err != nil { validation.Field(&req.ItemID, validation.Required)); err != nil {
fieldErrs := make(map[string]interface{}) fieldErrs := make(map[string]interface{})
vErr, ok := err.(validation.Errors) vErr, ok := err.(validation.Errors)
@ -70,8 +70,8 @@ func (v Validate) ValidateUpdateQuantity(req UpdateQuantityRequest) error {
const op = "shoppingbasketapp.service.ValidateUpdateQuantity" const op = "shoppingbasketapp.service.ValidateUpdateQuantity"
if err := validation.ValidateStruct(&req, if err := validation.ValidateStruct(&req,
validation.Field(&req.UserID, validation.Required), validation.Field(&req.CartID, validation.Required),
validation.Field(&req.ProductID, validation.Required), validation.Field(&req.ItemID, validation.Required),
validation.Field(&req.Quantity, validation.Required, validation.Min(int(1)))); err != nil { validation.Field(&req.Quantity, validation.Required, validation.Min(int(1)))); err != nil {
fieldErrs := make(map[string]interface{}) fieldErrs := make(map[string]interface{})

View File

@ -14,4 +14,5 @@ type Config struct {
Repo repository.Config `koanf:"repo" json:"repo"` Repo repository.Config `koanf:"repo" json:"repo"`
HTTPServer httpserver.Config `koanf:"http_server" json:"http_server"` HTTPServer httpserver.Config `koanf:"http_server" json:"http_server"`
Logger logger.Config `koanf:"logger" json:"logger"` Logger logger.Config `koanf:"logger" json:"logger"`
PathOfMigration string `koanf:"path_of_migration" json:"path_of_migration"`
} }