- PostRepo 新增 CountPostsByStatus 和 CountPending 方法 - Service 层定义 postAdminStatStore 接口 (ISP) - AdminService 注入 postRepo,新增 PostStats 结构体和 GetPostStats 方法 - AdminController.Dashboard 调用 GetPostStats 并传参到模板 - Dashboard 帖子卡片显示总数 + 已发布 + 待审核(橙色徽章) - DI 层将 AdminController 创建从 buildDepsCore 移至 buildDeps,以便注入 postRepo
70 lines
2.5 KiB
Go
70 lines
2.5 KiB
Go
package router
|
||
|
||
import (
|
||
"log"
|
||
"time"
|
||
|
||
"metazone.cc/metalab/internal/config"
|
||
"metazone.cc/metalab/internal/controller"
|
||
adminCtrl "metazone.cc/metalab/internal/controller/admin"
|
||
"metazone.cc/metalab/internal/middleware"
|
||
"metazone.cc/metalab/internal/repository"
|
||
"metazone.cc/metalab/internal/service"
|
||
"metazone.cc/metalab/internal/session"
|
||
|
||
"github.com/redis/go-redis/v9"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
type dependencies struct {
|
||
authCtrl *controller.AuthController
|
||
authMdw *middleware.AuthMiddleware
|
||
maintenanceMdw *middleware.MaintenanceMiddleware
|
||
settingsCtrl *controller.SettingsController
|
||
messageCtrl *controller.MessageController
|
||
postCtrl *controller.PostController
|
||
spaceCtrl *controller.SpaceController
|
||
studioCtrl *controller.StudioController
|
||
adminPostCtrl *adminCtrl.AdminPostController
|
||
adminCtrl *adminCtrl.AdminController
|
||
auditCtrl *adminCtrl.AuditController
|
||
siteSettingCtrl *adminCtrl.SiteSettingController
|
||
}
|
||
|
||
func buildDepsCore(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings, redisClient *redis.Client) (
|
||
*repository.UserRepo, *session.Manager, *service.AuthService,
|
||
*middleware.RateLimiter, *controller.AuthController,
|
||
*service.AvatarService, *middleware.AuthMiddleware,
|
||
) {
|
||
userRepo := repository.NewUserRepo(db)
|
||
|
||
idleTimeout := time.Duration(cfg.Session.IdleTimeout) * time.Minute
|
||
rememberTimeout := time.Duration(cfg.Session.RememberTimeout) * time.Minute
|
||
cleanupInterval := time.Duration(cfg.Session.CleanupInterval) * time.Second
|
||
|
||
// 总是创建 MemoryStore 作为兜底
|
||
memStore := session.NewMemoryStore(idleTimeout, rememberTimeout)
|
||
memStore.StartCleanup(cleanupInterval)
|
||
|
||
var sessionStore session.Store
|
||
|
||
if cfg.Redis.Enabled && redisClient != nil {
|
||
// Redis 模式 + 自动降级保护
|
||
redisStore := session.NewRedisStore(redisClient, idleTimeout, rememberTimeout)
|
||
sessionStore = session.NewFallbackStore(redisStore, memStore)
|
||
log.Println("[Router] 会话存储: Redis(带内存降级保护)")
|
||
} else {
|
||
// 纯内存模式
|
||
sessionStore = memStore
|
||
log.Println("[Router] 会话存储: 内存")
|
||
}
|
||
|
||
sessionMgr := session.NewManager(sessionStore, userRepo, cfg)
|
||
authService := service.NewAuthService(userRepo, sessionMgr, cfg, siteSettings)
|
||
rateLimiter := middleware.NewRateLimiter()
|
||
authCtrl := controller.NewAuthController(authService, sessionMgr, rateLimiter, cfg)
|
||
avatarSvc := service.NewAvatarService(userRepo)
|
||
authMdw := middleware.NewAuthMiddleware(cfg, sessionMgr)
|
||
return userRepo, sessionMgr, authService, rateLimiter, authCtrl, avatarSvc, authMdw
|
||
}
|