114 lines
3.3 KiB
Go
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")
|
|
}
|