package walletapi import ( "context" "io" "net/http" "hyapp/pkg/tencentim" "hyapp/services/gateway-service/internal/client" "hyapp/services/gateway-service/internal/transport/http/httproutes" ) // Handler owns wallet-facing HTTP endpoints. // It keeps wallet semantics behind wallet-service and only handles HTTP protocol conversion. type Handler struct { walletClient client.WalletClient roomGuardClient client.RoomGuardClient roomQueryClient client.RoomQueryClient userIdentityClient client.UserIdentityClient userProfileClient client.UserProfileClient userHostClient client.UserHostClient imAccountImporter TencentIMAccountImporter imPublisher TencentIMUserMessagePublisher imGroupIDPrefix string objectUploader ObjectUploader } // TencentIMAccountImporter 只负责把 app 内部 user_id 补偿导入腾讯 IM 账号体系。 type TencentIMAccountImporter interface { ImportAccount(ctx context.Context, userID int64, nickname string, faceURL string) error } // TencentIMUserMessagePublisher 只暴露服务端 C2C custom message 投递能力。 type TencentIMUserMessagePublisher interface { PublishUserCustomMessage(ctx context.Context, message tencentim.CustomUserMessage) error } // ObjectUploader 是临时支付链接包装 app scheme 时依赖的对象存储能力。 type ObjectUploader interface { PutObject(ctx context.Context, key string, reader io.Reader, sizeBytes int64, contentType string) (string, error) } type Config struct { WalletClient client.WalletClient RoomGuardClient client.RoomGuardClient RoomQueryClient client.RoomQueryClient UserIdentityClient client.UserIdentityClient UserProfileClient client.UserProfileClient UserHostClient client.UserHostClient IMAccountImporter TencentIMAccountImporter IMPublisher TencentIMUserMessagePublisher IMGroupIDPrefix string ObjectUploader ObjectUploader } func New(config Config) *Handler { return &Handler{ walletClient: config.WalletClient, roomGuardClient: config.RoomGuardClient, roomQueryClient: config.RoomQueryClient, userIdentityClient: config.UserIdentityClient, userProfileClient: config.UserProfileClient, userHostClient: config.UserHostClient, imAccountImporter: config.IMAccountImporter, imPublisher: config.IMPublisher, imGroupIDPrefix: config.IMGroupIDPrefix, objectUploader: config.ObjectUploader, } } func (h *Handler) WalletHandlers() httproutes.WalletHandlers { return httproutes.WalletHandlers{ GetWalletOverview: h.getWalletOverview, GetMyBalances: h.getMyBalances, ListRechargeProducts: h.listRechargeProducts, GetH5RechargeContext: h.getH5RechargeContext, ListH5RechargeOptions: h.listH5RechargeOptions, CreateH5RechargeOrder: h.createH5RechargeOrder, ListTemporaryPayMethods: h.listTemporaryPayMethods, CreateTemporaryPayLink: h.createTemporaryPayLink, GetTemporaryPayLink: h.getTemporaryPayLink, ListTemporaryPayLinks: h.listTemporaryPayLinks, SubmitH5RechargeTx: h.submitH5RechargeTx, GetH5RechargeOrder: h.getH5RechargeOrder, HandleMifapayNotify: h.handleMifapayNotify, HandleV5PayNotify: h.handleV5PayNotify, ConfirmGooglePayment: h.confirmGooglePayment, GetDiamondExchangeConfig: h.getDiamondExchangeConfig, ListCoinTransactions: h.listCoinTransactions, ListWalletTransactions: h.listWalletTransactions, ListCoinSellers: h.listCoinSellers, TransferCoinFromSeller: h.transferCoinFromSeller, SendDirectGift: h.sendDirectGift, GetSalaryWalletOverview: h.getSalaryWalletOverview, GetSalaryWalletHistory: h.getSalaryWalletHistory, SearchSalaryWalletSeller: h.searchSalaryWalletSeller, ExchangeSalaryToCoin: h.exchangeSalaryToCoin, TransferSalaryToSeller: h.transferSalaryToCoinSeller, GetRedPacketConfig: h.getRedPacketConfig, ListRoomRedPackets: h.listRoomRedPackets, CreateRoomRedPacket: h.createRoomRedPacket, GetRedPacket: h.getRedPacket, ClaimRedPacket: h.claimRedPacket, GetCurrentRegionIMGroup: h.getCurrentRegionIMGroup, GetRedPacketIMGroup: h.getCurrentRegionIMGroup, SendVoiceRoomRedPacket: h.sendVoiceRoomRedPacket, ListActiveRedPackets: h.listActiveRedPackets, ClaimVoiceRoomRedPacket: h.claimVoiceRoomRedPacket, GetVoiceRoomRedPacket: h.getVoiceRoomRedPacket, ListRedPacketClaims: h.listRedPacketClaims, ListSentRedPackets: h.listSentRedPackets, } } func (h *Handler) VIPHandlers() httproutes.VIPHandlers { return httproutes.VIPHandlers{ GetMyVIP: h.getMyVIP, ListVIPPackages: h.listVIPPackages, PurchaseVIP: h.purchaseVIP, } } func (h *Handler) GetMyGiftWall(writer http.ResponseWriter, request *http.Request) { h.getMyGiftWall(writer, request) } func (h *Handler) GetUserGiftWall(writer http.ResponseWriter, request *http.Request) { h.getUserGiftWall(writer, request) }