package httproutes import ( "net/http" "hyapp/services/gateway-service/internal/transport/http/httpkit" ) const APIV1Prefix = "/api/v1" type Wrapper func(http.HandlerFunc) http.Handler type Config struct { PublicWrap Wrapper AuthWrap Wrapper ProfileWrap Wrapper Auth AuthHandlers App AppHandlers User UserHandlers Manager ManagerHandlers Room RoomHandlers Message MessageHandlers Task TaskHandlers Level LevelHandlers Achievement AchievementHandlers Wallet WalletHandlers VIP VIPHandlers Game GameHandlers } type AuthHandlers struct { LoginPassword http.HandlerFunc SetPassword http.HandlerFunc QuickCreateAccount http.HandlerFunc LoginThirdParty http.HandlerFunc RegisterThirdParty http.HandlerFunc CheckThirdPartyRegistered http.HandlerFunc RefreshToken http.HandlerFunc Logout http.HandlerFunc } type AppHandlers struct { ListRegistrationCountries http.HandlerFunc ListLoginRiskBlockedCountries http.HandlerFunc GetAppBootstrap http.HandlerFunc ListH5Links http.HandlerFunc ListExploreTabs http.HandlerFunc ListAppBanners http.HandlerFunc ListSplashScreens http.HandlerFunc ListPopups http.HandlerFunc GetAppVersion http.HandlerFunc GetResourceGroup http.HandlerFunc ListResourceShopItems http.HandlerFunc PurchaseResourceShopItem http.HandlerFunc ListGifts http.HandlerFunc ListGiftTabs http.HandlerFunc ListEmojiPacks http.HandlerFunc IssueTencentIMUserSig http.HandlerFunc IssueTencentRTCToken http.HandlerFunc HandleTencentIMCallback http.HandlerFunc HandleTencentRTCCallback http.HandlerFunc UploadFile http.HandlerFunc UploadAvatar http.HandlerFunc UploadRegistrationAvatar http.HandlerFunc ProxyEffectMedia http.HandlerFunc HandlePushToken http.HandlerFunc AppHeartbeat http.HandlerFunc ReportAppEvents http.HandlerFunc } type UserHandlers struct { ResolveDisplayUserID http.HandlerFunc BatchUserProfiles http.HandlerFunc BatchRoomDisplayProfiles http.HandlerFunc GetMyOverview http.HandlerFunc GetMyInviteOverview http.HandlerFunc GetMyInviteReferrer http.HandlerFunc SearchInviteReferrer http.HandlerFunc BindInviteReferrer http.HandlerFunc GetMyGiftWall http.HandlerFunc GetMyIdentity http.HandlerFunc GetMyHostIdentity http.HandlerFunc GetMyRoleSummary http.HandlerFunc SearchHostAgencies http.HandlerFunc ApplyToHostAgency http.HandlerFunc GetAgencyProfile http.HandlerFunc ListAgencyRooms http.HandlerFunc UpdateAgencyProfile http.HandlerFunc GetHostCenterAgency http.HandlerFunc GetHostCenterPlatformPolicy http.HandlerFunc GetAgencyCenterOverview http.HandlerFunc GetAgencyCenterPlatformPolicy http.HandlerFunc ListAgencyCenterHosts http.HandlerFunc ListAgencyCenterApplications http.HandlerFunc ReviewAgencyCenterApplication http.HandlerFunc RemoveAgencyCenterHost http.HandlerFunc InviteAgencyCenterHost http.HandlerFunc GetBDLeaderCenterOverview http.HandlerFunc ListBDLeaderCenterBDs http.HandlerFunc ListBDLeaderCenterAgencies http.HandlerFunc InviteBDLeaderBD http.HandlerFunc InviteBDLeaderAgency http.HandlerFunc GetBDCenterOverview http.HandlerFunc ListBDCenterAgencies http.HandlerFunc InviteBDAgency http.HandlerFunc ListMyRoleInvitations http.HandlerFunc ProcessMyRoleInvitation http.HandlerFunc CompleteMyOnboarding http.HandlerFunc UpdateMyProfile http.HandlerFunc UpdateMyProfileBackground http.HandlerFunc UpdateMyContactInfo http.HandlerFunc ChangeMyCountry http.HandlerFunc ChangeMyDisplayUserID http.HandlerFunc ApplyMyPrettyDisplayUserID http.HandlerFunc ListAvailablePrettyDisplayIDs http.HandlerFunc ApplyPrettyDisplayIDFromPool http.HandlerFunc ListMyProfileVisitors http.HandlerFunc ListMyFollowing http.HandlerFunc ListMyFriends http.HandlerFunc ListMyFriendApplications http.HandlerFunc ListCPApplications http.HandlerFunc AcceptCPApplication http.HandlerFunc RejectCPApplication http.HandlerFunc ListCPRelationships http.HandlerFunc ListCPIntimacyLeaderboard http.HandlerFunc BreakCPRelationship http.HandlerFunc GetMyProfile http.HandlerFunc GetUserProfile http.HandlerFunc GetMyAppearance http.HandlerFunc GetUserAppearance http.HandlerFunc ListMyResources http.HandlerFunc EquipMyResource http.HandlerFunc UnequipMyResource http.HandlerFunc UserSocialAction http.HandlerFunc SubmitReport http.HandlerFunc } type ManagerHandlers struct { ListManagerGrantResources http.HandlerFunc GrantManagerResource http.HandlerFunc LookupBusinessUsers http.HandlerFunc GetManagerOverview http.HandlerFunc SearchManagerUsers http.HandlerFunc GrantManagerVIP http.HandlerFunc ManagerBlocks http.HandlerFunc ListManagerBlocks http.HandlerFunc CreateManagerBlock http.HandlerFunc UnblockManagerBlock http.HandlerFunc SetManagerUserLevel http.HandlerFunc CreateManagerBDLeader http.HandlerFunc TransferManagerUserCountry http.HandlerFunc } type RoomHandlers struct { GetMyRoom http.HandlerFunc ListRoomFeeds http.HandlerFunc ListRooms http.HandlerFunc GetCurrentRoom http.HandlerFunc GetRoomSnapshot http.HandlerFunc GetRoomDetail http.HandlerFunc GetRoomShare http.HandlerFunc GetRoomShareLanding http.HandlerFunc ListRoomOnlineUsers http.HandlerFunc ListRoomBannedUsers http.HandlerFunc GetRoomContributionRank http.HandlerFunc GetRoomGiftPanel http.HandlerFunc GetRoomRocket http.HandlerFunc FollowRoom http.HandlerFunc CreateRoom http.HandlerFunc UpdateRoomProfile http.HandlerFunc SaveRoomBackground http.HandlerFunc ListRoomBackgrounds http.HandlerFunc SetRoomBackground http.HandlerFunc JoinRoom http.HandlerFunc RoomHeartbeat http.HandlerFunc LeaveRoom http.HandlerFunc CloseRoom http.HandlerFunc MicUp http.HandlerFunc MicDown http.HandlerFunc ChangeMicSeat http.HandlerFunc ConfirmMicPublishing http.HandlerFunc MicHeartbeat http.HandlerFunc SetMicMute http.HandlerFunc SetMicSeatLock http.HandlerFunc SetChatEnabled http.HandlerFunc SetRoomPassword http.HandlerFunc SetRoomAdmin http.HandlerFunc MuteUser http.HandlerFunc KickUser http.HandlerFunc UnbanUser http.HandlerFunc SendGift http.HandlerFunc SendGiftBatch http.HandlerFunc } type MessageHandlers struct { ListMessageTabs http.HandlerFunc MarkInboxSectionRead http.HandlerFunc MarkInboxMessageReadPath http.HandlerFunc DeleteInboxMessagePath http.HandlerFunc ListInboxMessages http.HandlerFunc AcceptActionConfirm http.HandlerFunc RejectActionConfirm http.HandlerFunc BatchActionConfirmStatus http.HandlerFunc ListActionConfirms http.HandlerFunc } type TaskHandlers struct { ListTaskTabs http.HandlerFunc ClaimTaskReward http.HandlerFunc GetRegistrationRewardEligibility http.HandlerFunc GetFirstRechargeRewardStatus http.HandlerFunc GetCumulativeRechargeRewardStatus http.HandlerFunc GetInviteActivityRewardStatus http.HandlerFunc ClaimInviteActivityReward http.HandlerFunc ListInviteActivityLeaderboard http.HandlerFunc GetSevenDayCheckInStatus http.HandlerFunc SignSevenDayCheckIn http.HandlerFunc ListUserLeaderboards http.HandlerFunc CheckLuckyGift http.HandlerFunc GetRoomTurnoverRewardStatus http.HandlerFunc GetWeeklyStarCurrent http.HandlerFunc ListWeeklyStarLeaderboard http.HandlerFunc ListWeeklyStarHistory http.HandlerFunc GetCPWeeklyRankStatus http.HandlerFunc GetAgencyOpeningStatus http.HandlerFunc ApplyAgencyOpening http.HandlerFunc ListAgencyOpeningLeaderboard http.HandlerFunc GetWheelConfig http.HandlerFunc DrawWheel http.HandlerFunc ListWheelHistory http.HandlerFunc ListWheelHints http.HandlerFunc } type LevelHandlers struct { GetMyLevelOverview http.HandlerFunc GetLevelTrack http.HandlerFunc ListLevelRewards http.HandlerFunc } type AchievementHandlers struct { ListAchievements http.HandlerFunc ListMyBadges http.HandlerFunc SetBadgeDisplay http.HandlerFunc } type WalletHandlers struct { GetWalletOverview http.HandlerFunc GetMyBalances http.HandlerFunc ListRechargeProducts http.HandlerFunc GetH5RechargeContext http.HandlerFunc ListH5RechargeOptions http.HandlerFunc CreateH5RechargeOrder http.HandlerFunc ListTemporaryPayMethods http.HandlerFunc CreateTemporaryPayLink http.HandlerFunc GetTemporaryPayLink http.HandlerFunc ListTemporaryPayLinks http.HandlerFunc SubmitH5RechargeTx http.HandlerFunc GetH5RechargeOrder http.HandlerFunc HandleMifapayNotify http.HandlerFunc HandleV5PayNotify http.HandlerFunc ConfirmGooglePayment http.HandlerFunc GetDiamondExchangeConfig http.HandlerFunc ListCoinTransactions http.HandlerFunc ListWalletTransactions http.HandlerFunc ListCoinSellers http.HandlerFunc TransferCoinFromSeller http.HandlerFunc SendDirectGift http.HandlerFunc GetSalaryWalletOverview http.HandlerFunc GetSalaryWalletHistory http.HandlerFunc SearchSalaryWalletSeller http.HandlerFunc ExchangeSalaryToCoin http.HandlerFunc TransferSalaryToSeller http.HandlerFunc HandleSalaryWalletWithdrawAddress http.HandlerFunc WithdrawSalaryWallet http.HandlerFunc GetRedPacketConfig http.HandlerFunc ListRoomRedPackets http.HandlerFunc CreateRoomRedPacket http.HandlerFunc GetRedPacket http.HandlerFunc ClaimRedPacket http.HandlerFunc GetCurrentRegionIMGroup http.HandlerFunc GetRedPacketIMGroup http.HandlerFunc SendVoiceRoomRedPacket http.HandlerFunc ListActiveRedPackets http.HandlerFunc ClaimVoiceRoomRedPacket http.HandlerFunc GetVoiceRoomRedPacket http.HandlerFunc ListRedPacketClaims http.HandlerFunc ListSentRedPackets http.HandlerFunc } type VIPHandlers struct { GetMyVIP http.HandlerFunc ListVIPPackages http.HandlerFunc PurchaseVIP http.HandlerFunc } type GameHandlers struct { ListGames http.HandlerFunc ListRecentGames http.HandlerFunc ListExploreWinners http.HandlerFunc GetBridgeScript http.HandlerFunc LaunchGame http.HandlerFunc GetDiceConfig http.HandlerFunc MatchDice http.HandlerFunc CreateDiceMatch http.HandlerFunc JoinDiceMatch http.HandlerFunc GetDiceMatch http.HandlerFunc RollDiceMatch http.HandlerFunc CancelDiceMatch http.HandlerFunc GetRPSConfig http.HandlerFunc MatchRPS http.HandlerFunc CreateRPSMatch http.HandlerFunc JoinRPSMatch http.HandlerFunc GetRPSMatch http.HandlerFunc RollRPSMatch http.HandlerFunc CancelRPSMatch http.HandlerFunc ReportSelfGameH5Event http.HandlerFunc GetRoomRPSConfig http.HandlerFunc ListRoomRPSChallenges http.HandlerFunc CreateRoomRPSChallenge http.HandlerFunc AcceptRoomRPSChallenge http.HandlerFunc GetRoomRPSChallenge http.HandlerFunc HandleCallback http.HandlerFunc HandleZGameCallback http.HandlerFunc HandleHotgameGetUserInfo http.HandlerFunc HandleHotgameUpdateBalance http.HandlerFunc } type routes struct { mux *http.ServeMux config Config } // New 只维护 gateway 对外 HTTP 路径到 transport handler 的绑定。 // 业务状态和命令执行仍然全部下沉到 owner service,路由层不承载业务规则。 func New(config Config) http.Handler { mux := http.NewServeMux() routes := routes{mux: mux, config: config} routes.registerAuthRoutes() routes.registerAppRoutes() routes.registerUserRoutes() routes.registerManagerRoutes() routes.registerRoomRoutes() routes.registerMessageRoutes() routes.registerTaskRoutes() routes.registerLevelRoutes() routes.registerAchievementRoutes() routes.registerWalletRoutes() routes.registerVIPRoutes() routes.registerGameRoutes() return mux } func (r routes) public(path string, method string, next http.HandlerFunc) { r.register(path, method, r.config.PublicWrap, next) } func (r routes) rootPublic(path string, method string, next http.HandlerFunc) { r.registerRaw(path, method, r.config.PublicWrap, next) } func (r routes) auth(path string, method string, next http.HandlerFunc) { r.register(path, method, r.config.AuthWrap, next) } func (r routes) profile(path string, method string, next http.HandlerFunc) { r.register(path, method, r.config.ProfileWrap, next) } func (r routes) register(path string, method string, wrap Wrapper, next http.HandlerFunc) { r.registerRaw(APIV1Prefix+path, method, wrap, next) } func (r routes) registerRaw(path string, method string, wrap Wrapper, next http.HandlerFunc) { if method != "" { // method 继续走 gateway envelope,而不是使用 ServeMux 自动 405。 next = httpkit.RequireMethod(method, next) } r.mux.Handle(path, wrap(next)) } func (r routes) registerAuthRoutes() { h := r.config.Auth r.public("/auth/account/login", "", h.LoginPassword) r.auth("/auth/password/set", "", h.SetPassword) r.public("/auth/account/quick-create", http.MethodPost, h.QuickCreateAccount) r.public("/auth/third-party/login", "", h.LoginThirdParty) r.public("/auth/third-party/register", http.MethodPost, h.RegisterThirdParty) r.public("/auth/third-party/registered/check", http.MethodPost, h.CheckThirdPartyRegistered) r.public("/auth/token/refresh", "", h.RefreshToken) r.public("/auth/logout", "", h.Logout) } func (r routes) registerAppRoutes() { h := r.config.App r.public("/countries", "", h.ListRegistrationCountries) r.public("/login-risk/blocked-countries", http.MethodGet, h.ListLoginRiskBlockedCountries) r.public("/app/bootstrap", "", h.GetAppBootstrap) r.public("/app/h5-links", "", h.ListH5Links) r.public("/app/explore-tabs", http.MethodGet, h.ListExploreTabs) r.public("/app/banners", "", h.ListAppBanners) r.public("/app/splash-screens", http.MethodGet, h.ListSplashScreens) r.public("/app/popups", http.MethodGet, h.ListPopups) r.public("/app/version", http.MethodGet, h.GetAppVersion) r.public("/resource-groups/{group_id}", "", h.GetResourceGroup) r.public("/resource-shop/items", http.MethodGet, h.ListResourceShopItems) r.profile("/resource-shop/items/{shop_item_id}/purchase", http.MethodPost, h.PurchaseResourceShopItem) r.public("/gifts", "", h.ListGifts) r.public("/gift-tabs", http.MethodGet, h.ListGiftTabs) r.public("/emoji-packs", http.MethodGet, h.ListEmojiPacks) r.profile("/im/usersig", http.MethodGet, h.IssueTencentIMUserSig) r.profile("/rtc/token", http.MethodPost, h.IssueTencentRTCToken) r.public("/tencent-im/callback", "", h.HandleTencentIMCallback) r.public("/tencent-rtc/callback", "", h.HandleTencentRTCCallback) r.auth("/files/upload", "", h.UploadFile) r.auth("/files/avatar/upload", "", h.UploadAvatar) r.public("/files/registration/avatar/upload", http.MethodPost, h.UploadRegistrationAvatar) r.public("/media/effects/proxy", http.MethodGet, h.ProxyEffectMedia) r.auth("/app/heartbeat", http.MethodPost, h.AppHeartbeat) r.public("/app/events", http.MethodPost, h.ReportAppEvents) r.profile("/devices/push-token", "", h.HandlePushToken) } func (r routes) registerUserRoutes() { h := r.config.User r.public("/users/by-display-user-id/{display_user_id}", "", h.ResolveDisplayUserID) r.public("/users/by-id/{user_id}/profile", http.MethodGet, h.GetUserProfile) r.public("/users/by-id/{user_id}/appearance", http.MethodGet, h.GetUserAppearance) r.profile("/users/profiles:batch", "", h.BatchUserProfiles) r.profile("/users/room-display-profiles:batch", http.MethodGet, h.BatchRoomDisplayProfiles) r.profile("/users/me/overview", "", h.GetMyOverview) r.profile("/users/me/invite-overview", http.MethodGet, h.GetMyInviteOverview) r.profile("/users/me/invite-referrer", http.MethodGet, h.GetMyInviteReferrer) r.profile("/users/me/invite-referrer/search", http.MethodGet, h.SearchInviteReferrer) r.profile("/users/me/invite-referrer/bind", http.MethodPost, h.BindInviteReferrer) r.profile("/users/me/gift-wall", http.MethodGet, h.GetMyGiftWall) r.auth("/users/me/identity", "", h.GetMyIdentity) r.profile("/users/me/host-identity", "", h.GetMyHostIdentity) r.profile("/users/me/role-summary", "", h.GetMyRoleSummary) r.profile("/host/agencies/search", http.MethodGet, h.SearchHostAgencies) r.profile("/host/agency-applications", http.MethodPost, h.ApplyToHostAgency) r.profile("/agencies/profile", http.MethodGet, h.GetAgencyProfile) r.profile("/agencies/rooms", http.MethodGet, h.ListAgencyRooms) r.profile("/agencies/profile/update", http.MethodPost, h.UpdateAgencyProfile) r.profile("/host-center/agency", http.MethodGet, h.GetHostCenterAgency) r.profile("/host-center/platform-policy", http.MethodGet, h.GetHostCenterPlatformPolicy) r.profile("/agency-center/overview", http.MethodGet, h.GetAgencyCenterOverview) r.profile("/agency-center/platform-policy", http.MethodGet, h.GetAgencyCenterPlatformPolicy) r.profile("/agency-center/hosts", http.MethodGet, h.ListAgencyCenterHosts) r.profile("/agency-center/applications", http.MethodGet, h.ListAgencyCenterApplications) r.profile("/agency-center/applications/{application_id}/review", http.MethodPost, h.ReviewAgencyCenterApplication) r.profile("/agency-center/hosts/{host_user_id}/remove", http.MethodPost, h.RemoveAgencyCenterHost) r.profile("/agency-center/invitations/host", http.MethodPost, h.InviteAgencyCenterHost) r.profile("/bd-leader-center/overview", http.MethodGet, h.GetBDLeaderCenterOverview) r.profile("/bd-leader-center/bds", http.MethodGet, h.ListBDLeaderCenterBDs) r.profile("/bd-leader-center/agencies", http.MethodGet, h.ListBDLeaderCenterAgencies) r.profile("/bd-leader/invitations/bd", http.MethodPost, h.InviteBDLeaderBD) r.profile("/bd-leader/invitations/agency", http.MethodPost, h.InviteBDLeaderAgency) r.profile("/bd-center/overview", http.MethodGet, h.GetBDCenterOverview) r.profile("/bd-center/agencies", http.MethodGet, h.ListBDCenterAgencies) r.profile("/bd/invitations/agency", http.MethodPost, h.InviteBDAgency) r.profile("/role-invitations", http.MethodGet, h.ListMyRoleInvitations) r.profile("/role-invitations/{invitation_id}/process", http.MethodPost, h.ProcessMyRoleInvitation) r.auth("/users/me/onboarding/complete", "", h.CompleteMyOnboarding) r.profile("/users/me/profile/update", "", h.UpdateMyProfile) r.profile("/users/me/profile-bg-img", http.MethodPost, h.UpdateMyProfileBackground) r.profile("/users/me/contact-info", http.MethodPost, h.UpdateMyContactInfo) r.profile("/users/me/country/change", "", h.ChangeMyCountry) r.auth("/users/me/display-id/change", "", h.ChangeMyDisplayUserID) r.auth("/users/me/display-id/pretty/apply", "", h.ApplyMyPrettyDisplayUserID) r.auth("/users/pretty-ids/available", http.MethodGet, h.ListAvailablePrettyDisplayIDs) r.auth("/users/pretty-ids/apply", http.MethodPost, h.ApplyPrettyDisplayIDFromPool) r.profile("/users/me/visitors", http.MethodGet, h.ListMyProfileVisitors) r.profile("/users/me/following", http.MethodGet, h.ListMyFollowing) r.profile("/users/me/friends", http.MethodGet, h.ListMyFriends) r.profile("/users/me/friend-requests", http.MethodGet, h.ListMyFriendApplications) r.profile("/cp/applications", http.MethodGet, h.ListCPApplications) r.profile("/cp/applications/{application_id}/accept", http.MethodPost, h.AcceptCPApplication) r.profile("/cp/applications/{application_id}/reject", http.MethodPost, h.RejectCPApplication) r.profile("/cp/relationships", http.MethodGet, h.ListCPRelationships) r.profile("/cp/intimacy-leaderboard", http.MethodGet, h.ListCPIntimacyLeaderboard) r.profile("/cp/relationships/{relationship_id}/break", http.MethodPost, h.BreakCPRelationship) r.profile("/appearance", http.MethodGet, h.GetMyAppearance) r.profile("/users/me/appearance", http.MethodGet, h.GetMyAppearance) r.profile("/users/me", "", h.GetMyProfile) r.profile("/users/me/resources", "", h.ListMyResources) r.profile("/users/me/resources/{resource_id}/equip", "", h.EquipMyResource) r.profile("/users/me/resources/{resource_type}/unequip", http.MethodDelete, h.UnequipMyResource) r.profile("/reports", http.MethodPost, h.SubmitReport) r.profile("/users/{user_id}/{action...}", "", h.UserSocialAction) } func (r routes) registerManagerRoutes() { h := r.config.Manager r.profile("/manager-center/overview", http.MethodGet, h.GetManagerOverview) r.profile("/manager-center/users/search", http.MethodGet, h.SearchManagerUsers) r.profile("/manager-center/resource-grants/resources", http.MethodGet, h.ListManagerGrantResources) r.profile("/manager-center/resource-grants", http.MethodPost, h.GrantManagerResource) r.profile("/manager-center/vip-grants", http.MethodPost, h.GrantManagerVIP) r.profile("/manager-center/blocks", "", h.ManagerBlocks) r.profile("/manager-center/blocks/{block_id}/unblock", http.MethodPost, h.UnblockManagerBlock) r.profile("/manager-center/levels", http.MethodPost, h.SetManagerUserLevel) r.profile("/manager-center/bd-leaders", http.MethodPost, h.CreateManagerBDLeader) r.profile("/manager-center/users/country", http.MethodPost, h.TransferManagerUserCountry) r.profile("/business/users/lookup", http.MethodGet, h.LookupBusinessUsers) } func (r routes) registerRoomRoutes() { h := r.config.Room r.rootPublic("/share/rooms/{room_id}", http.MethodGet, h.GetRoomShareLanding) r.profile("/rooms/me", http.MethodGet, h.GetMyRoom) r.profile("/rooms/feeds", http.MethodGet, h.ListRoomFeeds) r.profile("/rooms", http.MethodGet, h.ListRooms) r.profile("/rooms/current", http.MethodGet, h.GetCurrentRoom) r.profile("/rooms/snapshot", http.MethodGet, h.GetRoomSnapshot) r.profile("/rooms/{room_id}/detail", http.MethodGet, h.GetRoomDetail) r.profile("/rooms/{room_id}/share", http.MethodGet, h.GetRoomShare) r.profile("/rooms/{room_id}/online-users", http.MethodGet, h.ListRoomOnlineUsers) r.profile("/rooms/{room_id}/banned-users", http.MethodGet, h.ListRoomBannedUsers) r.profile("/rooms/{room_id}/contribution-rank", http.MethodGet, h.GetRoomContributionRank) r.profile("/rooms/{room_id}/gift-panel", http.MethodGet, h.GetRoomGiftPanel) r.profile("/rooms/{room_id}/rocket", http.MethodGet, h.GetRoomRocket) r.profile("/rooms/{room_id}/follow", "", h.FollowRoom) r.profile("/rooms/{room_id}/backgrounds", http.MethodGet, h.ListRoomBackgrounds) r.profile("/rooms/create", http.MethodPost, h.CreateRoom) r.profile("/rooms/profile/update", http.MethodPost, h.UpdateRoomProfile) r.profile("/rooms/backgrounds/save", http.MethodPost, h.SaveRoomBackground) r.profile("/rooms/backgrounds/set", http.MethodPost, h.SetRoomBackground) r.profile("/rooms/join", http.MethodPost, h.JoinRoom) r.profile("/rooms/heartbeat", http.MethodPost, h.RoomHeartbeat) r.profile("/rooms/leave", http.MethodPost, h.LeaveRoom) r.profile("/rooms/close", http.MethodPost, h.CloseRoom) r.profile("/rooms/mic/up", http.MethodPost, h.MicUp) r.profile("/rooms/mic/down", http.MethodPost, h.MicDown) r.profile("/rooms/mic/change", http.MethodPost, h.ChangeMicSeat) r.profile("/rooms/mic/publishing/confirm", http.MethodPost, h.ConfirmMicPublishing) r.profile("/rooms/mic/heartbeat", http.MethodPost, h.MicHeartbeat) r.profile("/rooms/mic/mute", http.MethodPost, h.SetMicMute) r.profile("/rooms/mic/lock", http.MethodPost, h.SetMicSeatLock) r.profile("/rooms/chat/enabled", http.MethodPost, h.SetChatEnabled) r.profile("/rooms/password", http.MethodPost, h.SetRoomPassword) r.profile("/rooms/admin/set", http.MethodPost, h.SetRoomAdmin) r.profile("/rooms/user/mute", http.MethodPost, h.MuteUser) r.profile("/rooms/user/kick", http.MethodPost, h.KickUser) r.profile("/rooms/user/unban", http.MethodPost, h.UnbanUser) r.profile("/rooms/gift/send", http.MethodPost, h.SendGift) r.profile("/rooms/gift/batch-send", http.MethodPost, h.SendGiftBatch) } func (r routes) registerMessageRoutes() { h := r.config.Message r.profile("/messages/tabs", "", h.ListMessageTabs) r.profile("/messages/read-all", "", h.MarkInboxSectionRead) r.profile("/messages/{message_id}/read", "", h.MarkInboxMessageReadPath) r.profile("/messages/{message_id}", "", h.DeleteInboxMessagePath) r.profile("/message/action-confirms/{confirm_id}/accept", http.MethodPost, h.AcceptActionConfirm) r.profile("/message/action-confirms/{confirm_id}/reject", http.MethodPost, h.RejectActionConfirm) r.profile("/message/action-confirms/status", http.MethodPost, h.BatchActionConfirmStatus) r.profile("/message/action-confirms", http.MethodGet, h.ListActionConfirms) r.profile("/messages", "", h.ListInboxMessages) } func (r routes) registerTaskRoutes() { h := r.config.Task r.profile("/activities/registration-reward/eligibility", http.MethodGet, h.GetRegistrationRewardEligibility) r.profile("/activities/first-recharge-reward", http.MethodGet, h.GetFirstRechargeRewardStatus) r.profile("/activities/cumulative-recharge-reward", http.MethodGet, h.GetCumulativeRechargeRewardStatus) r.profile("/activities/invite-reward", http.MethodGet, h.GetInviteActivityRewardStatus) r.profile("/activities/invite-reward/leaderboard", http.MethodGet, h.ListInviteActivityLeaderboard) r.profile("/activities/invite-reward/claim", http.MethodPost, h.ClaimInviteActivityReward) r.profile("/activities/seven-day-checkin", http.MethodGet, h.GetSevenDayCheckInStatus) r.profile("/activities/seven-day-checkin/sign", http.MethodPost, h.SignSevenDayCheckIn) r.profile("/activities/user-leaderboards", http.MethodGet, h.ListUserLeaderboards) r.profile("/activities/room-turnover-reward", http.MethodGet, h.GetRoomTurnoverRewardStatus) r.profile("/activities/weekly-star/current", http.MethodGet, h.GetWeeklyStarCurrent) r.profile("/activities/weekly-star/leaderboard", http.MethodGet, h.ListWeeklyStarLeaderboard) r.profile("/activities/weekly-star/history", http.MethodGet, h.ListWeeklyStarHistory) r.profile("/activities/cp-weekly-rank", http.MethodGet, h.GetCPWeeklyRankStatus) r.profile("/activities/agency-opening-event", http.MethodGet, h.GetAgencyOpeningStatus) r.profile("/activities/agency-opening-event/apply", http.MethodPost, h.ApplyAgencyOpening) r.profile("/activities/agency-opening-event/leaderboard", http.MethodGet, h.ListAgencyOpeningLeaderboard) r.public("/activity/wheel/{wheel_id}/config", http.MethodGet, h.GetWheelConfig) r.profile("/activity/wheel/{wheel_id}/draw", http.MethodPost, h.DrawWheel) r.profile("/activity/wheel/{wheel_id}/history", http.MethodPost, h.ListWheelHistory) r.profile("/activity/wheel/{wheel_id}/hints", http.MethodPost, h.ListWheelHints) // App 侧接口保持稳定;内部仍按 pool_id 走当前 v2 规则、抽奖和返奖实现。 r.profile("/activities/lucky-gifts/check", http.MethodPost, h.CheckLuckyGift) r.profile("/tasks/tabs", http.MethodGet, h.ListTaskTabs) r.profile("/tasks/claim", http.MethodPost, h.ClaimTaskReward) } func (r routes) registerLevelRoutes() { h := r.config.Level r.profile("/levels/me/overview", http.MethodGet, h.GetMyLevelOverview) r.profile("/levels/tracks/{track}", http.MethodGet, h.GetLevelTrack) r.profile("/levels/rewards", http.MethodGet, h.ListLevelRewards) } func (r routes) registerAchievementRoutes() { h := r.config.Achievement r.public("/achievements", http.MethodGet, h.ListAchievements) r.profile("/badges/me", http.MethodGet, h.ListMyBadges) r.profile("/badges/display", http.MethodPost, h.SetBadgeDisplay) } func (r routes) registerWalletRoutes() { h := r.config.Wallet r.profile("/wallet/me/overview", http.MethodGet, h.GetWalletOverview) r.profile("/wallet/me/balances", "", h.GetMyBalances) r.profile("/wallet/recharge/products", http.MethodGet, h.ListRechargeProducts) r.public("/recharge/h5/context", http.MethodGet, h.GetH5RechargeContext) r.public("/recharge/h5/options", http.MethodGet, h.ListH5RechargeOptions) r.public("/recharge/h5/orders", http.MethodPost, h.CreateH5RechargeOrder) r.public("/recharge/h5/temporary/methods", http.MethodGet, h.ListTemporaryPayMethods) r.public("/recharge/h5/temporary/orders", http.MethodPost, h.CreateTemporaryPayLink) r.public("/recharge/h5/temporary/order-list", http.MethodGet, h.ListTemporaryPayLinks) r.public("/recharge/h5/temporary/orders/{order_id}", http.MethodGet, h.GetTemporaryPayLink) r.public("/recharge/h5/orders/{order_id}/tx", http.MethodPost, h.SubmitH5RechargeTx) r.public("/recharge/h5/orders/{order_id}", http.MethodGet, h.GetH5RechargeOrder) r.public("/payment/mifapay/notify", http.MethodPost, h.HandleMifapayNotify) r.public("/payment/v5pay/notify", http.MethodPost, h.HandleV5PayNotify) r.profile("/wallet/payments/google/confirm", http.MethodPost, h.ConfirmGooglePayment) r.profile("/wallet/diamond-exchange/config", http.MethodGet, h.GetDiamondExchangeConfig) r.profile("/wallet/coin-transactions", http.MethodGet, h.ListCoinTransactions) r.profile("/wallet/transactions", http.MethodGet, h.ListWalletTransactions) r.profile("/wallet/coin-sellers", http.MethodGet, h.ListCoinSellers) r.profile("/wallet/coin-seller/transfer", "", h.TransferCoinFromSeller) r.profile("/messages/direct-gifts/send", http.MethodPost, h.SendDirectGift) r.profile("/salary-wallet/overview", http.MethodGet, h.GetSalaryWalletOverview) r.profile("/salary-wallet/history", http.MethodGet, h.GetSalaryWalletHistory) r.profile("/salary-wallet/coin-sellers/search", http.MethodGet, h.SearchSalaryWalletSeller) r.profile("/salary-wallet/exchange", http.MethodPost, h.ExchangeSalaryToCoin) r.profile("/salary-wallet/transfer-to-coin-seller", http.MethodPost, h.TransferSalaryToSeller) r.profile("/salary-wallet/withdraw-address", "", h.HandleSalaryWalletWithdrawAddress) r.profile("/salary-wallet/withdraw", http.MethodPost, h.WithdrawSalaryWallet) r.profile("/red-packets/config", http.MethodGet, h.GetRedPacketConfig) r.profile("/rooms/{room_id}/red-packets", http.MethodGet, h.ListRoomRedPackets) r.profile("/rooms/{room_id}/red-packets/create", http.MethodPost, h.CreateRoomRedPacket) r.profile("/red-packets/{packet_id}", http.MethodGet, h.GetRedPacket) r.profile("/red-packets/{packet_id}/claim", http.MethodPost, h.ClaimRedPacket) r.profile("/app/region-im-group/current", http.MethodGet, h.GetCurrentRegionIMGroup) r.profile("/app/voice-room/red-packet/im-group", http.MethodGet, h.GetRedPacketIMGroup) r.profile("/app/voice-room/red-packet/config", http.MethodGet, h.GetRedPacketConfig) r.profile("/app/voice-room/red-packet/send", http.MethodPost, h.SendVoiceRoomRedPacket) r.profile("/app/voice-room/red-packet/active", http.MethodGet, h.ListActiveRedPackets) r.profile("/app/voice-room/red-packet/claim", http.MethodPost, h.ClaimVoiceRoomRedPacket) r.profile("/app/voice-room/red-packet/detail", http.MethodGet, h.GetVoiceRoomRedPacket) r.profile("/app/voice-room/red-packet/claim-records", http.MethodGet, h.ListRedPacketClaims) r.profile("/app/voice-room/red-packet/sent-records", http.MethodGet, h.ListSentRedPackets) } func (r routes) registerVIPRoutes() { h := r.config.VIP r.profile("/vip/me", http.MethodGet, h.GetMyVIP) r.profile("/vip/packages", http.MethodGet, h.ListVIPPackages) r.profile("/vip/purchase", http.MethodPost, h.PurchaseVIP) } func (r routes) registerGameRoutes() { h := r.config.Game r.profile("/games", http.MethodGet, h.ListGames) r.profile("/games/recent", http.MethodGet, h.ListRecentGames) r.profile("/games/explore-winners", http.MethodGet, h.ListExploreWinners) r.profile("/games/bridge-script", http.MethodGet, h.GetBridgeScript) r.profile("/games/{game_id}/launch", http.MethodPost, h.LaunchGame) r.profile("/games/dice/config", http.MethodGet, h.GetDiceConfig) r.profile("/games/dice/match", http.MethodPost, h.MatchDice) r.profile("/games/dice/matches", http.MethodPost, h.CreateDiceMatch) r.profile("/games/dice/matches/{match_id}/join", http.MethodPost, h.JoinDiceMatch) r.profile("/games/dice/matches/{match_id}", http.MethodGet, h.GetDiceMatch) r.profile("/games/dice/matches/{match_id}/roll", http.MethodPost, h.RollDiceMatch) r.profile("/games/dice/matches/{match_id}/cancel", http.MethodPost, h.CancelDiceMatch) r.profile("/games/rps/config", http.MethodGet, h.GetRPSConfig) r.profile("/games/rps/match", http.MethodPost, h.MatchRPS) r.profile("/games/rps/matches", http.MethodPost, h.CreateRPSMatch) r.profile("/games/rps/matches/{match_id}/join", http.MethodPost, h.JoinRPSMatch) r.profile("/games/rps/matches/{match_id}", http.MethodGet, h.GetRPSMatch) r.profile("/games/rps/matches/{match_id}/roll", http.MethodPost, h.RollRPSMatch) r.profile("/games/rps/matches/{match_id}/cancel", http.MethodPost, h.CancelRPSMatch) r.profile("/games/self/report-events", http.MethodPost, h.ReportSelfGameH5Event) r.profile("/games/room-rps/config", http.MethodGet, h.GetRoomRPSConfig) r.profile("/games/room-rps/challenges", http.MethodGet, h.ListRoomRPSChallenges) // 当前 ServeMux 包装按 path 注册,不能把 GET 列表和 POST 创建同时挂在 /challenges;创建动作单独放 /create,避免路由覆盖。 r.profile("/games/room-rps/challenges/create", http.MethodPost, h.CreateRoomRPSChallenge) r.profile("/games/room-rps/challenges/{challenge_id}", http.MethodGet, h.GetRoomRPSChallenge) // 应战只挂在具体 challenge 下,保证客户端必须拿到服务端生成的挑战单 ID 才能进入锁单流程。 r.profile("/games/room-rps/challenges/{challenge_id}/accept", http.MethodPost, h.AcceptRoomRPSChallenge) // 热游后台只能配置根路径回调;这里仍复用 public wrapper,让请求日志、request_id 和 app_code 解析保持一致。 r.rootPublic("/getUserInfo", http.MethodPost, h.HandleHotgameGetUserInfo) r.rootPublic("/updateBalance", http.MethodPost, h.HandleHotgameUpdateBalance) r.public("/zgame/callback/{operation...}", http.MethodPost, h.HandleZGameCallback) r.public("/game-callbacks/{platform_code}/{operation}", http.MethodPost, h.HandleCallback) }