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/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) // ================================================================================================================= // 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, 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 }