package roomturnoverreward import ( "context" "net/http" "strings" "time" "chatapp3-golang/internal/common" ) // GetHome 返回当前登录用户房间的流水奖励 H5 数据。 func (s *Service) GetHome(ctx context.Context, user common.AuthUser) (*RoomTurnoverRewardHomeResponse, error) { if s.repo.Java == nil { return nil, NewAppError(http.StatusServiceUnavailable, "java_gateway_unavailable", "java gateway is unavailable") } if user.UserID <= 0 { return nil, NewAppError(http.StatusUnauthorized, "invalid_user", "user is required") } config, err := s.GetConfig(ctx, user.SysOrigin) if err != nil { return nil, err } now := time.Now().In(s.location) periodStart, periodEnd := s.currentCycleBounds(now) levels := enabledPageLevels(config.LevelConfigs) resp := &RoomTurnoverRewardHomeResponse{ ActivityStatus: roomTurnoverRewardActivityStatus(config.Enabled), Configured: config.Configured, SysOrigin: config.SysOrigin, Timezone: config.Timezone, CycleKey: s.cycleKey(periodStart), PeriodStartAt: formatDateTime(periodStart), PeriodEndAt: formatDateTime(periodEnd), CurrentPeriodText: formatRoomTurnoverRewardPeriod(periodStart, periodEnd), CountdownMillis: maxInt64(0, periodEnd.UnixMilli()-now.UnixMilli()), UserID: user.UserID, HighlightRewardGold: 0, LevelConfigs: levels, } if profile, err := s.repo.Java.GetUserProfile(ctx, user.UserID); err == nil { resp.UserAccount = profile.Account resp.UserNickname = profile.UserNickname resp.UserAvatar = profile.UserAvatar } else if !isEmptyJavaProfileError(err) { return nil, err } roomProfile, err := s.repo.Java.GetRoomProfileByUserID(ctx, user.UserID) if err != nil { if isEmptyJavaProfileError(err) { return resp, nil } return nil, err } if int64(roomProfile.ID) <= 0 { return resp, nil } resp.HasRoom = true resp.RoomID = int64(roomProfile.ID) resp.RoomAccount = roomProfile.RoomAccount resp.RoomName = roomProfile.RoomName resp.RoomCover = roomProfile.RoomCover if resp.UserID == 0 { resp.UserID = int64(roomProfile.UserID) } contribution, err := s.repo.Java.GetCurrentWeekRoomContribution(ctx, resp.RoomID) if err != nil { return nil, err } resp.TurnoverAmount = int64(contribution.ContributionValue) if level, ok := pickHighestRankingLevel(rankingLevelsFromPayloads(levels), resp.TurnoverAmount); ok { resp.MatchedLevel = level.Level resp.TurnoverThreshold = level.TurnoverThreshold resp.ExpectedRewardGold = level.RewardGold resp.HighlightRewardGold = level.RewardGold } return resp, nil } func roomTurnoverRewardActivityStatus(enabled bool) string { if enabled { return roomTurnoverRewardActivityStatusOngoing } return roomTurnoverRewardActivityStatusDisabled } func rankingLevelsFromPayloads(levels []RoomTurnoverRewardLevelPayload) []roomTurnoverRewardRankingLevel { result := make([]roomTurnoverRewardRankingLevel, 0, len(levels)) for _, level := range levels { result = append(result, roomTurnoverRewardRankingLevel{ Level: level.Level, TurnoverThreshold: level.TurnoverThreshold, RewardGold: level.RewardGold, Enabled: level.Enabled, }) } return result } func isEmptyJavaProfileError(err error) bool { if err == nil { return false } return strings.Contains(strings.ToLower(err.Error()), "empty") }