projectx/cmd/erp.go
2025-04-14 15:28:51 +08:00

157 lines
4.1 KiB
Go

package cmd
import (
"context"
"fmt"
"log"
"management/internal/erpserver/handler"
"management/internal/erpserver/repository"
systemrepo "management/internal/erpserver/repository/system"
commonservice "management/internal/erpserver/service/v1/common"
systemservice "management/internal/erpserver/service/v1/system"
"management/internal/pkg/binding"
"management/internal/pkg/config"
"management/internal/pkg/database"
"management/internal/pkg/middleware"
"management/internal/pkg/redis"
"management/internal/pkg/session"
"management/internal/pkg/tpl"
"github.com/drhin/logger"
"github.com/spf13/cobra"
)
var erpCmd = &cobra.Command{
Use: "erp",
Short: "Start erp management server",
Long: `A Service to erp management`,
Run: func(cmd *cobra.Command, args []string) {
err := runErp(cmd.Context())
if err != nil {
log.Fatalf("run erp failed: %v", err)
}
},
}
func init() {
erpCmd.Flags().StringVarP(&configPath, "config", "c", "", "Custom config file path")
rootCmd.AddCommand(erpCmd)
}
func runErp(ctx context.Context) error {
conf, err := config.New(configPath)
checkError(err)
// 初始化数据
// dbinit.InitSeed()
// mustInit(redis.Init)
err = binding.SetValidatorTrans("zh")
checkError(err)
contextx, err := newAppContext(conf)
checkError(err)
address := fmt.Sprintf("%s:%d", conf.App.Host, conf.App.Port)
log.Printf("Starting erp manage server on %s", address)
server := InitServer(address, contextx.Router())
return server.ListenAndServe()
}
func newAppContext(conf *config.Config) (*handler.AppContext, error) {
// initialize DB
dbOptions := &database.PostgreSQLOptions{
Addr: conf.DB.Host,
Username: conf.DB.Username,
Password: conf.DB.Password,
Database: conf.DB.DBName,
}
gdb, err := database.NewPostgreSQL(dbOptions)
if err != nil {
return nil, err
}
repo := repository.NewStore(gdb)
// initialize Redis
redis, err := redis.New(conf.Redis)
if err != nil {
return nil, err
}
// initialize Session
db, err := gdb.DB()
if err != nil {
return nil, err
}
session := session.New(db, conf.App.Prod)
// initialize Logger
log, err := logger.NewProduction()
if err != nil {
return nil, err
}
ctx := &handler.AppContext{
DB: gdb,
Store: repo,
Redis: redis,
Session: session,
Config: conf,
Log: log,
}
setRepository(ctx)
setService(ctx)
setMiddleware(ctx)
if err := setRender(ctx); err != nil {
return nil, err
}
return ctx, nil
}
func setRepository(ctx *handler.AppContext) {
ctx.UserRepo = systemrepo.NewUserRepository(ctx.Store)
ctx.LoginLogRepo = systemrepo.NewLoginLogRepository(ctx.Store)
ctx.AuditLogRepo = systemrepo.NewAuditLogRepository(ctx.Store)
ctx.RoleRepo = systemrepo.NewRoleRepository(ctx.Store)
ctx.DepartmentRepo = systemrepo.NewDepartmentRepository(ctx.Store)
ctx.ConfigRepo = systemrepo.NewConfigRepository(ctx.Store)
ctx.RoleMenuRepo = systemrepo.NewRoleMenuRepository(ctx.Store)
ctx.MenuRepo = systemrepo.NewMenuRepository(ctx.Store)
}
func setService(ctx *handler.AppContext) {
ctx.CaptchaService = commonservice.NewCaptchaService()
ctx.ConfigService = systemservice.NewConfigService(ctx.ConfigRepo, ctx.Redis)
ctx.LoginLogService = systemservice.NewLoginLogService(ctx.LoginLogRepo)
ctx.AuditLogService = systemservice.NewAuditLogService(ctx.AuditLogRepo)
ctx.RoleService = systemservice.NewRoleService(ctx.RoleRepo)
ctx.UserService = systemservice.NewUserService(ctx.Session, ctx.Log, ctx.UserRepo, ctx.RoleService, ctx.LoginLogService)
ctx.DepartmentService = systemservice.NewDepartmentService(ctx.DepartmentRepo)
ctx.RoleMenuService = systemservice.NewRoleMenuService(ctx.RoleMenuRepo)
ctx.MenuService = systemservice.NewMenuService(ctx.Redis, ctx.Store, ctx.MenuRepo, ctx.RoleService, ctx.RoleMenuService)
}
func setMiddleware(ctx *handler.AppContext) {
ctx.Middleware = middleware.New(ctx.Session, ctx.MenuService, ctx.AuditLogService)
}
func setRender(ctx *handler.AppContext) error {
var err error
ctx.Render, err = tpl.New(ctx.Session, ctx.MenuService)
if err != nil {
return err
}
return nil
}
func checkError(err error) {
if err != nil {
log.Fatalf("init failed: %v", err)
}
}