forked from ebhomengo/niki
added migration in cmd layer
This commit is contained in:
parent
12af65bcd4
commit
ef60a6516d
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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{})
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,10 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Redis redis.Config `koanf:"redis" json:"redis"`
|
Redis redis.Config `koanf:"redis" json:"redis"`
|
||||||
Mysql mysql.Config `koanf:"mysql" json:"mysql"`
|
Mysql mysql.Config `koanf:"mysql" json:"mysql"`
|
||||||
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"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue