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 }