package config import ( "os" "strings" "time" ) // ModerationConfig 举报反馈服务配置 (spec §11.1) type ModerationConfig struct { AutoHideThreshold int CounterTTL time.Duration UserMarkerTTL time.Duration LockTTL time.Duration MaxDescriptionLen int MaxEvidenceCount int MaxContactLen int MaxReplyLen int MaxEvidenceSize int64 AllowedMimeTypes []string RateLimitUserPerDay int RateLimitIPPerDay int RateLimitDevPerDay int RateLimitFbUserDay int ClaimTimeout time.Duration PIIAnonymizeAfter time.Duration AutoArchiveAfter time.Duration RedisKeyPrefix string PathDCounterPolicy string // OSSBaseURL OSS bucket 公开访问的 host(不含末尾斜杠),用于把证据 oss_key 拼成完整 URL 写入 oss_url 列。 // 由环境变量 OSS_BASE_URL 覆盖(main.go)。 OSSBaseURL string } var Default = ModerationConfig{ AutoHideThreshold: 5, CounterTTL: 7 * 24 * time.Hour, UserMarkerTTL: 24 * time.Hour, LockTTL: 5 * time.Second, MaxDescriptionLen: 500, MaxEvidenceCount: 5, MaxContactLen: 320, MaxReplyLen: 2000, MaxEvidenceSize: 5 * 1024 * 1024, AllowedMimeTypes: []string{"image/png", "image/jpeg"}, RateLimitUserPerDay: 30, RateLimitIPPerDay: 200, RateLimitDevPerDay: 200, RateLimitFbUserDay: 5, ClaimTimeout: 15 * time.Minute, PIIAnonymizeAfter: 90 * 24 * time.Hour, AutoArchiveAfter: 90 * 24 * time.Hour, RedisKeyPrefix: "mod:report", PathDCounterPolicy: "preserve", OSSBaseURL: "https://top-fans-test.oss-cn-shanghai.aliyuncs.com", } // BuildOSSURL 把 oss_key 还原成可访问的完整 URL。 // 入参已是 http(s):// 开头则原样返回(兼容历史上传时就传完整 URL 的客户端); // 否则按 OSSBaseURL/ 拼接。返回空串表示入参为空。 func BuildOSSURL(ossBaseURL, key string) string { if key == "" { return "" } if strings.HasPrefix(key, "http://") || strings.HasPrefix(key, "https://") { return key } base := strings.TrimRight(ossBaseURL, "/") if base == "" { return key } return base + "/" + strings.TrimLeft(key, "/") } // LoadEnvOverrides 用环境变量覆盖 Default 里的可调字段。 func LoadEnvOverrides() ModerationConfig { c := Default if v := os.Getenv("OSS_BASE_URL"); v != "" { c.OSSBaseURL = v } return c }