109 lines
3.6 KiB
Go
109 lines
3.6 KiB
Go
package registerreward
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"chatapp3-golang/internal/integration"
|
|
)
|
|
|
|
// GetContent 返回当前登录用户的注册奖励展示内容。
|
|
// 这个接口不负责判断“是否应该弹窗”,只负责把当前用户可见的奖励内容组织完整。
|
|
func (s *RegisterRewardService) GetContent(ctx context.Context, user AuthUser) (*RegisterRewardContentResponse, error) {
|
|
if user.UserID <= 0 {
|
|
return nil, NewAppError(http.StatusUnauthorized, "invalid_user", "authenticated user is required")
|
|
}
|
|
|
|
sysOrigin := strings.ToUpper(strings.TrimSpace(user.SysOrigin))
|
|
if sysOrigin == "" {
|
|
return nil, NewAppError(http.StatusUnauthorized, "invalid_sys_origin", "authenticated sysOrigin is required")
|
|
}
|
|
|
|
configRow, err := s.loadRegisterRewardConfig(ctx, sysOrigin)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
userInfo, err := s.loadUserBaseInfo(ctx, user.UserID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
logRecord, err := s.loadRegisterRewardLog(ctx, sysOrigin, user.UserID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
registerDateMatchesServerDay := false
|
|
registerTime := ""
|
|
if userInfo != nil && !userInfo.CreateTime.IsZero() {
|
|
registerTime = formatRegisterRewardTime(userInfo.CreateTime)
|
|
registerDateMatchesServerDay = isRegisterRewardCurrentServerDate(userInfo.CreateTime)
|
|
}
|
|
|
|
goldAmount, rewardGroupID := resolveRegisterRewardPayload(configRow, logRecord)
|
|
rewardStatus := deriveRegisterRewardStatus(logRecord, registerDateMatchesServerDay, configRow != nil && configRow.Enabled)
|
|
hasRewardRecord := logRecord != nil
|
|
|
|
// 老用户没有历史领取日志时,不应该看到当前新配置的奖励内容。
|
|
if !registerDateMatchesServerDay && logRecord == nil {
|
|
goldAmount = 0
|
|
rewardGroupID = nil
|
|
}
|
|
|
|
rewardGroupName := ""
|
|
rewardItems := make([]RegisterRewardContentItem, 0)
|
|
if rewardGroupID != nil && *rewardGroupID > 0 {
|
|
items, groupName, err := s.loadRewardContentItems(ctx, *rewardGroupID)
|
|
if err == nil {
|
|
rewardItems = items
|
|
rewardGroupName = groupName
|
|
}
|
|
}
|
|
|
|
return &RegisterRewardContentResponse{
|
|
UserID: user.UserID,
|
|
SysOrigin: sysOrigin,
|
|
Available: goldAmount > 0 || rewardGroupID != nil,
|
|
RewardStatus: rewardStatus,
|
|
IsNewRegister: registerDateMatchesServerDay,
|
|
HasRewardRecord: hasRewardRecord,
|
|
GoldAmount: goldAmount,
|
|
RewardGroupID: rewardGroupID,
|
|
RewardGroupName: rewardGroupName,
|
|
RewardItems: rewardItems,
|
|
RegisterTime: registerTime,
|
|
}, nil
|
|
}
|
|
|
|
// loadRewardContentItems 按奖励组 ID 拉取奖励组详情,并整理成端上可直接渲染的列表。
|
|
func (s *RegisterRewardService) loadRewardContentItems(ctx context.Context, rewardGroupID int64) ([]RegisterRewardContentItem, string, error) {
|
|
detail, err := s.java.GetRewardGroupDetail(ctx, rewardGroupID)
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
return buildRegisterRewardContentItems(detail.RewardConfigList), strings.TrimSpace(detail.Name), nil
|
|
}
|
|
|
|
// buildRegisterRewardContentItems 把 Java 奖励组返回值映射成注册奖励接口自己的展示结构。
|
|
func buildRegisterRewardContentItems(items []integration.RewardGroupItem) []RegisterRewardContentItem {
|
|
if len(items) == 0 {
|
|
return make([]RegisterRewardContentItem, 0)
|
|
}
|
|
|
|
result := make([]RegisterRewardContentItem, 0, len(items))
|
|
for _, item := range items {
|
|
result = append(result, RegisterRewardContentItem{
|
|
ID: int64(item.ID),
|
|
Type: strings.TrimSpace(item.Type),
|
|
Name: strings.TrimSpace(item.Name),
|
|
Content: strings.TrimSpace(item.Content),
|
|
Quantity: int64(item.Quantity),
|
|
Cover: strings.TrimSpace(item.Cover),
|
|
Remark: strings.TrimSpace(item.Remark),
|
|
})
|
|
}
|
|
return result
|
|
}
|