Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 31s
refactor(api/user): 重构用户相关接口使用token验证替代user_id路径参数 docs: 更新API文档规范,明确私有接口需携带token及返回字段要求 fix(service/user): 避免写入未使用字段的零值导致MySQL校验错误 style: 统一格式化部分代码缩进和导入顺序 chore: 更新DS_Store等IDE配置文件
65 lines
1.9 KiB
Go
65 lines
1.9 KiB
Go
package user
|
||
|
||
import (
|
||
"context"
|
||
"time"
|
||
|
||
"bindbox-game/internal/repository/mysql/model"
|
||
)
|
||
|
||
// AddItemCard 给用户添加道具卡
|
||
// 功能描述:
|
||
// - 根据道具卡模板ID查询模板信息
|
||
// - 验证道具卡状态是否有效(status=1)
|
||
// - 创建用户道具卡记录,继承模板的有效期设置
|
||
// - 支持批量添加,quantity参数控制数量
|
||
//
|
||
// 参数说明:
|
||
// - ctx: 上下文
|
||
// - userID: 用户ID
|
||
// - cardID: 道具卡模板ID
|
||
// - quantity: 添加数量,如果<=0则默认为1
|
||
//
|
||
// 返回说明:
|
||
// - error: 错误信息,包括数据库查询失败、模板不存在等情况
|
||
func (s *service) AddItemCard(ctx context.Context, userID int64, cardID int64, quantity int) error {
|
||
if quantity <= 0 {
|
||
quantity = 1
|
||
}
|
||
tpl, err := s.readDB.SystemItemCards.WithContext(ctx).Where(s.readDB.SystemItemCards.ID.Eq(cardID)).First()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if tpl == nil || tpl.Status != 1 {
|
||
return nil
|
||
}
|
||
now := time.Now()
|
||
for i := 0; i < quantity; i++ {
|
||
item := &model.UserItemCards{UserID: userID, CardID: cardID, Status: 1}
|
||
if !tpl.ValidStart.IsZero() {
|
||
item.ValidStart = tpl.ValidStart
|
||
} else {
|
||
item.ValidStart = now
|
||
}
|
||
if !tpl.ValidEnd.IsZero() {
|
||
item.ValidEnd = tpl.ValidEnd
|
||
}
|
||
do := s.writeDB.UserItemCards.WithContext(ctx)
|
||
// 避免写入未使用相关字段的零值,触发 MySQL 时间字段校验错误
|
||
do = do.Omit(
|
||
s.writeDB.UserItemCards.UsedAt,
|
||
s.writeDB.UserItemCards.UsedDrawLogID,
|
||
s.writeDB.UserItemCards.UsedActivityID,
|
||
s.writeDB.UserItemCards.UsedIssueID,
|
||
)
|
||
if tpl.ValidEnd.IsZero() {
|
||
do = do.Omit(s.writeDB.UserItemCards.ValidEnd)
|
||
}
|
||
if err := do.Create(item); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|