2026-04-27 23:27:37 +08:00

114 lines
3.3 KiB
Go

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")
}