Files
zt-closet-backend/.codebuddy/plans/完善UserDefaultQuota配置化_ca78d85f.md
T
2026-09-11 01:41:52 +08:00

4.6 KiB
Raw Blame History

name, overview, todos
name overview todos
完善UserDefaultQuota配置化 补齐 UserDefaultQuota 配置链路:定义 setting.UserDefaultQuotaSettingS 结构体、main 读取配置、config 增加 UserDefaultQuota 段,并让 ensureDefaultQuota 改用配置值(配置缺省时回落现有常量兜底),修复当前因未定义结构体导致的编译错误。
id content status
define-setting 在 pkg/setting/section.go 新增 UserDefaultQuotaSettingS 结构体(Cos/AI/OutfitShare/ClosetShare int64),修复 global/setting.go 的 undefined 编译错误 completed
id content status dependencies
wire-config 在 main.go setupSetting 增加 ReadSection("UserDefaultQuota"),并在 config.yaml 与 config.example.yaml 新增 UserDefaultQuota 段(20/3/10/5) completed
define-setting
id content status dependencies
service-use-config 在 internal/service/quota.go 新增 defaultQuotaValue 辅助(判 nil、字段 completed
define-setting

需求概述

完善「新用户默认额度(UserDefaultQuota)」的配置化链路。当前 global/setting.go 已声明 UserDefaultQuotaSetting *setting.UserDefaultQuotaSettingS,但结构体未定义、main 未读取、config 无配置段、service 仍用硬编码常量,导致项目编译报错(undefined: setting.UserDefaultQuotaSettingS)。

核心功能

  • 定义 UserDefaultQuotaSettingS 配置结构体,修复编译错误。
  • main 启动时读取 UserDefaultQuota 配置段。
  • 两个 config 文件新增 UserDefaultQuota 段(Cos/AI/OutfitShare/ClosetShare)。
  • ensureDefaultQuota 改为读取配置值,配置缺省(<=0 或 global 为 nil)时回落现有常量兜底。
  • 保持现有行为不变:未配置时默认仍为 20/3/10/5;初始化仍为 best-effort 且幂等。

技术方案

技术栈

沿用现有:Go + viper(setting.ReadSection → UnmarshalKey)配置读取,global 单例持有配置,internal/service 消费配置。

实现要点

  1. 定义配置结构体 — pkg/setting/section.go 新增(放在 WechatPaySettingS 之后、ReadSection 方法之前,与现有结构体风格一致):
type UserDefaultQuotaSettingS struct {
Cos         int64 // 免费上传额度
AI          int64 // 免费 AI 推荐额度
OutfitShare int64 // 免费社区分享额度
ClosetShare int64 // 免费衣柜分享额度
}

修复 global/setting.go:19 的 undefined 编译错误。

  1. main 读取配置 — main.go setupSetting() 增 setting.ReadSection("UserDefaultQuota", &global.UserDefaultQuotaSetting),与其他段处理方式一致(错误则 return err)。

  2. config 增加配置段 — configs/config.yaml 与 configs/config.example.yaml 均新增:

UserDefaultQuota:
Cos: 20
AI: 3
OutfitShare: 10
ClosetShare: 5
  1. service 使用配置 + 兜底 — internal/service/quota.go:
  • 新增取值辅助 defaultQuotaValue(quotaType int8) int64:判 global.UserDefaultQuotaSetting 是否为 nil;取对应字段;字段 <= 0 时回落 constants.go 的 DefaultQuota* 常量。
  • ensureDefaultQuota 的 defaults 列表 total 改为调用 defaultQuotaValue(quotaType)。
  • 语义约定:值 <= 0 视为「未设置」回落常量默认(本次不支持「显式 0 额度」,如需后续加开关,注释说明)。
  • constants.go 的四个 DefaultQuota* 常量保留作为兜底默认,补注释说明用途。

关键决策与约束

  • 兜底优先,不破坏现有默认:配置缺省或 global 为 nil(如未走 main 的单测场景)时结果仍为 20/3/10/5,避免空指针 panic。
  • 幂等/best-effort 不变:ensureDefaultQuota 仍在 WxLogin 新用户分支中以 best-effort 调用,已存在则跳过,写流水(QuotaChangeTypeActivity)与同步 Redis 逻辑保持不变。
  • 安全:纯数值配置,无秘钥、无外部输入风险。

涉及文件

  • pkg/setting/section.go:[MODIFY] 新增 UserDefaultQuotaSettingS。
  • main.go:[MODIFY] setupSetting 增 ReadSection("UserDefaultQuota", ...)。
  • configs/config.yaml、configs/config.example.yaml:[MODIFY] 新增 UserDefaultQuota 段。
  • internal/service/quota.go:[MODIFY] 新增 defaultQuotaValue 辅助,ensureDefaultQuota 改用配置。
  • internal/service/constants.go:[MODIFY] 保留 DefaultQuota* 常量并补注释。

验证

  • go build ./...、go vet ./... 通过(修复当前 undefined 错误)。
  • 逻辑核对:未配置该段时结果为 20/3/10/5;配置后按配置生效;global.UserDefaultQuotaSetting 为 nil 或字段 <=0 时不 panic 且回落常量。