- 新增关注系统: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 按分类分页查询
92 lines
3.5 KiB
Go
92 lines
3.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
|
||
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
|
||
}
|