2026-07-15 09:43:33 +08:00

149 lines
6.4 KiB
Go

package activityapi
import (
"context"
userv1 "hyapp.local/api/proto/user/v1"
"hyapp/pkg/userleaderboard"
"hyapp/services/gateway-service/internal/client"
"hyapp/services/gateway-service/internal/transport/http/httproutes"
)
// Handler owns activity-facing HTTP endpoints.
// It keeps task and registration reward reads/writes behind activity-service, with gateway only adding auth context.
type Handler struct {
taskClient client.TaskClient
growthLevelClient client.GrowthLevelClient
achievementClient client.AchievementClient
userProfileClient UserProfileReader
roomQueryClient client.RoomQueryClient
walletClient client.WalletClient
userLeaderboard UserLeaderboardStore
registrationReward client.RegistrationRewardClient
firstRechargeReward client.FirstRechargeRewardClient
cumulativeRecharge client.CumulativeRechargeRewardClient
inviteActivityReward client.InviteActivityRewardClient
sevenDayCheckIn client.SevenDayCheckInClient
luckyGift client.LuckyGiftClient
roomTurnoverReward client.RoomTurnoverRewardClient
weeklyStar client.WeeklyStarClient
cpWeeklyRank client.CPWeeklyRankClient
agencyOpening client.AgencyOpeningClient
wheel client.WheelClient
activityTemplateRuntime client.ActivityTemplateRuntimeClient
}
type UserLeaderboardStore interface {
List(ctx context.Context, query userleaderboard.Query) (userleaderboard.Page, error)
RankForUser(ctx context.Context, query userleaderboard.Query, userID int64) (userleaderboard.Entry, bool, error)
}
// UserProfileReader keeps activity HTTP composition on the two profile operations it actually needs.
// The concrete gRPC client exposes more user commands, but widening this boundary would let activity handlers
// accidentally mutate user ownership while only resolving a trusted region and leaderboard presentation data.
type UserProfileReader interface {
GetUser(ctx context.Context, req *userv1.GetUserRequest) (*userv1.GetUserResponse, error)
BatchGetUsers(ctx context.Context, req *userv1.BatchGetUsersRequest) (*userv1.BatchGetUsersResponse, error)
}
type Config struct {
TaskClient client.TaskClient
GrowthLevelClient client.GrowthLevelClient
AchievementClient client.AchievementClient
UserProfileClient UserProfileReader
RoomQueryClient client.RoomQueryClient
WalletClient client.WalletClient
UserLeaderboard UserLeaderboardStore
RegistrationReward client.RegistrationRewardClient
FirstRechargeReward client.FirstRechargeRewardClient
CumulativeRecharge client.CumulativeRechargeRewardClient
InviteActivityReward client.InviteActivityRewardClient
SevenDayCheckIn client.SevenDayCheckInClient
LuckyGift client.LuckyGiftClient
RoomTurnoverReward client.RoomTurnoverRewardClient
WeeklyStar client.WeeklyStarClient
CPWeeklyRank client.CPWeeklyRankClient
AgencyOpening client.AgencyOpeningClient
Wheel client.WheelClient
ActivityTemplateRuntime client.ActivityTemplateRuntimeClient
}
func New(config Config) *Handler {
return &Handler{
taskClient: config.TaskClient,
growthLevelClient: config.GrowthLevelClient,
achievementClient: config.AchievementClient,
userProfileClient: config.UserProfileClient,
roomQueryClient: config.RoomQueryClient,
walletClient: config.WalletClient,
userLeaderboard: config.UserLeaderboard,
registrationReward: config.RegistrationReward,
firstRechargeReward: config.FirstRechargeReward,
cumulativeRecharge: config.CumulativeRecharge,
inviteActivityReward: config.InviteActivityReward,
sevenDayCheckIn: config.SevenDayCheckIn,
luckyGift: config.LuckyGift,
roomTurnoverReward: config.RoomTurnoverReward,
weeklyStar: config.WeeklyStar,
cpWeeklyRank: config.CPWeeklyRank,
agencyOpening: config.AgencyOpening,
wheel: config.Wheel,
activityTemplateRuntime: config.ActivityTemplateRuntime,
}
}
func (h *Handler) TaskHandlers() httproutes.TaskHandlers {
return httproutes.TaskHandlers{
ListTaskTabs: h.listTaskTabs,
ClaimTaskReward: h.claimTaskReward,
GetRegistrationRewardEligibility: h.getRegistrationRewardEligibility,
GetFirstRechargeRewardStatus: h.getFirstRechargeRewardStatus,
GetCumulativeRechargeRewardStatus: h.getCumulativeRechargeRewardStatus,
GetInviteActivityRewardStatus: h.getInviteActivityRewardStatus,
ClaimInviteActivityReward: h.claimInviteActivityReward,
ListInviteActivityLeaderboard: h.listInviteActivityLeaderboard,
GetSevenDayCheckInStatus: h.getSevenDayCheckInStatus,
SignSevenDayCheckIn: h.signSevenDayCheckIn,
ListUserLeaderboards: h.listUserLeaderboards,
CheckLuckyGift: h.checkLuckyGift,
GetRoomTurnoverRewardStatus: h.getRoomTurnoverRewardStatus,
GetWeeklyStarCurrent: h.getWeeklyStarCurrent,
ListWeeklyStarLeaderboard: h.listWeeklyStarLeaderboard,
ListWeeklyStarHistory: h.listWeeklyStarHistory,
GetCPWeeklyRankStatus: h.getCPWeeklyRankStatus,
GetAgencyOpeningStatus: h.getAgencyOpeningStatus,
ApplyAgencyOpening: h.applyAgencyOpening,
ListAgencyOpeningLeaderboard: h.listAgencyOpeningLeaderboard,
GetWheelConfig: h.getWheelConfig,
DrawWheel: h.drawWheel,
ListWheelHistory: h.listWheelHistory,
ListWheelHints: h.listWheelHints,
GetCurrentActivityTemplate: h.getCurrentActivityTemplate,
VisitActivityTemplate: h.visitActivityTemplate,
ListActivityTemplateTasks: h.listActivityTemplateTasks,
ClaimActivityTemplateTask: h.claimActivityTemplateTask,
ListActivityTemplateDailyLeaderboard: h.listActivityTemplateDailyLeaderboard,
ListActivityTemplateTotalLeaderboard: h.listActivityTemplateTotalLeaderboard,
}
}
func (h *Handler) LevelHandlers() httproutes.LevelHandlers {
return httproutes.LevelHandlers{
GetMyLevelOverview: h.getMyLevelOverview,
GetLevelTrack: h.getLevelTrack,
ListLevelRewards: h.listLevelRewards,
}
}
func (h *Handler) AchievementHandlers() httproutes.AchievementHandlers {
return httproutes.AchievementHandlers{
ListAchievements: h.listAchievements,
ListMyBadges: h.listMyBadges,
SetBadgeDisplay: h.setBadgeDisplay,
}
}