Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat(pay): 添加支付API基础结构 feat(miniapp): 创建支付测试小程序页面与配置 feat(wechatpay): 配置微信支付参数与证书 fix(guild): 修复成员列表查询条件 docs: 更新代码规范文档与需求文档 style: 统一前后端枚举显示与注释格式 refactor(admin): 重构用户奖励发放接口参数处理 test(title): 添加称号效果参数验证测试
51 lines
1.8 KiB
Go
51 lines
1.8 KiB
Go
package title
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"bindbox-game/internal/repository/mysql/model"
|
|
"fmt"
|
|
)
|
|
|
|
func (s *service) AssignUserTitle(ctx context.Context, userID int64, titleID int64, expiresAt *time.Time, remark string) error {
|
|
t, err := s.readDB.SystemTitles.WithContext(ctx).
|
|
Where(s.readDB.SystemTitles.ID.Eq(titleID)).First()
|
|
if err != nil || t == nil || t.Status != 1 {
|
|
return err
|
|
}
|
|
ut, err := s.readDB.UserTitles.WithContext(ctx).
|
|
Where(s.readDB.UserTitles.UserID.Eq(userID)).
|
|
Where(s.readDB.UserTitles.TitleID.Eq(titleID)).First()
|
|
if err == nil && ut != nil {
|
|
now := time.Now()
|
|
if ut.Active == 1 && (ut.ExpiresAt.IsZero() || ut.ExpiresAt.After(now)) {
|
|
return fmt.Errorf("already_owned")
|
|
}
|
|
ut.Active = 1
|
|
ut.Remark = remark
|
|
if expiresAt != nil && !expiresAt.IsZero() { ut.ExpiresAt = *expiresAt }
|
|
if err := s.writeDB.UserTitles.WithContext(ctx).Save(ut); err != nil { return err }
|
|
} else {
|
|
now := time.Now()
|
|
row := &model.UserTitles{
|
|
UserID: userID,
|
|
TitleID: titleID,
|
|
Active: 1,
|
|
ObtainedAt: now,
|
|
Source: "admin_assign",
|
|
Remark: remark,
|
|
}
|
|
if expiresAt != nil && !expiresAt.IsZero() { row.ExpiresAt = *expiresAt }
|
|
if err := s.writeDB.UserTitles.WithContext(ctx).Create(row); err != nil { return err }
|
|
}
|
|
others, _ := s.readDB.UserTitles.WithContext(ctx).
|
|
Where(s.readDB.UserTitles.UserID.Eq(userID)).
|
|
Where(s.readDB.UserTitles.TitleID.Neq(titleID)).
|
|
Where(s.readDB.UserTitles.Active.Eq(1)).Find()
|
|
for _, o := range others {
|
|
o.Active = 0
|
|
_ = s.writeDB.UserTitles.WithContext(ctx).Save(o)
|
|
}
|
|
return nil
|
|
} |