projectx/cmd/build/build.go
2025-06-25 16:11:03 +08:00

137 lines
4.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package build
import (
"net/http"
"management/internal/erpserver/handler"
"management/internal/erpserver/repository"
"management/internal/erpserver/repository/seed"
"management/internal/erpserver/repository/system/audit"
config1 "management/internal/erpserver/repository/system/config"
"management/internal/erpserver/repository/system/department"
"management/internal/erpserver/repository/system/loginlog"
"management/internal/erpserver/repository/system/menu"
"management/internal/erpserver/repository/system/role"
"management/internal/erpserver/repository/system/rolemenu"
"management/internal/erpserver/repository/system/user"
v1 "management/internal/erpserver/service/v1"
"management/internal/erpserver/service/v1/auth"
"management/internal/erpserver/service/v1/common"
system2 "management/internal/erpserver/service/v1/system"
"management/internal/pkg/cache"
"management/internal/pkg/config"
"management/internal/pkg/render"
"management/internal/pkg/session"
"management/internal/pkg/sqldb"
"management/internal/tasks"
"github.com/drhin/logger"
"go.uber.org/zap"
)
func Initialize(conf *config.Config, log *logger.Logger) (http.Handler, func(), error) {
db, dbClose, err := sqldb.NewDB(conf, log)
if err != nil {
return nil, nil, err
}
rd, rdClose, err := cache.ConnectRedis(conf, log)
if err != nil {
dbClose()
return nil, nil, err
}
sm, err := session.NewSCSManager(rd, conf)
if err != nil {
dbClose()
rdClose()
return nil, nil, err
}
redisCache := cache.NewRedisCache(rd)
// =================================================================================================================
// repo
store := repository.NewStore(db)
userRepository := user.NewStore(store, log)
roleRepository := role.NewStore(store, log)
menuRepository := menu.NewStore(store, log)
roleMenuRepository := rolemenu.NewStore(store, log)
departmentRepository := department.NewStore(store, log)
configRepository := config1.NewStore(store, log)
loginLogRepository := loginlog.NewStore(store, log)
auditLogRepository := audit.NewStore(store, log)
sd := seed.NewSeed(configRepository, departmentRepository, roleRepository, userRepository, menuRepository)
if err := sd.Run(); err != nil {
dbClose()
rdClose()
return nil, nil, err
}
// =================================================================================================================
// service
service := v1.NewService(log, sm, redisCache)
loginLogService := system2.NewLoginLogService(service, loginLogRepository)
roleMenuService := system2.NewRoleMenuService(service, roleMenuRepository)
roleService := system2.NewRoleService(service, roleRepository)
departmentService := system2.NewDepartmentService(service, departmentRepository)
userService := system2.NewUserService(service, userRepository, roleService, departmentService, loginLogService)
menuService := system2.NewMenuService(service, menuRepository, roleService, roleMenuService)
configService := system2.NewConfigService(service, configRepository)
captchaService := common.NewCaptchaService()
auditLogService := system2.NewAuditLogService(service, auditLogRepository)
authService := auth.NewAuth(log, rd, sm, userService, roleService, loginLogService)
// =================================================================================================================
// task
opt := tasks.NewRedisClientConnector(rd)
taskDistributor := tasks.NewRedisTaskDistributor(log, opt)
taskProcessor := tasks.NewRedisTaskProcessor(log, opt, auditLogService)
go func() {
log.Info("start task processor")
err := taskProcessor.Start()
if err != nil {
log.Fatal("failed to start task processor", zap.Error(err))
}
}()
// =================================================================================================================
// render
rdr := render.NewRender(log)
// =================================================================================================================
// app route
cfg := handler.Config{
Conf: conf,
Log: log,
Sm: sm,
Render: rdr,
TaskDistributor: taskDistributor,
CaptchaService: captchaService,
AuthService: authService,
UserService: userService,
RoleService: roleService,
DepartmentService: departmentService,
MenuService: menuService,
ConfigService: configService,
AuditLogService: auditLogService,
LoginLogService: loginLogService,
}
app := handler.WebApp(cfg)
return app, func() {
taskProcessor.Shutdown() // 复用 redis只需要关闭一个 redis 的关闭就不需要了
dbClose()
}, nil
}