2026-05-14 17:44:16 +08:00

251 lines
9.9 KiB
Go

package activityapi
import (
"net/http"
"strings"
activityv1 "hyapp.local/api/proto/activity/v1"
"hyapp/services/gateway-service/internal/auth"
"hyapp/services/gateway-service/internal/transport/http/httpkit"
)
type levelOverviewData struct {
Tracks []levelTrackOverviewData `json:"tracks"`
ServerTimeMS int64 `json:"server_time_ms"`
}
type levelTrackOverviewData struct {
Track string `json:"track"`
Name string `json:"name"`
Level int32 `json:"level"`
TierID int64 `json:"tier_id"`
TotalValue int64 `json:"total_value"`
CurrentLevelRequiredValue int64 `json:"current_level_required_value"`
NextLevel int32 `json:"next_level"`
NextLevelRequiredValue int64 `json:"next_level_required_value"`
DisplayAvatarFrameResourceID int64 `json:"display_avatar_frame_resource_id"`
DisplayBadgeResourceID int64 `json:"display_badge_resource_id"`
RewardPendingCount int64 `json:"reward_pending_count"`
SortOrder int32 `json:"sort_order"`
}
type levelTrackDetailData struct {
Overview levelTrackOverviewData `json:"overview"`
Rules []levelRuleData `json:"rules"`
Tiers []levelTierData `json:"tiers"`
ServerTimeMS int64 `json:"server_time_ms"`
}
type levelRuleData struct {
Track string `json:"track"`
Level int32 `json:"level"`
RequiredValue int64 `json:"required_value"`
Name string `json:"name"`
Status string `json:"status"`
RewardResourceGroupID int64 `json:"reward_resource_group_id"`
SortOrder int32 `json:"sort_order"`
DisplayConfigJSON string `json:"display_config_json"`
CreatedByAdminID int64 `json:"created_by_admin_id"`
UpdatedByAdminID int64 `json:"updated_by_admin_id"`
CreatedAtMS int64 `json:"created_at_ms"`
UpdatedAtMS int64 `json:"updated_at_ms"`
}
type levelTierData struct {
TierID int64 `json:"tier_id"`
Track string `json:"track"`
MinLevel int32 `json:"min_level"`
MaxLevel int32 `json:"max_level"`
Name string `json:"name"`
DisplayAvatarFrameResourceID int64 `json:"display_avatar_frame_resource_id"`
DisplayBadgeResourceID int64 `json:"display_badge_resource_id"`
RewardResourceGroupID int64 `json:"reward_resource_group_id"`
Status string `json:"status"`
DisplayConfigJSON string `json:"display_config_json"`
CreatedByAdminID int64 `json:"created_by_admin_id"`
UpdatedByAdminID int64 `json:"updated_by_admin_id"`
CreatedAtMS int64 `json:"created_at_ms"`
UpdatedAtMS int64 `json:"updated_at_ms"`
}
type levelRewardData struct {
RewardJobID string `json:"reward_job_id"`
UserID int64 `json:"user_id"`
Track string `json:"track"`
RewardSourceType string `json:"reward_source_type"`
RewardSourceID string `json:"reward_source_id"`
ResourceGroupID int64 `json:"resource_group_id"`
WalletCommandID string `json:"wallet_command_id"`
WalletGrantID string `json:"wallet_grant_id"`
Status string `json:"status"`
AttemptCount int32 `json:"attempt_count"`
FailureReason string `json:"failure_reason"`
CreatedAtMS int64 `json:"created_at_ms"`
UpdatedAtMS int64 `json:"updated_at_ms"`
}
func (h *Handler) getMyLevelOverview(writer http.ResponseWriter, request *http.Request) {
if h.growthLevelClient == nil {
httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error")
return
}
resp, err := h.growthLevelClient.GetMyLevelOverview(request.Context(), &activityv1.GetMyLevelOverviewRequest{
Meta: httpkit.ActivityMeta(request),
UserId: auth.UserIDFromContext(request.Context()),
})
if err != nil {
httpkit.WriteRPCError(writer, request, err)
return
}
tracks := make([]levelTrackOverviewData, 0, len(resp.GetTracks()))
for _, item := range resp.GetTracks() {
tracks = append(tracks, levelTrackOverviewFromProto(item))
}
httpkit.WriteOK(writer, request, levelOverviewData{Tracks: tracks, ServerTimeMS: resp.GetServerTimeMs()})
}
func (h *Handler) getLevelTrack(writer http.ResponseWriter, request *http.Request) {
if h.growthLevelClient == nil {
httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error")
return
}
track := strings.TrimSpace(request.PathValue("track"))
if track == "" {
httpkit.WriteError(writer, request, http.StatusBadRequest, httpkit.CodeInvalidArgument, "invalid argument")
return
}
resp, err := h.growthLevelClient.GetLevelTrack(request.Context(), &activityv1.GetLevelTrackRequest{
Meta: httpkit.ActivityMeta(request),
UserId: auth.UserIDFromContext(request.Context()),
Track: track,
})
if err != nil {
httpkit.WriteRPCError(writer, request, err)
return
}
rules := make([]levelRuleData, 0, len(resp.GetRules()))
for _, rule := range resp.GetRules() {
rules = append(rules, levelRuleFromProto(rule))
}
tiers := make([]levelTierData, 0, len(resp.GetTiers()))
for _, tier := range resp.GetTiers() {
tiers = append(tiers, levelTierFromProto(tier))
}
httpkit.WriteOK(writer, request, levelTrackDetailData{
Overview: levelTrackOverviewFromProto(resp.GetOverview()),
Rules: rules,
Tiers: tiers,
ServerTimeMS: resp.GetServerTimeMs(),
})
}
func (h *Handler) listLevelRewards(writer http.ResponseWriter, request *http.Request) {
if h.growthLevelClient == nil {
httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error")
return
}
page, ok := httpkit.PositiveInt32Query(request, "page", 1)
if !ok {
httpkit.WriteError(writer, request, http.StatusBadRequest, httpkit.CodeInvalidArgument, "invalid argument")
return
}
pageSize, ok := httpkit.PositiveInt32Query(request, "page_size", 20)
if !ok {
httpkit.WriteError(writer, request, http.StatusBadRequest, httpkit.CodeInvalidArgument, "invalid argument")
return
}
resp, err := h.growthLevelClient.ListLevelRewards(request.Context(), &activityv1.ListLevelRewardsRequest{
Meta: httpkit.ActivityMeta(request),
UserId: auth.UserIDFromContext(request.Context()),
Track: strings.TrimSpace(request.URL.Query().Get("track")),
Status: strings.TrimSpace(request.URL.Query().Get("status")),
Page: page,
PageSize: pageSize,
})
if err != nil {
httpkit.WriteRPCError(writer, request, err)
return
}
rewards := make([]levelRewardData, 0, len(resp.GetRewards()))
for _, reward := range resp.GetRewards() {
rewards = append(rewards, levelRewardFromProto(reward))
}
httpkit.WriteOK(writer, request, map[string]any{
"rewards": rewards,
"total": resp.GetTotal(),
"page": page,
"page_size": pageSize,
})
}
func levelTrackOverviewFromProto(item *activityv1.LevelTrackOverview) levelTrackOverviewData {
return levelTrackOverviewData{
Track: item.GetTrack(),
Name: item.GetName(),
Level: item.GetLevel(),
TierID: item.GetTierId(),
TotalValue: item.GetTotalValue(),
CurrentLevelRequiredValue: item.GetCurrentLevelRequiredValue(),
NextLevel: item.GetNextLevel(),
NextLevelRequiredValue: item.GetNextLevelRequiredValue(),
DisplayAvatarFrameResourceID: item.GetDisplayAvatarFrameResourceId(),
DisplayBadgeResourceID: item.GetDisplayBadgeResourceId(),
RewardPendingCount: item.GetRewardPendingCount(),
SortOrder: item.GetSortOrder(),
}
}
func levelRuleFromProto(item *activityv1.LevelRule) levelRuleData {
return levelRuleData{
Track: item.GetTrack(),
Level: item.GetLevel(),
RequiredValue: item.GetRequiredValue(),
Name: item.GetName(),
Status: item.GetStatus(),
RewardResourceGroupID: item.GetRewardResourceGroupId(),
SortOrder: item.GetSortOrder(),
DisplayConfigJSON: item.GetDisplayConfigJson(),
CreatedByAdminID: item.GetCreatedByAdminId(),
UpdatedByAdminID: item.GetUpdatedByAdminId(),
CreatedAtMS: item.GetCreatedAtMs(),
UpdatedAtMS: item.GetUpdatedAtMs(),
}
}
func levelTierFromProto(item *activityv1.LevelTier) levelTierData {
return levelTierData{
TierID: item.GetTierId(),
Track: item.GetTrack(),
MinLevel: item.GetMinLevel(),
MaxLevel: item.GetMaxLevel(),
Name: item.GetName(),
DisplayAvatarFrameResourceID: item.GetDisplayAvatarFrameResourceId(),
DisplayBadgeResourceID: item.GetDisplayBadgeResourceId(),
RewardResourceGroupID: item.GetRewardResourceGroupId(),
Status: item.GetStatus(),
DisplayConfigJSON: item.GetDisplayConfigJson(),
CreatedByAdminID: item.GetCreatedByAdminId(),
UpdatedByAdminID: item.GetUpdatedByAdminId(),
CreatedAtMS: item.GetCreatedAtMs(),
UpdatedAtMS: item.GetUpdatedAtMs(),
}
}
func levelRewardFromProto(item *activityv1.LevelRewardJob) levelRewardData {
return levelRewardData{
RewardJobID: item.GetRewardJobId(),
UserID: item.GetUserId(),
Track: item.GetTrack(),
RewardSourceType: item.GetRewardSourceType(),
RewardSourceID: item.GetRewardSourceId(),
ResourceGroupID: item.GetResourceGroupId(),
WalletCommandID: item.GetWalletCommandId(),
WalletGrantID: item.GetWalletGrantId(),
Status: item.GetStatus(),
AttemptCount: item.GetAttemptCount(),
FailureReason: item.GetFailureReason(),
CreatedAtMS: item.GetCreatedAtMs(),
UpdatedAtMS: item.GetUpdatedAtMs(),
}
}