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
}