Files
mce/internal/router/deps_core.go
Victor_Jay 680df7371a feat: 实现关注系统 + 通知侧边栏分类 TAB + 点赞聚合通知
- 新增关注系统:UserFollow 模型、FollowService(toggle/status/列表隐私控制)
- User 新增 FollowersCount/FollowingCount/FollowListPublic/NotifyPrefs 字段
- Space 页面增加四态关注按钮(关注/已关注/回关/已互粉)+ 粉丝/关注数链接
- 新增 /space/:uid/followers 和 /space/:uid/following 列表页
- 新增 NotifyFollow/NotifyLikeAggregated 通知类型
- ReactionService 点赞时写入 daily_like_summary,访问时生成聚合通知
- FollowService 关注时触发 NotifyFollow 通知
- 消息中心侧边栏升级为分类 TAB(全部/系统通知/@艾特/点赞/关注)
- NotificationService 新增 ListByCategory 按分类分页查询
2026-06-01 16:30:46 +08:00

92 lines
3.5 KiB
Go
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 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
postService *service.PostService
spaceCtrl *controller.SpaceController
studioCtrl *controller.StudioController
adminPostCtrl *adminCtrl.AdminPostController
adminCtrl *adminCtrl.AdminController
auditCtrl *adminCtrl.AuditController
siteSettingCtrl *adminCtrl.SiteSettingController
levelCtrl *controller.LevelController
energyCtrl *controller.EnergyController
adminEnergyCtrl *adminCtrl.AdminEnergyController
energyService *service.EnergyService
commentCtrl *controller.CommentController
commentService *service.CommentService
adminCommentCtrl *adminCtrl.AdminCommentController
reactionCtrl *controller.ReactionController
followCtrl *controller.FollowController
followPageCtrl *controller.FollowPageController
}
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 模å¼<C3A5> + 自动é™<C3A9>级ä¿<C3A4>护
redisStore := session.NewRedisStore(redisClient, idleTimeout, rememberTimeout)
sessionStore = session.NewFallbackStore(redisStore, memStore)
log.Println("[Router] 会è¯<C3A8>å­˜å¨: Redis(带内存é™<C3A9>级ä¿<C3A4>护)")
} else {
// 纯内存模å¼<C3A5>
sessionStore = memStore
log.Println("[Router] 会è¯<C3A8>å­˜å¨: 内存")
}
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
}
// buildDepsLevel 构建等级/签到ç¸å…³ä¾<C3A4>èµ
func buildDepsLevel(db *gorm.DB, notifSvc *service.NotificationService, authMdw *middleware.AuthMiddleware) (
*repository.LevelRepo, *service.LevelService, *controller.LevelController,
) {
levelRepo := repository.NewLevelRepo(db)
levelSvc := service.NewLevelService(levelRepo, levelRepo, levelRepo, notifSvc)
levelCtrl := controller.NewLevelController(levelSvc)
authMdw.WithLevelService(levelSvc)
return levelRepo, levelSvc, levelCtrl
}