Add Tencent Cloud Text Moderation System (TMS) as a fallback moderation service when OpenAI is unavailable or returns an error. The service now checks OpenAI first, and falls back to Tencent TMS if it fails, providing better reliability for content moderation. Features: - New Tencent TMS configuration in config.yaml with environment variable overrides - New tencent package in internal/pkg/tencent/ with TMS client implementation - PostAIService now uses dual moderation with OpenAI primary and Tencent fallback - Strict mode configuration passed to PostAIService for consistent behavior BREAKING CHANGE: NewPostAIService now requires tencentClient and strictMode parameters - update wire configuration accordingly.
479 lines
16 KiB
Go
479 lines
16 KiB
Go
package wire
|
||
|
||
import (
|
||
"time"
|
||
|
||
"carrot_bbs/internal/cache"
|
||
"carrot_bbs/internal/config"
|
||
"carrot_bbs/internal/grpc/runner"
|
||
"carrot_bbs/internal/pkg/email"
|
||
"carrot_bbs/internal/pkg/hook"
|
||
"carrot_bbs/internal/pkg/openai"
|
||
"carrot_bbs/internal/pkg/redis"
|
||
"carrot_bbs/internal/pkg/s3"
|
||
"carrot_bbs/internal/pkg/tencent"
|
||
"carrot_bbs/internal/pkg/ws"
|
||
"carrot_bbs/internal/repository"
|
||
"carrot_bbs/internal/service"
|
||
|
||
"github.com/google/wire"
|
||
"go.uber.org/zap"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// ServiceSet Service 层 Provider Set
|
||
var ServiceSet = wire.NewSet(
|
||
// JWT 服务(需要配置参数)
|
||
ProvideJWTService,
|
||
|
||
// 基础服务
|
||
ProvideEmailService,
|
||
ProvidePostAIService,
|
||
|
||
// 核心服务(按依赖顺序)
|
||
ProvidePushService,
|
||
ProvideSystemMessageService,
|
||
ProvidePostService,
|
||
ProvideCommentService,
|
||
ProvideMessageService,
|
||
ProvideNotificationService,
|
||
ProvideUserService,
|
||
ProvideStickerService,
|
||
ProvideVoteService,
|
||
ProvideChannelService,
|
||
ProvideChatService,
|
||
ProvideScheduleService,
|
||
ProvideScheduleSyncService,
|
||
ProvideGroupService,
|
||
ProvideUploadService,
|
||
ProvideUserActivityService,
|
||
ProvideRoleService,
|
||
ProvideAdminUserService,
|
||
ProvideAdminPostService,
|
||
ProvideAdminCommentService,
|
||
ProvideAdminGroupService,
|
||
ProvideAdminDashboardService,
|
||
ProvideQRCodeLoginService,
|
||
ProvideHotRankWorker,
|
||
ProvideMaterialService,
|
||
ProvideCallService,
|
||
ProvideReportService,
|
||
ProvideAdminReportService,
|
||
ProvideVerificationService,
|
||
ProvideAdminVerificationService,
|
||
ProvideSensitiveService,
|
||
ProvideUserProfileAuditService,
|
||
|
||
// 日志服务
|
||
ProvideAsyncLogManager,
|
||
ProvideOperationLogService,
|
||
ProvideLoginLogService,
|
||
ProvideDataChangeLogService,
|
||
ProvideLogCleanupService,
|
||
ProvideLogService,
|
||
)
|
||
|
||
// ProvideJWTService 提供 JWT 服务
|
||
func ProvideJWTService(cfg *config.Config) *service.JWTService {
|
||
return service.NewJWTService(
|
||
cfg.JWT.Secret,
|
||
int64(cfg.JWT.AccessTokenExpire.Seconds()),
|
||
int64(cfg.JWT.RefreshTokenExpire.Seconds()),
|
||
)
|
||
}
|
||
|
||
// ProvideEmailService 提供邮件服务
|
||
func ProvideEmailService(client email.Client) service.EmailService {
|
||
return service.NewEmailService(client)
|
||
}
|
||
|
||
// ProvidePostAIService 提供 AI 服务
|
||
func ProvidePostAIService(openAIClient openai.Client, tencentClient tencent.Client, cfg *config.Config) *service.PostAIService {
|
||
return service.NewPostAIService(openAIClient, tencentClient, cfg.OpenAI.StrictModeration)
|
||
}
|
||
|
||
// ProvidePushService 提供推送服务
|
||
func ProvidePushService(
|
||
pushRepo repository.PushRecordRepository,
|
||
deviceTokenRepo repository.DeviceTokenRepository,
|
||
messageRepo repository.MessageRepository,
|
||
wsHub *ws.Hub,
|
||
) service.PushService {
|
||
return service.NewPushService(pushRepo, deviceTokenRepo, messageRepo, wsHub)
|
||
}
|
||
|
||
// ProvideSystemMessageService 提供系统消息服务
|
||
func ProvideSystemMessageService(
|
||
notifyRepo repository.SystemNotificationRepository,
|
||
pushService service.PushService,
|
||
userRepo repository.UserRepository,
|
||
postRepo repository.PostRepository,
|
||
cacheBackend cache.Cache,
|
||
) service.SystemMessageService {
|
||
return service.NewSystemMessageService(notifyRepo, pushService, userRepo, postRepo, cacheBackend)
|
||
}
|
||
|
||
func ProvidePostService(
|
||
postRepo repository.PostRepository,
|
||
systemMessageService service.SystemMessageService,
|
||
postAIService *service.PostAIService,
|
||
cacheBackend cache.Cache,
|
||
txManager repository.TransactionManager,
|
||
hookManager *hook.Manager,
|
||
_ *hook.ModerationHooks,
|
||
_ *hook.BuiltinHooks,
|
||
logService *service.LogService,
|
||
) service.PostService {
|
||
return service.NewPostService(postRepo, systemMessageService, postAIService, cacheBackend, txManager, hookManager, logService)
|
||
}
|
||
|
||
func ProvideCommentService(
|
||
commentRepo repository.CommentRepository,
|
||
postRepo repository.PostRepository,
|
||
systemMessageService service.SystemMessageService,
|
||
postAIService *service.PostAIService,
|
||
cacheBackend cache.Cache,
|
||
hookManager *hook.Manager,
|
||
logService *service.LogService,
|
||
) *service.CommentService {
|
||
return service.NewCommentService(commentRepo, postRepo, systemMessageService, postAIService, cacheBackend, hookManager, logService)
|
||
}
|
||
|
||
// ProvideMessageService 提供消息服务
|
||
func ProvideMessageService(
|
||
messageRepo repository.MessageRepository,
|
||
cacheBackend cache.Cache,
|
||
uploadService *service.UploadService,
|
||
) *service.MessageService {
|
||
return service.NewMessageService(messageRepo, cacheBackend, uploadService)
|
||
}
|
||
|
||
// ProvideNotificationService 提供通知服务
|
||
func ProvideNotificationService(
|
||
notificationRepo repository.NotificationRepository,
|
||
cacheBackend cache.Cache,
|
||
) *service.NotificationService {
|
||
return service.NewNotificationService(notificationRepo, cacheBackend)
|
||
}
|
||
|
||
// ProvideUserService 提供用户服务
|
||
func ProvideUserService(
|
||
userRepo repository.UserRepository,
|
||
systemMessageService service.SystemMessageService,
|
||
emailService service.EmailService,
|
||
cacheBackend cache.Cache,
|
||
logService *service.LogService,
|
||
) service.UserService {
|
||
return service.NewUserService(userRepo, systemMessageService, emailService, cacheBackend, logService)
|
||
}
|
||
|
||
// ProvideStickerService 提供表情服务
|
||
func ProvideStickerService(
|
||
stickerRepo repository.StickerRepository,
|
||
) service.StickerService {
|
||
return service.NewStickerService(stickerRepo)
|
||
}
|
||
|
||
// ProvideVoteService 提供投票服务
|
||
func ProvideVoteService(
|
||
voteRepo repository.VoteRepository,
|
||
postRepo repository.PostRepository,
|
||
cache cache.Cache,
|
||
postAIService *service.PostAIService,
|
||
systemMessageService service.SystemMessageService,
|
||
hookManager *hook.Manager,
|
||
logService *service.LogService,
|
||
) *service.VoteService {
|
||
return service.NewVoteService(voteRepo, postRepo, cache, postAIService, systemMessageService, hookManager, logService)
|
||
}
|
||
|
||
func ProvideChannelService(channelRepo repository.ChannelRepository, cacheBackend cache.Cache) service.ChannelService {
|
||
return service.NewChannelService(channelRepo, cacheBackend)
|
||
}
|
||
|
||
// ProvideChatService 提供聊天服务
|
||
// Note: sensitiveService 传 nil,与 main.go 保持一致
|
||
func ProvideChatService(
|
||
messageRepo repository.MessageRepository,
|
||
userRepo repository.UserRepository,
|
||
wsHub *ws.Hub,
|
||
cacheBackend cache.Cache,
|
||
uploadService *service.UploadService,
|
||
) service.ChatService {
|
||
return service.NewChatService(messageRepo, userRepo, nil, wsHub, cacheBackend, uploadService)
|
||
}
|
||
|
||
// ProvideScheduleService 提供日程服务
|
||
func ProvideScheduleService(
|
||
scheduleRepo repository.ScheduleRepository,
|
||
) service.ScheduleService {
|
||
return service.NewScheduleService(scheduleRepo)
|
||
}
|
||
|
||
// ProvideScheduleSyncService 提供课表同步服务
|
||
func ProvideScheduleSyncService(
|
||
taskManager *runner.TaskManager,
|
||
scheduleRepo repository.ScheduleRepository,
|
||
logger *zap.Logger,
|
||
) service.ScheduleSyncService {
|
||
return service.NewScheduleSyncService(taskManager, scheduleRepo, logger)
|
||
}
|
||
|
||
// ProvideGroupService 提供群组服务
|
||
func ProvideGroupService(
|
||
groupRepo repository.GroupRepository,
|
||
userRepo repository.UserRepository,
|
||
messageRepo repository.MessageRepository,
|
||
requestRepo repository.GroupJoinRequestRepository,
|
||
notifyRepo repository.SystemNotificationRepository,
|
||
wsHub *ws.Hub,
|
||
cacheBackend cache.Cache,
|
||
) service.GroupService {
|
||
return service.NewGroupService(groupRepo, userRepo, messageRepo, requestRepo, notifyRepo, wsHub, cacheBackend)
|
||
}
|
||
|
||
// ProvideUploadService 提供上传服务
|
||
func ProvideUploadService(
|
||
s3Client *s3.Client,
|
||
userService service.UserService,
|
||
) *service.UploadService {
|
||
return service.NewUploadService(s3Client, userService)
|
||
}
|
||
|
||
// ProvideUserActivityService 提供用户活跃统计服务
|
||
func ProvideUserActivityService(repo repository.UserActivityRepository) service.UserActivityService {
|
||
return service.NewUserActivityService(repo)
|
||
}
|
||
|
||
// ProvideRoleService 提供角色管理服务
|
||
func ProvideRoleService(
|
||
roleRepo repository.RoleRepository,
|
||
casbinSvc service.CasbinService,
|
||
) service.RoleService {
|
||
return service.NewRoleService(roleRepo, casbinSvc)
|
||
}
|
||
|
||
// ProvideAdminUserService 提供管理端用户服务
|
||
func ProvideAdminUserService(userRepo repository.UserRepository) service.AdminUserService {
|
||
return service.NewAdminUserService(userRepo)
|
||
}
|
||
|
||
// ProvideAdminPostService 提供管理端帖子服务
|
||
func ProvideAdminPostService(postRepo repository.PostRepository, cacheBackend cache.Cache, logService *service.LogService) service.AdminPostService {
|
||
return service.NewAdminPostService(postRepo, cacheBackend, logService)
|
||
}
|
||
|
||
// ProvideAdminCommentService 提供管理端评论服务
|
||
func ProvideAdminCommentService(commentRepo repository.CommentRepository, postRepo repository.PostRepository) service.AdminCommentService {
|
||
return service.NewAdminCommentService(commentRepo, postRepo)
|
||
}
|
||
|
||
// ProvideAdminGroupService 提供管理端群组服务
|
||
func ProvideAdminGroupService(
|
||
groupRepo repository.GroupRepository,
|
||
userRepo repository.UserRepository,
|
||
) service.AdminGroupService {
|
||
return service.NewAdminGroupService(groupRepo, userRepo)
|
||
}
|
||
|
||
// ProvideAdminDashboardService 提供管理端仪表盘服务
|
||
func ProvideAdminDashboardService(
|
||
db *gorm.DB,
|
||
userRepo repository.UserRepository,
|
||
postRepo repository.PostRepository,
|
||
commentRepo repository.CommentRepository,
|
||
groupRepo repository.GroupRepository,
|
||
activityRepo repository.UserActivityRepository,
|
||
) service.AdminDashboardService {
|
||
return service.NewAdminDashboardService(db, userRepo, postRepo, commentRepo, groupRepo, activityRepo)
|
||
}
|
||
|
||
// ProvideAsyncLogManager 提供异步日志管理器
|
||
func ProvideAsyncLogManager(
|
||
operationRepo repository.OperationLogRepository,
|
||
loginRepo repository.LoginLogRepository,
|
||
dataChangeRepo repository.DataChangeLogRepository,
|
||
logger *zap.Logger,
|
||
cfg *config.Config,
|
||
) *service.AsyncLogManager {
|
||
asyncCfg := &service.AsyncLogConfig{
|
||
BufferSize: cfg.Log.Async.BufferSize,
|
||
BatchSize: cfg.Log.Async.BatchSize,
|
||
WorkerCount: cfg.Log.Async.WorkerCount,
|
||
EnableFallback: cfg.Log.Async.EnableFallback,
|
||
FallbackPath: cfg.Log.Async.FallbackPath,
|
||
}
|
||
|
||
// 解析刷新间隔
|
||
if duration, err := parseDuration(cfg.Log.Async.FlushInterval); err == nil {
|
||
asyncCfg.FlushInterval = duration
|
||
} else {
|
||
asyncCfg.FlushInterval = 3 * time.Second
|
||
}
|
||
|
||
return service.NewAsyncLogManager(operationRepo, loginRepo, dataChangeRepo, logger, asyncCfg)
|
||
}
|
||
|
||
// ProvideOperationLogService 提供操作日志服务
|
||
func ProvideOperationLogService(
|
||
asyncManager *service.AsyncLogManager,
|
||
operationRepo repository.OperationLogRepository,
|
||
) service.OperationLogService {
|
||
return service.NewOperationLogService(asyncManager, operationRepo)
|
||
}
|
||
|
||
// ProvideLoginLogService 提供登录日志服务
|
||
func ProvideLoginLogService(
|
||
asyncManager *service.AsyncLogManager,
|
||
loginRepo repository.LoginLogRepository,
|
||
) service.LoginLogService {
|
||
return service.NewLoginLogService(asyncManager, loginRepo)
|
||
}
|
||
|
||
// ProvideDataChangeLogService 提供数据变更日志服务
|
||
func ProvideDataChangeLogService(
|
||
asyncManager *service.AsyncLogManager,
|
||
dataChangeRepo repository.DataChangeLogRepository,
|
||
) service.DataChangeLogService {
|
||
return service.NewDataChangeLogService(asyncManager, dataChangeRepo)
|
||
}
|
||
|
||
// ProvideLogCleanupService 提供日志清理服务
|
||
func ProvideLogCleanupService(
|
||
operationRepo repository.OperationLogRepository,
|
||
loginRepo repository.LoginLogRepository,
|
||
dataChangeRepo repository.DataChangeLogRepository,
|
||
logger *zap.Logger,
|
||
cfg *config.Config,
|
||
) service.LogCleanupService {
|
||
cleanupCfg := &service.LogCleanupConfig{
|
||
Enabled: true,
|
||
OperationLog: cfg.Log.Retention.OperationLog,
|
||
LoginLog: cfg.Log.Retention.LoginLog,
|
||
DataChangeLog: cfg.Log.Retention.DataChange,
|
||
CleanupTime: "02:00",
|
||
}
|
||
return service.NewLogCleanupService(operationRepo, loginRepo, dataChangeRepo, cleanupCfg, logger)
|
||
}
|
||
|
||
// ProvideLogService 提供日志服务组合
|
||
func ProvideLogService(
|
||
operationLogService service.OperationLogService,
|
||
loginLogService service.LoginLogService,
|
||
dataChangeLogService service.DataChangeLogService,
|
||
) *service.LogService {
|
||
return service.NewLogService(operationLogService, loginLogService, dataChangeLogService)
|
||
}
|
||
|
||
// ProvideQRCodeLoginService 提供二维码登录服务
|
||
func ProvideHotRankWorker(cfg *config.Config, postRepo repository.PostRepository, cacheBackend cache.Cache) *service.HotRankWorker {
|
||
return service.NewHotRankWorker(cfg, postRepo, cacheBackend)
|
||
}
|
||
|
||
func ProvideQRCodeLoginService(
|
||
redisClient *redis.Client,
|
||
wsHub *ws.Hub,
|
||
jwtService *service.JWTService,
|
||
userService service.UserService,
|
||
activityService service.UserActivityService,
|
||
logService *service.LogService,
|
||
) *service.QRCodeLoginService {
|
||
return service.NewQRCodeLoginService(redisClient, wsHub, jwtService, userService, activityService, logService)
|
||
}
|
||
|
||
// ProvideMaterialService 提供学习资料服务
|
||
func ProvideMaterialService(
|
||
subjectRepo repository.MaterialSubjectRepository,
|
||
fileRepo repository.MaterialFileRepository,
|
||
) service.MaterialService {
|
||
return service.NewMaterialService(subjectRepo, fileRepo)
|
||
}
|
||
|
||
// parseDuration 解析时长字符串
|
||
func parseDuration(s string) (time.Duration, error) {
|
||
return time.ParseDuration(s)
|
||
}
|
||
|
||
// ProvideCallService 提供通话服务
|
||
func ProvideCallService(
|
||
callRepo repository.CallRepository,
|
||
wsHub *ws.Hub,
|
||
cfg *config.Config,
|
||
db *gorm.DB,
|
||
) service.CallService {
|
||
return service.NewCallService(callRepo, wsHub, cfg, db)
|
||
}
|
||
|
||
// ProvideReportService 提供举报服务
|
||
func ProvideReportService(
|
||
reportRepo repository.ReportRepository,
|
||
postRepo repository.PostRepository,
|
||
commentRepo repository.CommentRepository,
|
||
messageRepo repository.MessageRepository,
|
||
userRepo repository.UserRepository,
|
||
notifyRepo repository.SystemNotificationRepository,
|
||
pushService service.PushService,
|
||
txManager repository.TransactionManager,
|
||
logService service.OperationLogService,
|
||
cfg *config.Config,
|
||
) service.ReportService {
|
||
return service.NewReportService(reportRepo, postRepo, commentRepo, messageRepo, userRepo, notifyRepo, pushService, txManager, logService, cfg)
|
||
}
|
||
|
||
// ProvideAdminReportService 提供管理端举报服务
|
||
func ProvideAdminReportService(
|
||
reportRepo repository.ReportRepository,
|
||
postRepo repository.PostRepository,
|
||
commentRepo repository.CommentRepository,
|
||
messageRepo repository.MessageRepository,
|
||
userRepo repository.UserRepository,
|
||
notifyRepo repository.SystemNotificationRepository,
|
||
pushService service.PushService,
|
||
txManager repository.TransactionManager,
|
||
logService service.OperationLogService,
|
||
) service.AdminReportService {
|
||
return service.NewAdminReportService(reportRepo, postRepo, commentRepo, messageRepo, userRepo, notifyRepo, pushService, txManager, logService)
|
||
}
|
||
|
||
// ProvideVerificationService 提供身份认证服务
|
||
func ProvideVerificationService(
|
||
verificationRepo repository.VerificationRepository,
|
||
userRepo repository.UserRepository,
|
||
) service.VerificationService {
|
||
return service.NewVerificationService(verificationRepo, userRepo)
|
||
}
|
||
|
||
// ProvideAdminVerificationService 提供管理端身份认证服务
|
||
func ProvideAdminVerificationService(
|
||
verificationRepo repository.VerificationRepository,
|
||
userRepo repository.UserRepository,
|
||
) service.AdminVerificationService {
|
||
return service.NewAdminVerificationService(verificationRepo, userRepo)
|
||
}
|
||
|
||
// ProvideSensitiveService 提供敏感词服务
|
||
func ProvideSensitiveService(
|
||
sensitiveWordRepo repository.SensitiveWordRepository,
|
||
redisClient *redis.Client,
|
||
cfg *config.Config,
|
||
) service.SensitiveService {
|
||
sensitiveCfg := &service.SensitiveConfig{
|
||
Enabled: cfg.Sensitive.Enabled,
|
||
ReplaceStr: cfg.Sensitive.ReplaceStr,
|
||
MinMatchLen: cfg.Sensitive.MinMatchLen,
|
||
LoadFromDB: cfg.Sensitive.LoadFromDB,
|
||
LoadFromRedis: cfg.Sensitive.LoadFromRedis,
|
||
RedisKeyPrefix: cfg.Sensitive.RedisKeyPrefix,
|
||
}
|
||
return service.NewSensitiveService(sensitiveWordRepo, redisClient, sensitiveCfg)
|
||
}
|
||
|
||
func ProvideUserProfileAuditService(
|
||
auditRepo repository.UserProfileAuditRepository,
|
||
userRepo repository.UserRepository,
|
||
hookManager *hook.Manager,
|
||
moderationHooks *hook.ModerationHooks,
|
||
) service.UserProfileAuditService {
|
||
return service.NewUserProfileAuditService(auditRepo, userRepo, hookManager, moderationHooks)
|
||
}
|