diff --git a/api/proto/wallet/v1/wallet.pb.go b/api/proto/wallet/v1/wallet.pb.go index b2821fcc..6f88b228 100644 --- a/api/proto/wallet/v1/wallet.pb.go +++ b/api/proto/wallet/v1/wallet.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 -// protoc v5.29.2 +// protoc-gen-go v1.36.11 +// protoc v7.34.1 // source: proto/wallet/v1/wallet.proto package walletv1 @@ -11,6 +11,7 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -22,30 +23,27 @@ const ( // DebitGiftRequest 是 room-service 送礼同步扣费的最小账务输入。 type DebitGiftRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` - RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` - SenderUserId int64 `protobuf:"varint,3,opt,name=sender_user_id,json=senderUserId,proto3" json:"sender_user_id,omitempty"` - TargetUserId int64 `protobuf:"varint,4,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` - GiftId string `protobuf:"bytes,5,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` - GiftCount int32 `protobuf:"varint,6,opt,name=gift_count,json=giftCount,proto3" json:"gift_count,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` + SenderUserId int64 `protobuf:"varint,3,opt,name=sender_user_id,json=senderUserId,proto3" json:"sender_user_id,omitempty"` + TargetUserId int64 `protobuf:"varint,4,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` + GiftId string `protobuf:"bytes,5,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` + GiftCount int32 `protobuf:"varint,6,opt,name=gift_count,json=giftCount,proto3" json:"gift_count,omitempty"` // price_version 为空时使用当前生效价格;非空时必须命中 active 价格版本。 PriceVersion string `protobuf:"bytes,7,opt,name=price_version,json=priceVersion,proto3" json:"price_version,omitempty"` AppCode string `protobuf:"bytes,8,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` // region_id 来自 room-service 房间 visible_region_id,用于校验礼物区域可用性。 - RegionId int64 `protobuf:"varint,9,opt,name=region_id,json=regionId,proto3" json:"region_id,omitempty"` + RegionId int64 `protobuf:"varint,9,opt,name=region_id,json=regionId,proto3" json:"region_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DebitGiftRequest) Reset() { *x = DebitGiftRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DebitGiftRequest) String() string { @@ -56,7 +54,7 @@ func (*DebitGiftRequest) ProtoMessage() {} func (x *DebitGiftRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -136,27 +134,26 @@ func (x *DebitGiftRequest) GetRegionId() int64 { // DebitGiftResponse 返回扣费流水、服务端结算值和 sender COIN 账后余额。 type DebitGiftResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - BillingReceiptId string `protobuf:"bytes,1,opt,name=billing_receipt_id,json=billingReceiptId,proto3" json:"billing_receipt_id,omitempty"` - TransactionId string `protobuf:"bytes,2,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` - CoinSpent int64 `protobuf:"varint,3,opt,name=coin_spent,json=coinSpent,proto3" json:"coin_spent,omitempty"` - GiftPointAdded int64 `protobuf:"varint,4,opt,name=gift_point_added,json=giftPointAdded,proto3" json:"gift_point_added,omitempty"` - HeatValue int64 `protobuf:"varint,5,opt,name=heat_value,json=heatValue,proto3" json:"heat_value,omitempty"` - PriceVersion string `protobuf:"bytes,6,opt,name=price_version,json=priceVersion,proto3" json:"price_version,omitempty"` - // balance_after 是 sender COIN available_amount 账后余额。 - BalanceAfter int64 `protobuf:"varint,7,opt,name=balance_after,json=balanceAfter,proto3" json:"balance_after,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + BillingReceiptId string `protobuf:"bytes,1,opt,name=billing_receipt_id,json=billingReceiptId,proto3" json:"billing_receipt_id,omitempty"` + TransactionId string `protobuf:"bytes,2,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` + CoinSpent int64 `protobuf:"varint,3,opt,name=coin_spent,json=coinSpent,proto3" json:"coin_spent,omitempty"` + GiftPointAdded int64 `protobuf:"varint,4,opt,name=gift_point_added,json=giftPointAdded,proto3" json:"gift_point_added,omitempty"` + HeatValue int64 `protobuf:"varint,5,opt,name=heat_value,json=heatValue,proto3" json:"heat_value,omitempty"` + PriceVersion string `protobuf:"bytes,6,opt,name=price_version,json=priceVersion,proto3" json:"price_version,omitempty"` + // balance_after 是 sender 被扣费资产 available_amount 账后余额。 + BalanceAfter int64 `protobuf:"varint,7,opt,name=balance_after,json=balanceAfter,proto3" json:"balance_after,omitempty"` + ChargeAssetType string `protobuf:"bytes,8,opt,name=charge_asset_type,json=chargeAssetType,proto3" json:"charge_asset_type,omitempty"` + ChargeAmount int64 `protobuf:"varint,9,opt,name=charge_amount,json=chargeAmount,proto3" json:"charge_amount,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DebitGiftResponse) Reset() { *x = DebitGiftResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DebitGiftResponse) String() string { @@ -167,7 +164,7 @@ func (*DebitGiftResponse) ProtoMessage() {} func (x *DebitGiftResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -231,26 +228,37 @@ func (x *DebitGiftResponse) GetBalanceAfter() int64 { return 0 } +func (x *DebitGiftResponse) GetChargeAssetType() string { + if x != nil { + return x.ChargeAssetType + } + return "" +} + +func (x *DebitGiftResponse) GetChargeAmount() int64 { + if x != nil { + return x.ChargeAmount + } + return 0 +} + // AssetBalance 是用户某类资产的余额投影。 type AssetBalance struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AssetType string `protobuf:"bytes,1,opt,name=asset_type,json=assetType,proto3" json:"asset_type,omitempty"` - AvailableAmount int64 `protobuf:"varint,2,opt,name=available_amount,json=availableAmount,proto3" json:"available_amount,omitempty"` - FrozenAmount int64 `protobuf:"varint,3,opt,name=frozen_amount,json=frozenAmount,proto3" json:"frozen_amount,omitempty"` - Version int64 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` - AppCode string `protobuf:"bytes,5,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + AssetType string `protobuf:"bytes,1,opt,name=asset_type,json=assetType,proto3" json:"asset_type,omitempty"` + AvailableAmount int64 `protobuf:"varint,2,opt,name=available_amount,json=availableAmount,proto3" json:"available_amount,omitempty"` + FrozenAmount int64 `protobuf:"varint,3,opt,name=frozen_amount,json=frozenAmount,proto3" json:"frozen_amount,omitempty"` + Version int64 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` + AppCode string `protobuf:"bytes,5,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AssetBalance) Reset() { *x = AssetBalance{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AssetBalance) String() string { @@ -261,7 +269,7 @@ func (*AssetBalance) ProtoMessage() {} func (x *AssetBalance) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -313,23 +321,20 @@ func (x *AssetBalance) GetAppCode() string { // GetBalancesRequest 查询用户多资产余额;内部调用方负责鉴权和用户范围控制。 type GetBalancesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + AssetTypes []string `protobuf:"bytes,3,rep,name=asset_types,json=assetTypes,proto3" json:"asset_types,omitempty"` + AppCode string `protobuf:"bytes,4,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - AssetTypes []string `protobuf:"bytes,3,rep,name=asset_types,json=assetTypes,proto3" json:"asset_types,omitempty"` - AppCode string `protobuf:"bytes,4,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetBalancesRequest) Reset() { *x = GetBalancesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetBalancesRequest) String() string { @@ -340,7 +345,7 @@ func (*GetBalancesRequest) ProtoMessage() {} func (x *GetBalancesRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -384,20 +389,17 @@ func (x *GetBalancesRequest) GetAppCode() string { } type GetBalancesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Balances []*AssetBalance `protobuf:"bytes,1,rep,name=balances,proto3" json:"balances,omitempty"` unknownFields protoimpl.UnknownFields - - Balances []*AssetBalance `protobuf:"bytes,1,rep,name=balances,proto3" json:"balances,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetBalancesResponse) Reset() { *x = GetBalancesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetBalancesResponse) String() string { @@ -408,7 +410,7 @@ func (*GetBalancesResponse) ProtoMessage() {} func (x *GetBalancesResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -432,27 +434,24 @@ func (x *GetBalancesResponse) GetBalances() []*AssetBalance { // AdminCreditAssetRequest 是后台手动入账/调账的最小审计命令。 type AdminCreditAssetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` - TargetUserId int64 `protobuf:"varint,2,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` - AssetType string `protobuf:"bytes,3,opt,name=asset_type,json=assetType,proto3" json:"asset_type,omitempty"` - Amount int64 `protobuf:"varint,4,opt,name=amount,proto3" json:"amount,omitempty"` - OperatorUserId int64 `protobuf:"varint,5,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` - Reason string `protobuf:"bytes,6,opt,name=reason,proto3" json:"reason,omitempty"` - EvidenceRef string `protobuf:"bytes,7,opt,name=evidence_ref,json=evidenceRef,proto3" json:"evidence_ref,omitempty"` - AppCode string `protobuf:"bytes,8,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + TargetUserId int64 `protobuf:"varint,2,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` + AssetType string `protobuf:"bytes,3,opt,name=asset_type,json=assetType,proto3" json:"asset_type,omitempty"` + Amount int64 `protobuf:"varint,4,opt,name=amount,proto3" json:"amount,omitempty"` + OperatorUserId int64 `protobuf:"varint,5,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + Reason string `protobuf:"bytes,6,opt,name=reason,proto3" json:"reason,omitempty"` + EvidenceRef string `protobuf:"bytes,7,opt,name=evidence_ref,json=evidenceRef,proto3" json:"evidence_ref,omitempty"` + AppCode string `protobuf:"bytes,8,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AdminCreditAssetRequest) Reset() { *x = AdminCreditAssetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AdminCreditAssetRequest) String() string { @@ -463,7 +462,7 @@ func (*AdminCreditAssetRequest) ProtoMessage() {} func (x *AdminCreditAssetRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -535,21 +534,18 @@ func (x *AdminCreditAssetRequest) GetAppCode() string { } type AdminCreditAssetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + TransactionId string `protobuf:"bytes,1,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` + Balance *AssetBalance `protobuf:"bytes,2,opt,name=balance,proto3" json:"balance,omitempty"` unknownFields protoimpl.UnknownFields - - TransactionId string `protobuf:"bytes,1,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` - Balance *AssetBalance `protobuf:"bytes,2,opt,name=balance,proto3" json:"balance,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AdminCreditAssetResponse) Reset() { *x = AdminCreditAssetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AdminCreditAssetResponse) String() string { @@ -560,7 +556,7 @@ func (*AdminCreditAssetResponse) ProtoMessage() {} func (x *AdminCreditAssetResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -591,28 +587,25 @@ func (x *AdminCreditAssetResponse) GetBalance() *AssetBalance { // TransferCoinFromSellerRequest 是币商给玩家转普通金币的内部账务命令。 type TransferCoinFromSellerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` - SellerUserId int64 `protobuf:"varint,2,opt,name=seller_user_id,json=sellerUserId,proto3" json:"seller_user_id,omitempty"` - TargetUserId int64 `protobuf:"varint,3,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` - Amount int64 `protobuf:"varint,4,opt,name=amount,proto3" json:"amount,omitempty"` - Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` - AppCode string `protobuf:"bytes,6,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + SellerUserId int64 `protobuf:"varint,2,opt,name=seller_user_id,json=sellerUserId,proto3" json:"seller_user_id,omitempty"` + TargetUserId int64 `protobuf:"varint,3,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` + Amount int64 `protobuf:"varint,4,opt,name=amount,proto3" json:"amount,omitempty"` + Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` + AppCode string `protobuf:"bytes,6,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` // seller_region_id 和 target_region_id 由 gateway 从 user-service 查询,不接受客户端提交。 SellerRegionId int64 `protobuf:"varint,7,opt,name=seller_region_id,json=sellerRegionId,proto3" json:"seller_region_id,omitempty"` TargetRegionId int64 `protobuf:"varint,8,opt,name=target_region_id,json=targetRegionId,proto3" json:"target_region_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TransferCoinFromSellerRequest) Reset() { *x = TransferCoinFromSellerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TransferCoinFromSellerRequest) String() string { @@ -623,7 +616,7 @@ func (*TransferCoinFromSellerRequest) ProtoMessage() {} func (x *TransferCoinFromSellerRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -696,29 +689,26 @@ func (x *TransferCoinFromSellerRequest) GetTargetRegionId() int64 { // TransferCoinFromSellerResponse 同时返回金币到账结果和本次转账对应的充值金额口径。 type TransferCoinFromSellerResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TransactionId string `protobuf:"bytes,1,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` - SellerBalanceAfter int64 `protobuf:"varint,2,opt,name=seller_balance_after,json=sellerBalanceAfter,proto3" json:"seller_balance_after,omitempty"` - TargetBalanceAfter int64 `protobuf:"varint,3,opt,name=target_balance_after,json=targetBalanceAfter,proto3" json:"target_balance_after,omitempty"` - Amount int64 `protobuf:"varint,4,opt,name=amount,proto3" json:"amount,omitempty"` - RechargeUsdMinor int64 `protobuf:"varint,5,opt,name=recharge_usd_minor,json=rechargeUsdMinor,proto3" json:"recharge_usd_minor,omitempty"` - RechargeCurrencyCode string `protobuf:"bytes,6,opt,name=recharge_currency_code,json=rechargeCurrencyCode,proto3" json:"recharge_currency_code,omitempty"` - RechargePolicyId int64 `protobuf:"varint,7,opt,name=recharge_policy_id,json=rechargePolicyId,proto3" json:"recharge_policy_id,omitempty"` - RechargePolicyVersion string `protobuf:"bytes,8,opt,name=recharge_policy_version,json=rechargePolicyVersion,proto3" json:"recharge_policy_version,omitempty"` - RechargePolicyCoinAmount int64 `protobuf:"varint,9,opt,name=recharge_policy_coin_amount,json=rechargePolicyCoinAmount,proto3" json:"recharge_policy_coin_amount,omitempty"` - RechargePolicyUsdMinorAmount int64 `protobuf:"varint,10,opt,name=recharge_policy_usd_minor_amount,json=rechargePolicyUsdMinorAmount,proto3" json:"recharge_policy_usd_minor_amount,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + TransactionId string `protobuf:"bytes,1,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` + SellerBalanceAfter int64 `protobuf:"varint,2,opt,name=seller_balance_after,json=sellerBalanceAfter,proto3" json:"seller_balance_after,omitempty"` + TargetBalanceAfter int64 `protobuf:"varint,3,opt,name=target_balance_after,json=targetBalanceAfter,proto3" json:"target_balance_after,omitempty"` + Amount int64 `protobuf:"varint,4,opt,name=amount,proto3" json:"amount,omitempty"` + RechargeUsdMinor int64 `protobuf:"varint,5,opt,name=recharge_usd_minor,json=rechargeUsdMinor,proto3" json:"recharge_usd_minor,omitempty"` + RechargeCurrencyCode string `protobuf:"bytes,6,opt,name=recharge_currency_code,json=rechargeCurrencyCode,proto3" json:"recharge_currency_code,omitempty"` + RechargePolicyId int64 `protobuf:"varint,7,opt,name=recharge_policy_id,json=rechargePolicyId,proto3" json:"recharge_policy_id,omitempty"` + RechargePolicyVersion string `protobuf:"bytes,8,opt,name=recharge_policy_version,json=rechargePolicyVersion,proto3" json:"recharge_policy_version,omitempty"` + RechargePolicyCoinAmount int64 `protobuf:"varint,9,opt,name=recharge_policy_coin_amount,json=rechargePolicyCoinAmount,proto3" json:"recharge_policy_coin_amount,omitempty"` + RechargePolicyUsdMinorAmount int64 `protobuf:"varint,10,opt,name=recharge_policy_usd_minor_amount,json=rechargePolicyUsdMinorAmount,proto3" json:"recharge_policy_usd_minor_amount,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TransferCoinFromSellerResponse) Reset() { *x = TransferCoinFromSellerResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TransferCoinFromSellerResponse) String() string { @@ -729,7 +719,7 @@ func (*TransferCoinFromSellerResponse) ProtoMessage() {} func (x *TransferCoinFromSellerResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -816,39 +806,36 @@ func (x *TransferCoinFromSellerResponse) GetRechargePolicyUsdMinorAmount() int64 // Resource 是资源库里可配置、可赠送、可被礼物引用的最小资源。 type Resource struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - ResourceId int64 `protobuf:"varint,2,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - ResourceCode string `protobuf:"bytes,3,opt,name=resource_code,json=resourceCode,proto3" json:"resource_code,omitempty"` - ResourceType string `protobuf:"bytes,4,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` - Grantable bool `protobuf:"varint,7,opt,name=grantable,proto3" json:"grantable,omitempty"` - GrantStrategy string `protobuf:"bytes,8,opt,name=grant_strategy,json=grantStrategy,proto3" json:"grant_strategy,omitempty"` - WalletAssetType string `protobuf:"bytes,9,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` - WalletAssetAmount int64 `protobuf:"varint,10,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` - UsageScopes []string `protobuf:"bytes,11,rep,name=usage_scopes,json=usageScopes,proto3" json:"usage_scopes,omitempty"` - AssetUrl string `protobuf:"bytes,12,opt,name=asset_url,json=assetUrl,proto3" json:"asset_url,omitempty"` - PreviewUrl string `protobuf:"bytes,13,opt,name=preview_url,json=previewUrl,proto3" json:"preview_url,omitempty"` - AnimationUrl string `protobuf:"bytes,14,opt,name=animation_url,json=animationUrl,proto3" json:"animation_url,omitempty"` - MetadataJson string `protobuf:"bytes,15,opt,name=metadata_json,json=metadataJson,proto3" json:"metadata_json,omitempty"` - SortOrder int32 `protobuf:"varint,16,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` - CreatedByUserId int64 `protobuf:"varint,17,opt,name=created_by_user_id,json=createdByUserId,proto3" json:"created_by_user_id,omitempty"` - UpdatedByUserId int64 `protobuf:"varint,18,opt,name=updated_by_user_id,json=updatedByUserId,proto3" json:"updated_by_user_id,omitempty"` - CreatedAtMs int64 `protobuf:"varint,19,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` - UpdatedAtMs int64 `protobuf:"varint,20,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + ResourceId int64 `protobuf:"varint,2,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + ResourceCode string `protobuf:"bytes,3,opt,name=resource_code,json=resourceCode,proto3" json:"resource_code,omitempty"` + ResourceType string `protobuf:"bytes,4,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` + Grantable bool `protobuf:"varint,7,opt,name=grantable,proto3" json:"grantable,omitempty"` + GrantStrategy string `protobuf:"bytes,8,opt,name=grant_strategy,json=grantStrategy,proto3" json:"grant_strategy,omitempty"` + WalletAssetType string `protobuf:"bytes,9,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` + WalletAssetAmount int64 `protobuf:"varint,10,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` + UsageScopes []string `protobuf:"bytes,11,rep,name=usage_scopes,json=usageScopes,proto3" json:"usage_scopes,omitempty"` + AssetUrl string `protobuf:"bytes,12,opt,name=asset_url,json=assetUrl,proto3" json:"asset_url,omitempty"` + PreviewUrl string `protobuf:"bytes,13,opt,name=preview_url,json=previewUrl,proto3" json:"preview_url,omitempty"` + AnimationUrl string `protobuf:"bytes,14,opt,name=animation_url,json=animationUrl,proto3" json:"animation_url,omitempty"` + MetadataJson string `protobuf:"bytes,15,opt,name=metadata_json,json=metadataJson,proto3" json:"metadata_json,omitempty"` + SortOrder int32 `protobuf:"varint,16,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` + CreatedByUserId int64 `protobuf:"varint,17,opt,name=created_by_user_id,json=createdByUserId,proto3" json:"created_by_user_id,omitempty"` + UpdatedByUserId int64 `protobuf:"varint,18,opt,name=updated_by_user_id,json=updatedByUserId,proto3" json:"updated_by_user_id,omitempty"` + CreatedAtMs int64 `protobuf:"varint,19,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + UpdatedAtMs int64 `protobuf:"varint,20,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Resource) Reset() { *x = Resource{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Resource) String() string { @@ -859,7 +846,7 @@ func (*Resource) ProtoMessage() {} func (x *Resource) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1015,31 +1002,28 @@ func (x *Resource) GetUpdatedAtMs() int64 { } type ResourceGroupItem struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - GroupItemId int64 `protobuf:"varint,1,opt,name=group_item_id,json=groupItemId,proto3" json:"group_item_id,omitempty"` - GroupId int64 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - Resource *Resource `protobuf:"bytes,4,opt,name=resource,proto3" json:"resource,omitempty"` - Quantity int64 `protobuf:"varint,5,opt,name=quantity,proto3" json:"quantity,omitempty"` - DurationMs int64 `protobuf:"varint,6,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"` - SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` - CreatedAtMs int64 `protobuf:"varint,8,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` - UpdatedAtMs int64 `protobuf:"varint,9,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` - ItemType string `protobuf:"bytes,10,opt,name=item_type,json=itemType,proto3" json:"item_type,omitempty"` - WalletAssetType string `protobuf:"bytes,11,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` - WalletAssetAmount int64 `protobuf:"varint,12,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + GroupItemId int64 `protobuf:"varint,1,opt,name=group_item_id,json=groupItemId,proto3" json:"group_item_id,omitempty"` + GroupId int64 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + Resource *Resource `protobuf:"bytes,4,opt,name=resource,proto3" json:"resource,omitempty"` + Quantity int64 `protobuf:"varint,5,opt,name=quantity,proto3" json:"quantity,omitempty"` + DurationMs int64 `protobuf:"varint,6,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"` + SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` + CreatedAtMs int64 `protobuf:"varint,8,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + UpdatedAtMs int64 `protobuf:"varint,9,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + ItemType string `protobuf:"bytes,10,opt,name=item_type,json=itemType,proto3" json:"item_type,omitempty"` + WalletAssetType string `protobuf:"bytes,11,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` + WalletAssetAmount int64 `protobuf:"varint,12,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ResourceGroupItem) Reset() { *x = ResourceGroupItem{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResourceGroupItem) String() string { @@ -1050,7 +1034,7 @@ func (*ResourceGroupItem) ProtoMessage() {} func (x *ResourceGroupItem) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1150,31 +1134,28 @@ func (x *ResourceGroupItem) GetWalletAssetAmount() int64 { } type ResourceGroup struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - GroupId int64 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - GroupCode string `protobuf:"bytes,3,opt,name=group_code,json=groupCode,proto3" json:"group_code,omitempty"` - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` - Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` - SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` - Items []*ResourceGroupItem `protobuf:"bytes,8,rep,name=items,proto3" json:"items,omitempty"` - CreatedByUserId int64 `protobuf:"varint,9,opt,name=created_by_user_id,json=createdByUserId,proto3" json:"created_by_user_id,omitempty"` - UpdatedByUserId int64 `protobuf:"varint,10,opt,name=updated_by_user_id,json=updatedByUserId,proto3" json:"updated_by_user_id,omitempty"` - CreatedAtMs int64 `protobuf:"varint,11,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` - UpdatedAtMs int64 `protobuf:"varint,12,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + GroupId int64 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + GroupCode string `protobuf:"bytes,3,opt,name=group_code,json=groupCode,proto3" json:"group_code,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` + SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` + Items []*ResourceGroupItem `protobuf:"bytes,8,rep,name=items,proto3" json:"items,omitempty"` + CreatedByUserId int64 `protobuf:"varint,9,opt,name=created_by_user_id,json=createdByUserId,proto3" json:"created_by_user_id,omitempty"` + UpdatedByUserId int64 `protobuf:"varint,10,opt,name=updated_by_user_id,json=updatedByUserId,proto3" json:"updated_by_user_id,omitempty"` + CreatedAtMs int64 `protobuf:"varint,11,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + UpdatedAtMs int64 `protobuf:"varint,12,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ResourceGroup) Reset() { *x = ResourceGroup{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResourceGroup) String() string { @@ -1185,7 +1166,7 @@ func (*ResourceGroup) ProtoMessage() {} func (x *ResourceGroup) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1285,36 +1266,38 @@ func (x *ResourceGroup) GetUpdatedAtMs() int64 { } type GiftConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - GiftId string `protobuf:"bytes,2,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` - ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - Resource *Resource `protobuf:"bytes,4,opt,name=resource,proto3" json:"resource,omitempty"` - Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` - PresentationJson string `protobuf:"bytes,8,opt,name=presentation_json,json=presentationJson,proto3" json:"presentation_json,omitempty"` - PriceVersion string `protobuf:"bytes,9,opt,name=price_version,json=priceVersion,proto3" json:"price_version,omitempty"` - CoinPrice int64 `protobuf:"varint,10,opt,name=coin_price,json=coinPrice,proto3" json:"coin_price,omitempty"` - GiftPointAmount int64 `protobuf:"varint,11,opt,name=gift_point_amount,json=giftPointAmount,proto3" json:"gift_point_amount,omitempty"` - HeatValue int64 `protobuf:"varint,12,opt,name=heat_value,json=heatValue,proto3" json:"heat_value,omitempty"` - CreatedByUserId int64 `protobuf:"varint,13,opt,name=created_by_user_id,json=createdByUserId,proto3" json:"created_by_user_id,omitempty"` - UpdatedByUserId int64 `protobuf:"varint,14,opt,name=updated_by_user_id,json=updatedByUserId,proto3" json:"updated_by_user_id,omitempty"` - CreatedAtMs int64 `protobuf:"varint,15,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` - UpdatedAtMs int64 `protobuf:"varint,16,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` - RegionIds []int64 `protobuf:"varint,17,rep,packed,name=region_ids,json=regionIds,proto3" json:"region_ids,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + GiftId string `protobuf:"bytes,2,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` + ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + Resource *Resource `protobuf:"bytes,4,opt,name=resource,proto3" json:"resource,omitempty"` + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` + SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` + PresentationJson string `protobuf:"bytes,8,opt,name=presentation_json,json=presentationJson,proto3" json:"presentation_json,omitempty"` + PriceVersion string `protobuf:"bytes,9,opt,name=price_version,json=priceVersion,proto3" json:"price_version,omitempty"` + CoinPrice int64 `protobuf:"varint,10,opt,name=coin_price,json=coinPrice,proto3" json:"coin_price,omitempty"` + GiftPointAmount int64 `protobuf:"varint,11,opt,name=gift_point_amount,json=giftPointAmount,proto3" json:"gift_point_amount,omitempty"` + HeatValue int64 `protobuf:"varint,12,opt,name=heat_value,json=heatValue,proto3" json:"heat_value,omitempty"` + CreatedByUserId int64 `protobuf:"varint,13,opt,name=created_by_user_id,json=createdByUserId,proto3" json:"created_by_user_id,omitempty"` + UpdatedByUserId int64 `protobuf:"varint,14,opt,name=updated_by_user_id,json=updatedByUserId,proto3" json:"updated_by_user_id,omitempty"` + CreatedAtMs int64 `protobuf:"varint,15,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + UpdatedAtMs int64 `protobuf:"varint,16,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + RegionIds []int64 `protobuf:"varint,17,rep,packed,name=region_ids,json=regionIds,proto3" json:"region_ids,omitempty"` + GiftTypeCode string `protobuf:"bytes,18,opt,name=gift_type_code,json=giftTypeCode,proto3" json:"gift_type_code,omitempty"` + ChargeAssetType string `protobuf:"bytes,19,opt,name=charge_asset_type,json=chargeAssetType,proto3" json:"charge_asset_type,omitempty"` + EffectiveFromMs int64 `protobuf:"varint,20,opt,name=effective_from_ms,json=effectiveFromMs,proto3" json:"effective_from_ms,omitempty"` + EffectiveToMs int64 `protobuf:"varint,21,opt,name=effective_to_ms,json=effectiveToMs,proto3" json:"effective_to_ms,omitempty"` + EffectTypes []string `protobuf:"bytes,22,rep,name=effect_types,json=effectTypes,proto3" json:"effect_types,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GiftConfig) Reset() { *x = GiftConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GiftConfig) String() string { @@ -1325,7 +1308,7 @@ func (*GiftConfig) ProtoMessage() {} func (x *GiftConfig) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1459,33 +1442,65 @@ func (x *GiftConfig) GetRegionIds() []int64 { return nil } -type UserResourceEntitlement struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *GiftConfig) GetGiftTypeCode() string { + if x != nil { + return x.GiftTypeCode + } + return "" +} - AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - EntitlementId string `protobuf:"bytes,2,opt,name=entitlement_id,json=entitlementId,proto3" json:"entitlement_id,omitempty"` - UserId int64 `protobuf:"varint,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - Resource *Resource `protobuf:"bytes,5,opt,name=resource,proto3" json:"resource,omitempty"` - Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` - Quantity int64 `protobuf:"varint,7,opt,name=quantity,proto3" json:"quantity,omitempty"` - RemainingQuantity int64 `protobuf:"varint,8,opt,name=remaining_quantity,json=remainingQuantity,proto3" json:"remaining_quantity,omitempty"` - EffectiveAtMs int64 `protobuf:"varint,9,opt,name=effective_at_ms,json=effectiveAtMs,proto3" json:"effective_at_ms,omitempty"` - ExpiresAtMs int64 `protobuf:"varint,10,opt,name=expires_at_ms,json=expiresAtMs,proto3" json:"expires_at_ms,omitempty"` - SourceGrantId string `protobuf:"bytes,11,opt,name=source_grant_id,json=sourceGrantId,proto3" json:"source_grant_id,omitempty"` - CreatedAtMs int64 `protobuf:"varint,12,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` - UpdatedAtMs int64 `protobuf:"varint,13,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` +func (x *GiftConfig) GetChargeAssetType() string { + if x != nil { + return x.ChargeAssetType + } + return "" +} + +func (x *GiftConfig) GetEffectiveFromMs() int64 { + if x != nil { + return x.EffectiveFromMs + } + return 0 +} + +func (x *GiftConfig) GetEffectiveToMs() int64 { + if x != nil { + return x.EffectiveToMs + } + return 0 +} + +func (x *GiftConfig) GetEffectTypes() []string { + if x != nil { + return x.EffectTypes + } + return nil +} + +type UserResourceEntitlement struct { + state protoimpl.MessageState `protogen:"open.v1"` + AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + EntitlementId string `protobuf:"bytes,2,opt,name=entitlement_id,json=entitlementId,proto3" json:"entitlement_id,omitempty"` + UserId int64 `protobuf:"varint,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + Resource *Resource `protobuf:"bytes,5,opt,name=resource,proto3" json:"resource,omitempty"` + Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` + Quantity int64 `protobuf:"varint,7,opt,name=quantity,proto3" json:"quantity,omitempty"` + RemainingQuantity int64 `protobuf:"varint,8,opt,name=remaining_quantity,json=remainingQuantity,proto3" json:"remaining_quantity,omitempty"` + EffectiveAtMs int64 `protobuf:"varint,9,opt,name=effective_at_ms,json=effectiveAtMs,proto3" json:"effective_at_ms,omitempty"` + ExpiresAtMs int64 `protobuf:"varint,10,opt,name=expires_at_ms,json=expiresAtMs,proto3" json:"expires_at_ms,omitempty"` + SourceGrantId string `protobuf:"bytes,11,opt,name=source_grant_id,json=sourceGrantId,proto3" json:"source_grant_id,omitempty"` + CreatedAtMs int64 `protobuf:"varint,12,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + UpdatedAtMs int64 `protobuf:"varint,13,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserResourceEntitlement) Reset() { *x = UserResourceEntitlement{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserResourceEntitlement) String() string { @@ -1496,7 +1511,7 @@ func (*UserResourceEntitlement) ProtoMessage() {} func (x *UserResourceEntitlement) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1603,29 +1618,26 @@ func (x *UserResourceEntitlement) GetUpdatedAtMs() int64 { } type ResourceGrantItem struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - GrantItemId int64 `protobuf:"varint,1,opt,name=grant_item_id,json=grantItemId,proto3" json:"grant_item_id,omitempty"` - GrantId string `protobuf:"bytes,2,opt,name=grant_id,json=grantId,proto3" json:"grant_id,omitempty"` - ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - ResourceSnapshotJson string `protobuf:"bytes,4,opt,name=resource_snapshot_json,json=resourceSnapshotJson,proto3" json:"resource_snapshot_json,omitempty"` - Quantity int64 `protobuf:"varint,5,opt,name=quantity,proto3" json:"quantity,omitempty"` - DurationMs int64 `protobuf:"varint,6,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"` - ResultType string `protobuf:"bytes,7,opt,name=result_type,json=resultType,proto3" json:"result_type,omitempty"` - WalletTransactionId string `protobuf:"bytes,8,opt,name=wallet_transaction_id,json=walletTransactionId,proto3" json:"wallet_transaction_id,omitempty"` - EntitlementId string `protobuf:"bytes,9,opt,name=entitlement_id,json=entitlementId,proto3" json:"entitlement_id,omitempty"` - CreatedAtMs int64 `protobuf:"varint,10,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + GrantItemId int64 `protobuf:"varint,1,opt,name=grant_item_id,json=grantItemId,proto3" json:"grant_item_id,omitempty"` + GrantId string `protobuf:"bytes,2,opt,name=grant_id,json=grantId,proto3" json:"grant_id,omitempty"` + ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + ResourceSnapshotJson string `protobuf:"bytes,4,opt,name=resource_snapshot_json,json=resourceSnapshotJson,proto3" json:"resource_snapshot_json,omitempty"` + Quantity int64 `protobuf:"varint,5,opt,name=quantity,proto3" json:"quantity,omitempty"` + DurationMs int64 `protobuf:"varint,6,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"` + ResultType string `protobuf:"bytes,7,opt,name=result_type,json=resultType,proto3" json:"result_type,omitempty"` + WalletTransactionId string `protobuf:"bytes,8,opt,name=wallet_transaction_id,json=walletTransactionId,proto3" json:"wallet_transaction_id,omitempty"` + EntitlementId string `protobuf:"bytes,9,opt,name=entitlement_id,json=entitlementId,proto3" json:"entitlement_id,omitempty"` + CreatedAtMs int64 `protobuf:"varint,10,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ResourceGrantItem) Reset() { *x = ResourceGrantItem{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResourceGrantItem) String() string { @@ -1636,7 +1648,7 @@ func (*ResourceGrantItem) ProtoMessage() {} func (x *ResourceGrantItem) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1722,32 +1734,29 @@ func (x *ResourceGrantItem) GetCreatedAtMs() int64 { } type ResourceGrant struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - GrantId string `protobuf:"bytes,2,opt,name=grant_id,json=grantId,proto3" json:"grant_id,omitempty"` - CommandId string `protobuf:"bytes,3,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` - TargetUserId int64 `protobuf:"varint,4,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` - GrantSource string `protobuf:"bytes,5,opt,name=grant_source,json=grantSource,proto3" json:"grant_source,omitempty"` - GrantSubjectType string `protobuf:"bytes,6,opt,name=grant_subject_type,json=grantSubjectType,proto3" json:"grant_subject_type,omitempty"` - GrantSubjectId string `protobuf:"bytes,7,opt,name=grant_subject_id,json=grantSubjectId,proto3" json:"grant_subject_id,omitempty"` - Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` - Reason string `protobuf:"bytes,9,opt,name=reason,proto3" json:"reason,omitempty"` - OperatorUserId int64 `protobuf:"varint,10,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` - Items []*ResourceGrantItem `protobuf:"bytes,11,rep,name=items,proto3" json:"items,omitempty"` - CreatedAtMs int64 `protobuf:"varint,12,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` - UpdatedAtMs int64 `protobuf:"varint,13,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + GrantId string `protobuf:"bytes,2,opt,name=grant_id,json=grantId,proto3" json:"grant_id,omitempty"` + CommandId string `protobuf:"bytes,3,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + TargetUserId int64 `protobuf:"varint,4,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` + GrantSource string `protobuf:"bytes,5,opt,name=grant_source,json=grantSource,proto3" json:"grant_source,omitempty"` + GrantSubjectType string `protobuf:"bytes,6,opt,name=grant_subject_type,json=grantSubjectType,proto3" json:"grant_subject_type,omitempty"` + GrantSubjectId string `protobuf:"bytes,7,opt,name=grant_subject_id,json=grantSubjectId,proto3" json:"grant_subject_id,omitempty"` + Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` + Reason string `protobuf:"bytes,9,opt,name=reason,proto3" json:"reason,omitempty"` + OperatorUserId int64 `protobuf:"varint,10,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + Items []*ResourceGrantItem `protobuf:"bytes,11,rep,name=items,proto3" json:"items,omitempty"` + CreatedAtMs int64 `protobuf:"varint,12,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + UpdatedAtMs int64 `protobuf:"varint,13,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ResourceGrant) Reset() { *x = ResourceGrant{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResourceGrant) String() string { @@ -1758,7 +1767,7 @@ func (*ResourceGrant) ProtoMessage() {} func (x *ResourceGrant) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1865,26 +1874,23 @@ func (x *ResourceGrant) GetUpdatedAtMs() int64 { } type ResourceGroupItemInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ResourceId int64 `protobuf:"varint,1,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - Quantity int64 `protobuf:"varint,2,opt,name=quantity,proto3" json:"quantity,omitempty"` - DurationMs int64 `protobuf:"varint,3,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"` - SortOrder int32 `protobuf:"varint,4,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` - ItemType string `protobuf:"bytes,5,opt,name=item_type,json=itemType,proto3" json:"item_type,omitempty"` - WalletAssetType string `protobuf:"bytes,6,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` - WalletAssetAmount int64 `protobuf:"varint,7,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ResourceId int64 `protobuf:"varint,1,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + Quantity int64 `protobuf:"varint,2,opt,name=quantity,proto3" json:"quantity,omitempty"` + DurationMs int64 `protobuf:"varint,3,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"` + SortOrder int32 `protobuf:"varint,4,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` + ItemType string `protobuf:"bytes,5,opt,name=item_type,json=itemType,proto3" json:"item_type,omitempty"` + WalletAssetType string `protobuf:"bytes,6,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` + WalletAssetAmount int64 `protobuf:"varint,7,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ResourceGroupItemInput) Reset() { *x = ResourceGroupItemInput{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResourceGroupItemInput) String() string { @@ -1895,7 +1901,7 @@ func (*ResourceGroupItemInput) ProtoMessage() {} func (x *ResourceGroupItemInput) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1960,27 +1966,24 @@ func (x *ResourceGroupItemInput) GetWalletAssetAmount() int64 { } type ListResourcesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + ResourceType string `protobuf:"bytes,3,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Keyword string `protobuf:"bytes,5,opt,name=keyword,proto3" json:"keyword,omitempty"` + Page int32 `protobuf:"varint,6,opt,name=page,proto3" json:"page,omitempty"` + PageSize int32 `protobuf:"varint,7,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + ActiveOnly bool `protobuf:"varint,8,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - ResourceType string `protobuf:"bytes,3,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Keyword string `protobuf:"bytes,5,opt,name=keyword,proto3" json:"keyword,omitempty"` - Page int32 `protobuf:"varint,6,opt,name=page,proto3" json:"page,omitempty"` - PageSize int32 `protobuf:"varint,7,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - ActiveOnly bool `protobuf:"varint,8,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListResourcesRequest) Reset() { *x = ListResourcesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListResourcesRequest) String() string { @@ -1991,7 +1994,7 @@ func (*ListResourcesRequest) ProtoMessage() {} func (x *ListResourcesRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2063,21 +2066,18 @@ func (x *ListResourcesRequest) GetActiveOnly() bool { } type ListResourcesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Resources []*Resource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` unknownFields protoimpl.UnknownFields - - Resources []*Resource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListResourcesResponse) Reset() { *x = ListResourcesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListResourcesResponse) String() string { @@ -2088,7 +2088,7 @@ func (*ListResourcesResponse) ProtoMessage() {} func (x *ListResourcesResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2118,22 +2118,19 @@ func (x *ListResourcesResponse) GetTotal() int64 { } type GetResourceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetResourceRequest) Reset() { *x = GetResourceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetResourceRequest) String() string { @@ -2144,7 +2141,7 @@ func (*GetResourceRequest) ProtoMessage() {} func (x *GetResourceRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2181,20 +2178,17 @@ func (x *GetResourceRequest) GetResourceId() int64 { } type GetResourceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Resource *Resource `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` unknownFields protoimpl.UnknownFields - - Resource *Resource `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetResourceResponse) Reset() { *x = GetResourceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetResourceResponse) String() string { @@ -2205,7 +2199,7 @@ func (*GetResourceResponse) ProtoMessage() {} func (x *GetResourceResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2228,36 +2222,33 @@ func (x *GetResourceResponse) GetResource() *Resource { } type CreateResourceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - ResourceCode string `protobuf:"bytes,3,opt,name=resource_code,json=resourceCode,proto3" json:"resource_code,omitempty"` - ResourceType string `protobuf:"bytes,4,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` - Grantable bool `protobuf:"varint,7,opt,name=grantable,proto3" json:"grantable,omitempty"` - GrantStrategy string `protobuf:"bytes,8,opt,name=grant_strategy,json=grantStrategy,proto3" json:"grant_strategy,omitempty"` - WalletAssetType string `protobuf:"bytes,9,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` - WalletAssetAmount int64 `protobuf:"varint,10,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` - UsageScopes []string `protobuf:"bytes,11,rep,name=usage_scopes,json=usageScopes,proto3" json:"usage_scopes,omitempty"` - AssetUrl string `protobuf:"bytes,12,opt,name=asset_url,json=assetUrl,proto3" json:"asset_url,omitempty"` - PreviewUrl string `protobuf:"bytes,13,opt,name=preview_url,json=previewUrl,proto3" json:"preview_url,omitempty"` - AnimationUrl string `protobuf:"bytes,14,opt,name=animation_url,json=animationUrl,proto3" json:"animation_url,omitempty"` - MetadataJson string `protobuf:"bytes,15,opt,name=metadata_json,json=metadataJson,proto3" json:"metadata_json,omitempty"` - SortOrder int32 `protobuf:"varint,16,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` - OperatorUserId int64 `protobuf:"varint,17,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + ResourceCode string `protobuf:"bytes,3,opt,name=resource_code,json=resourceCode,proto3" json:"resource_code,omitempty"` + ResourceType string `protobuf:"bytes,4,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` + Grantable bool `protobuf:"varint,7,opt,name=grantable,proto3" json:"grantable,omitempty"` + GrantStrategy string `protobuf:"bytes,8,opt,name=grant_strategy,json=grantStrategy,proto3" json:"grant_strategy,omitempty"` + WalletAssetType string `protobuf:"bytes,9,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` + WalletAssetAmount int64 `protobuf:"varint,10,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` + UsageScopes []string `protobuf:"bytes,11,rep,name=usage_scopes,json=usageScopes,proto3" json:"usage_scopes,omitempty"` + AssetUrl string `protobuf:"bytes,12,opt,name=asset_url,json=assetUrl,proto3" json:"asset_url,omitempty"` + PreviewUrl string `protobuf:"bytes,13,opt,name=preview_url,json=previewUrl,proto3" json:"preview_url,omitempty"` + AnimationUrl string `protobuf:"bytes,14,opt,name=animation_url,json=animationUrl,proto3" json:"animation_url,omitempty"` + MetadataJson string `protobuf:"bytes,15,opt,name=metadata_json,json=metadataJson,proto3" json:"metadata_json,omitempty"` + SortOrder int32 `protobuf:"varint,16,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` + OperatorUserId int64 `protobuf:"varint,17,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateResourceRequest) Reset() { *x = CreateResourceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateResourceRequest) String() string { @@ -2268,7 +2259,7 @@ func (*CreateResourceRequest) ProtoMessage() {} func (x *CreateResourceRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2403,37 +2394,34 @@ func (x *CreateResourceRequest) GetOperatorUserId() int64 { } type UpdateResourceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - ResourceCode string `protobuf:"bytes,4,opt,name=resource_code,json=resourceCode,proto3" json:"resource_code,omitempty"` - ResourceType string `protobuf:"bytes,5,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"` - Grantable bool `protobuf:"varint,8,opt,name=grantable,proto3" json:"grantable,omitempty"` - GrantStrategy string `protobuf:"bytes,9,opt,name=grant_strategy,json=grantStrategy,proto3" json:"grant_strategy,omitempty"` - WalletAssetType string `protobuf:"bytes,10,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` - WalletAssetAmount int64 `protobuf:"varint,11,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` - UsageScopes []string `protobuf:"bytes,12,rep,name=usage_scopes,json=usageScopes,proto3" json:"usage_scopes,omitempty"` - AssetUrl string `protobuf:"bytes,13,opt,name=asset_url,json=assetUrl,proto3" json:"asset_url,omitempty"` - PreviewUrl string `protobuf:"bytes,14,opt,name=preview_url,json=previewUrl,proto3" json:"preview_url,omitempty"` - AnimationUrl string `protobuf:"bytes,15,opt,name=animation_url,json=animationUrl,proto3" json:"animation_url,omitempty"` - MetadataJson string `protobuf:"bytes,16,opt,name=metadata_json,json=metadataJson,proto3" json:"metadata_json,omitempty"` - SortOrder int32 `protobuf:"varint,17,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` - OperatorUserId int64 `protobuf:"varint,18,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + ResourceCode string `protobuf:"bytes,4,opt,name=resource_code,json=resourceCode,proto3" json:"resource_code,omitempty"` + ResourceType string `protobuf:"bytes,5,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"` + Grantable bool `protobuf:"varint,8,opt,name=grantable,proto3" json:"grantable,omitempty"` + GrantStrategy string `protobuf:"bytes,9,opt,name=grant_strategy,json=grantStrategy,proto3" json:"grant_strategy,omitempty"` + WalletAssetType string `protobuf:"bytes,10,opt,name=wallet_asset_type,json=walletAssetType,proto3" json:"wallet_asset_type,omitempty"` + WalletAssetAmount int64 `protobuf:"varint,11,opt,name=wallet_asset_amount,json=walletAssetAmount,proto3" json:"wallet_asset_amount,omitempty"` + UsageScopes []string `protobuf:"bytes,12,rep,name=usage_scopes,json=usageScopes,proto3" json:"usage_scopes,omitempty"` + AssetUrl string `protobuf:"bytes,13,opt,name=asset_url,json=assetUrl,proto3" json:"asset_url,omitempty"` + PreviewUrl string `protobuf:"bytes,14,opt,name=preview_url,json=previewUrl,proto3" json:"preview_url,omitempty"` + AnimationUrl string `protobuf:"bytes,15,opt,name=animation_url,json=animationUrl,proto3" json:"animation_url,omitempty"` + MetadataJson string `protobuf:"bytes,16,opt,name=metadata_json,json=metadataJson,proto3" json:"metadata_json,omitempty"` + SortOrder int32 `protobuf:"varint,17,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` + OperatorUserId int64 `protobuf:"varint,18,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateResourceRequest) Reset() { *x = UpdateResourceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateResourceRequest) String() string { @@ -2444,7 +2432,7 @@ func (*UpdateResourceRequest) ProtoMessage() {} func (x *UpdateResourceRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2586,24 +2574,21 @@ func (x *UpdateResourceRequest) GetOperatorUserId() int64 { } type SetResourceStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - OperatorUserId int64 `protobuf:"varint,5,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + ResourceId int64 `protobuf:"varint,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + OperatorUserId int64 `protobuf:"varint,5,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SetResourceStatusRequest) Reset() { *x = SetResourceStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetResourceStatusRequest) String() string { @@ -2614,7 +2599,7 @@ func (*SetResourceStatusRequest) ProtoMessage() {} func (x *SetResourceStatusRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2665,20 +2650,17 @@ func (x *SetResourceStatusRequest) GetOperatorUserId() int64 { } type ResourceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Resource *Resource `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` unknownFields protoimpl.UnknownFields - - Resource *Resource `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ResourceResponse) Reset() { *x = ResourceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResourceResponse) String() string { @@ -2689,7 +2671,7 @@ func (*ResourceResponse) ProtoMessage() {} func (x *ResourceResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2712,26 +2694,23 @@ func (x *ResourceResponse) GetResource() *Resource { } type ListResourceGroupsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Keyword string `protobuf:"bytes,4,opt,name=keyword,proto3" json:"keyword,omitempty"` + Page int32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` + PageSize int32 `protobuf:"varint,6,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + ActiveOnly bool `protobuf:"varint,7,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - Keyword string `protobuf:"bytes,4,opt,name=keyword,proto3" json:"keyword,omitempty"` - Page int32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` - PageSize int32 `protobuf:"varint,6,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - ActiveOnly bool `protobuf:"varint,7,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListResourceGroupsRequest) Reset() { *x = ListResourceGroupsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListResourceGroupsRequest) String() string { @@ -2742,7 +2721,7 @@ func (*ListResourceGroupsRequest) ProtoMessage() {} func (x *ListResourceGroupsRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2807,21 +2786,18 @@ func (x *ListResourceGroupsRequest) GetActiveOnly() bool { } type ListResourceGroupsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Groups []*ResourceGroup `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` unknownFields protoimpl.UnknownFields - - Groups []*ResourceGroup `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListResourceGroupsResponse) Reset() { *x = ListResourceGroupsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListResourceGroupsResponse) String() string { @@ -2832,7 +2808,7 @@ func (*ListResourceGroupsResponse) ProtoMessage() {} func (x *ListResourceGroupsResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2862,22 +2838,19 @@ func (x *ListResourceGroupsResponse) GetTotal() int64 { } type GetResourceGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + GroupId int64 `protobuf:"varint,3,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - GroupId int64 `protobuf:"varint,3,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetResourceGroupRequest) Reset() { *x = GetResourceGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetResourceGroupRequest) String() string { @@ -2888,7 +2861,7 @@ func (*GetResourceGroupRequest) ProtoMessage() {} func (x *GetResourceGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2925,20 +2898,17 @@ func (x *GetResourceGroupRequest) GetGroupId() int64 { } type GetResourceGroupResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Group *ResourceGroup `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` unknownFields protoimpl.UnknownFields - - Group *ResourceGroup `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetResourceGroupResponse) Reset() { *x = GetResourceGroupResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetResourceGroupResponse) String() string { @@ -2949,7 +2919,7 @@ func (*GetResourceGroupResponse) ProtoMessage() {} func (x *GetResourceGroupResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2972,10 +2942,7 @@ func (x *GetResourceGroupResponse) GetGroup() *ResourceGroup { } type CreateResourceGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` GroupCode string `protobuf:"bytes,3,opt,name=group_code,json=groupCode,proto3" json:"group_code,omitempty"` @@ -2985,15 +2952,15 @@ type CreateResourceGroupRequest struct { SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` Items []*ResourceGroupItemInput `protobuf:"bytes,8,rep,name=items,proto3" json:"items,omitempty"` OperatorUserId int64 `protobuf:"varint,9,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateResourceGroupRequest) Reset() { *x = CreateResourceGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateResourceGroupRequest) String() string { @@ -3004,7 +2971,7 @@ func (*CreateResourceGroupRequest) ProtoMessage() {} func (x *CreateResourceGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3083,10 +3050,7 @@ func (x *CreateResourceGroupRequest) GetOperatorUserId() int64 { } type UpdateResourceGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` GroupId int64 `protobuf:"varint,3,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` @@ -3097,15 +3061,15 @@ type UpdateResourceGroupRequest struct { SortOrder int32 `protobuf:"varint,8,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` Items []*ResourceGroupItemInput `protobuf:"bytes,9,rep,name=items,proto3" json:"items,omitempty"` OperatorUserId int64 `protobuf:"varint,10,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateResourceGroupRequest) Reset() { *x = UpdateResourceGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateResourceGroupRequest) String() string { @@ -3116,7 +3080,7 @@ func (*UpdateResourceGroupRequest) ProtoMessage() {} func (x *UpdateResourceGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3202,24 +3166,21 @@ func (x *UpdateResourceGroupRequest) GetOperatorUserId() int64 { } type SetResourceGroupStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - GroupId int64 `protobuf:"varint,3,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - OperatorUserId int64 `protobuf:"varint,5,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + GroupId int64 `protobuf:"varint,3,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + OperatorUserId int64 `protobuf:"varint,5,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SetResourceGroupStatusRequest) Reset() { *x = SetResourceGroupStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetResourceGroupStatusRequest) String() string { @@ -3230,7 +3191,7 @@ func (*SetResourceGroupStatusRequest) ProtoMessage() {} func (x *SetResourceGroupStatusRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3281,20 +3242,17 @@ func (x *SetResourceGroupStatusRequest) GetOperatorUserId() int64 { } type ResourceGroupResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Group *ResourceGroup `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` unknownFields protoimpl.UnknownFields - - Group *ResourceGroup `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ResourceGroupResponse) Reset() { *x = ResourceGroupResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResourceGroupResponse) String() string { @@ -3305,7 +3263,7 @@ func (*ResourceGroupResponse) ProtoMessage() {} func (x *ResourceGroupResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3328,28 +3286,25 @@ func (x *ResourceGroupResponse) GetGroup() *ResourceGroup { } type ListGiftConfigsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Keyword string `protobuf:"bytes,4,opt,name=keyword,proto3" json:"keyword,omitempty"` + Page int32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` + PageSize int32 `protobuf:"varint,6,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + ActiveOnly bool `protobuf:"varint,7,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` + RegionId int64 `protobuf:"varint,8,opt,name=region_id,json=regionId,proto3" json:"region_id,omitempty"` + FilterRegion bool `protobuf:"varint,9,opt,name=filter_region,json=filterRegion,proto3" json:"filter_region,omitempty"` unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - Keyword string `protobuf:"bytes,4,opt,name=keyword,proto3" json:"keyword,omitempty"` - Page int32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` - PageSize int32 `protobuf:"varint,6,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - ActiveOnly bool `protobuf:"varint,7,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` - RegionId int64 `protobuf:"varint,8,opt,name=region_id,json=regionId,proto3" json:"region_id,omitempty"` - FilterRegion bool `protobuf:"varint,9,opt,name=filter_region,json=filterRegion,proto3" json:"filter_region,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListGiftConfigsRequest) Reset() { *x = ListGiftConfigsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListGiftConfigsRequest) String() string { @@ -3360,7 +3315,7 @@ func (*ListGiftConfigsRequest) ProtoMessage() {} func (x *ListGiftConfigsRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3439,21 +3394,18 @@ func (x *ListGiftConfigsRequest) GetFilterRegion() bool { } type ListGiftConfigsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Gifts []*GiftConfig `protobuf:"bytes,1,rep,name=gifts,proto3" json:"gifts,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` unknownFields protoimpl.UnknownFields - - Gifts []*GiftConfig `protobuf:"bytes,1,rep,name=gifts,proto3" json:"gifts,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListGiftConfigsResponse) Reset() { *x = ListGiftConfigsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListGiftConfigsResponse) String() string { @@ -3464,7 +3416,7 @@ func (*ListGiftConfigsResponse) ProtoMessage() {} func (x *ListGiftConfigsResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3494,34 +3446,36 @@ func (x *ListGiftConfigsResponse) GetTotal() int64 { } type CreateGiftConfigRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - GiftId string `protobuf:"bytes,3,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` - ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` - PresentationJson string `protobuf:"bytes,8,opt,name=presentation_json,json=presentationJson,proto3" json:"presentation_json,omitempty"` - PriceVersion string `protobuf:"bytes,9,opt,name=price_version,json=priceVersion,proto3" json:"price_version,omitempty"` - CoinPrice int64 `protobuf:"varint,10,opt,name=coin_price,json=coinPrice,proto3" json:"coin_price,omitempty"` - GiftPointAmount int64 `protobuf:"varint,11,opt,name=gift_point_amount,json=giftPointAmount,proto3" json:"gift_point_amount,omitempty"` - HeatValue int64 `protobuf:"varint,12,opt,name=heat_value,json=heatValue,proto3" json:"heat_value,omitempty"` - EffectiveAtMs int64 `protobuf:"varint,13,opt,name=effective_at_ms,json=effectiveAtMs,proto3" json:"effective_at_ms,omitempty"` - OperatorUserId int64 `protobuf:"varint,14,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` - RegionIds []int64 `protobuf:"varint,15,rep,packed,name=region_ids,json=regionIds,proto3" json:"region_ids,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + GiftId string `protobuf:"bytes,3,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` + ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` + SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` + PresentationJson string `protobuf:"bytes,8,opt,name=presentation_json,json=presentationJson,proto3" json:"presentation_json,omitempty"` + PriceVersion string `protobuf:"bytes,9,opt,name=price_version,json=priceVersion,proto3" json:"price_version,omitempty"` + CoinPrice int64 `protobuf:"varint,10,opt,name=coin_price,json=coinPrice,proto3" json:"coin_price,omitempty"` + GiftPointAmount int64 `protobuf:"varint,11,opt,name=gift_point_amount,json=giftPointAmount,proto3" json:"gift_point_amount,omitempty"` + HeatValue int64 `protobuf:"varint,12,opt,name=heat_value,json=heatValue,proto3" json:"heat_value,omitempty"` + EffectiveAtMs int64 `protobuf:"varint,13,opt,name=effective_at_ms,json=effectiveAtMs,proto3" json:"effective_at_ms,omitempty"` + OperatorUserId int64 `protobuf:"varint,14,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + RegionIds []int64 `protobuf:"varint,15,rep,packed,name=region_ids,json=regionIds,proto3" json:"region_ids,omitempty"` + GiftTypeCode string `protobuf:"bytes,16,opt,name=gift_type_code,json=giftTypeCode,proto3" json:"gift_type_code,omitempty"` + ChargeAssetType string `protobuf:"bytes,17,opt,name=charge_asset_type,json=chargeAssetType,proto3" json:"charge_asset_type,omitempty"` + EffectiveFromMs int64 `protobuf:"varint,18,opt,name=effective_from_ms,json=effectiveFromMs,proto3" json:"effective_from_ms,omitempty"` + EffectiveToMs int64 `protobuf:"varint,19,opt,name=effective_to_ms,json=effectiveToMs,proto3" json:"effective_to_ms,omitempty"` + EffectTypes []string `protobuf:"bytes,20,rep,name=effect_types,json=effectTypes,proto3" json:"effect_types,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateGiftConfigRequest) Reset() { *x = CreateGiftConfigRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateGiftConfigRequest) String() string { @@ -3532,7 +3486,7 @@ func (*CreateGiftConfigRequest) ProtoMessage() {} func (x *CreateGiftConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3652,35 +3606,72 @@ func (x *CreateGiftConfigRequest) GetRegionIds() []int64 { return nil } -type UpdateGiftConfigRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *CreateGiftConfigRequest) GetGiftTypeCode() string { + if x != nil { + return x.GiftTypeCode + } + return "" +} - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - GiftId string `protobuf:"bytes,3,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` - ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` - PresentationJson string `protobuf:"bytes,8,opt,name=presentation_json,json=presentationJson,proto3" json:"presentation_json,omitempty"` - PriceVersion string `protobuf:"bytes,9,opt,name=price_version,json=priceVersion,proto3" json:"price_version,omitempty"` - CoinPrice int64 `protobuf:"varint,10,opt,name=coin_price,json=coinPrice,proto3" json:"coin_price,omitempty"` - GiftPointAmount int64 `protobuf:"varint,11,opt,name=gift_point_amount,json=giftPointAmount,proto3" json:"gift_point_amount,omitempty"` - HeatValue int64 `protobuf:"varint,12,opt,name=heat_value,json=heatValue,proto3" json:"heat_value,omitempty"` - EffectiveAtMs int64 `protobuf:"varint,13,opt,name=effective_at_ms,json=effectiveAtMs,proto3" json:"effective_at_ms,omitempty"` - OperatorUserId int64 `protobuf:"varint,14,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` - RegionIds []int64 `protobuf:"varint,15,rep,packed,name=region_ids,json=regionIds,proto3" json:"region_ids,omitempty"` +func (x *CreateGiftConfigRequest) GetChargeAssetType() string { + if x != nil { + return x.ChargeAssetType + } + return "" +} + +func (x *CreateGiftConfigRequest) GetEffectiveFromMs() int64 { + if x != nil { + return x.EffectiveFromMs + } + return 0 +} + +func (x *CreateGiftConfigRequest) GetEffectiveToMs() int64 { + if x != nil { + return x.EffectiveToMs + } + return 0 +} + +func (x *CreateGiftConfigRequest) GetEffectTypes() []string { + if x != nil { + return x.EffectTypes + } + return nil +} + +type UpdateGiftConfigRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + GiftId string `protobuf:"bytes,3,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` + ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` + SortOrder int32 `protobuf:"varint,7,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` + PresentationJson string `protobuf:"bytes,8,opt,name=presentation_json,json=presentationJson,proto3" json:"presentation_json,omitempty"` + PriceVersion string `protobuf:"bytes,9,opt,name=price_version,json=priceVersion,proto3" json:"price_version,omitempty"` + CoinPrice int64 `protobuf:"varint,10,opt,name=coin_price,json=coinPrice,proto3" json:"coin_price,omitempty"` + GiftPointAmount int64 `protobuf:"varint,11,opt,name=gift_point_amount,json=giftPointAmount,proto3" json:"gift_point_amount,omitempty"` + HeatValue int64 `protobuf:"varint,12,opt,name=heat_value,json=heatValue,proto3" json:"heat_value,omitempty"` + EffectiveAtMs int64 `protobuf:"varint,13,opt,name=effective_at_ms,json=effectiveAtMs,proto3" json:"effective_at_ms,omitempty"` + OperatorUserId int64 `protobuf:"varint,14,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + RegionIds []int64 `protobuf:"varint,15,rep,packed,name=region_ids,json=regionIds,proto3" json:"region_ids,omitempty"` + GiftTypeCode string `protobuf:"bytes,16,opt,name=gift_type_code,json=giftTypeCode,proto3" json:"gift_type_code,omitempty"` + ChargeAssetType string `protobuf:"bytes,17,opt,name=charge_asset_type,json=chargeAssetType,proto3" json:"charge_asset_type,omitempty"` + EffectiveFromMs int64 `protobuf:"varint,18,opt,name=effective_from_ms,json=effectiveFromMs,proto3" json:"effective_from_ms,omitempty"` + EffectiveToMs int64 `protobuf:"varint,19,opt,name=effective_to_ms,json=effectiveToMs,proto3" json:"effective_to_ms,omitempty"` + EffectTypes []string `protobuf:"bytes,20,rep,name=effect_types,json=effectTypes,proto3" json:"effect_types,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateGiftConfigRequest) Reset() { *x = UpdateGiftConfigRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateGiftConfigRequest) String() string { @@ -3691,7 +3682,7 @@ func (*UpdateGiftConfigRequest) ProtoMessage() {} func (x *UpdateGiftConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3811,25 +3802,57 @@ func (x *UpdateGiftConfigRequest) GetRegionIds() []int64 { return nil } -type SetGiftConfigStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *UpdateGiftConfigRequest) GetGiftTypeCode() string { + if x != nil { + return x.GiftTypeCode + } + return "" +} - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - GiftId string `protobuf:"bytes,3,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - OperatorUserId int64 `protobuf:"varint,5,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` +func (x *UpdateGiftConfigRequest) GetChargeAssetType() string { + if x != nil { + return x.ChargeAssetType + } + return "" +} + +func (x *UpdateGiftConfigRequest) GetEffectiveFromMs() int64 { + if x != nil { + return x.EffectiveFromMs + } + return 0 +} + +func (x *UpdateGiftConfigRequest) GetEffectiveToMs() int64 { + if x != nil { + return x.EffectiveToMs + } + return 0 +} + +func (x *UpdateGiftConfigRequest) GetEffectTypes() []string { + if x != nil { + return x.EffectTypes + } + return nil +} + +type SetGiftConfigStatusRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + GiftId string `protobuf:"bytes,3,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + OperatorUserId int64 `protobuf:"varint,5,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SetGiftConfigStatusRequest) Reset() { *x = SetGiftConfigStatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SetGiftConfigStatusRequest) String() string { @@ -3840,7 +3863,7 @@ func (*SetGiftConfigStatusRequest) ProtoMessage() {} func (x *SetGiftConfigStatusRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3891,20 +3914,17 @@ func (x *SetGiftConfigStatusRequest) GetOperatorUserId() int64 { } type GiftConfigResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Gift *GiftConfig `protobuf:"bytes,1,opt,name=gift,proto3" json:"gift,omitempty"` unknownFields protoimpl.UnknownFields - - Gift *GiftConfig `protobuf:"bytes,1,opt,name=gift,proto3" json:"gift,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GiftConfigResponse) Reset() { *x = GiftConfigResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GiftConfigResponse) String() string { @@ -3915,7 +3935,7 @@ func (*GiftConfigResponse) ProtoMessage() {} func (x *GiftConfigResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3938,28 +3958,25 @@ func (x *GiftConfigResponse) GetGift() *GiftConfig { } type GrantResourceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - TargetUserId int64 `protobuf:"varint,3,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` - ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - Quantity int64 `protobuf:"varint,5,opt,name=quantity,proto3" json:"quantity,omitempty"` - DurationMs int64 `protobuf:"varint,6,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"` - Reason string `protobuf:"bytes,7,opt,name=reason,proto3" json:"reason,omitempty"` - OperatorUserId int64 `protobuf:"varint,8,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` - GrantSource string `protobuf:"bytes,9,opt,name=grant_source,json=grantSource,proto3" json:"grant_source,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + TargetUserId int64 `protobuf:"varint,3,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` + ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + Quantity int64 `protobuf:"varint,5,opt,name=quantity,proto3" json:"quantity,omitempty"` + DurationMs int64 `protobuf:"varint,6,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"` + Reason string `protobuf:"bytes,7,opt,name=reason,proto3" json:"reason,omitempty"` + OperatorUserId int64 `protobuf:"varint,8,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + GrantSource string `protobuf:"bytes,9,opt,name=grant_source,json=grantSource,proto3" json:"grant_source,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GrantResourceRequest) Reset() { *x = GrantResourceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GrantResourceRequest) String() string { @@ -3970,7 +3987,7 @@ func (*GrantResourceRequest) ProtoMessage() {} func (x *GrantResourceRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4049,26 +4066,23 @@ func (x *GrantResourceRequest) GetGrantSource() string { } type GrantResourceGroupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - TargetUserId int64 `protobuf:"varint,3,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` - GroupId int64 `protobuf:"varint,4,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` - OperatorUserId int64 `protobuf:"varint,6,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` - GrantSource string `protobuf:"bytes,7,opt,name=grant_source,json=grantSource,proto3" json:"grant_source,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + TargetUserId int64 `protobuf:"varint,3,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` + GroupId int64 `protobuf:"varint,4,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` + OperatorUserId int64 `protobuf:"varint,6,opt,name=operator_user_id,json=operatorUserId,proto3" json:"operator_user_id,omitempty"` + GrantSource string `protobuf:"bytes,7,opt,name=grant_source,json=grantSource,proto3" json:"grant_source,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GrantResourceGroupRequest) Reset() { *x = GrantResourceGroupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GrantResourceGroupRequest) String() string { @@ -4079,7 +4093,7 @@ func (*GrantResourceGroupRequest) ProtoMessage() {} func (x *GrantResourceGroupRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4144,20 +4158,17 @@ func (x *GrantResourceGroupRequest) GetGrantSource() string { } type ResourceGrantResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Grant *ResourceGrant `protobuf:"bytes,1,opt,name=grant,proto3" json:"grant,omitempty"` unknownFields protoimpl.UnknownFields - - Grant *ResourceGrant `protobuf:"bytes,1,opt,name=grant,proto3" json:"grant,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ResourceGrantResponse) Reset() { *x = ResourceGrantResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResourceGrantResponse) String() string { @@ -4168,7 +4179,7 @@ func (*ResourceGrantResponse) ProtoMessage() {} func (x *ResourceGrantResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4191,24 +4202,21 @@ func (x *ResourceGrantResponse) GetGrant() *ResourceGrant { } type ListUserResourcesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + UserId int64 `protobuf:"varint,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + ResourceType string `protobuf:"bytes,4,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` + ActiveOnly bool `protobuf:"varint,5,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - UserId int64 `protobuf:"varint,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - ResourceType string `protobuf:"bytes,4,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` - ActiveOnly bool `protobuf:"varint,5,opt,name=active_only,json=activeOnly,proto3" json:"active_only,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListUserResourcesRequest) Reset() { *x = ListUserResourcesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListUserResourcesRequest) String() string { @@ -4219,7 +4227,7 @@ func (*ListUserResourcesRequest) ProtoMessage() {} func (x *ListUserResourcesRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4270,20 +4278,17 @@ func (x *ListUserResourcesRequest) GetActiveOnly() bool { } type ListUserResourcesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Resources []*UserResourceEntitlement `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` unknownFields protoimpl.UnknownFields - - Resources []*UserResourceEntitlement `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListUserResourcesResponse) Reset() { *x = ListUserResourcesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListUserResourcesResponse) String() string { @@ -4294,7 +4299,7 @@ func (*ListUserResourcesResponse) ProtoMessage() {} func (x *ListUserResourcesResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4317,24 +4322,21 @@ func (x *ListUserResourcesResponse) GetResources() []*UserResourceEntitlement { } type EquipUserResourceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + UserId int64 `protobuf:"varint,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + EntitlementId string `protobuf:"bytes,5,opt,name=entitlement_id,json=entitlementId,proto3" json:"entitlement_id,omitempty"` unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - UserId int64 `protobuf:"varint,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - ResourceId int64 `protobuf:"varint,4,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - EntitlementId string `protobuf:"bytes,5,opt,name=entitlement_id,json=entitlementId,proto3" json:"entitlement_id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *EquipUserResourceRequest) Reset() { *x = EquipUserResourceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *EquipUserResourceRequest) String() string { @@ -4345,7 +4347,7 @@ func (*EquipUserResourceRequest) ProtoMessage() {} func (x *EquipUserResourceRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4396,20 +4398,17 @@ func (x *EquipUserResourceRequest) GetEntitlementId() string { } type EquipUserResourceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Resource *UserResourceEntitlement `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` unknownFields protoimpl.UnknownFields - - Resource *UserResourceEntitlement `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"` + sizeCache protoimpl.SizeCache } func (x *EquipUserResourceResponse) Reset() { *x = EquipUserResourceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *EquipUserResourceResponse) String() string { @@ -4420,7 +4419,7 @@ func (*EquipUserResourceResponse) ProtoMessage() {} func (x *EquipUserResourceResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4443,25 +4442,22 @@ func (x *EquipUserResourceResponse) GetResource() *UserResourceEntitlement { } type ListResourceGrantsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + TargetUserId int64 `protobuf:"varint,3,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Page int32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` + PageSize int32 `protobuf:"varint,6,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` - TargetUserId int64 `protobuf:"varint,3,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Page int32 `protobuf:"varint,5,opt,name=page,proto3" json:"page,omitempty"` - PageSize int32 `protobuf:"varint,6,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListResourceGrantsRequest) Reset() { *x = ListResourceGrantsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListResourceGrantsRequest) String() string { @@ -4472,7 +4468,7 @@ func (*ListResourceGrantsRequest) ProtoMessage() {} func (x *ListResourceGrantsRequest) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4530,21 +4526,18 @@ func (x *ListResourceGrantsRequest) GetPageSize() int32 { } type ListResourceGrantsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Grants []*ResourceGrant `protobuf:"bytes,1,rep,name=grants,proto3" json:"grants,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` unknownFields protoimpl.UnknownFields - - Grants []*ResourceGrant `protobuf:"bytes,1,rep,name=grants,proto3" json:"grants,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListResourceGrantsResponse) Reset() { *x = ListResourceGrantsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListResourceGrantsResponse) String() string { @@ -4555,7 +4548,7 @@ func (*ListResourceGrantsResponse) ProtoMessage() {} func (x *ListResourceGrantsResponse) ProtoReflect() protoreflect.Message { mi := &file_proto_wallet_v1_wallet_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4584,980 +4577,946 @@ func (x *ListResourceGrantsResponse) GetTotal() int64 { return 0 } +type RechargeBill struct { + state protoimpl.MessageState `protogen:"open.v1"` + AppCode string `protobuf:"bytes,1,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + TransactionId string `protobuf:"bytes,2,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` + CommandId string `protobuf:"bytes,3,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + RechargeType string `protobuf:"bytes,4,opt,name=recharge_type,json=rechargeType,proto3" json:"recharge_type,omitempty"` + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + ExternalRef string `protobuf:"bytes,6,opt,name=external_ref,json=externalRef,proto3" json:"external_ref,omitempty"` + UserId int64 `protobuf:"varint,7,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + SellerUserId int64 `protobuf:"varint,8,opt,name=seller_user_id,json=sellerUserId,proto3" json:"seller_user_id,omitempty"` + SellerRegionId int64 `protobuf:"varint,9,opt,name=seller_region_id,json=sellerRegionId,proto3" json:"seller_region_id,omitempty"` + TargetRegionId int64 `protobuf:"varint,10,opt,name=target_region_id,json=targetRegionId,proto3" json:"target_region_id,omitempty"` + PolicyId int64 `protobuf:"varint,11,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyVersion string `protobuf:"bytes,12,opt,name=policy_version,json=policyVersion,proto3" json:"policy_version,omitempty"` + CurrencyCode string `protobuf:"bytes,13,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"` + CoinAmount int64 `protobuf:"varint,14,opt,name=coin_amount,json=coinAmount,proto3" json:"coin_amount,omitempty"` + UsdMinorAmount int64 `protobuf:"varint,15,opt,name=usd_minor_amount,json=usdMinorAmount,proto3" json:"usd_minor_amount,omitempty"` + ExchangeCoinAmount int64 `protobuf:"varint,16,opt,name=exchange_coin_amount,json=exchangeCoinAmount,proto3" json:"exchange_coin_amount,omitempty"` + ExchangeUsdMinorAmount int64 `protobuf:"varint,17,opt,name=exchange_usd_minor_amount,json=exchangeUsdMinorAmount,proto3" json:"exchange_usd_minor_amount,omitempty"` + CreatedAtMs int64 `protobuf:"varint,18,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RechargeBill) Reset() { + *x = RechargeBill{} + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RechargeBill) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RechargeBill) ProtoMessage() {} + +func (x *RechargeBill) ProtoReflect() protoreflect.Message { + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[48] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RechargeBill.ProtoReflect.Descriptor instead. +func (*RechargeBill) Descriptor() ([]byte, []int) { + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{48} +} + +func (x *RechargeBill) GetAppCode() string { + if x != nil { + return x.AppCode + } + return "" +} + +func (x *RechargeBill) GetTransactionId() string { + if x != nil { + return x.TransactionId + } + return "" +} + +func (x *RechargeBill) GetCommandId() string { + if x != nil { + return x.CommandId + } + return "" +} + +func (x *RechargeBill) GetRechargeType() string { + if x != nil { + return x.RechargeType + } + return "" +} + +func (x *RechargeBill) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *RechargeBill) GetExternalRef() string { + if x != nil { + return x.ExternalRef + } + return "" +} + +func (x *RechargeBill) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *RechargeBill) GetSellerUserId() int64 { + if x != nil { + return x.SellerUserId + } + return 0 +} + +func (x *RechargeBill) GetSellerRegionId() int64 { + if x != nil { + return x.SellerRegionId + } + return 0 +} + +func (x *RechargeBill) GetTargetRegionId() int64 { + if x != nil { + return x.TargetRegionId + } + return 0 +} + +func (x *RechargeBill) GetPolicyId() int64 { + if x != nil { + return x.PolicyId + } + return 0 +} + +func (x *RechargeBill) GetPolicyVersion() string { + if x != nil { + return x.PolicyVersion + } + return "" +} + +func (x *RechargeBill) GetCurrencyCode() string { + if x != nil { + return x.CurrencyCode + } + return "" +} + +func (x *RechargeBill) GetCoinAmount() int64 { + if x != nil { + return x.CoinAmount + } + return 0 +} + +func (x *RechargeBill) GetUsdMinorAmount() int64 { + if x != nil { + return x.UsdMinorAmount + } + return 0 +} + +func (x *RechargeBill) GetExchangeCoinAmount() int64 { + if x != nil { + return x.ExchangeCoinAmount + } + return 0 +} + +func (x *RechargeBill) GetExchangeUsdMinorAmount() int64 { + if x != nil { + return x.ExchangeUsdMinorAmount + } + return 0 +} + +func (x *RechargeBill) GetCreatedAtMs() int64 { + if x != nil { + return x.CreatedAtMs + } + return 0 +} + +type ListRechargeBillsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + UserId int64 `protobuf:"varint,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + SellerUserId int64 `protobuf:"varint,4,opt,name=seller_user_id,json=sellerUserId,proto3" json:"seller_user_id,omitempty"` + RegionId int64 `protobuf:"varint,5,opt,name=region_id,json=regionId,proto3" json:"region_id,omitempty"` + RechargeType string `protobuf:"bytes,6,opt,name=recharge_type,json=rechargeType,proto3" json:"recharge_type,omitempty"` + Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"` + Keyword string `protobuf:"bytes,8,opt,name=keyword,proto3" json:"keyword,omitempty"` + StartAtMs int64 `protobuf:"varint,9,opt,name=start_at_ms,json=startAtMs,proto3" json:"start_at_ms,omitempty"` + EndAtMs int64 `protobuf:"varint,10,opt,name=end_at_ms,json=endAtMs,proto3" json:"end_at_ms,omitempty"` + Page int32 `protobuf:"varint,11,opt,name=page,proto3" json:"page,omitempty"` + PageSize int32 `protobuf:"varint,12,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRechargeBillsRequest) Reset() { + *x = ListRechargeBillsRequest{} + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRechargeBillsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRechargeBillsRequest) ProtoMessage() {} + +func (x *ListRechargeBillsRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[49] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRechargeBillsRequest.ProtoReflect.Descriptor instead. +func (*ListRechargeBillsRequest) Descriptor() ([]byte, []int) { + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{49} +} + +func (x *ListRechargeBillsRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *ListRechargeBillsRequest) GetAppCode() string { + if x != nil { + return x.AppCode + } + return "" +} + +func (x *ListRechargeBillsRequest) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *ListRechargeBillsRequest) GetSellerUserId() int64 { + if x != nil { + return x.SellerUserId + } + return 0 +} + +func (x *ListRechargeBillsRequest) GetRegionId() int64 { + if x != nil { + return x.RegionId + } + return 0 +} + +func (x *ListRechargeBillsRequest) GetRechargeType() string { + if x != nil { + return x.RechargeType + } + return "" +} + +func (x *ListRechargeBillsRequest) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *ListRechargeBillsRequest) GetKeyword() string { + if x != nil { + return x.Keyword + } + return "" +} + +func (x *ListRechargeBillsRequest) GetStartAtMs() int64 { + if x != nil { + return x.StartAtMs + } + return 0 +} + +func (x *ListRechargeBillsRequest) GetEndAtMs() int64 { + if x != nil { + return x.EndAtMs + } + return 0 +} + +func (x *ListRechargeBillsRequest) GetPage() int32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *ListRechargeBillsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +type ListRechargeBillsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Bills []*RechargeBill `protobuf:"bytes,1,rep,name=bills,proto3" json:"bills,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRechargeBillsResponse) Reset() { + *x = ListRechargeBillsResponse{} + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRechargeBillsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRechargeBillsResponse) ProtoMessage() {} + +func (x *ListRechargeBillsResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[50] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRechargeBillsResponse.ProtoReflect.Descriptor instead. +func (*ListRechargeBillsResponse) Descriptor() ([]byte, []int) { + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{50} +} + +func (x *ListRechargeBillsResponse) GetBills() []*RechargeBill { + if x != nil { + return x.Bills + } + return nil +} + +func (x *ListRechargeBillsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + var File_proto_wallet_v1_wallet_proto protoreflect.FileDescriptor -var file_proto_wallet_v1_wallet_proto_rawDesc = []byte{ - 0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2f, 0x76, - 0x31, 0x2f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, - 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x22, - 0xab, 0x02, 0x0a, 0x10, 0x44, 0x65, 0x62, 0x69, 0x74, 0x47, 0x69, 0x66, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x69, 0x66, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x69, 0x66, 0x74, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x69, 0x66, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x67, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x9a, 0x02, - 0x0a, 0x11, 0x44, 0x65, 0x62, 0x69, 0x74, 0x47, 0x69, 0x66, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x49, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x69, 0x6e, - 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x6f, - 0x69, 0x6e, 0x53, 0x70, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x69, 0x66, 0x74, 0x5f, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x67, 0x69, 0x66, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x65, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x65, 0x61, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x68, 0x65, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x62, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x22, 0xb2, 0x01, 0x0a, 0x0c, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x41, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x5f, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x66, 0x72, - 0x6f, 0x7a, 0x65, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, - 0x88, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x50, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x39, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x52, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x95, 0x02, 0x0a, - 0x17, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, - 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x76, - 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x66, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, - 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, - 0x43, 0x6f, 0x64, 0x65, 0x22, 0x7a, 0x0a, 0x18, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, - 0x64, 0x69, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, - 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x22, 0xa9, 0x02, 0x0a, 0x1d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x69, - 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x6c, 0x65, - 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x19, 0x0a, - 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x65, 0x6c, 0x6c, - 0x65, 0x72, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0e, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x94, 0x04, 0x0a, - 0x1e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x69, 0x6e, 0x46, 0x72, 0x6f, - 0x6d, 0x53, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, - 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x75, - 0x73, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x55, 0x73, 0x64, 0x4d, 0x69, 0x6e, 0x6f, 0x72, - 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x14, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x63, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, - 0x67, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, - 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x1b, - 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x18, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x43, 0x6f, 0x69, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x20, 0x72, - 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x75, - 0x73, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1c, 0x72, 0x65, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x55, 0x73, 0x64, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0xc9, 0x05, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x53, - 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x75, 0x73, 0x61, 0x67, 0x65, - 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x75, - 0x72, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x6e, 0x69, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, - 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x42, - 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x22, - 0xc7, 0x03, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, - 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, - 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, - 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x22, 0x0a, 0x0d, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, - 0x11, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xad, 0x03, 0x0a, 0x0d, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, - 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x68, - 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, - 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x22, 0xe0, 0x04, 0x0a, 0x0a, 0x47, 0x69, - 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x69, 0x66, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x69, 0x66, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x35, 0x0a, - 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, - 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x6f, 0x69, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x67, 0x69, 0x66, - 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x68, 0x65, 0x61, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x68, 0x65, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2b, 0x0a, 0x12, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x42, 0x79, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x1d, 0x0a, - 0x0a, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, - 0x03, 0x52, 0x09, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0xeb, 0x03, 0x0a, - 0x17, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, - 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x71, 0x75, 0x61, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x72, 0x65, 0x6d, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x26, - 0x0a, 0x0f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6d, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, - 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x5f, 0x6d, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x22, 0x86, 0x03, 0x0a, 0x11, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x74, 0x65, 0x6d, - 0x12, 0x22, 0x0a, 0x0d, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x74, - 0x65, 0x6d, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x13, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x4d, 0x73, 0x22, 0xe1, 0x03, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0b, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, - 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x4d, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x22, 0x8e, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, - 0x1f, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, - 0x1b, 0x0a, 0x09, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x69, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x11, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xf9, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, - 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x66, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, - 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x6f, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x22, 0x4c, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xdc, 0x04, 0x0a, 0x15, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x75, 0x73, - 0x61, 0x67, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6e, 0x69, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, - 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xfd, 0x04, 0x0a, 0x15, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x75, 0x73, - 0x61, 0x67, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6e, 0x69, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x61, 0x6e, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x73, 0x6f, - 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xb7, 0x01, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x22, 0x49, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x68, 0x79, 0x61, - 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, - 0xd9, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, - 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x6a, 0x0a, 0x1a, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x68, 0x79, 0x61, 0x70, - 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x6e, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x22, 0x50, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xcb, 0x02, 0x0a, 0x1a, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x3d, - 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, - 0x6d, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x28, 0x0a, - 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0xe6, 0x02, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, - 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, - 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, - 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x22, 0xb6, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x4d, 0x0a, 0x15, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x98, 0x02, 0x0a, 0x16, 0x4c, 0x69, 0x73, - 0x74, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, - 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, - 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, - 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x66, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, - 0x0a, 0x05, 0x67, 0x69, 0x66, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x67, 0x69, 0x66, 0x74, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x85, 0x04, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, - 0x07, 0x67, 0x69, 0x66, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x67, 0x69, 0x66, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x12, - 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x6f, 0x69, 0x6e, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, - 0x67, 0x69, 0x66, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x68, 0x65, 0x61, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x68, 0x65, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x26, - 0x0a, 0x0f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6d, - 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0f, - 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, - 0x85, 0x04, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, - 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, - 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x69, 0x66, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x69, 0x66, 0x74, 0x49, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x63, 0x6f, 0x69, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x67, - 0x69, 0x66, 0x74, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x67, 0x69, 0x66, 0x74, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x65, 0x61, 0x74, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x68, 0x65, 0x61, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6d, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x41, 0x74, 0x4d, 0x73, 0x12, 0x28, - 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x1a, 0x53, 0x65, 0x74, 0x47, - 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x17, 0x0a, 0x07, 0x67, 0x69, 0x66, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x67, 0x69, 0x66, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x12, 0x47, - 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x67, 0x69, 0x66, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x04, 0x67, 0x69, - 0x66, 0x74, 0x22, 0xb9, 0x02, 0x0a, 0x14, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, - 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, - 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xfb, - 0x01, 0x0a, 0x19, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, - 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x15, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x05, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x18, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, - 0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, - 0x79, 0x22, 0x63, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, - 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x18, 0x45, 0x71, 0x75, 0x69, 0x70, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, - 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x61, - 0x0a, 0x19, 0x45, 0x71, 0x75, 0x69, 0x70, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x19, - 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x70, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x6a, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x32, 0xc0, 0x12, 0x0a, 0x0d, 0x57, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x69, 0x74, 0x47, - 0x69, 0x66, 0x74, 0x12, 0x21, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, - 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x62, 0x69, 0x74, 0x47, 0x69, 0x66, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, - 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x62, 0x69, 0x74, 0x47, 0x69, - 0x66, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0b, 0x47, 0x65, - 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x68, 0x79, 0x61, 0x70, - 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x10, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, - 0x64, 0x69, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, - 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, - 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x69, 0x6e, 0x46, 0x72, 0x6f, - 0x6d, 0x53, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x2e, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x43, 0x6f, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x6c, 0x6c, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x43, 0x6f, 0x69, 0x6e, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x6c, 0x6c, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x68, 0x79, 0x61, 0x70, - 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x68, - 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x68, - 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5b, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x26, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x68, 0x79, 0x61, 0x70, - 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x11, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x29, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x68, - 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x6d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2a, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2b, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, - 0x0a, 0x10, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x28, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x68, - 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2b, - 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x68, 0x79, - 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2b, 0x2e, 0x68, 0x79, 0x61, - 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x70, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x68, 0x79, 0x61, 0x70, - 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x68, 0x79, 0x61, 0x70, - 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x64, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x12, 0x27, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x66, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, - 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x2e, 0x68, 0x79, - 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, - 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, - 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x66, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, - 0x13, 0x53, 0x65, 0x74, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, - 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0d, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, - 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x12, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2a, 0x2e, 0x68, - 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, - 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x6a, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, - 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x11, - 0x45, 0x71, 0x75, 0x69, 0x70, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x29, 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x71, 0x75, 0x69, 0x70, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x68, - 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x71, 0x75, 0x69, 0x70, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x2a, - 0x2e, 0x68, 0x79, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x61, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x68, 0x79, 0x61, - 0x70, 0x70, 0x2e, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2a, 0x5a, 0x28, 0x68, 0x79, 0x61, 0x70, 0x70, - 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x77, 0x61, 0x6c, 0x6c, 0x65, - 0x74, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_proto_wallet_v1_wallet_proto_rawDesc = "" + + "\n" + + "\x1cproto/wallet/v1/wallet.proto\x12\x0fhyapp.wallet.v1\"\xab\x02\n" + + "\x10DebitGiftRequest\x12\x1d\n" + + "\n" + + "command_id\x18\x01 \x01(\tR\tcommandId\x12\x17\n" + + "\aroom_id\x18\x02 \x01(\tR\x06roomId\x12$\n" + + "\x0esender_user_id\x18\x03 \x01(\x03R\fsenderUserId\x12$\n" + + "\x0etarget_user_id\x18\x04 \x01(\x03R\ftargetUserId\x12\x17\n" + + "\agift_id\x18\x05 \x01(\tR\x06giftId\x12\x1d\n" + + "\n" + + "gift_count\x18\x06 \x01(\x05R\tgiftCount\x12#\n" + + "\rprice_version\x18\a \x01(\tR\fpriceVersion\x12\x19\n" + + "\bapp_code\x18\b \x01(\tR\aappCode\x12\x1b\n" + + "\tregion_id\x18\t \x01(\x03R\bregionId\"\xeb\x02\n" + + "\x11DebitGiftResponse\x12,\n" + + "\x12billing_receipt_id\x18\x01 \x01(\tR\x10billingReceiptId\x12%\n" + + "\x0etransaction_id\x18\x02 \x01(\tR\rtransactionId\x12\x1d\n" + + "\n" + + "coin_spent\x18\x03 \x01(\x03R\tcoinSpent\x12(\n" + + "\x10gift_point_added\x18\x04 \x01(\x03R\x0egiftPointAdded\x12\x1d\n" + + "\n" + + "heat_value\x18\x05 \x01(\x03R\theatValue\x12#\n" + + "\rprice_version\x18\x06 \x01(\tR\fpriceVersion\x12#\n" + + "\rbalance_after\x18\a \x01(\x03R\fbalanceAfter\x12*\n" + + "\x11charge_asset_type\x18\b \x01(\tR\x0fchargeAssetType\x12#\n" + + "\rcharge_amount\x18\t \x01(\x03R\fchargeAmount\"\xb2\x01\n" + + "\fAssetBalance\x12\x1d\n" + + "\n" + + "asset_type\x18\x01 \x01(\tR\tassetType\x12)\n" + + "\x10available_amount\x18\x02 \x01(\x03R\x0favailableAmount\x12#\n" + + "\rfrozen_amount\x18\x03 \x01(\x03R\ffrozenAmount\x12\x18\n" + + "\aversion\x18\x04 \x01(\x03R\aversion\x12\x19\n" + + "\bapp_code\x18\x05 \x01(\tR\aappCode\"\x88\x01\n" + + "\x12GetBalancesRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x17\n" + + "\auser_id\x18\x02 \x01(\x03R\x06userId\x12\x1f\n" + + "\vasset_types\x18\x03 \x03(\tR\n" + + "assetTypes\x12\x19\n" + + "\bapp_code\x18\x04 \x01(\tR\aappCode\"P\n" + + "\x13GetBalancesResponse\x129\n" + + "\bbalances\x18\x01 \x03(\v2\x1d.hyapp.wallet.v1.AssetBalanceR\bbalances\"\x95\x02\n" + + "\x17AdminCreditAssetRequest\x12\x1d\n" + + "\n" + + "command_id\x18\x01 \x01(\tR\tcommandId\x12$\n" + + "\x0etarget_user_id\x18\x02 \x01(\x03R\ftargetUserId\x12\x1d\n" + + "\n" + + "asset_type\x18\x03 \x01(\tR\tassetType\x12\x16\n" + + "\x06amount\x18\x04 \x01(\x03R\x06amount\x12(\n" + + "\x10operator_user_id\x18\x05 \x01(\x03R\x0eoperatorUserId\x12\x16\n" + + "\x06reason\x18\x06 \x01(\tR\x06reason\x12!\n" + + "\fevidence_ref\x18\a \x01(\tR\vevidenceRef\x12\x19\n" + + "\bapp_code\x18\b \x01(\tR\aappCode\"z\n" + + "\x18AdminCreditAssetResponse\x12%\n" + + "\x0etransaction_id\x18\x01 \x01(\tR\rtransactionId\x127\n" + + "\abalance\x18\x02 \x01(\v2\x1d.hyapp.wallet.v1.AssetBalanceR\abalance\"\xa9\x02\n" + + "\x1dTransferCoinFromSellerRequest\x12\x1d\n" + + "\n" + + "command_id\x18\x01 \x01(\tR\tcommandId\x12$\n" + + "\x0eseller_user_id\x18\x02 \x01(\x03R\fsellerUserId\x12$\n" + + "\x0etarget_user_id\x18\x03 \x01(\x03R\ftargetUserId\x12\x16\n" + + "\x06amount\x18\x04 \x01(\x03R\x06amount\x12\x16\n" + + "\x06reason\x18\x05 \x01(\tR\x06reason\x12\x19\n" + + "\bapp_code\x18\x06 \x01(\tR\aappCode\x12(\n" + + "\x10seller_region_id\x18\a \x01(\x03R\x0esellerRegionId\x12(\n" + + "\x10target_region_id\x18\b \x01(\x03R\x0etargetRegionId\"\x94\x04\n" + + "\x1eTransferCoinFromSellerResponse\x12%\n" + + "\x0etransaction_id\x18\x01 \x01(\tR\rtransactionId\x120\n" + + "\x14seller_balance_after\x18\x02 \x01(\x03R\x12sellerBalanceAfter\x120\n" + + "\x14target_balance_after\x18\x03 \x01(\x03R\x12targetBalanceAfter\x12\x16\n" + + "\x06amount\x18\x04 \x01(\x03R\x06amount\x12,\n" + + "\x12recharge_usd_minor\x18\x05 \x01(\x03R\x10rechargeUsdMinor\x124\n" + + "\x16recharge_currency_code\x18\x06 \x01(\tR\x14rechargeCurrencyCode\x12,\n" + + "\x12recharge_policy_id\x18\a \x01(\x03R\x10rechargePolicyId\x126\n" + + "\x17recharge_policy_version\x18\b \x01(\tR\x15rechargePolicyVersion\x12=\n" + + "\x1brecharge_policy_coin_amount\x18\t \x01(\x03R\x18rechargePolicyCoinAmount\x12F\n" + + " recharge_policy_usd_minor_amount\x18\n" + + " \x01(\x03R\x1crechargePolicyUsdMinorAmount\"\xc9\x05\n" + + "\bResource\x12\x19\n" + + "\bapp_code\x18\x01 \x01(\tR\aappCode\x12\x1f\n" + + "\vresource_id\x18\x02 \x01(\x03R\n" + + "resourceId\x12#\n" + + "\rresource_code\x18\x03 \x01(\tR\fresourceCode\x12#\n" + + "\rresource_type\x18\x04 \x01(\tR\fresourceType\x12\x12\n" + + "\x04name\x18\x05 \x01(\tR\x04name\x12\x16\n" + + "\x06status\x18\x06 \x01(\tR\x06status\x12\x1c\n" + + "\tgrantable\x18\a \x01(\bR\tgrantable\x12%\n" + + "\x0egrant_strategy\x18\b \x01(\tR\rgrantStrategy\x12*\n" + + "\x11wallet_asset_type\x18\t \x01(\tR\x0fwalletAssetType\x12.\n" + + "\x13wallet_asset_amount\x18\n" + + " \x01(\x03R\x11walletAssetAmount\x12!\n" + + "\fusage_scopes\x18\v \x03(\tR\vusageScopes\x12\x1b\n" + + "\tasset_url\x18\f \x01(\tR\bassetUrl\x12\x1f\n" + + "\vpreview_url\x18\r \x01(\tR\n" + + "previewUrl\x12#\n" + + "\ranimation_url\x18\x0e \x01(\tR\fanimationUrl\x12#\n" + + "\rmetadata_json\x18\x0f \x01(\tR\fmetadataJson\x12\x1d\n" + + "\n" + + "sort_order\x18\x10 \x01(\x05R\tsortOrder\x12+\n" + + "\x12created_by_user_id\x18\x11 \x01(\x03R\x0fcreatedByUserId\x12+\n" + + "\x12updated_by_user_id\x18\x12 \x01(\x03R\x0fupdatedByUserId\x12\"\n" + + "\rcreated_at_ms\x18\x13 \x01(\x03R\vcreatedAtMs\x12\"\n" + + "\rupdated_at_ms\x18\x14 \x01(\x03R\vupdatedAtMs\"\xc7\x03\n" + + "\x11ResourceGroupItem\x12\"\n" + + "\rgroup_item_id\x18\x01 \x01(\x03R\vgroupItemId\x12\x19\n" + + "\bgroup_id\x18\x02 \x01(\x03R\agroupId\x12\x1f\n" + + "\vresource_id\x18\x03 \x01(\x03R\n" + + "resourceId\x125\n" + + "\bresource\x18\x04 \x01(\v2\x19.hyapp.wallet.v1.ResourceR\bresource\x12\x1a\n" + + "\bquantity\x18\x05 \x01(\x03R\bquantity\x12\x1f\n" + + "\vduration_ms\x18\x06 \x01(\x03R\n" + + "durationMs\x12\x1d\n" + + "\n" + + "sort_order\x18\a \x01(\x05R\tsortOrder\x12\"\n" + + "\rcreated_at_ms\x18\b \x01(\x03R\vcreatedAtMs\x12\"\n" + + "\rupdated_at_ms\x18\t \x01(\x03R\vupdatedAtMs\x12\x1b\n" + + "\titem_type\x18\n" + + " \x01(\tR\bitemType\x12*\n" + + "\x11wallet_asset_type\x18\v \x01(\tR\x0fwalletAssetType\x12.\n" + + "\x13wallet_asset_amount\x18\f \x01(\x03R\x11walletAssetAmount\"\xad\x03\n" + + "\rResourceGroup\x12\x19\n" + + "\bapp_code\x18\x01 \x01(\tR\aappCode\x12\x19\n" + + "\bgroup_id\x18\x02 \x01(\x03R\agroupId\x12\x1d\n" + + "\n" + + "group_code\x18\x03 \x01(\tR\tgroupCode\x12\x12\n" + + "\x04name\x18\x04 \x01(\tR\x04name\x12\x16\n" + + "\x06status\x18\x05 \x01(\tR\x06status\x12 \n" + + "\vdescription\x18\x06 \x01(\tR\vdescription\x12\x1d\n" + + "\n" + + "sort_order\x18\a \x01(\x05R\tsortOrder\x128\n" + + "\x05items\x18\b \x03(\v2\".hyapp.wallet.v1.ResourceGroupItemR\x05items\x12+\n" + + "\x12created_by_user_id\x18\t \x01(\x03R\x0fcreatedByUserId\x12+\n" + + "\x12updated_by_user_id\x18\n" + + " \x01(\x03R\x0fupdatedByUserId\x12\"\n" + + "\rcreated_at_ms\x18\v \x01(\x03R\vcreatedAtMs\x12\"\n" + + "\rupdated_at_ms\x18\f \x01(\x03R\vupdatedAtMs\"\xa9\x06\n" + + "\n" + + "GiftConfig\x12\x19\n" + + "\bapp_code\x18\x01 \x01(\tR\aappCode\x12\x17\n" + + "\agift_id\x18\x02 \x01(\tR\x06giftId\x12\x1f\n" + + "\vresource_id\x18\x03 \x01(\x03R\n" + + "resourceId\x125\n" + + "\bresource\x18\x04 \x01(\v2\x19.hyapp.wallet.v1.ResourceR\bresource\x12\x16\n" + + "\x06status\x18\x05 \x01(\tR\x06status\x12\x12\n" + + "\x04name\x18\x06 \x01(\tR\x04name\x12\x1d\n" + + "\n" + + "sort_order\x18\a \x01(\x05R\tsortOrder\x12+\n" + + "\x11presentation_json\x18\b \x01(\tR\x10presentationJson\x12#\n" + + "\rprice_version\x18\t \x01(\tR\fpriceVersion\x12\x1d\n" + + "\n" + + "coin_price\x18\n" + + " \x01(\x03R\tcoinPrice\x12*\n" + + "\x11gift_point_amount\x18\v \x01(\x03R\x0fgiftPointAmount\x12\x1d\n" + + "\n" + + "heat_value\x18\f \x01(\x03R\theatValue\x12+\n" + + "\x12created_by_user_id\x18\r \x01(\x03R\x0fcreatedByUserId\x12+\n" + + "\x12updated_by_user_id\x18\x0e \x01(\x03R\x0fupdatedByUserId\x12\"\n" + + "\rcreated_at_ms\x18\x0f \x01(\x03R\vcreatedAtMs\x12\"\n" + + "\rupdated_at_ms\x18\x10 \x01(\x03R\vupdatedAtMs\x12\x1d\n" + + "\n" + + "region_ids\x18\x11 \x03(\x03R\tregionIds\x12$\n" + + "\x0egift_type_code\x18\x12 \x01(\tR\fgiftTypeCode\x12*\n" + + "\x11charge_asset_type\x18\x13 \x01(\tR\x0fchargeAssetType\x12*\n" + + "\x11effective_from_ms\x18\x14 \x01(\x03R\x0feffectiveFromMs\x12&\n" + + "\x0feffective_to_ms\x18\x15 \x01(\x03R\reffectiveToMs\x12!\n" + + "\feffect_types\x18\x16 \x03(\tR\veffectTypes\"\xeb\x03\n" + + "\x17UserResourceEntitlement\x12\x19\n" + + "\bapp_code\x18\x01 \x01(\tR\aappCode\x12%\n" + + "\x0eentitlement_id\x18\x02 \x01(\tR\rentitlementId\x12\x17\n" + + "\auser_id\x18\x03 \x01(\x03R\x06userId\x12\x1f\n" + + "\vresource_id\x18\x04 \x01(\x03R\n" + + "resourceId\x125\n" + + "\bresource\x18\x05 \x01(\v2\x19.hyapp.wallet.v1.ResourceR\bresource\x12\x16\n" + + "\x06status\x18\x06 \x01(\tR\x06status\x12\x1a\n" + + "\bquantity\x18\a \x01(\x03R\bquantity\x12-\n" + + "\x12remaining_quantity\x18\b \x01(\x03R\x11remainingQuantity\x12&\n" + + "\x0feffective_at_ms\x18\t \x01(\x03R\reffectiveAtMs\x12\"\n" + + "\rexpires_at_ms\x18\n" + + " \x01(\x03R\vexpiresAtMs\x12&\n" + + "\x0fsource_grant_id\x18\v \x01(\tR\rsourceGrantId\x12\"\n" + + "\rcreated_at_ms\x18\f \x01(\x03R\vcreatedAtMs\x12\"\n" + + "\rupdated_at_ms\x18\r \x01(\x03R\vupdatedAtMs\"\x86\x03\n" + + "\x11ResourceGrantItem\x12\"\n" + + "\rgrant_item_id\x18\x01 \x01(\x03R\vgrantItemId\x12\x19\n" + + "\bgrant_id\x18\x02 \x01(\tR\agrantId\x12\x1f\n" + + "\vresource_id\x18\x03 \x01(\x03R\n" + + "resourceId\x124\n" + + "\x16resource_snapshot_json\x18\x04 \x01(\tR\x14resourceSnapshotJson\x12\x1a\n" + + "\bquantity\x18\x05 \x01(\x03R\bquantity\x12\x1f\n" + + "\vduration_ms\x18\x06 \x01(\x03R\n" + + "durationMs\x12\x1f\n" + + "\vresult_type\x18\a \x01(\tR\n" + + "resultType\x122\n" + + "\x15wallet_transaction_id\x18\b \x01(\tR\x13walletTransactionId\x12%\n" + + "\x0eentitlement_id\x18\t \x01(\tR\rentitlementId\x12\"\n" + + "\rcreated_at_ms\x18\n" + + " \x01(\x03R\vcreatedAtMs\"\xe1\x03\n" + + "\rResourceGrant\x12\x19\n" + + "\bapp_code\x18\x01 \x01(\tR\aappCode\x12\x19\n" + + "\bgrant_id\x18\x02 \x01(\tR\agrantId\x12\x1d\n" + + "\n" + + "command_id\x18\x03 \x01(\tR\tcommandId\x12$\n" + + "\x0etarget_user_id\x18\x04 \x01(\x03R\ftargetUserId\x12!\n" + + "\fgrant_source\x18\x05 \x01(\tR\vgrantSource\x12,\n" + + "\x12grant_subject_type\x18\x06 \x01(\tR\x10grantSubjectType\x12(\n" + + "\x10grant_subject_id\x18\a \x01(\tR\x0egrantSubjectId\x12\x16\n" + + "\x06status\x18\b \x01(\tR\x06status\x12\x16\n" + + "\x06reason\x18\t \x01(\tR\x06reason\x12(\n" + + "\x10operator_user_id\x18\n" + + " \x01(\x03R\x0eoperatorUserId\x128\n" + + "\x05items\x18\v \x03(\v2\".hyapp.wallet.v1.ResourceGrantItemR\x05items\x12\"\n" + + "\rcreated_at_ms\x18\f \x01(\x03R\vcreatedAtMs\x12\"\n" + + "\rupdated_at_ms\x18\r \x01(\x03R\vupdatedAtMs\"\x8e\x02\n" + + "\x16ResourceGroupItemInput\x12\x1f\n" + + "\vresource_id\x18\x01 \x01(\x03R\n" + + "resourceId\x12\x1a\n" + + "\bquantity\x18\x02 \x01(\x03R\bquantity\x12\x1f\n" + + "\vduration_ms\x18\x03 \x01(\x03R\n" + + "durationMs\x12\x1d\n" + + "\n" + + "sort_order\x18\x04 \x01(\x05R\tsortOrder\x12\x1b\n" + + "\titem_type\x18\x05 \x01(\tR\bitemType\x12*\n" + + "\x11wallet_asset_type\x18\x06 \x01(\tR\x0fwalletAssetType\x12.\n" + + "\x13wallet_asset_amount\x18\a \x01(\x03R\x11walletAssetAmount\"\xf9\x01\n" + + "\x14ListResourcesRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12#\n" + + "\rresource_type\x18\x03 \x01(\tR\fresourceType\x12\x16\n" + + "\x06status\x18\x04 \x01(\tR\x06status\x12\x18\n" + + "\akeyword\x18\x05 \x01(\tR\akeyword\x12\x12\n" + + "\x04page\x18\x06 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\a \x01(\x05R\bpageSize\x12\x1f\n" + + "\vactive_only\x18\b \x01(\bR\n" + + "activeOnly\"f\n" + + "\x15ListResourcesResponse\x127\n" + + "\tresources\x18\x01 \x03(\v2\x19.hyapp.wallet.v1.ResourceR\tresources\x12\x14\n" + + "\x05total\x18\x02 \x01(\x03R\x05total\"o\n" + + "\x12GetResourceRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x1f\n" + + "\vresource_id\x18\x03 \x01(\x03R\n" + + "resourceId\"L\n" + + "\x13GetResourceResponse\x125\n" + + "\bresource\x18\x01 \x01(\v2\x19.hyapp.wallet.v1.ResourceR\bresource\"\xdc\x04\n" + + "\x15CreateResourceRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12#\n" + + "\rresource_code\x18\x03 \x01(\tR\fresourceCode\x12#\n" + + "\rresource_type\x18\x04 \x01(\tR\fresourceType\x12\x12\n" + + "\x04name\x18\x05 \x01(\tR\x04name\x12\x16\n" + + "\x06status\x18\x06 \x01(\tR\x06status\x12\x1c\n" + + "\tgrantable\x18\a \x01(\bR\tgrantable\x12%\n" + + "\x0egrant_strategy\x18\b \x01(\tR\rgrantStrategy\x12*\n" + + "\x11wallet_asset_type\x18\t \x01(\tR\x0fwalletAssetType\x12.\n" + + "\x13wallet_asset_amount\x18\n" + + " \x01(\x03R\x11walletAssetAmount\x12!\n" + + "\fusage_scopes\x18\v \x03(\tR\vusageScopes\x12\x1b\n" + + "\tasset_url\x18\f \x01(\tR\bassetUrl\x12\x1f\n" + + "\vpreview_url\x18\r \x01(\tR\n" + + "previewUrl\x12#\n" + + "\ranimation_url\x18\x0e \x01(\tR\fanimationUrl\x12#\n" + + "\rmetadata_json\x18\x0f \x01(\tR\fmetadataJson\x12\x1d\n" + + "\n" + + "sort_order\x18\x10 \x01(\x05R\tsortOrder\x12(\n" + + "\x10operator_user_id\x18\x11 \x01(\x03R\x0eoperatorUserId\"\xfd\x04\n" + + "\x15UpdateResourceRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x1f\n" + + "\vresource_id\x18\x03 \x01(\x03R\n" + + "resourceId\x12#\n" + + "\rresource_code\x18\x04 \x01(\tR\fresourceCode\x12#\n" + + "\rresource_type\x18\x05 \x01(\tR\fresourceType\x12\x12\n" + + "\x04name\x18\x06 \x01(\tR\x04name\x12\x16\n" + + "\x06status\x18\a \x01(\tR\x06status\x12\x1c\n" + + "\tgrantable\x18\b \x01(\bR\tgrantable\x12%\n" + + "\x0egrant_strategy\x18\t \x01(\tR\rgrantStrategy\x12*\n" + + "\x11wallet_asset_type\x18\n" + + " \x01(\tR\x0fwalletAssetType\x12.\n" + + "\x13wallet_asset_amount\x18\v \x01(\x03R\x11walletAssetAmount\x12!\n" + + "\fusage_scopes\x18\f \x03(\tR\vusageScopes\x12\x1b\n" + + "\tasset_url\x18\r \x01(\tR\bassetUrl\x12\x1f\n" + + "\vpreview_url\x18\x0e \x01(\tR\n" + + "previewUrl\x12#\n" + + "\ranimation_url\x18\x0f \x01(\tR\fanimationUrl\x12#\n" + + "\rmetadata_json\x18\x10 \x01(\tR\fmetadataJson\x12\x1d\n" + + "\n" + + "sort_order\x18\x11 \x01(\x05R\tsortOrder\x12(\n" + + "\x10operator_user_id\x18\x12 \x01(\x03R\x0eoperatorUserId\"\xb7\x01\n" + + "\x18SetResourceStatusRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x1f\n" + + "\vresource_id\x18\x03 \x01(\x03R\n" + + "resourceId\x12\x16\n" + + "\x06status\x18\x04 \x01(\tR\x06status\x12(\n" + + "\x10operator_user_id\x18\x05 \x01(\x03R\x0eoperatorUserId\"I\n" + + "\x10ResourceResponse\x125\n" + + "\bresource\x18\x01 \x01(\v2\x19.hyapp.wallet.v1.ResourceR\bresource\"\xd9\x01\n" + + "\x19ListResourceGroupsRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12\x18\n" + + "\akeyword\x18\x04 \x01(\tR\akeyword\x12\x12\n" + + "\x04page\x18\x05 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\x06 \x01(\x05R\bpageSize\x12\x1f\n" + + "\vactive_only\x18\a \x01(\bR\n" + + "activeOnly\"j\n" + + "\x1aListResourceGroupsResponse\x126\n" + + "\x06groups\x18\x01 \x03(\v2\x1e.hyapp.wallet.v1.ResourceGroupR\x06groups\x12\x14\n" + + "\x05total\x18\x02 \x01(\x03R\x05total\"n\n" + + "\x17GetResourceGroupRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x19\n" + + "\bgroup_id\x18\x03 \x01(\x03R\agroupId\"P\n" + + "\x18GetResourceGroupResponse\x124\n" + + "\x05group\x18\x01 \x01(\v2\x1e.hyapp.wallet.v1.ResourceGroupR\x05group\"\xcb\x02\n" + + "\x1aCreateResourceGroupRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x1d\n" + + "\n" + + "group_code\x18\x03 \x01(\tR\tgroupCode\x12\x12\n" + + "\x04name\x18\x04 \x01(\tR\x04name\x12\x16\n" + + "\x06status\x18\x05 \x01(\tR\x06status\x12 \n" + + "\vdescription\x18\x06 \x01(\tR\vdescription\x12\x1d\n" + + "\n" + + "sort_order\x18\a \x01(\x05R\tsortOrder\x12=\n" + + "\x05items\x18\b \x03(\v2'.hyapp.wallet.v1.ResourceGroupItemInputR\x05items\x12(\n" + + "\x10operator_user_id\x18\t \x01(\x03R\x0eoperatorUserId\"\xe6\x02\n" + + "\x1aUpdateResourceGroupRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x19\n" + + "\bgroup_id\x18\x03 \x01(\x03R\agroupId\x12\x1d\n" + + "\n" + + "group_code\x18\x04 \x01(\tR\tgroupCode\x12\x12\n" + + "\x04name\x18\x05 \x01(\tR\x04name\x12\x16\n" + + "\x06status\x18\x06 \x01(\tR\x06status\x12 \n" + + "\vdescription\x18\a \x01(\tR\vdescription\x12\x1d\n" + + "\n" + + "sort_order\x18\b \x01(\x05R\tsortOrder\x12=\n" + + "\x05items\x18\t \x03(\v2'.hyapp.wallet.v1.ResourceGroupItemInputR\x05items\x12(\n" + + "\x10operator_user_id\x18\n" + + " \x01(\x03R\x0eoperatorUserId\"\xb6\x01\n" + + "\x1dSetResourceGroupStatusRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x19\n" + + "\bgroup_id\x18\x03 \x01(\x03R\agroupId\x12\x16\n" + + "\x06status\x18\x04 \x01(\tR\x06status\x12(\n" + + "\x10operator_user_id\x18\x05 \x01(\x03R\x0eoperatorUserId\"M\n" + + "\x15ResourceGroupResponse\x124\n" + + "\x05group\x18\x01 \x01(\v2\x1e.hyapp.wallet.v1.ResourceGroupR\x05group\"\x98\x02\n" + + "\x16ListGiftConfigsRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12\x18\n" + + "\akeyword\x18\x04 \x01(\tR\akeyword\x12\x12\n" + + "\x04page\x18\x05 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\x06 \x01(\x05R\bpageSize\x12\x1f\n" + + "\vactive_only\x18\a \x01(\bR\n" + + "activeOnly\x12\x1b\n" + + "\tregion_id\x18\b \x01(\x03R\bregionId\x12#\n" + + "\rfilter_region\x18\t \x01(\bR\ffilterRegion\"b\n" + + "\x17ListGiftConfigsResponse\x121\n" + + "\x05gifts\x18\x01 \x03(\v2\x1b.hyapp.wallet.v1.GiftConfigR\x05gifts\x12\x14\n" + + "\x05total\x18\x02 \x01(\x03R\x05total\"\xce\x05\n" + + "\x17CreateGiftConfigRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x17\n" + + "\agift_id\x18\x03 \x01(\tR\x06giftId\x12\x1f\n" + + "\vresource_id\x18\x04 \x01(\x03R\n" + + "resourceId\x12\x16\n" + + "\x06status\x18\x05 \x01(\tR\x06status\x12\x12\n" + + "\x04name\x18\x06 \x01(\tR\x04name\x12\x1d\n" + + "\n" + + "sort_order\x18\a \x01(\x05R\tsortOrder\x12+\n" + + "\x11presentation_json\x18\b \x01(\tR\x10presentationJson\x12#\n" + + "\rprice_version\x18\t \x01(\tR\fpriceVersion\x12\x1d\n" + + "\n" + + "coin_price\x18\n" + + " \x01(\x03R\tcoinPrice\x12*\n" + + "\x11gift_point_amount\x18\v \x01(\x03R\x0fgiftPointAmount\x12\x1d\n" + + "\n" + + "heat_value\x18\f \x01(\x03R\theatValue\x12&\n" + + "\x0feffective_at_ms\x18\r \x01(\x03R\reffectiveAtMs\x12(\n" + + "\x10operator_user_id\x18\x0e \x01(\x03R\x0eoperatorUserId\x12\x1d\n" + + "\n" + + "region_ids\x18\x0f \x03(\x03R\tregionIds\x12$\n" + + "\x0egift_type_code\x18\x10 \x01(\tR\fgiftTypeCode\x12*\n" + + "\x11charge_asset_type\x18\x11 \x01(\tR\x0fchargeAssetType\x12*\n" + + "\x11effective_from_ms\x18\x12 \x01(\x03R\x0feffectiveFromMs\x12&\n" + + "\x0feffective_to_ms\x18\x13 \x01(\x03R\reffectiveToMs\x12!\n" + + "\feffect_types\x18\x14 \x03(\tR\veffectTypes\"\xce\x05\n" + + "\x17UpdateGiftConfigRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x17\n" + + "\agift_id\x18\x03 \x01(\tR\x06giftId\x12\x1f\n" + + "\vresource_id\x18\x04 \x01(\x03R\n" + + "resourceId\x12\x16\n" + + "\x06status\x18\x05 \x01(\tR\x06status\x12\x12\n" + + "\x04name\x18\x06 \x01(\tR\x04name\x12\x1d\n" + + "\n" + + "sort_order\x18\a \x01(\x05R\tsortOrder\x12+\n" + + "\x11presentation_json\x18\b \x01(\tR\x10presentationJson\x12#\n" + + "\rprice_version\x18\t \x01(\tR\fpriceVersion\x12\x1d\n" + + "\n" + + "coin_price\x18\n" + + " \x01(\x03R\tcoinPrice\x12*\n" + + "\x11gift_point_amount\x18\v \x01(\x03R\x0fgiftPointAmount\x12\x1d\n" + + "\n" + + "heat_value\x18\f \x01(\x03R\theatValue\x12&\n" + + "\x0feffective_at_ms\x18\r \x01(\x03R\reffectiveAtMs\x12(\n" + + "\x10operator_user_id\x18\x0e \x01(\x03R\x0eoperatorUserId\x12\x1d\n" + + "\n" + + "region_ids\x18\x0f \x03(\x03R\tregionIds\x12$\n" + + "\x0egift_type_code\x18\x10 \x01(\tR\fgiftTypeCode\x12*\n" + + "\x11charge_asset_type\x18\x11 \x01(\tR\x0fchargeAssetType\x12*\n" + + "\x11effective_from_ms\x18\x12 \x01(\x03R\x0feffectiveFromMs\x12&\n" + + "\x0feffective_to_ms\x18\x13 \x01(\x03R\reffectiveToMs\x12!\n" + + "\feffect_types\x18\x14 \x03(\tR\veffectTypes\"\xb1\x01\n" + + "\x1aSetGiftConfigStatusRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x17\n" + + "\agift_id\x18\x03 \x01(\tR\x06giftId\x12\x16\n" + + "\x06status\x18\x04 \x01(\tR\x06status\x12(\n" + + "\x10operator_user_id\x18\x05 \x01(\x03R\x0eoperatorUserId\"E\n" + + "\x12GiftConfigResponse\x12/\n" + + "\x04gift\x18\x01 \x01(\v2\x1b.hyapp.wallet.v1.GiftConfigR\x04gift\"\xb9\x02\n" + + "\x14GrantResourceRequest\x12\x1d\n" + + "\n" + + "command_id\x18\x01 \x01(\tR\tcommandId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12$\n" + + "\x0etarget_user_id\x18\x03 \x01(\x03R\ftargetUserId\x12\x1f\n" + + "\vresource_id\x18\x04 \x01(\x03R\n" + + "resourceId\x12\x1a\n" + + "\bquantity\x18\x05 \x01(\x03R\bquantity\x12\x1f\n" + + "\vduration_ms\x18\x06 \x01(\x03R\n" + + "durationMs\x12\x16\n" + + "\x06reason\x18\a \x01(\tR\x06reason\x12(\n" + + "\x10operator_user_id\x18\b \x01(\x03R\x0eoperatorUserId\x12!\n" + + "\fgrant_source\x18\t \x01(\tR\vgrantSource\"\xfb\x01\n" + + "\x19GrantResourceGroupRequest\x12\x1d\n" + + "\n" + + "command_id\x18\x01 \x01(\tR\tcommandId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12$\n" + + "\x0etarget_user_id\x18\x03 \x01(\x03R\ftargetUserId\x12\x19\n" + + "\bgroup_id\x18\x04 \x01(\x03R\agroupId\x12\x16\n" + + "\x06reason\x18\x05 \x01(\tR\x06reason\x12(\n" + + "\x10operator_user_id\x18\x06 \x01(\x03R\x0eoperatorUserId\x12!\n" + + "\fgrant_source\x18\a \x01(\tR\vgrantSource\"M\n" + + "\x15ResourceGrantResponse\x124\n" + + "\x05grant\x18\x01 \x01(\v2\x1e.hyapp.wallet.v1.ResourceGrantR\x05grant\"\xb3\x01\n" + + "\x18ListUserResourcesRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x17\n" + + "\auser_id\x18\x03 \x01(\x03R\x06userId\x12#\n" + + "\rresource_type\x18\x04 \x01(\tR\fresourceType\x12\x1f\n" + + "\vactive_only\x18\x05 \x01(\bR\n" + + "activeOnly\"c\n" + + "\x19ListUserResourcesResponse\x12F\n" + + "\tresources\x18\x01 \x03(\v2(.hyapp.wallet.v1.UserResourceEntitlementR\tresources\"\xb5\x01\n" + + "\x18EquipUserResourceRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x17\n" + + "\auser_id\x18\x03 \x01(\x03R\x06userId\x12\x1f\n" + + "\vresource_id\x18\x04 \x01(\x03R\n" + + "resourceId\x12%\n" + + "\x0eentitlement_id\x18\x05 \x01(\tR\rentitlementId\"a\n" + + "\x19EquipUserResourceResponse\x12D\n" + + "\bresource\x18\x01 \x01(\v2(.hyapp.wallet.v1.UserResourceEntitlementR\bresource\"\xc4\x01\n" + + "\x19ListResourceGrantsRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12$\n" + + "\x0etarget_user_id\x18\x03 \x01(\x03R\ftargetUserId\x12\x16\n" + + "\x06status\x18\x04 \x01(\tR\x06status\x12\x12\n" + + "\x04page\x18\x05 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\x06 \x01(\x05R\bpageSize\"j\n" + + "\x1aListResourceGrantsResponse\x126\n" + + "\x06grants\x18\x01 \x03(\v2\x1e.hyapp.wallet.v1.ResourceGrantR\x06grants\x12\x14\n" + + "\x05total\x18\x02 \x01(\x03R\x05total\"\xa7\x05\n" + + "\fRechargeBill\x12\x19\n" + + "\bapp_code\x18\x01 \x01(\tR\aappCode\x12%\n" + + "\x0etransaction_id\x18\x02 \x01(\tR\rtransactionId\x12\x1d\n" + + "\n" + + "command_id\x18\x03 \x01(\tR\tcommandId\x12#\n" + + "\rrecharge_type\x18\x04 \x01(\tR\frechargeType\x12\x16\n" + + "\x06status\x18\x05 \x01(\tR\x06status\x12!\n" + + "\fexternal_ref\x18\x06 \x01(\tR\vexternalRef\x12\x17\n" + + "\auser_id\x18\a \x01(\x03R\x06userId\x12$\n" + + "\x0eseller_user_id\x18\b \x01(\x03R\fsellerUserId\x12(\n" + + "\x10seller_region_id\x18\t \x01(\x03R\x0esellerRegionId\x12(\n" + + "\x10target_region_id\x18\n" + + " \x01(\x03R\x0etargetRegionId\x12\x1b\n" + + "\tpolicy_id\x18\v \x01(\x03R\bpolicyId\x12%\n" + + "\x0epolicy_version\x18\f \x01(\tR\rpolicyVersion\x12#\n" + + "\rcurrency_code\x18\r \x01(\tR\fcurrencyCode\x12\x1f\n" + + "\vcoin_amount\x18\x0e \x01(\x03R\n" + + "coinAmount\x12(\n" + + "\x10usd_minor_amount\x18\x0f \x01(\x03R\x0eusdMinorAmount\x120\n" + + "\x14exchange_coin_amount\x18\x10 \x01(\x03R\x12exchangeCoinAmount\x129\n" + + "\x19exchange_usd_minor_amount\x18\x11 \x01(\x03R\x16exchangeUsdMinorAmount\x12\"\n" + + "\rcreated_at_ms\x18\x12 \x01(\x03R\vcreatedAtMs\"\xf4\x02\n" + + "\x18ListRechargeBillsRequest\x12\x1d\n" + + "\n" + + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x17\n" + + "\auser_id\x18\x03 \x01(\x03R\x06userId\x12$\n" + + "\x0eseller_user_id\x18\x04 \x01(\x03R\fsellerUserId\x12\x1b\n" + + "\tregion_id\x18\x05 \x01(\x03R\bregionId\x12#\n" + + "\rrecharge_type\x18\x06 \x01(\tR\frechargeType\x12\x16\n" + + "\x06status\x18\a \x01(\tR\x06status\x12\x18\n" + + "\akeyword\x18\b \x01(\tR\akeyword\x12\x1e\n" + + "\vstart_at_ms\x18\t \x01(\x03R\tstartAtMs\x12\x1a\n" + + "\tend_at_ms\x18\n" + + " \x01(\x03R\aendAtMs\x12\x12\n" + + "\x04page\x18\v \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\f \x01(\x05R\bpageSize\"f\n" + + "\x19ListRechargeBillsResponse\x123\n" + + "\x05bills\x18\x01 \x03(\v2\x1d.hyapp.wallet.v1.RechargeBillR\x05bills\x12\x14\n" + + "\x05total\x18\x02 \x01(\x03R\x05total2\xac\x13\n" + + "\rWalletService\x12R\n" + + "\tDebitGift\x12!.hyapp.wallet.v1.DebitGiftRequest\x1a\".hyapp.wallet.v1.DebitGiftResponse\x12X\n" + + "\vGetBalances\x12#.hyapp.wallet.v1.GetBalancesRequest\x1a$.hyapp.wallet.v1.GetBalancesResponse\x12g\n" + + "\x10AdminCreditAsset\x12(.hyapp.wallet.v1.AdminCreditAssetRequest\x1a).hyapp.wallet.v1.AdminCreditAssetResponse\x12y\n" + + "\x16TransferCoinFromSeller\x12..hyapp.wallet.v1.TransferCoinFromSellerRequest\x1a/.hyapp.wallet.v1.TransferCoinFromSellerResponse\x12^\n" + + "\rListResources\x12%.hyapp.wallet.v1.ListResourcesRequest\x1a&.hyapp.wallet.v1.ListResourcesResponse\x12X\n" + + "\vGetResource\x12#.hyapp.wallet.v1.GetResourceRequest\x1a$.hyapp.wallet.v1.GetResourceResponse\x12[\n" + + "\x0eCreateResource\x12&.hyapp.wallet.v1.CreateResourceRequest\x1a!.hyapp.wallet.v1.ResourceResponse\x12[\n" + + "\x0eUpdateResource\x12&.hyapp.wallet.v1.UpdateResourceRequest\x1a!.hyapp.wallet.v1.ResourceResponse\x12a\n" + + "\x11SetResourceStatus\x12).hyapp.wallet.v1.SetResourceStatusRequest\x1a!.hyapp.wallet.v1.ResourceResponse\x12m\n" + + "\x12ListResourceGroups\x12*.hyapp.wallet.v1.ListResourceGroupsRequest\x1a+.hyapp.wallet.v1.ListResourceGroupsResponse\x12g\n" + + "\x10GetResourceGroup\x12(.hyapp.wallet.v1.GetResourceGroupRequest\x1a).hyapp.wallet.v1.GetResourceGroupResponse\x12j\n" + + "\x13CreateResourceGroup\x12+.hyapp.wallet.v1.CreateResourceGroupRequest\x1a&.hyapp.wallet.v1.ResourceGroupResponse\x12j\n" + + "\x13UpdateResourceGroup\x12+.hyapp.wallet.v1.UpdateResourceGroupRequest\x1a&.hyapp.wallet.v1.ResourceGroupResponse\x12p\n" + + "\x16SetResourceGroupStatus\x12..hyapp.wallet.v1.SetResourceGroupStatusRequest\x1a&.hyapp.wallet.v1.ResourceGroupResponse\x12d\n" + + "\x0fListGiftConfigs\x12'.hyapp.wallet.v1.ListGiftConfigsRequest\x1a(.hyapp.wallet.v1.ListGiftConfigsResponse\x12a\n" + + "\x10CreateGiftConfig\x12(.hyapp.wallet.v1.CreateGiftConfigRequest\x1a#.hyapp.wallet.v1.GiftConfigResponse\x12a\n" + + "\x10UpdateGiftConfig\x12(.hyapp.wallet.v1.UpdateGiftConfigRequest\x1a#.hyapp.wallet.v1.GiftConfigResponse\x12g\n" + + "\x13SetGiftConfigStatus\x12+.hyapp.wallet.v1.SetGiftConfigStatusRequest\x1a#.hyapp.wallet.v1.GiftConfigResponse\x12^\n" + + "\rGrantResource\x12%.hyapp.wallet.v1.GrantResourceRequest\x1a&.hyapp.wallet.v1.ResourceGrantResponse\x12h\n" + + "\x12GrantResourceGroup\x12*.hyapp.wallet.v1.GrantResourceGroupRequest\x1a&.hyapp.wallet.v1.ResourceGrantResponse\x12j\n" + + "\x11ListUserResources\x12).hyapp.wallet.v1.ListUserResourcesRequest\x1a*.hyapp.wallet.v1.ListUserResourcesResponse\x12j\n" + + "\x11EquipUserResource\x12).hyapp.wallet.v1.EquipUserResourceRequest\x1a*.hyapp.wallet.v1.EquipUserResourceResponse\x12m\n" + + "\x12ListResourceGrants\x12*.hyapp.wallet.v1.ListResourceGrantsRequest\x1a+.hyapp.wallet.v1.ListResourceGrantsResponse\x12j\n" + + "\x11ListRechargeBills\x12).hyapp.wallet.v1.ListRechargeBillsRequest\x1a*.hyapp.wallet.v1.ListRechargeBillsResponseB*Z(hyapp.local/api/proto/wallet/v1;walletv1b\x06proto3" var ( file_proto_wallet_v1_wallet_proto_rawDescOnce sync.Once - file_proto_wallet_v1_wallet_proto_rawDescData = file_proto_wallet_v1_wallet_proto_rawDesc + file_proto_wallet_v1_wallet_proto_rawDescData []byte ) func file_proto_wallet_v1_wallet_proto_rawDescGZIP() []byte { file_proto_wallet_v1_wallet_proto_rawDescOnce.Do(func() { - file_proto_wallet_v1_wallet_proto_rawDescData = protoimpl.X.CompressGZIP(file_proto_wallet_v1_wallet_proto_rawDescData) + file_proto_wallet_v1_wallet_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_proto_wallet_v1_wallet_proto_rawDesc), len(file_proto_wallet_v1_wallet_proto_rawDesc))) }) return file_proto_wallet_v1_wallet_proto_rawDescData } -var file_proto_wallet_v1_wallet_proto_msgTypes = make([]protoimpl.MessageInfo, 48) +var file_proto_wallet_v1_wallet_proto_msgTypes = make([]protoimpl.MessageInfo, 51) var file_proto_wallet_v1_wallet_proto_goTypes = []any{ (*DebitGiftRequest)(nil), // 0: hyapp.wallet.v1.DebitGiftRequest (*DebitGiftResponse)(nil), // 1: hyapp.wallet.v1.DebitGiftResponse @@ -5607,6 +5566,9 @@ var file_proto_wallet_v1_wallet_proto_goTypes = []any{ (*EquipUserResourceResponse)(nil), // 45: hyapp.wallet.v1.EquipUserResourceResponse (*ListResourceGrantsRequest)(nil), // 46: hyapp.wallet.v1.ListResourceGrantsRequest (*ListResourceGrantsResponse)(nil), // 47: hyapp.wallet.v1.ListResourceGrantsResponse + (*RechargeBill)(nil), // 48: hyapp.wallet.v1.RechargeBill + (*ListRechargeBillsRequest)(nil), // 49: hyapp.wallet.v1.ListRechargeBillsRequest + (*ListRechargeBillsResponse)(nil), // 50: hyapp.wallet.v1.ListRechargeBillsResponse } var file_proto_wallet_v1_wallet_proto_depIdxs = []int32{ 2, // 0: hyapp.wallet.v1.GetBalancesResponse.balances:type_name -> hyapp.wallet.v1.AssetBalance @@ -5630,57 +5592,60 @@ var file_proto_wallet_v1_wallet_proto_depIdxs = []int32{ 13, // 18: hyapp.wallet.v1.ListUserResourcesResponse.resources:type_name -> hyapp.wallet.v1.UserResourceEntitlement 13, // 19: hyapp.wallet.v1.EquipUserResourceResponse.resource:type_name -> hyapp.wallet.v1.UserResourceEntitlement 15, // 20: hyapp.wallet.v1.ListResourceGrantsResponse.grants:type_name -> hyapp.wallet.v1.ResourceGrant - 0, // 21: hyapp.wallet.v1.WalletService.DebitGift:input_type -> hyapp.wallet.v1.DebitGiftRequest - 3, // 22: hyapp.wallet.v1.WalletService.GetBalances:input_type -> hyapp.wallet.v1.GetBalancesRequest - 5, // 23: hyapp.wallet.v1.WalletService.AdminCreditAsset:input_type -> hyapp.wallet.v1.AdminCreditAssetRequest - 7, // 24: hyapp.wallet.v1.WalletService.TransferCoinFromSeller:input_type -> hyapp.wallet.v1.TransferCoinFromSellerRequest - 17, // 25: hyapp.wallet.v1.WalletService.ListResources:input_type -> hyapp.wallet.v1.ListResourcesRequest - 19, // 26: hyapp.wallet.v1.WalletService.GetResource:input_type -> hyapp.wallet.v1.GetResourceRequest - 21, // 27: hyapp.wallet.v1.WalletService.CreateResource:input_type -> hyapp.wallet.v1.CreateResourceRequest - 22, // 28: hyapp.wallet.v1.WalletService.UpdateResource:input_type -> hyapp.wallet.v1.UpdateResourceRequest - 23, // 29: hyapp.wallet.v1.WalletService.SetResourceStatus:input_type -> hyapp.wallet.v1.SetResourceStatusRequest - 25, // 30: hyapp.wallet.v1.WalletService.ListResourceGroups:input_type -> hyapp.wallet.v1.ListResourceGroupsRequest - 27, // 31: hyapp.wallet.v1.WalletService.GetResourceGroup:input_type -> hyapp.wallet.v1.GetResourceGroupRequest - 29, // 32: hyapp.wallet.v1.WalletService.CreateResourceGroup:input_type -> hyapp.wallet.v1.CreateResourceGroupRequest - 30, // 33: hyapp.wallet.v1.WalletService.UpdateResourceGroup:input_type -> hyapp.wallet.v1.UpdateResourceGroupRequest - 31, // 34: hyapp.wallet.v1.WalletService.SetResourceGroupStatus:input_type -> hyapp.wallet.v1.SetResourceGroupStatusRequest - 33, // 35: hyapp.wallet.v1.WalletService.ListGiftConfigs:input_type -> hyapp.wallet.v1.ListGiftConfigsRequest - 35, // 36: hyapp.wallet.v1.WalletService.CreateGiftConfig:input_type -> hyapp.wallet.v1.CreateGiftConfigRequest - 36, // 37: hyapp.wallet.v1.WalletService.UpdateGiftConfig:input_type -> hyapp.wallet.v1.UpdateGiftConfigRequest - 37, // 38: hyapp.wallet.v1.WalletService.SetGiftConfigStatus:input_type -> hyapp.wallet.v1.SetGiftConfigStatusRequest - 39, // 39: hyapp.wallet.v1.WalletService.GrantResource:input_type -> hyapp.wallet.v1.GrantResourceRequest - 40, // 40: hyapp.wallet.v1.WalletService.GrantResourceGroup:input_type -> hyapp.wallet.v1.GrantResourceGroupRequest - 42, // 41: hyapp.wallet.v1.WalletService.ListUserResources:input_type -> hyapp.wallet.v1.ListUserResourcesRequest - 44, // 42: hyapp.wallet.v1.WalletService.EquipUserResource:input_type -> hyapp.wallet.v1.EquipUserResourceRequest - 46, // 43: hyapp.wallet.v1.WalletService.ListResourceGrants:input_type -> hyapp.wallet.v1.ListResourceGrantsRequest - 1, // 44: hyapp.wallet.v1.WalletService.DebitGift:output_type -> hyapp.wallet.v1.DebitGiftResponse - 4, // 45: hyapp.wallet.v1.WalletService.GetBalances:output_type -> hyapp.wallet.v1.GetBalancesResponse - 6, // 46: hyapp.wallet.v1.WalletService.AdminCreditAsset:output_type -> hyapp.wallet.v1.AdminCreditAssetResponse - 8, // 47: hyapp.wallet.v1.WalletService.TransferCoinFromSeller:output_type -> hyapp.wallet.v1.TransferCoinFromSellerResponse - 18, // 48: hyapp.wallet.v1.WalletService.ListResources:output_type -> hyapp.wallet.v1.ListResourcesResponse - 20, // 49: hyapp.wallet.v1.WalletService.GetResource:output_type -> hyapp.wallet.v1.GetResourceResponse - 24, // 50: hyapp.wallet.v1.WalletService.CreateResource:output_type -> hyapp.wallet.v1.ResourceResponse - 24, // 51: hyapp.wallet.v1.WalletService.UpdateResource:output_type -> hyapp.wallet.v1.ResourceResponse - 24, // 52: hyapp.wallet.v1.WalletService.SetResourceStatus:output_type -> hyapp.wallet.v1.ResourceResponse - 26, // 53: hyapp.wallet.v1.WalletService.ListResourceGroups:output_type -> hyapp.wallet.v1.ListResourceGroupsResponse - 28, // 54: hyapp.wallet.v1.WalletService.GetResourceGroup:output_type -> hyapp.wallet.v1.GetResourceGroupResponse - 32, // 55: hyapp.wallet.v1.WalletService.CreateResourceGroup:output_type -> hyapp.wallet.v1.ResourceGroupResponse - 32, // 56: hyapp.wallet.v1.WalletService.UpdateResourceGroup:output_type -> hyapp.wallet.v1.ResourceGroupResponse - 32, // 57: hyapp.wallet.v1.WalletService.SetResourceGroupStatus:output_type -> hyapp.wallet.v1.ResourceGroupResponse - 34, // 58: hyapp.wallet.v1.WalletService.ListGiftConfigs:output_type -> hyapp.wallet.v1.ListGiftConfigsResponse - 38, // 59: hyapp.wallet.v1.WalletService.CreateGiftConfig:output_type -> hyapp.wallet.v1.GiftConfigResponse - 38, // 60: hyapp.wallet.v1.WalletService.UpdateGiftConfig:output_type -> hyapp.wallet.v1.GiftConfigResponse - 38, // 61: hyapp.wallet.v1.WalletService.SetGiftConfigStatus:output_type -> hyapp.wallet.v1.GiftConfigResponse - 41, // 62: hyapp.wallet.v1.WalletService.GrantResource:output_type -> hyapp.wallet.v1.ResourceGrantResponse - 41, // 63: hyapp.wallet.v1.WalletService.GrantResourceGroup:output_type -> hyapp.wallet.v1.ResourceGrantResponse - 43, // 64: hyapp.wallet.v1.WalletService.ListUserResources:output_type -> hyapp.wallet.v1.ListUserResourcesResponse - 45, // 65: hyapp.wallet.v1.WalletService.EquipUserResource:output_type -> hyapp.wallet.v1.EquipUserResourceResponse - 47, // 66: hyapp.wallet.v1.WalletService.ListResourceGrants:output_type -> hyapp.wallet.v1.ListResourceGrantsResponse - 44, // [44:67] is the sub-list for method output_type - 21, // [21:44] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 48, // 21: hyapp.wallet.v1.ListRechargeBillsResponse.bills:type_name -> hyapp.wallet.v1.RechargeBill + 0, // 22: hyapp.wallet.v1.WalletService.DebitGift:input_type -> hyapp.wallet.v1.DebitGiftRequest + 3, // 23: hyapp.wallet.v1.WalletService.GetBalances:input_type -> hyapp.wallet.v1.GetBalancesRequest + 5, // 24: hyapp.wallet.v1.WalletService.AdminCreditAsset:input_type -> hyapp.wallet.v1.AdminCreditAssetRequest + 7, // 25: hyapp.wallet.v1.WalletService.TransferCoinFromSeller:input_type -> hyapp.wallet.v1.TransferCoinFromSellerRequest + 17, // 26: hyapp.wallet.v1.WalletService.ListResources:input_type -> hyapp.wallet.v1.ListResourcesRequest + 19, // 27: hyapp.wallet.v1.WalletService.GetResource:input_type -> hyapp.wallet.v1.GetResourceRequest + 21, // 28: hyapp.wallet.v1.WalletService.CreateResource:input_type -> hyapp.wallet.v1.CreateResourceRequest + 22, // 29: hyapp.wallet.v1.WalletService.UpdateResource:input_type -> hyapp.wallet.v1.UpdateResourceRequest + 23, // 30: hyapp.wallet.v1.WalletService.SetResourceStatus:input_type -> hyapp.wallet.v1.SetResourceStatusRequest + 25, // 31: hyapp.wallet.v1.WalletService.ListResourceGroups:input_type -> hyapp.wallet.v1.ListResourceGroupsRequest + 27, // 32: hyapp.wallet.v1.WalletService.GetResourceGroup:input_type -> hyapp.wallet.v1.GetResourceGroupRequest + 29, // 33: hyapp.wallet.v1.WalletService.CreateResourceGroup:input_type -> hyapp.wallet.v1.CreateResourceGroupRequest + 30, // 34: hyapp.wallet.v1.WalletService.UpdateResourceGroup:input_type -> hyapp.wallet.v1.UpdateResourceGroupRequest + 31, // 35: hyapp.wallet.v1.WalletService.SetResourceGroupStatus:input_type -> hyapp.wallet.v1.SetResourceGroupStatusRequest + 33, // 36: hyapp.wallet.v1.WalletService.ListGiftConfigs:input_type -> hyapp.wallet.v1.ListGiftConfigsRequest + 35, // 37: hyapp.wallet.v1.WalletService.CreateGiftConfig:input_type -> hyapp.wallet.v1.CreateGiftConfigRequest + 36, // 38: hyapp.wallet.v1.WalletService.UpdateGiftConfig:input_type -> hyapp.wallet.v1.UpdateGiftConfigRequest + 37, // 39: hyapp.wallet.v1.WalletService.SetGiftConfigStatus:input_type -> hyapp.wallet.v1.SetGiftConfigStatusRequest + 39, // 40: hyapp.wallet.v1.WalletService.GrantResource:input_type -> hyapp.wallet.v1.GrantResourceRequest + 40, // 41: hyapp.wallet.v1.WalletService.GrantResourceGroup:input_type -> hyapp.wallet.v1.GrantResourceGroupRequest + 42, // 42: hyapp.wallet.v1.WalletService.ListUserResources:input_type -> hyapp.wallet.v1.ListUserResourcesRequest + 44, // 43: hyapp.wallet.v1.WalletService.EquipUserResource:input_type -> hyapp.wallet.v1.EquipUserResourceRequest + 46, // 44: hyapp.wallet.v1.WalletService.ListResourceGrants:input_type -> hyapp.wallet.v1.ListResourceGrantsRequest + 49, // 45: hyapp.wallet.v1.WalletService.ListRechargeBills:input_type -> hyapp.wallet.v1.ListRechargeBillsRequest + 1, // 46: hyapp.wallet.v1.WalletService.DebitGift:output_type -> hyapp.wallet.v1.DebitGiftResponse + 4, // 47: hyapp.wallet.v1.WalletService.GetBalances:output_type -> hyapp.wallet.v1.GetBalancesResponse + 6, // 48: hyapp.wallet.v1.WalletService.AdminCreditAsset:output_type -> hyapp.wallet.v1.AdminCreditAssetResponse + 8, // 49: hyapp.wallet.v1.WalletService.TransferCoinFromSeller:output_type -> hyapp.wallet.v1.TransferCoinFromSellerResponse + 18, // 50: hyapp.wallet.v1.WalletService.ListResources:output_type -> hyapp.wallet.v1.ListResourcesResponse + 20, // 51: hyapp.wallet.v1.WalletService.GetResource:output_type -> hyapp.wallet.v1.GetResourceResponse + 24, // 52: hyapp.wallet.v1.WalletService.CreateResource:output_type -> hyapp.wallet.v1.ResourceResponse + 24, // 53: hyapp.wallet.v1.WalletService.UpdateResource:output_type -> hyapp.wallet.v1.ResourceResponse + 24, // 54: hyapp.wallet.v1.WalletService.SetResourceStatus:output_type -> hyapp.wallet.v1.ResourceResponse + 26, // 55: hyapp.wallet.v1.WalletService.ListResourceGroups:output_type -> hyapp.wallet.v1.ListResourceGroupsResponse + 28, // 56: hyapp.wallet.v1.WalletService.GetResourceGroup:output_type -> hyapp.wallet.v1.GetResourceGroupResponse + 32, // 57: hyapp.wallet.v1.WalletService.CreateResourceGroup:output_type -> hyapp.wallet.v1.ResourceGroupResponse + 32, // 58: hyapp.wallet.v1.WalletService.UpdateResourceGroup:output_type -> hyapp.wallet.v1.ResourceGroupResponse + 32, // 59: hyapp.wallet.v1.WalletService.SetResourceGroupStatus:output_type -> hyapp.wallet.v1.ResourceGroupResponse + 34, // 60: hyapp.wallet.v1.WalletService.ListGiftConfigs:output_type -> hyapp.wallet.v1.ListGiftConfigsResponse + 38, // 61: hyapp.wallet.v1.WalletService.CreateGiftConfig:output_type -> hyapp.wallet.v1.GiftConfigResponse + 38, // 62: hyapp.wallet.v1.WalletService.UpdateGiftConfig:output_type -> hyapp.wallet.v1.GiftConfigResponse + 38, // 63: hyapp.wallet.v1.WalletService.SetGiftConfigStatus:output_type -> hyapp.wallet.v1.GiftConfigResponse + 41, // 64: hyapp.wallet.v1.WalletService.GrantResource:output_type -> hyapp.wallet.v1.ResourceGrantResponse + 41, // 65: hyapp.wallet.v1.WalletService.GrantResourceGroup:output_type -> hyapp.wallet.v1.ResourceGrantResponse + 43, // 66: hyapp.wallet.v1.WalletService.ListUserResources:output_type -> hyapp.wallet.v1.ListUserResourcesResponse + 45, // 67: hyapp.wallet.v1.WalletService.EquipUserResource:output_type -> hyapp.wallet.v1.EquipUserResourceResponse + 47, // 68: hyapp.wallet.v1.WalletService.ListResourceGrants:output_type -> hyapp.wallet.v1.ListResourceGrantsResponse + 50, // 69: hyapp.wallet.v1.WalletService.ListRechargeBills:output_type -> hyapp.wallet.v1.ListRechargeBillsResponse + 46, // [46:70] is the sub-list for method output_type + 22, // [22:46] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_proto_wallet_v1_wallet_proto_init() } @@ -5688,591 +5653,13 @@ func file_proto_wallet_v1_wallet_proto_init() { if File_proto_wallet_v1_wallet_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_proto_wallet_v1_wallet_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*DebitGiftRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*DebitGiftResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*AssetBalance); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetBalancesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*GetBalancesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*AdminCreditAssetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*AdminCreditAssetResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*TransferCoinFromSellerRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*TransferCoinFromSellerResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*Resource); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*ResourceGroupItem); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*ResourceGroup); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*GiftConfig); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*UserResourceEntitlement); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*ResourceGrantItem); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*ResourceGrant); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*ResourceGroupItemInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*ListResourcesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[18].Exporter = func(v any, i int) any { - switch v := v.(*ListResourcesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[19].Exporter = func(v any, i int) any { - switch v := v.(*GetResourceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*GetResourceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*CreateResourceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*UpdateResourceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*SetResourceStatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*ResourceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[25].Exporter = func(v any, i int) any { - switch v := v.(*ListResourceGroupsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[26].Exporter = func(v any, i int) any { - switch v := v.(*ListResourceGroupsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[27].Exporter = func(v any, i int) any { - switch v := v.(*GetResourceGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[28].Exporter = func(v any, i int) any { - switch v := v.(*GetResourceGroupResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[29].Exporter = func(v any, i int) any { - switch v := v.(*CreateResourceGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[30].Exporter = func(v any, i int) any { - switch v := v.(*UpdateResourceGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[31].Exporter = func(v any, i int) any { - switch v := v.(*SetResourceGroupStatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[32].Exporter = func(v any, i int) any { - switch v := v.(*ResourceGroupResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[33].Exporter = func(v any, i int) any { - switch v := v.(*ListGiftConfigsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[34].Exporter = func(v any, i int) any { - switch v := v.(*ListGiftConfigsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[35].Exporter = func(v any, i int) any { - switch v := v.(*CreateGiftConfigRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[36].Exporter = func(v any, i int) any { - switch v := v.(*UpdateGiftConfigRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[37].Exporter = func(v any, i int) any { - switch v := v.(*SetGiftConfigStatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[38].Exporter = func(v any, i int) any { - switch v := v.(*GiftConfigResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[39].Exporter = func(v any, i int) any { - switch v := v.(*GrantResourceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[40].Exporter = func(v any, i int) any { - switch v := v.(*GrantResourceGroupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[41].Exporter = func(v any, i int) any { - switch v := v.(*ResourceGrantResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[42].Exporter = func(v any, i int) any { - switch v := v.(*ListUserResourcesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*ListUserResourcesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[44].Exporter = func(v any, i int) any { - switch v := v.(*EquipUserResourceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[45].Exporter = func(v any, i int) any { - switch v := v.(*EquipUserResourceResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[46].Exporter = func(v any, i int) any { - switch v := v.(*ListResourceGrantsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_proto_wallet_v1_wallet_proto_msgTypes[47].Exporter = func(v any, i int) any { - switch v := v.(*ListResourceGrantsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_proto_wallet_v1_wallet_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_wallet_v1_wallet_proto_rawDesc), len(file_proto_wallet_v1_wallet_proto_rawDesc)), NumEnums: 0, - NumMessages: 48, + NumMessages: 51, NumExtensions: 0, NumServices: 1, }, @@ -6281,7 +5668,6 @@ func file_proto_wallet_v1_wallet_proto_init() { MessageInfos: file_proto_wallet_v1_wallet_proto_msgTypes, }.Build() File_proto_wallet_v1_wallet_proto = out.File - file_proto_wallet_v1_wallet_proto_rawDesc = nil file_proto_wallet_v1_wallet_proto_goTypes = nil file_proto_wallet_v1_wallet_proto_depIdxs = nil } diff --git a/api/proto/wallet/v1/wallet.proto b/api/proto/wallet/v1/wallet.proto index 176f6295..c47d43f3 100644 --- a/api/proto/wallet/v1/wallet.proto +++ b/api/proto/wallet/v1/wallet.proto @@ -27,8 +27,10 @@ message DebitGiftResponse { int64 gift_point_added = 4; int64 heat_value = 5; string price_version = 6; - // balance_after 是 sender COIN available_amount 账后余额。 + // balance_after 是 sender 被扣费资产 available_amount 账后余额。 int64 balance_after = 7; + string charge_asset_type = 8; + int64 charge_amount = 9; } // AssetBalance 是用户某类资产的余额投影。 @@ -168,6 +170,11 @@ message GiftConfig { int64 created_at_ms = 15; int64 updated_at_ms = 16; repeated int64 region_ids = 17; + string gift_type_code = 18; + string charge_asset_type = 19; + int64 effective_from_ms = 20; + int64 effective_to_ms = 21; + repeated string effect_types = 22; } message UserResourceEntitlement { @@ -399,6 +406,11 @@ message CreateGiftConfigRequest { int64 effective_at_ms = 13; int64 operator_user_id = 14; repeated int64 region_ids = 15; + string gift_type_code = 16; + string charge_asset_type = 17; + int64 effective_from_ms = 18; + int64 effective_to_ms = 19; + repeated string effect_types = 20; } message UpdateGiftConfigRequest { @@ -417,6 +429,11 @@ message UpdateGiftConfigRequest { int64 effective_at_ms = 13; int64 operator_user_id = 14; repeated int64 region_ids = 15; + string gift_type_code = 16; + string charge_asset_type = 17; + int64 effective_from_ms = 18; + int64 effective_to_ms = 19; + repeated string effect_types = 20; } message SetGiftConfigStatusRequest { @@ -495,6 +512,47 @@ message ListResourceGrantsResponse { int64 total = 2; } +message RechargeBill { + string app_code = 1; + string transaction_id = 2; + string command_id = 3; + string recharge_type = 4; + string status = 5; + string external_ref = 6; + int64 user_id = 7; + int64 seller_user_id = 8; + int64 seller_region_id = 9; + int64 target_region_id = 10; + int64 policy_id = 11; + string policy_version = 12; + string currency_code = 13; + int64 coin_amount = 14; + int64 usd_minor_amount = 15; + int64 exchange_coin_amount = 16; + int64 exchange_usd_minor_amount = 17; + int64 created_at_ms = 18; +} + +message ListRechargeBillsRequest { + string request_id = 1; + string app_code = 2; + int64 user_id = 3; + int64 seller_user_id = 4; + int64 region_id = 5; + string recharge_type = 6; + string status = 7; + string keyword = 8; + int64 start_at_ms = 9; + int64 end_at_ms = 10; + int32 page = 11; + int32 page_size = 12; +} + +message ListRechargeBillsResponse { + repeated RechargeBill bills = 1; + int64 total = 2; +} + // WalletService 是内部账务 gRPC 边界,外部 HTTP 入口仍由 gateway-service 承载。 service WalletService { rpc DebitGift(DebitGiftRequest) returns (DebitGiftResponse); @@ -520,4 +578,5 @@ service WalletService { rpc ListUserResources(ListUserResourcesRequest) returns (ListUserResourcesResponse); rpc EquipUserResource(EquipUserResourceRequest) returns (EquipUserResourceResponse); rpc ListResourceGrants(ListResourceGrantsRequest) returns (ListResourceGrantsResponse); + rpc ListRechargeBills(ListRechargeBillsRequest) returns (ListRechargeBillsResponse); } diff --git a/api/proto/wallet/v1/wallet_grpc.pb.go b/api/proto/wallet/v1/wallet_grpc.pb.go index ee7d09f6..b4d5244d 100644 --- a/api/proto/wallet/v1/wallet_grpc.pb.go +++ b/api/proto/wallet/v1/wallet_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.2 +// - protoc-gen-go-grpc v1.6.1 +// - protoc v7.34.1 // source: proto/wallet/v1/wallet.proto package walletv1 @@ -42,6 +42,7 @@ const ( WalletService_ListUserResources_FullMethodName = "/hyapp.wallet.v1.WalletService/ListUserResources" WalletService_EquipUserResource_FullMethodName = "/hyapp.wallet.v1.WalletService/EquipUserResource" WalletService_ListResourceGrants_FullMethodName = "/hyapp.wallet.v1.WalletService/ListResourceGrants" + WalletService_ListRechargeBills_FullMethodName = "/hyapp.wallet.v1.WalletService/ListRechargeBills" ) // WalletServiceClient is the client API for WalletService service. @@ -73,6 +74,7 @@ type WalletServiceClient interface { ListUserResources(ctx context.Context, in *ListUserResourcesRequest, opts ...grpc.CallOption) (*ListUserResourcesResponse, error) EquipUserResource(ctx context.Context, in *EquipUserResourceRequest, opts ...grpc.CallOption) (*EquipUserResourceResponse, error) ListResourceGrants(ctx context.Context, in *ListResourceGrantsRequest, opts ...grpc.CallOption) (*ListResourceGrantsResponse, error) + ListRechargeBills(ctx context.Context, in *ListRechargeBillsRequest, opts ...grpc.CallOption) (*ListRechargeBillsResponse, error) } type walletServiceClient struct { @@ -313,6 +315,16 @@ func (c *walletServiceClient) ListResourceGrants(ctx context.Context, in *ListRe return out, nil } +func (c *walletServiceClient) ListRechargeBills(ctx context.Context, in *ListRechargeBillsRequest, opts ...grpc.CallOption) (*ListRechargeBillsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListRechargeBillsResponse) + err := c.cc.Invoke(ctx, WalletService_ListRechargeBills_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // WalletServiceServer is the server API for WalletService service. // All implementations must embed UnimplementedWalletServiceServer // for forward compatibility. @@ -342,6 +354,7 @@ type WalletServiceServer interface { ListUserResources(context.Context, *ListUserResourcesRequest) (*ListUserResourcesResponse, error) EquipUserResource(context.Context, *EquipUserResourceRequest) (*EquipUserResourceResponse, error) ListResourceGrants(context.Context, *ListResourceGrantsRequest) (*ListResourceGrantsResponse, error) + ListRechargeBills(context.Context, *ListRechargeBillsRequest) (*ListRechargeBillsResponse, error) mustEmbedUnimplementedWalletServiceServer() } @@ -353,73 +366,76 @@ type WalletServiceServer interface { type UnimplementedWalletServiceServer struct{} func (UnimplementedWalletServiceServer) DebitGift(context.Context, *DebitGiftRequest) (*DebitGiftResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DebitGift not implemented") + return nil, status.Error(codes.Unimplemented, "method DebitGift not implemented") } func (UnimplementedWalletServiceServer) GetBalances(context.Context, *GetBalancesRequest) (*GetBalancesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetBalances not implemented") + return nil, status.Error(codes.Unimplemented, "method GetBalances not implemented") } func (UnimplementedWalletServiceServer) AdminCreditAsset(context.Context, *AdminCreditAssetRequest) (*AdminCreditAssetResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AdminCreditAsset not implemented") + return nil, status.Error(codes.Unimplemented, "method AdminCreditAsset not implemented") } func (UnimplementedWalletServiceServer) TransferCoinFromSeller(context.Context, *TransferCoinFromSellerRequest) (*TransferCoinFromSellerResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method TransferCoinFromSeller not implemented") + return nil, status.Error(codes.Unimplemented, "method TransferCoinFromSeller not implemented") } func (UnimplementedWalletServiceServer) ListResources(context.Context, *ListResourcesRequest) (*ListResourcesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListResources not implemented") + return nil, status.Error(codes.Unimplemented, "method ListResources not implemented") } func (UnimplementedWalletServiceServer) GetResource(context.Context, *GetResourceRequest) (*GetResourceResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetResource not implemented") + return nil, status.Error(codes.Unimplemented, "method GetResource not implemented") } func (UnimplementedWalletServiceServer) CreateResource(context.Context, *CreateResourceRequest) (*ResourceResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateResource not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateResource not implemented") } func (UnimplementedWalletServiceServer) UpdateResource(context.Context, *UpdateResourceRequest) (*ResourceResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateResource not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateResource not implemented") } func (UnimplementedWalletServiceServer) SetResourceStatus(context.Context, *SetResourceStatusRequest) (*ResourceResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetResourceStatus not implemented") + return nil, status.Error(codes.Unimplemented, "method SetResourceStatus not implemented") } func (UnimplementedWalletServiceServer) ListResourceGroups(context.Context, *ListResourceGroupsRequest) (*ListResourceGroupsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListResourceGroups not implemented") + return nil, status.Error(codes.Unimplemented, "method ListResourceGroups not implemented") } func (UnimplementedWalletServiceServer) GetResourceGroup(context.Context, *GetResourceGroupRequest) (*GetResourceGroupResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetResourceGroup not implemented") + return nil, status.Error(codes.Unimplemented, "method GetResourceGroup not implemented") } func (UnimplementedWalletServiceServer) CreateResourceGroup(context.Context, *CreateResourceGroupRequest) (*ResourceGroupResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateResourceGroup not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateResourceGroup not implemented") } func (UnimplementedWalletServiceServer) UpdateResourceGroup(context.Context, *UpdateResourceGroupRequest) (*ResourceGroupResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateResourceGroup not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateResourceGroup not implemented") } func (UnimplementedWalletServiceServer) SetResourceGroupStatus(context.Context, *SetResourceGroupStatusRequest) (*ResourceGroupResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetResourceGroupStatus not implemented") + return nil, status.Error(codes.Unimplemented, "method SetResourceGroupStatus not implemented") } func (UnimplementedWalletServiceServer) ListGiftConfigs(context.Context, *ListGiftConfigsRequest) (*ListGiftConfigsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListGiftConfigs not implemented") + return nil, status.Error(codes.Unimplemented, "method ListGiftConfigs not implemented") } func (UnimplementedWalletServiceServer) CreateGiftConfig(context.Context, *CreateGiftConfigRequest) (*GiftConfigResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateGiftConfig not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateGiftConfig not implemented") } func (UnimplementedWalletServiceServer) UpdateGiftConfig(context.Context, *UpdateGiftConfigRequest) (*GiftConfigResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateGiftConfig not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateGiftConfig not implemented") } func (UnimplementedWalletServiceServer) SetGiftConfigStatus(context.Context, *SetGiftConfigStatusRequest) (*GiftConfigResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetGiftConfigStatus not implemented") + return nil, status.Error(codes.Unimplemented, "method SetGiftConfigStatus not implemented") } func (UnimplementedWalletServiceServer) GrantResource(context.Context, *GrantResourceRequest) (*ResourceGrantResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GrantResource not implemented") + return nil, status.Error(codes.Unimplemented, "method GrantResource not implemented") } func (UnimplementedWalletServiceServer) GrantResourceGroup(context.Context, *GrantResourceGroupRequest) (*ResourceGrantResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GrantResourceGroup not implemented") + return nil, status.Error(codes.Unimplemented, "method GrantResourceGroup not implemented") } func (UnimplementedWalletServiceServer) ListUserResources(context.Context, *ListUserResourcesRequest) (*ListUserResourcesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListUserResources not implemented") + return nil, status.Error(codes.Unimplemented, "method ListUserResources not implemented") } func (UnimplementedWalletServiceServer) EquipUserResource(context.Context, *EquipUserResourceRequest) (*EquipUserResourceResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EquipUserResource not implemented") + return nil, status.Error(codes.Unimplemented, "method EquipUserResource not implemented") } func (UnimplementedWalletServiceServer) ListResourceGrants(context.Context, *ListResourceGrantsRequest) (*ListResourceGrantsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListResourceGrants not implemented") + return nil, status.Error(codes.Unimplemented, "method ListResourceGrants not implemented") +} +func (UnimplementedWalletServiceServer) ListRechargeBills(context.Context, *ListRechargeBillsRequest) (*ListRechargeBillsResponse, error) { + return nil, status.Error(codes.Unimplemented, "method ListRechargeBills not implemented") } func (UnimplementedWalletServiceServer) mustEmbedUnimplementedWalletServiceServer() {} func (UnimplementedWalletServiceServer) testEmbeddedByValue() {} @@ -432,7 +448,7 @@ type UnsafeWalletServiceServer interface { } func RegisterWalletServiceServer(s grpc.ServiceRegistrar, srv WalletServiceServer) { - // If the following call pancis, it indicates UnimplementedWalletServiceServer was + // If the following call panics, it indicates UnimplementedWalletServiceServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. @@ -856,6 +872,24 @@ func _WalletService_ListResourceGrants_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } +func _WalletService_ListRechargeBills_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRechargeBillsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WalletServiceServer).ListRechargeBills(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WalletService_ListRechargeBills_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WalletServiceServer).ListRechargeBills(ctx, req.(*ListRechargeBillsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // WalletService_ServiceDesc is the grpc.ServiceDesc for WalletService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -955,6 +989,10 @@ var WalletService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListResourceGrants", Handler: _WalletService_ListResourceGrants_Handler, }, + { + MethodName: "ListRechargeBills", + Handler: _WalletService_ListRechargeBills_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "proto/wallet/v1/wallet.proto", diff --git a/docs/openapi/gateway.swagger.yaml b/docs/openapi/gateway.swagger.yaml index a0bd1d4f..22f2571f 100644 --- a/docs/openapi/gateway.swagger.yaml +++ b/docs/openapi/gateway.swagger.yaml @@ -1307,9 +1307,15 @@ paths: required: false type: integer format: int32 + - name: region_id + in: query + required: false + type: integer + format: int64 + description: 区域 ID;返回该区域和 GLOBAL 兜底礼物。 responses: "200": - description: 返回 active 礼物配置;礼物资源必须来自 `resource_type=gift`。 + description: 返回当前 active、区域可用且在有效期内的礼物配置;礼物资源必须来自 `resource_type=gift`。 schema: $ref: "#/definitions/GiftListEnvelope" "400": @@ -2140,6 +2146,24 @@ definitions: type: string price_version: type: string + gift_type_code: + type: string + enum: + - normal + - cp + - lucky + - super_lucky + - exclusive + - noble + - flag + - activity + - magic + - custom + charge_asset_type: + type: string + enum: + - COIN + - DIAMOND coin_price: type: integer format: int64 @@ -2149,6 +2173,22 @@ definitions: heat_value: type: integer format: int64 + effective_from_ms: + type: integer + format: int64 + description: 0 表示不限制开始时间。 + effective_to_ms: + type: integer + format: int64 + description: 0 表示不限制结束时间。 + effect_types: + type: array + items: + type: string + enum: + - animation + - music + - global_broadcast region_ids: type: array items: diff --git a/docs/openapi/wallet.swagger.yaml b/docs/openapi/wallet.swagger.yaml index c88d3bbf..1673aa1e 100644 --- a/docs/openapi/wallet.swagger.yaml +++ b/docs/openapi/wallet.swagger.yaml @@ -134,7 +134,17 @@ definitions: coin_spent: type: integer format: int64 - description: 本次实际扣减的 COIN 数量。 + description: 兼容旧调用方的扣费数量;新调用方应优先读取 charge_asset_type 和 charge_amount。 + charge_asset_type: + type: string + enum: + - COIN + - DIAMOND + description: 本次实际扣减的资产类型。 + charge_amount: + type: integer + format: int64 + description: 本次实际扣减的资产数量。 gift_point_added: type: integer format: int64 @@ -149,7 +159,7 @@ definitions: balance_after: type: integer format: int64 - description: 扣费后的发送方余额。 + description: 扣费后的发送方被扣费资产余额。 HealthCheckRequest: type: object properties: diff --git a/docs/resource-group-gift-architecture.md b/docs/resource-group-gift-architecture.md index b0a0b051..607d29b8 100644 --- a/docs/resource-group-gift-architecture.md +++ b/docs/resource-group-gift-architecture.md @@ -8,7 +8,7 @@ - 资源组只表达“打包集合”,赠送资源组时按当时组内容展开成多条资源赠送事实;组内可以直接配置 `COIN` 和 `DIAMOND` 钱包资产数量。 - 资源和资源组都可以通过后台命令赠送给用户,赠送必须可审计、可幂等、可追溯。 - 金币仍由 `wallet-service` 资产账本管理;资源库里的金币资源只是对 `COIN` 入账规则的配置包装。 -- 礼物价格、礼物热度、主播积分仍由 `wallet-service` 结算,客户端不能提交价格、热度或积分。 +- 礼物价格、收费资产、礼物热度、主播积分和有效期仍由 `wallet-service` 结算,客户端不能提交价格、收费类型、热度或积分。 - 按 `app_code` 隔离资源、资源组、礼物配置、赠送和用户持有状态。 ## Non-Goals @@ -38,7 +38,7 @@ | `resource` | 可配置、可引用、可赠送的最小资源。头像框、金币、座驾、气泡、徽章、飘屏、礼物都属于资源。 | | `resource_group` | 一组资源和钱包资产项的集合。赠送资源组时展开为组内每个资源或资产赠送项。 | | `resource_group_item` | 资源组成员。`item_type=resource` 引用资源库资源;`item_type=wallet_asset` 直接配置 `COIN` 或 `DIAMOND` 数量。 | -| `gift_config` | 礼物配置是一个绑定了 `resource_type=gift` 资源的业务配置,并额外拥有价格、热度和主播积分规则。 | +| `gift_config` | 礼物配置是一个绑定了 `resource_type=gift` 资源的业务配置,并额外拥有礼物类型、有效期、特效、价格、收费资产、热度和主播积分规则。 | | `user_resource` | 用户持有的非金币资源权益,例如某个头像框 30 天、某个徽章永久。 | | `wallet_asset_resource` | 会转成钱包资产入账的资源,例如金币。实际余额仍写 `wallet_accounts`。 | | `grant` | 后台或系统向用户发放资源或资源组的命令事实。 | @@ -57,17 +57,44 @@ ## Gift Boundary -礼物不是独立上传资源。新增礼物必须从 `resources` 中选择一个 `resource_type=gift` 的资源,然后配置礼物价格和结算值。 +礼物不是独立上传资源。新增礼物必须从 `resources` 中选择一个 `resource_type=gift` 的资源,然后配置礼物类型、有效期、特效、价格、收费资产和结算值。 -礼物拆成两层: +礼物拆成三层: | Layer | Owner | Fields | | --- | --- | --- | -| 礼物配置 | `wallet-service` resource domain | `gift_id`、`resource_id`、展示名、排序、上下架状态、客户端表现 metadata | +| 礼物配置 | `wallet-service` resource domain | `gift_id`、`resource_id`、展示名、排序、上下架状态、礼物类型、有效期、特效、客户端表现 metadata | | 礼物区域配置 | `wallet-service` resource domain | `gift_id` 和多个 `region_id` 的映射;`region_id=0` 表示 GLOBAL 兜底区域 | -| 礼物账务价格 | `wallet-service` ledger domain | `gift_id`、`price_version`、`coin_price`、`gift_point_amount`、`heat_value`、生效时间 | +| 礼物账务价格 | `wallet-service` ledger domain | `gift_id`、`price_version`、`charge_asset_type`、`coin_price`、`gift_point_amount`、`heat_value`、价格生效时间 | -`SendGift` 仍然只接收 `gift_id/gift_count`。room-service 必须把房间 `visible_region_id` 传给 wallet-service,wallet-service 必须验证礼物 active 且在该区域可用,使用服务端价格扣 `COIN`,用服务端资源快照发房间消息。客户端不能提交资源 URL、礼物价格、热度、主播积分或礼物区域。 +礼物类型 code 固定为: + +| Code | Label | +| --- | --- | +| `normal` | 普通礼物 | +| `cp` | CP礼物 | +| `lucky` | 幸运礼物 | +| `super_lucky` | 超级幸运礼物 | +| `exclusive` | 专属礼物 | +| `noble` | 贵族礼物 | +| `flag` | 国旗礼物 | +| `activity` | 活动礼物 | +| `magic` | 魔法礼物 | +| `custom` | 定制礼物 | + +礼物收费资产只允许 `COIN` 和 `DIAMOND`。字段名沿用 `coin_price` 表达“价格数值”,实际扣费资产由 `charge_asset_type` 决定。`DebitGiftResponse.coin_spent` 保留兼容旧调用方;新调用方应优先读取 `charge_asset_type` 和 `charge_amount`。 + +礼物特效 code 固定为: + +| Code | Label | +| --- | --- | +| `animation` | 动画 | +| `music` | 音乐 | +| `global_broadcast` | 全局广播 | + +`gift_configs.effective_from_ms` 和 `gift_configs.effective_to_ms` 表达礼物配置有效期。任一字段为 `0` 表示该方向不限制;两个字段都为 `0` 表示长期有效。App 礼物列表和 `DebitGift` 送礼扣费都必须过滤未开始或已结束的 active 礼物。后台列表可以展示全部礼物,便于运营提前配置或排查历史配置。 + +`SendGift` 仍然只接收 `gift_id/gift_count`。room-service 必须把房间 `visible_region_id` 传给 wallet-service,wallet-service 必须验证礼物 active、在有效期内且在该区域可用,再使用服务端价格按 `charge_asset_type` 扣 `COIN` 或 `DIAMOND`,用服务端资源快照发房间消息。客户端不能提交资源 URL、礼物价格、收费资产、热度、主播积分、有效期、特效或礼物区域。 礼物绑定资源时的约束: @@ -75,7 +102,7 @@ - 礼物绑定的 resource 必须 `resource_type=gift`。 - 下架 resource 不自动删除历史礼物交易,只阻止新礼物上架或继续发送。 - 修改礼物 resource 后,新发送使用新 resource;历史礼物事件使用发送时快照,不反查当前配置。 -- 钱包落账 metadata 必须保存 `gift_id`、`price_version`、`coin_price`、`gift_point_amount`、`heat_value`。房间礼物事件必须保存必要的 `resource_snapshot_json` 供客户端展示和审计。 +- 钱包落账 metadata 必须保存 `gift_id`、`price_version`、`charge_asset_type`、`charge_amount`、`coin_price`、`gift_point_amount`、`heat_value`。房间礼物事件必须保存必要的 `resource_snapshot_json` 供客户端展示和审计。 ## Grant Boundary @@ -198,13 +225,34 @@ gift_configs( name VARCHAR(128) NOT NULL, sort_order INT NOT NULL DEFAULT 0, presentation_json JSON NULL, + gift_type_code VARCHAR(32) NOT NULL DEFAULT 'normal', + effective_from_ms BIGINT NOT NULL DEFAULT 0, + effective_to_ms BIGINT NOT NULL DEFAULT 0, + effect_types_json JSON NULL, created_by_user_id BIGINT NOT NULL, updated_by_user_id BIGINT NOT NULL, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, gift_id), KEY idx_gift_configs_resource (app_code, resource_id), - KEY idx_gift_configs_status_sort (app_code, status, sort_order) + KEY idx_gift_configs_status_sort (app_code, status, sort_order), + KEY idx_gift_configs_effective (app_code, status, effective_from_ms, effective_to_ms) +); + +wallet_gift_prices( + app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', + gift_id VARCHAR(96) NOT NULL, + price_version VARCHAR(64) NOT NULL, + status VARCHAR(32) NOT NULL, + charge_asset_type VARCHAR(32) NOT NULL DEFAULT 'COIN', + coin_price BIGINT NOT NULL, + gift_point_amount BIGINT NOT NULL, + heat_value BIGINT NOT NULL, + effective_at_ms BIGINT NOT NULL, + created_at_ms BIGINT NOT NULL, + updated_at_ms BIGINT NOT NULL, + PRIMARY KEY (app_code, gift_id, price_version), + KEY idx_wallet_gift_prices_effective (app_code, gift_id, status, effective_at_ms) ); gift_config_regions( @@ -322,6 +370,9 @@ GET /api/v1/admin/resource-grants - 资源组内 `item_type=wallet_asset` 的单位是数量,后台前端提交 `assetType` 和 `amount`;`server/admin` 换算为 wallet-service RPC 的 `wallet_asset_type`、`wallet_asset_amount`,`duration_ms=0`、`quantity=1`。 - 同一资源组内同一个 `resource_id` 不能重复,同一种钱包资产也不能重复。 - active 资源组保存或启用时,组内资源项必须是 `active`、`grantable=true` 且不能是 `coin` 资源;金币和钻石必须使用 `wallet_asset` 项。 +- 礼物新增或编辑时必须选择礼物类型和收费类型;收费类型只允许 `COIN` 或 `DIAMOND`。 +- 礼物有效期可以为空;填写时必须满足结束时间晚于开始时间。有效期只控制礼物配置可见和可发送,不重算历史礼物交易。 +- 礼物特效是枚举多选,只描述客户端表现能力;服务端不根据特效触发动画、音乐或广播,只在 App 礼物列表和房间礼物消息相关链路中透传必要配置。 权限建议: @@ -365,7 +416,7 @@ GET /api/v1/users/me/resources POST /api/v1/users/me/resources/{resource_id}/equip ``` -礼物列表按区域过滤:传入 `region_id=N` 时返回绑定到 `N` 的礼物和 `region_id=0` 的 GLOBAL 兜底礼物;不传 `region_id` 时只返回 GLOBAL 兜底礼物。 +礼物列表按区域和有效期过滤:传入 `region_id=N` 时返回绑定到 `N` 的礼物和 `region_id=0` 的 GLOBAL 兜底礼物;不传 `region_id` 时只返回 GLOBAL 兜底礼物。只返回 `status=active`、资源 active、当前时间落在有效期内的礼物。响应会包含 `gift_type_code`、`charge_asset_type`、`effective_from_ms`、`effective_to_ms` 和 `effect_types`,客户端只能用于展示和选择,不能在送礼时回传这些值作为结算依据。 装备资源的边界: diff --git a/docs/voice-room-feature-inventory.md b/docs/voice-room-feature-inventory.md index cf592f9f..0507b3cd 100644 --- a/docs/voice-room-feature-inventory.md +++ b/docs/voice-room-feature-inventory.md @@ -127,7 +127,7 @@ | SendGift 房间命令 | `DONE` | room-service 先扣费,再更新 heat、gift_rank、outbox | 礼物目标、礼物表现和客户端动画联调 | | 房间热度 | `DONE` | `RoomSnapshot.heat` 和 `RoomHeatChanged` 事件 | 热度衰减/排行榜周期未做 | | 本地礼物榜 | `DONE` | `LocalRank` 和 `gift_rank` 快照 | 全局榜、跨房榜、榜单重置未做 | -| 礼物配置 | `PARTIAL` | `wallet_gift_prices` 提供服务端价格,SendGift 请求只传 `gift_id/gift_count`;礼物配置已绑定 `resource_type=gift` 资源 | 客户端礼物表现联调、资源版本缓存刷新未做 | +| 礼物配置 | `PARTIAL` | `wallet_gift_prices` 提供服务端价格和 `COIN`/`DIAMOND` 收费资产,`gift_configs` 提供礼物类型、有效期和特效;SendGift 请求只传 `gift_id/gift_count`;礼物配置已绑定 `resource_type=gift` 资源 | 客户端礼物表现联调、资源版本缓存刷新未做 | | 背包/道具 | `PARTIAL` | `user_resource_entitlements`、`user_resource_equipment` 支持资源发放、我的资源和可佩戴资源装备 | 背包扣减、免费礼物、道具过期扫描未做 | | 礼物消息补偿 | `DONE` | GiftSent/Heat/Rank 事件进入 outbox,主事件同步 IM | 客户端去重和展示策略未验收 | diff --git a/server/admin/cmd/server/main.go b/server/admin/cmd/server/main.go index 9055faeb..3000ef9d 100644 --- a/server/admin/cmd/server/main.go +++ b/server/admin/cmd/server/main.go @@ -32,6 +32,7 @@ import ( jobmodule "hyapp-admin-server/internal/modules/job" menumodule "hyapp-admin-server/internal/modules/menu" notificationmodule "hyapp-admin-server/internal/modules/notification" + paymentmodule "hyapp-admin-server/internal/modules/payment" rbacmodule "hyapp-admin-server/internal/modules/rbac" resourcemodule "hyapp-admin-server/internal/modules/resource" roomadminmodule "hyapp-admin-server/internal/modules/roomadmin" @@ -185,6 +186,7 @@ func main() { Job: jobmodule.New(store, cfg, auditHandler), Menu: menumodule.New(store, auditHandler), Notification: notificationmodule.New(store, auditHandler), + Payment: paymentmodule.New(walletclient.NewGRPC(walletConn)), RBAC: rbacmodule.New(store, auditHandler), Resource: resourcemodule.New(walletclient.NewGRPC(walletConn), auditHandler), RoomAdmin: roomadminmodule.New(roomDB, userDB, auditHandler), diff --git a/server/admin/internal/integration/userclient/country_region.go b/server/admin/internal/integration/userclient/country_region.go index 79f865b8..43a1c48e 100644 --- a/server/admin/internal/integration/userclient/country_region.go +++ b/server/admin/internal/integration/userclient/country_region.go @@ -228,7 +228,7 @@ func fromProtoRegion(region *userv1.Region) *Region { RegionCode: region.GetRegionCode(), Name: region.GetName(), Status: region.GetStatus(), - Countries: append([]string(nil), region.GetCountries()...), + Countries: append([]string{}, region.GetCountries()...), SortOrder: region.GetSortOrder(), CreatedAtMs: region.GetCreatedAtMs(), UpdatedAtMs: region.GetUpdatedAtMs(), diff --git a/server/admin/internal/integration/walletclient/client.go b/server/admin/internal/integration/walletclient/client.go index 90443901..a81ab887 100644 --- a/server/admin/internal/integration/walletclient/client.go +++ b/server/admin/internal/integration/walletclient/client.go @@ -8,7 +8,7 @@ import ( "google.golang.org/grpc" ) -// Client 是 admin-server 对 wallet-service 资源管理 RPC 的最小依赖。 +// Client 是 admin-server 对 wallet-service 资源和账务只读 RPC 的最小依赖。 type Client interface { ListResources(ctx context.Context, req *walletv1.ListResourcesRequest) (*walletv1.ListResourcesResponse, error) GetResource(ctx context.Context, req *walletv1.GetResourceRequest) (*walletv1.GetResourceResponse, error) @@ -27,6 +27,7 @@ type Client interface { GrantResource(ctx context.Context, req *walletv1.GrantResourceRequest) (*walletv1.ResourceGrantResponse, error) GrantResourceGroup(ctx context.Context, req *walletv1.GrantResourceGroupRequest) (*walletv1.ResourceGrantResponse, error) ListResourceGrants(ctx context.Context, req *walletv1.ListResourceGrantsRequest) (*walletv1.ListResourceGrantsResponse, error) + ListRechargeBills(ctx context.Context, req *walletv1.ListRechargeBillsRequest) (*walletv1.ListRechargeBillsResponse, error) } type GRPCClient struct { @@ -104,3 +105,7 @@ func (c *GRPCClient) GrantResourceGroup(ctx context.Context, req *walletv1.Grant func (c *GRPCClient) ListResourceGrants(ctx context.Context, req *walletv1.ListResourceGrantsRequest) (*walletv1.ListResourceGrantsResponse, error) { return c.client.ListResourceGrants(ctx, req) } + +func (c *GRPCClient) ListRechargeBills(ctx context.Context, req *walletv1.ListRechargeBillsRequest) (*walletv1.ListRechargeBillsResponse, error) { + return c.client.ListRechargeBills(ctx, req) +} diff --git a/server/admin/internal/model/models.go b/server/admin/internal/model/models.go index ce0e0e74..d1d85b0f 100644 --- a/server/admin/internal/model/models.go +++ b/server/admin/internal/model/models.go @@ -93,6 +93,26 @@ func (AppConfig) TableName() string { return "admin_app_configs" } +type AppBanner struct { + ID uint `gorm:"primaryKey" json:"id"` + AppCode string `gorm:"size:32;index:idx_admin_app_banners_app_sort,not null;default:lalu" json:"appCode"` + CoverURL string `gorm:"size:1024;not null" json:"coverUrl"` + BannerType string `gorm:"size:16;not null" json:"bannerType"` + Param string `gorm:"size:2048" json:"param"` + Status string `gorm:"size:24;index:idx_admin_app_banners_app_sort,not null;default:active" json:"status"` + Platform string `gorm:"size:24;index:idx_admin_app_banners_scope,not null" json:"platform"` + SortOrder int `gorm:"index:idx_admin_app_banners_app_sort,not null;default:0" json:"sortOrder"` + RegionID int64 `gorm:"index:idx_admin_app_banners_scope,not null;default:0" json:"regionId"` + CountryCode string `gorm:"size:8;index:idx_admin_app_banners_scope" json:"countryCode"` + Description string `gorm:"size:255" json:"description"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` +} + +func (AppBanner) TableName() string { + return "admin_app_banners" +} + type RefreshToken struct { ID uint `gorm:"primaryKey" json:"id"` UserID uint `gorm:"index;not null" json:"userId"` diff --git a/server/admin/internal/modules/appconfig/handler.go b/server/admin/internal/modules/appconfig/handler.go index c2680ebc..5a741812 100644 --- a/server/admin/internal/modules/appconfig/handler.go +++ b/server/admin/internal/modules/appconfig/handler.go @@ -2,7 +2,10 @@ package appconfig import ( "fmt" + "strconv" + "strings" + "hyapp-admin-server/internal/appctx" "hyapp-admin-server/internal/modules/shared" "hyapp-admin-server/internal/repository" "hyapp-admin-server/internal/response" @@ -43,3 +46,98 @@ func (h *Handler) UpdateH5Links(c *gin.Context) { shared.OperationLog(c, h.audit, "update-app-h5-links", "admin_app_configs", "success", fmt.Sprintf("%d h5 links", len(request.Items))) response.OK(c, gin.H{"items": items, "total": len(items)}) } + +func (h *Handler) ListBanners(c *gin.Context) { + options := shared.ListOptions(c) + items, err := h.service.ListBanners(appctx.FromContext(c.Request.Context()), repository.AppBannerListOptions{ + Keyword: options.Keyword, + Status: options.Status, + Platform: strings.TrimSpace(c.Query("platform")), + RegionID: parseOptionalInt64(c.Query("regionId"), c.Query("region_id")), + Country: firstQuery(c, "countryCode", "country_code", "country"), + }) + if err != nil { + response.ServerError(c, "获取 BANNER 配置失败") + return + } + response.OK(c, gin.H{"items": items, "total": len(items)}) +} + +func (h *Handler) CreateBanner(c *gin.Context) { + var request bannerRequest + if err := c.ShouldBindJSON(&request); err != nil { + response.BadRequest(c, "参数不正确") + return + } + item, err := h.service.CreateBanner(appctx.FromContext(c.Request.Context()), request) + if err != nil { + response.BadRequest(c, err.Error()) + return + } + shared.OperationLog(c, h.audit, "create-app-banner", "admin_app_banners", "success", fmt.Sprintf("banner_id=%d", item.ID)) + response.Created(c, item) +} + +func (h *Handler) UpdateBanner(c *gin.Context) { + id, ok := bannerID(c) + if !ok { + return + } + var request bannerRequest + if err := c.ShouldBindJSON(&request); err != nil { + response.BadRequest(c, "参数不正确") + return + } + item, err := h.service.UpdateBanner(appctx.FromContext(c.Request.Context()), id, request) + if err != nil { + response.BadRequest(c, err.Error()) + return + } + shared.OperationLog(c, h.audit, "update-app-banner", "admin_app_banners", "success", fmt.Sprintf("banner_id=%d", item.ID)) + response.OK(c, item) +} + +func (h *Handler) DeleteBanner(c *gin.Context) { + id, ok := bannerID(c) + if !ok { + return + } + if err := h.service.DeleteBanner(appctx.FromContext(c.Request.Context()), id); err != nil { + response.BadRequest(c, err.Error()) + return + } + shared.OperationLog(c, h.audit, "delete-app-banner", "admin_app_banners", "success", fmt.Sprintf("banner_id=%d", id)) + response.OK(c, gin.H{"deleted": true}) +} + +func bannerID(c *gin.Context) (uint, bool) { + value, err := strconv.ParseUint(c.Param("banner_id"), 10, 64) + if err != nil || value == 0 { + response.BadRequest(c, "banner id is invalid") + return 0, false + } + return uint(value), true +} + +func parseOptionalInt64(values ...string) int64 { + for _, value := range values { + value = strings.TrimSpace(value) + if value == "" { + continue + } + parsed, err := strconv.ParseInt(value, 10, 64) + if err == nil && parsed > 0 { + return parsed + } + } + return 0 +} + +func firstQuery(c *gin.Context, keys ...string) string { + for _, key := range keys { + if value := c.Query(key); value != "" { + return value + } + } + return "" +} diff --git a/server/admin/internal/modules/appconfig/request.go b/server/admin/internal/modules/appconfig/request.go index a471f139..01fb6b20 100644 --- a/server/admin/internal/modules/appconfig/request.go +++ b/server/admin/internal/modules/appconfig/request.go @@ -8,3 +8,15 @@ type h5LinkPayload struct { Key string `json:"key" binding:"required"` URL string `json:"url"` } + +type bannerRequest struct { + CoverURL string `json:"coverUrl" binding:"required"` + BannerType string `json:"bannerType" binding:"required"` + Param string `json:"param"` + Status string `json:"status" binding:"required"` + Platform string `json:"platform" binding:"required"` + SortOrder int `json:"sortOrder"` + RegionID int64 `json:"regionId"` + CountryCode string `json:"countryCode"` + Description string `json:"description"` +} diff --git a/server/admin/internal/modules/appconfig/routes.go b/server/admin/internal/modules/appconfig/routes.go index 3e383fa7..704ea3bf 100644 --- a/server/admin/internal/modules/appconfig/routes.go +++ b/server/admin/internal/modules/appconfig/routes.go @@ -13,4 +13,9 @@ func RegisterRoutes(protected *gin.RouterGroup, h *Handler) { protected.GET("/admin/app-config/h5-links", middleware.RequirePermission("app-config:view"), h.ListH5Links) protected.PUT("/admin/app-config/h5-links", middleware.RequirePermission("app-config:update"), h.UpdateH5Links) + + protected.GET("/admin/app-config/banners", middleware.RequirePermission("app-config:view"), h.ListBanners) + protected.POST("/admin/app-config/banners", middleware.RequirePermission("app-config:update"), h.CreateBanner) + protected.PUT("/admin/app-config/banners/:banner_id", middleware.RequirePermission("app-config:update"), h.UpdateBanner) + protected.DELETE("/admin/app-config/banners/:banner_id", middleware.RequirePermission("app-config:update"), h.DeleteBanner) } diff --git a/server/admin/internal/modules/appconfig/service.go b/server/admin/internal/modules/appconfig/service.go index 69f6771c..c3cd3d32 100644 --- a/server/admin/internal/modules/appconfig/service.go +++ b/server/admin/internal/modules/appconfig/service.go @@ -5,7 +5,9 @@ import ( "fmt" "strings" "unicode" + "unicode/utf8" + "hyapp-admin-server/internal/appctx" "hyapp-admin-server/internal/model" "hyapp-admin-server/internal/repository" ) @@ -36,6 +38,22 @@ type H5Link struct { UpdatedAtMs int64 `json:"updatedAtMs"` } +type AppBanner struct { + ID uint `json:"id"` + AppCode string `json:"appCode"` + CoverURL string `json:"coverUrl"` + BannerType string `json:"bannerType"` + Param string `json:"param"` + Status string `json:"status"` + Platform string `json:"platform"` + SortOrder int `json:"sortOrder"` + RegionID int64 `json:"regionId"` + CountryCode string `json:"countryCode"` + Description string `json:"description"` + CreatedAtMs int64 `json:"createdAtMs"` + UpdatedAtMs int64 `json:"updatedAtMs"` +} + func NewService(store *repository.Store) *AppConfigService { return &AppConfigService{store: store} } @@ -102,6 +120,62 @@ func (s *AppConfigService) UpdateH5Links(request updateH5LinksRequest) ([]H5Link return s.ListH5Links() } +func (s *AppConfigService) ListBanners(appCode string, options repository.AppBannerListOptions) ([]AppBanner, error) { + options.AppCode = appctx.Normalize(appCode) + options.Status = normalizeBannerStatus(options.Status) + options.Platform = normalizeBannerPlatform(options.Platform) + options.Country = normalizeCountryCode(options.Country) + options.Keyword = strings.TrimSpace(options.Keyword) + items, err := s.store.ListAppBanners(options) + if err != nil { + return nil, err + } + out := make([]AppBanner, 0, len(items)) + for _, item := range items { + out = append(out, appBannerFromModel(item)) + } + return out, nil +} + +func (s *AppConfigService) CreateBanner(appCode string, req bannerRequest) (AppBanner, error) { + item, err := bannerModelFromRequest(appctx.Normalize(appCode), req) + if err != nil { + return AppBanner{}, err + } + if err := s.store.CreateAppBanner(&item); err != nil { + return AppBanner{}, err + } + return appBannerFromModel(item), nil +} + +func (s *AppConfigService) UpdateBanner(appCode string, id uint, req bannerRequest) (AppBanner, error) { + item, err := s.store.GetAppBanner(appctx.Normalize(appCode), id) + if err != nil { + return AppBanner{}, err + } + updated, err := bannerModelFromRequest(item.AppCode, req) + if err != nil { + return AppBanner{}, err + } + item.CoverURL = updated.CoverURL + item.BannerType = updated.BannerType + item.Param = updated.Param + item.Status = updated.Status + item.Platform = updated.Platform + item.SortOrder = updated.SortOrder + item.RegionID = updated.RegionID + item.CountryCode = updated.CountryCode + item.Description = updated.Description + if err := s.store.UpdateAppBanner(&item); err != nil { + return AppBanner{}, err + } + return appBannerFromModel(item), nil +} + +func (s *AppConfigService) DeleteBanner(appCode string, id uint) error { + return s.store.DeleteAppBanner(appctx.Normalize(appCode), id) +} + func h5LinkDefinitionSet() map[string]string { out := make(map[string]string, len(h5LinkDefinitions)) for _, definition := range h5LinkDefinitions { @@ -124,3 +198,101 @@ func validateH5URL(value string) error { } return nil } + +func bannerModelFromRequest(appCode string, req bannerRequest) (model.AppBanner, error) { + item := model.AppBanner{ + AppCode: appctx.Normalize(appCode), + CoverURL: strings.TrimSpace(req.CoverURL), + BannerType: normalizeBannerType(req.BannerType), + Param: strings.TrimSpace(req.Param), + Status: normalizeBannerStatus(req.Status), + Platform: normalizeBannerPlatform(req.Platform), + SortOrder: req.SortOrder, + RegionID: req.RegionID, + CountryCode: normalizeCountryCode(req.CountryCode), + Description: strings.TrimSpace(req.Description), + } + if item.CoverURL == "" || len(item.CoverURL) > 1024 { + return model.AppBanner{}, errors.New("banner cover is invalid") + } + if item.BannerType != "h5" && item.BannerType != "app" { + return model.AppBanner{}, errors.New("banner type is invalid") + } + if item.BannerType == "h5" { + if item.Param == "" { + return model.AppBanner{}, errors.New("h5 link is required") + } + if err := validateH5URL(item.Param); err != nil { + return model.AppBanner{}, err + } + } + if len(item.Param) > 2048 { + return model.AppBanner{}, errors.New("banner param is too long") + } + if item.Status != "active" && item.Status != "disabled" { + return model.AppBanner{}, errors.New("banner status is invalid") + } + if item.Platform != "android" && item.Platform != "ios" { + return model.AppBanner{}, errors.New("banner platform is invalid") + } + if item.RegionID < 0 { + return model.AppBanner{}, errors.New("banner region is invalid") + } + if item.CountryCode != "" && !validCountryCode(item.CountryCode) { + return model.AppBanner{}, errors.New("banner country is invalid") + } + if utf8.RuneCountInString(item.Description) > 255 { + return model.AppBanner{}, errors.New("banner description is too long") + } + return item, nil +} + +func appBannerFromModel(item model.AppBanner) AppBanner { + return AppBanner{ + ID: item.ID, + AppCode: item.AppCode, + CoverURL: item.CoverURL, + BannerType: item.BannerType, + Param: item.Param, + Status: item.Status, + Platform: item.Platform, + SortOrder: item.SortOrder, + RegionID: item.RegionID, + CountryCode: item.CountryCode, + Description: item.Description, + CreatedAtMs: item.CreatedAt.UnixMilli(), + UpdatedAtMs: item.UpdatedAt.UnixMilli(), + } +} + +func normalizeBannerType(value string) string { + return strings.ToLower(strings.TrimSpace(value)) +} + +func normalizeBannerStatus(value string) string { + value = strings.ToLower(strings.TrimSpace(value)) + if value == "" { + return "active" + } + return value +} + +func normalizeBannerPlatform(value string) string { + return strings.ToLower(strings.TrimSpace(value)) +} + +func normalizeCountryCode(value string) string { + return strings.ToUpper(strings.TrimSpace(value)) +} + +func validCountryCode(value string) bool { + if len(value) < 2 || len(value) > 3 { + return false + } + for _, char := range value { + if char < 'A' || char > 'Z' { + return false + } + } + return true +} diff --git a/server/admin/internal/modules/appuser/service.go b/server/admin/internal/modules/appuser/service.go index b8a4886f..c73d34e2 100644 --- a/server/admin/internal/modules/appuser/service.go +++ b/server/admin/internal/modules/appuser/service.go @@ -79,8 +79,29 @@ func (s *Service) ListUsers(ctx context.Context, query listQuery) ([]AppUser, in COALESCE(u.country, ''), COALESCE((SELECT c.country_name FROM countries c WHERE c.app_code = u.app_code AND c.country_code = u.country LIMIT 1), ''), COALESCE((SELECT c.country_display_name FROM countries c WHERE c.app_code = u.app_code AND c.country_code = u.country LIMIT 1), ''), - COALESCE(u.region_id, 0), - COALESCE((SELECT rg.name FROM regions rg WHERE rg.app_code = u.app_code AND rg.region_id = u.region_id LIMIT 1), ''), + CASE + WHEN COALESCE(u.region_id, 0) = 0 THEN 0 + WHEN EXISTS ( + SELECT 1 FROM regions rg + WHERE rg.app_code = u.app_code + AND rg.region_id = u.region_id + AND rg.status = 'active' + AND rg.region_code NOT IN ('Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED') + LIMIT 1 + ) THEN u.region_id + ELSE 0 + END, + CASE + WHEN COALESCE(u.region_id, 0) = 0 OR NOT EXISTS ( + SELECT 1 FROM regions rg + WHERE rg.app_code = u.app_code + AND rg.region_id = u.region_id + AND rg.status = 'active' + AND rg.region_code NOT IN ('Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED') + LIMIT 1 + ) THEN 'GLOBAL' + ELSE COALESCE((SELECT rg.name FROM regions rg WHERE rg.app_code = u.app_code AND rg.region_id = u.region_id LIMIT 1), '') + END, u.status, u.created_at_ms, u.updated_at_ms, @@ -149,8 +170,29 @@ func (s *Service) GetUser(ctx context.Context, userID int64) (AppUser, error) { COALESCE(u.country, ''), COALESCE((SELECT c.country_name FROM countries c WHERE c.app_code = u.app_code AND c.country_code = u.country LIMIT 1), ''), COALESCE((SELECT c.country_display_name FROM countries c WHERE c.app_code = u.app_code AND c.country_code = u.country LIMIT 1), ''), - COALESCE(u.region_id, 0), - COALESCE((SELECT rg.name FROM regions rg WHERE rg.app_code = u.app_code AND rg.region_id = u.region_id LIMIT 1), ''), + CASE + WHEN COALESCE(u.region_id, 0) = 0 THEN 0 + WHEN EXISTS ( + SELECT 1 FROM regions rg + WHERE rg.app_code = u.app_code + AND rg.region_id = u.region_id + AND rg.status = 'active' + AND rg.region_code NOT IN ('Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED') + LIMIT 1 + ) THEN u.region_id + ELSE 0 + END, + CASE + WHEN COALESCE(u.region_id, 0) = 0 OR NOT EXISTS ( + SELECT 1 FROM regions rg + WHERE rg.app_code = u.app_code + AND rg.region_id = u.region_id + AND rg.status = 'active' + AND rg.region_code NOT IN ('Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED') + LIMIT 1 + ) THEN 'GLOBAL' + ELSE COALESCE((SELECT rg.name FROM regions rg WHERE rg.app_code = u.app_code AND rg.region_id = u.region_id LIMIT 1), '') + END, u.status, u.created_at_ms, u.updated_at_ms, @@ -344,6 +386,7 @@ func (s *Service) resolveCountryRegion(ctx context.Context, input string) (strin AND rc.country_code = c.country_code AND rc.status = 'active' AND rg.status = 'active' + AND rg.region_code NOT IN ('Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED') ORDER BY rg.sort_order ASC, rg.region_id ASC LIMIT 1 ), 0) diff --git a/server/admin/internal/modules/countryregion/handler.go b/server/admin/internal/modules/countryregion/handler.go index 533c2bde..9fd50dce 100644 --- a/server/admin/internal/modules/countryregion/handler.go +++ b/server/admin/internal/modules/countryregion/handler.go @@ -354,6 +354,10 @@ func writeCountryRegionError(c *gin.Context, err error, fallback string) { response.BadRequest(c, "国家已归属其他启用区域") return } + if errors.Is(err, errGlobalRegionProtected) { + response.BadRequest(c, "GLOBAL 区域不能停用或配置国家") + return + } if st, ok := status.FromError(err); ok { switch st.Code() { case codes.InvalidArgument, codes.AlreadyExists, codes.FailedPrecondition, codes.Aborted: diff --git a/server/admin/internal/modules/countryregion/service.go b/server/admin/internal/modules/countryregion/service.go index f8f9058d..9eb601c5 100644 --- a/server/admin/internal/modules/countryregion/service.go +++ b/server/admin/internal/modules/countryregion/service.go @@ -17,9 +17,11 @@ import ( ) const countryRegionCaller = "hyapp-admin-server" +const globalRegionCode = "GLOBAL" const regionStatusActive = "active" const regionStatusDisabled = "disabled" const regionRebuildTaskStatusPending = "pending" +const retiredRegionCodeSQLList = "'Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED'" const maxCountryNameLength = 128 const maxCountryDisplayNameLength = 128 const maxCountryFlagLength = 16 @@ -33,13 +35,14 @@ var ( shortRegionCodePattern = regexp.MustCompile(`^[A-Za-z0-9_]{2,32}$`) descriptiveRegionCodePattern = regexp.MustCompile(`^[A-Za-z0-9][A-Za-z0-9 _-]{1,63}$`) - errCountryNotFound = errors.New("country not found") - errCountryInvalid = errors.New("country payload invalid") - errCountryConflict = errors.New("country already exists") - errRegionNotFound = errors.New("region not found") - errRegionInvalid = errors.New("region payload invalid") - errRegionConflict = errors.New("region already exists") - errRegionCountryMapping = errors.New("country already belongs to another active region") + errCountryNotFound = errors.New("country not found") + errCountryInvalid = errors.New("country payload invalid") + errCountryConflict = errors.New("country already exists") + errRegionNotFound = errors.New("region not found") + errRegionInvalid = errors.New("region payload invalid") + errRegionConflict = errors.New("region already exists") + errRegionCountryMapping = errors.New("country already belongs to another active region") + errGlobalRegionProtected = errors.New("global region is protected") ) type Service struct { @@ -170,11 +173,20 @@ func (s *Service) CreateRegion(ctx context.Context, actorID int64, requestID str } defer tx.Rollback() - countries, err := canonicalCountryCodes(ctx, tx, req.Countries) - if err != nil { - return nil, err - } nowMs := time.Now().UnixMilli() + countries := []string{} + if !isGlobalRegionCode(req.RegionCode) { + countries, err = canonicalCountryCodes(ctx, tx, req.Countries) + if err != nil { + return nil, err + } + if err := releaseRetiredCountryMappings(ctx, tx, countries, actorID, nowMs); err != nil { + return nil, err + } + if err := ensureCountriesAssignableToNewRegion(ctx, tx, countries); err != nil { + return nil, err + } + } appCode := appctx.FromContext(ctx) result, err := tx.ExecContext(ctx, ` INSERT INTO regions (app_code, region_code, name, status, sort_order, created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms) @@ -265,6 +277,9 @@ func (s *Service) setRegionEnabled(ctx context.Context, actorID int64, regionID if err != nil { return nil, err } + if !enabled && isGlobalRegionCode(before.RegionCode) { + return nil, errGlobalRegionProtected + } nowMs := time.Now().UnixMilli() nextStatus := regionStatusDisabled @@ -544,9 +559,15 @@ func validRegionCreateRequest(req createRegionRequest) bool { if !validRegionCode(req.RegionCode) { return false } + if isRetiredRegionCode(req.RegionCode) { + return false + } if req.Name == "" || utf8.RuneCountInString(req.Name) > maxRegionNameLength { return false } + if isGlobalRegionCode(req.RegionCode) { + return len(req.Countries) == 0 + } return len(req.Countries) > 0 } @@ -554,6 +575,19 @@ func validRegionCode(code string) bool { return shortRegionCodePattern.MatchString(code) || descriptiveRegionCodePattern.MatchString(code) } +func isGlobalRegionCode(code string) bool { + return normalizeRegionCode(code) == globalRegionCode +} + +func isRetiredRegionCode(code string) bool { + switch strings.ToUpper(normalizeRegionCode(code)) { + case "AUSTRALIA AND NEW ZEALAND", "CARIBBEAN", "MELANESIA", "MICRONESIA", "POLYNESIA", "SOUTHERN AFRICA", "UNSPECIFIED": + return true + default: + return false + } +} + func canonicalCountryCodes(ctx context.Context, q regionQueryer, countries []string) ([]string, error) { if len(countries) == 0 { return nil, errRegionInvalid @@ -586,6 +620,41 @@ func canonicalCountryCodes(ctx context.Context, q regionQueryer, countries []str return result, nil } +func ensureCountriesAssignableToNewRegion(ctx context.Context, q regionQueryer, countries []string) error { + for _, country := range countries { + var existingRegionID int64 + err := q.QueryRowContext(ctx, ` + SELECT region_id + FROM region_countries + WHERE app_code = ? AND country_code = ? AND status = ? + LIMIT 1 + `, appctx.FromContext(ctx), country, regionStatusActive).Scan(&existingRegionID) + if errors.Is(err, sql.ErrNoRows) { + continue + } + if err != nil { + return err + } + return errRegionCountryMapping + } + return nil +} + +func releaseRetiredCountryMappings(ctx context.Context, tx *sql.Tx, countries []string, actorID int64, nowMs int64) error { + for _, country := range countries { + if _, err := tx.ExecContext(ctx, ` + UPDATE region_countries rc + INNER JOIN regions rg ON rg.app_code = rc.app_code AND rg.region_id = rc.region_id + SET rc.status = ?, rc.updated_by_user_id = ?, rc.updated_at_ms = ? + WHERE rc.app_code = ? AND rc.country_code = ? AND rc.status = ? + AND rg.region_code IN (`+retiredRegionCodeSQLList+`) + `, regionStatusDisabled, nullableInt64(actorID), nowMs, appctx.FromContext(ctx), country, regionStatusActive); err != nil { + return err + } + } + return nil +} + func mapRegionWriteError(err error) error { var mysqlErr *mysqlDriver.MySQLError if errors.As(err, &mysqlErr) && mysqlErr.Number == 1062 { diff --git a/server/admin/internal/modules/payment/dto.go b/server/admin/internal/modules/payment/dto.go new file mode 100644 index 00000000..888c5436 --- /dev/null +++ b/server/admin/internal/modules/payment/dto.go @@ -0,0 +1,50 @@ +package payment + +import walletv1 "hyapp.local/api/proto/wallet/v1" + +type rechargeBillDTO struct { + AppCode string `json:"appCode"` + TransactionID string `json:"transactionId"` + CommandID string `json:"commandId"` + RechargeType string `json:"rechargeType"` + Status string `json:"status"` + ExternalRef string `json:"externalRef"` + UserID int64 `json:"userId"` + SellerUserID int64 `json:"sellerUserId"` + SellerRegionID int64 `json:"sellerRegionId"` + TargetRegionID int64 `json:"targetRegionId"` + PolicyID int64 `json:"policyId"` + PolicyVersion string `json:"policyVersion"` + CurrencyCode string `json:"currencyCode"` + CoinAmount int64 `json:"coinAmount"` + USDMinorAmount int64 `json:"usdMinorAmount"` + ExchangeCoinAmount int64 `json:"exchangeCoinAmount"` + ExchangeUSDMinorAmount int64 `json:"exchangeUsdMinorAmount"` + CreatedAtMS int64 `json:"createdAtMs"` +} + +func rechargeBillFromProto(item *walletv1.RechargeBill) rechargeBillDTO { + if item == nil { + return rechargeBillDTO{} + } + return rechargeBillDTO{ + AppCode: item.GetAppCode(), + TransactionID: item.GetTransactionId(), + CommandID: item.GetCommandId(), + RechargeType: item.GetRechargeType(), + Status: item.GetStatus(), + ExternalRef: item.GetExternalRef(), + UserID: item.GetUserId(), + SellerUserID: item.GetSellerUserId(), + SellerRegionID: item.GetSellerRegionId(), + TargetRegionID: item.GetTargetRegionId(), + PolicyID: item.GetPolicyId(), + PolicyVersion: item.GetPolicyVersion(), + CurrencyCode: item.GetCurrencyCode(), + CoinAmount: item.GetCoinAmount(), + USDMinorAmount: item.GetUsdMinorAmount(), + ExchangeCoinAmount: item.GetExchangeCoinAmount(), + ExchangeUSDMinorAmount: item.GetExchangeUsdMinorAmount(), + CreatedAtMS: item.GetCreatedAtMs(), + } +} diff --git a/server/admin/internal/modules/payment/handler.go b/server/admin/internal/modules/payment/handler.go new file mode 100644 index 00000000..8afac36a --- /dev/null +++ b/server/admin/internal/modules/payment/handler.go @@ -0,0 +1,72 @@ +package payment + +import ( + "strconv" + "strings" + + "hyapp-admin-server/internal/appctx" + "hyapp-admin-server/internal/integration/walletclient" + "hyapp-admin-server/internal/middleware" + "hyapp-admin-server/internal/modules/shared" + "hyapp-admin-server/internal/response" + walletv1 "hyapp.local/api/proto/wallet/v1" + + "github.com/gin-gonic/gin" +) + +type Handler struct { + wallet walletclient.Client +} + +func New(wallet walletclient.Client) *Handler { + return &Handler{wallet: wallet} +} + +func (h *Handler) ListRechargeBills(c *gin.Context) { + options := shared.ListOptions(c) + resp, err := h.wallet.ListRechargeBills(c.Request.Context(), &walletv1.ListRechargeBillsRequest{ + RequestId: middleware.CurrentRequestID(c), + AppCode: appctx.FromContext(c.Request.Context()), + UserId: queryInt64(c, "user_id", "userId"), + SellerUserId: queryInt64(c, "seller_user_id", "sellerUserId"), + RegionId: queryInt64(c, "region_id", "regionId"), + RechargeType: strings.TrimSpace(firstQuery(c, "recharge_type", "rechargeType")), + Status: options.Status, + Keyword: options.Keyword, + StartAtMs: queryInt64(c, "start_at_ms", "startAtMs"), + EndAtMs: queryInt64(c, "end_at_ms", "endAtMs"), + Page: int32(options.Page), + PageSize: int32(options.PageSize), + }) + if err != nil { + response.ServerError(c, "获取账单列表失败") + return + } + + items := make([]rechargeBillDTO, 0, len(resp.GetBills())) + for _, item := range resp.GetBills() { + items = append(items, rechargeBillFromProto(item)) + } + response.OK(c, response.Page{Items: items, Page: options.Page, PageSize: options.PageSize, Total: resp.GetTotal()}) +} + +func queryInt64(c *gin.Context, keys ...string) int64 { + value := strings.TrimSpace(firstQuery(c, keys...)) + if value == "" { + return 0 + } + parsed, err := strconv.ParseInt(value, 10, 64) + if err != nil || parsed < 0 { + return 0 + } + return parsed +} + +func firstQuery(c *gin.Context, keys ...string) string { + for _, key := range keys { + if value := c.Query(key); value != "" { + return value + } + } + return "" +} diff --git a/server/admin/internal/modules/payment/routes.go b/server/admin/internal/modules/payment/routes.go new file mode 100644 index 00000000..06e1e247 --- /dev/null +++ b/server/admin/internal/modules/payment/routes.go @@ -0,0 +1,15 @@ +package payment + +import ( + "hyapp-admin-server/internal/middleware" + + "github.com/gin-gonic/gin" +) + +func RegisterRoutes(protected *gin.RouterGroup, h *Handler) { + if h == nil { + return + } + + protected.GET("/admin/payment/recharge-bills", middleware.RequirePermission("payment-bill:view"), h.ListRechargeBills) +} diff --git a/server/admin/internal/modules/resource/dto.go b/server/admin/internal/modules/resource/dto.go index 72e42abb..d0333956 100644 --- a/server/admin/internal/modules/resource/dto.go +++ b/server/admin/internal/modules/resource/dto.go @@ -64,9 +64,14 @@ type giftDTO struct { SortOrder int32 `json:"sortOrder"` PresentationJSON string `json:"presentationJson"` PriceVersion string `json:"priceVersion"` + GiftTypeCode string `json:"giftTypeCode"` + ChargeAssetType string `json:"chargeAssetType"` CoinPrice int64 `json:"coinPrice"` GiftPointAmount int64 `json:"giftPointAmount"` HeatValue int64 `json:"heatValue"` + EffectiveFromMS int64 `json:"effectiveFromMs"` + EffectiveToMS int64 `json:"effectiveToMs"` + EffectTypes []string `json:"effectTypes"` CreatedByUserID int64 `json:"createdByUserId"` UpdatedByUserID int64 `json:"updatedByUserId"` CreatedAtMS int64 `json:"createdAtMs"` @@ -189,9 +194,14 @@ func giftFromProto(gift *walletv1.GiftConfig) giftDTO { SortOrder: gift.GetSortOrder(), PresentationJSON: gift.GetPresentationJson(), PriceVersion: gift.GetPriceVersion(), + GiftTypeCode: gift.GetGiftTypeCode(), + ChargeAssetType: gift.GetChargeAssetType(), CoinPrice: gift.GetCoinPrice(), GiftPointAmount: gift.GetGiftPointAmount(), HeatValue: gift.GetHeatValue(), + EffectiveFromMS: gift.GetEffectiveFromMs(), + EffectiveToMS: gift.GetEffectiveToMs(), + EffectTypes: gift.GetEffectTypes(), CreatedByUserID: gift.GetCreatedByUserId(), UpdatedByUserID: gift.GetUpdatedByUserId(), CreatedAtMS: gift.GetCreatedAtMs(), diff --git a/server/admin/internal/modules/resource/request.go b/server/admin/internal/modules/resource/request.go index 93921360..17691336 100644 --- a/server/admin/internal/modules/resource/request.go +++ b/server/admin/internal/modules/resource/request.go @@ -42,18 +42,23 @@ type resourceGroupItemRequest struct { } type giftRequest struct { - GiftID string `json:"giftId"` - ResourceID int64 `json:"resourceId"` - Status string `json:"status"` - Name string `json:"name"` - SortOrder int32 `json:"sortOrder"` - PresentationJSON string `json:"presentationJson"` - PriceVersion string `json:"priceVersion"` - CoinPrice int64 `json:"coinPrice"` - GiftPointAmount int64 `json:"giftPointAmount"` - HeatValue int64 `json:"heatValue"` - EffectiveAtMS int64 `json:"effectiveAtMs"` - RegionIDs []int64 `json:"regionIds"` + GiftID string `json:"giftId"` + ResourceID int64 `json:"resourceId"` + Status string `json:"status"` + Name string `json:"name"` + SortOrder int32 `json:"sortOrder"` + PresentationJSON string `json:"presentationJson"` + PriceVersion string `json:"priceVersion"` + GiftTypeCode string `json:"giftTypeCode"` + ChargeAssetType string `json:"chargeAssetType"` + CoinPrice int64 `json:"coinPrice"` + GiftPointAmount int64 `json:"giftPointAmount"` + HeatValue int64 `json:"heatValue"` + EffectiveAtMS int64 `json:"effectiveAtMs"` + EffectiveFromMS int64 `json:"effectiveFromMs"` + EffectiveToMS int64 `json:"effectiveToMs"` + EffectTypes []string `json:"effectTypes"` + RegionIDs []int64 `json:"regionIds"` } type grantResourceRequest struct { @@ -161,10 +166,15 @@ func (r giftRequest) createProto(c *gin.Context) *walletv1.CreateGiftConfigReque SortOrder: r.SortOrder, PresentationJson: strings.TrimSpace(r.PresentationJSON), PriceVersion: strings.TrimSpace(r.PriceVersion), + GiftTypeCode: strings.TrimSpace(r.GiftTypeCode), + ChargeAssetType: strings.TrimSpace(r.ChargeAssetType), CoinPrice: r.CoinPrice, GiftPointAmount: r.GiftPointAmount, HeatValue: r.HeatValue, EffectiveAtMs: r.EffectiveAtMS, + EffectiveFromMs: r.EffectiveFromMS, + EffectiveToMs: r.EffectiveToMS, + EffectTypes: r.EffectTypes, OperatorUserId: actorID(c), RegionIds: r.RegionIDs, } @@ -181,10 +191,15 @@ func (r giftRequest) updateProto(c *gin.Context, giftID string) *walletv1.Update SortOrder: r.SortOrder, PresentationJson: strings.TrimSpace(r.PresentationJSON), PriceVersion: strings.TrimSpace(r.PriceVersion), + GiftTypeCode: strings.TrimSpace(r.GiftTypeCode), + ChargeAssetType: strings.TrimSpace(r.ChargeAssetType), CoinPrice: r.CoinPrice, GiftPointAmount: r.GiftPointAmount, HeatValue: r.HeatValue, EffectiveAtMs: r.EffectiveAtMS, + EffectiveFromMs: r.EffectiveFromMS, + EffectiveToMs: r.EffectiveToMS, + EffectTypes: r.EffectTypes, OperatorUserId: actorID(c), RegionIds: r.RegionIDs, } diff --git a/server/admin/internal/repository/app_banner_repository.go b/server/admin/internal/repository/app_banner_repository.go new file mode 100644 index 00000000..db033450 --- /dev/null +++ b/server/admin/internal/repository/app_banner_repository.go @@ -0,0 +1,57 @@ +package repository + +import ( + "strings" + + "hyapp-admin-server/internal/model" +) + +type AppBannerListOptions struct { + AppCode string + Keyword string + Status string + Platform string + RegionID int64 + Country string +} + +func (s *Store) ListAppBanners(options AppBannerListOptions) ([]model.AppBanner, error) { + var items []model.AppBanner + query := s.db.Where("app_code = ?", strings.TrimSpace(options.AppCode)) + if options.Status != "" { + query = query.Where("status = ?", strings.TrimSpace(options.Status)) + } + if options.Platform != "" { + query = query.Where("platform = ?", strings.TrimSpace(options.Platform)) + } + if options.RegionID > 0 { + query = query.Where("region_id = ?", options.RegionID) + } + if options.Country != "" { + query = query.Where("country_code = ?", strings.TrimSpace(options.Country)) + } + if options.Keyword != "" { + like := "%" + strings.TrimSpace(options.Keyword) + "%" + query = query.Where("(description LIKE ? OR param LIKE ? OR country_code LIKE ?)", like, like, like) + } + err := query.Order("sort_order ASC, id DESC").Find(&items).Error + return items, err +} + +func (s *Store) GetAppBanner(appCode string, id uint) (model.AppBanner, error) { + var item model.AppBanner + err := s.db.Where("app_code = ? AND id = ?", strings.TrimSpace(appCode), id).First(&item).Error + return item, err +} + +func (s *Store) CreateAppBanner(item *model.AppBanner) error { + return s.db.Create(item).Error +} + +func (s *Store) UpdateAppBanner(item *model.AppBanner) error { + return s.db.Save(item).Error +} + +func (s *Store) DeleteAppBanner(appCode string, id uint) error { + return s.db.Where("app_code = ? AND id = ?", strings.TrimSpace(appCode), id).Delete(&model.AppBanner{}).Error +} diff --git a/server/admin/internal/repository/repository.go b/server/admin/internal/repository/repository.go index bf8b485d..843ccf24 100644 --- a/server/admin/internal/repository/repository.go +++ b/server/admin/internal/repository/repository.go @@ -65,6 +65,7 @@ func (s *Store) AutoMigrate() error { &model.Permission{}, &model.Menu{}, &model.AppConfig{}, + &model.AppBanner{}, &model.RefreshToken{}, &model.LoginLog{}, &model.OperationLog{}, diff --git a/server/admin/internal/repository/seed.go b/server/admin/internal/repository/seed.go index 0046198a..3a372a6c 100644 --- a/server/admin/internal/repository/seed.go +++ b/server/admin/internal/repository/seed.go @@ -55,6 +55,7 @@ var defaultPermissions = []model.Permission{ {Name: "币商查看", Code: "coin-seller:view", Kind: "menu"}, {Name: "币商创建", Code: "coin-seller:create", Kind: "button"}, {Name: "币商更新", Code: "coin-seller:update", Kind: "button"}, + {Name: "支付账单查看", Code: "payment-bill:view", Kind: "menu"}, {Name: "角色查看", Code: "role:view", Kind: "menu"}, {Name: "角色创建", Code: "role:create", Kind: "button"}, {Name: "角色更新", Code: "role:update", Kind: "button"}, @@ -101,6 +102,7 @@ func (s *Store) seedMenus() error { appConfigID := uint(0) resourceID := uint(0) roomsID := uint(0) + paymentID := uint(0) menus := []model.Menu{ {Title: "总览", Code: "overview", Path: "/overview", Icon: "dashboard", PermissionCode: "overview:view", Sort: 10, Visible: true}, {Title: "系统管理", Code: "system", Path: "", Icon: "settings", PermissionCode: "", Sort: 30, Visible: true}, @@ -110,6 +112,7 @@ func (s *Store) seedMenus() error { {Title: "房间管理", Code: "rooms", Path: "", Icon: "room", PermissionCode: "", Sort: 65, Visible: true}, {Title: "APP配置", Code: "app-config", Path: "", Icon: "settings", PermissionCode: "", Sort: 66, Visible: true}, {Title: "资源管理", Code: "resources", Path: "", Icon: "inventory", PermissionCode: "", Sort: 67, Visible: true}, + {Title: "支付管理", Code: "payment", Path: "", Icon: "wallet", PermissionCode: "", Sort: 68, Visible: true}, {Title: "地区管理", Code: "geo", Path: "", Icon: "map", PermissionCode: "", Sort: 70, Visible: true}, {Title: "团队管理", Code: "host-org", Path: "", Icon: "network", PermissionCode: "", Sort: 80, Visible: true}, {Title: "任务中心", Code: "jobs", Path: "/jobs", Icon: "task", PermissionCode: "job:view", Sort: 90, Visible: true}, @@ -143,6 +146,9 @@ func (s *Store) seedMenus() error { if syncedMenu.Code == "rooms" { roomsID = syncedMenu.ID } + if syncedMenu.Code == "payment" { + paymentID = syncedMenu.ID + } } children := []model.Menu{ @@ -154,10 +160,12 @@ func (s *Store) seedMenus() error { {ParentID: &appUsersID, Title: "用户列表", Code: "app-user-list", Path: "/app/users", Icon: "users", PermissionCode: "app-user:view", Sort: 60, Visible: true}, {ParentID: &roomsID, Title: "房间列表", Code: "room-list", Path: "/rooms", Icon: "room", PermissionCode: "room:view", Sort: 65, Visible: true}, {ParentID: &appConfigID, Title: "H5配置", Code: "app-config-h5", Path: "/app-config/h5", Icon: "settings", PermissionCode: "app-config:view", Sort: 66, Visible: true}, + {ParentID: &appConfigID, Title: "BANNER配置", Code: "app-config-banners", Path: "/app-config/banners", Icon: "image", PermissionCode: "app-config:view", Sort: 67, Visible: true}, {ParentID: &resourceID, Title: "资源列表", Code: "resource-list", Path: "/resources", Icon: "inventory", PermissionCode: "resource:view", Sort: 67, Visible: true}, {ParentID: &resourceID, Title: "资源组列表", Code: "resource-group-list", Path: "/resource-groups", Icon: "category", PermissionCode: "resource-group:view", Sort: 68, Visible: true}, {ParentID: &resourceID, Title: "礼物列表", Code: "gift-list", Path: "/gifts", Icon: "gift", PermissionCode: "gift:view", Sort: 69, Visible: true}, {ParentID: &resourceID, Title: "资源赠送", Code: "resource-grant-list", Path: "/resource-grants", Icon: "send", PermissionCode: "resource-grant:view", Sort: 70, Visible: true}, + {ParentID: &paymentID, Title: "账单列表", Code: "payment-bill-list", Path: "/payment/bills", Icon: "receipt", PermissionCode: "payment-bill:view", Sort: 68, Visible: true}, {ParentID: &geoID, Title: "国家管理", Code: "host-org-countries", Path: "/host/countries", Icon: "public", PermissionCode: "country:view", Sort: 70, Visible: true}, {ParentID: &geoID, Title: "区域管理", Code: "host-org-regions", Path: "/host/regions", Icon: "map", PermissionCode: "region:view", Sort: 71, Visible: true}, {ParentID: &hostOrgID, Title: "Agency 管理", Code: "host-org-agencies", Path: "/host/agencies", Icon: "apartment", PermissionCode: "agency:view", Sort: 80, Visible: true}, @@ -402,13 +410,14 @@ func defaultRolePermissionCodes(code string) []string { "agency:view", "agency:create", "agency:status", "bd:view", "bd:create", "bd:update", "coin-seller:view", "coin-seller:create", "coin-seller:update", + "payment-bill:view", "log:view", "notification:view", "notification:read", "job:view", "job:cancel", "export:create", "upload:create", } case "auditor": - return []string{"overview:view", "log:view", "user:view", "app-user:view", "room:view", "app-config:view", "resource:view", "resource-group:view", "resource-grant:view", "gift:view", "role:view", "permission:view", "job:view"} + return []string{"overview:view", "log:view", "user:view", "app-user:view", "room:view", "app-config:view", "resource:view", "resource-group:view", "resource-grant:view", "gift:view", "payment-bill:view", "role:view", "permission:view", "job:view"} case "readonly": return []string{ "overview:view", @@ -426,6 +435,7 @@ func defaultRolePermissionCodes(code string) []string { "agency:view", "bd:view", "coin-seller:view", + "payment-bill:view", "role:view", "permission:view", "menu:view", @@ -453,9 +463,10 @@ func defaultRolePermissionMigrationCodes(code string) []string { "country:view", "country:create", "country:update", "country:status", "region:view", "region:create", "region:update", "region:status", "coin-seller:view", "coin-seller:create", "coin-seller:update", + "payment-bill:view", } case "auditor", "readonly": - return []string{"room:view", "app-config:view", "resource:view", "resource-group:view", "resource-grant:view", "gift:view", "coin-seller:view"} + return []string{"room:view", "app-config:view", "resource:view", "resource-group:view", "resource-grant:view", "gift:view", "coin-seller:view", "payment-bill:view"} default: return nil } diff --git a/server/admin/internal/router/router.go b/server/admin/internal/router/router.go index c3603b92..17c1593e 100644 --- a/server/admin/internal/router/router.go +++ b/server/admin/internal/router/router.go @@ -16,6 +16,7 @@ import ( "hyapp-admin-server/internal/modules/job" "hyapp-admin-server/internal/modules/menu" "hyapp-admin-server/internal/modules/notification" + "hyapp-admin-server/internal/modules/payment" "hyapp-admin-server/internal/modules/rbac" resourcemodule "hyapp-admin-server/internal/modules/resource" "hyapp-admin-server/internal/modules/roomadmin" @@ -40,6 +41,7 @@ type Handlers struct { Job *job.Handler Menu *menu.Handler Notification *notification.Handler + Payment *payment.Handler RBAC *rbac.Handler Resource *resourcemodule.Handler RoomAdmin *roomadmin.Handler @@ -72,6 +74,7 @@ func New(cfg config.Config, auth *service.AuthService, h Handlers) *gin.Engine { hostorg.RegisterRoutes(protected, h.HostOrg) audit.RegisterRoutes(protected, h.Audit) notification.RegisterRoutes(protected, h.Notification) + payment.RegisterRoutes(protected, h.Payment) job.RegisterRoutes(protected, h.Job) upload.RegisterRoutes(protected, h.Upload) search.RegisterRoutes(protected, h.Search) diff --git a/server/admin/migrations/006_admin_app_banners.sql b/server/admin/migrations/006_admin_app_banners.sql new file mode 100644 index 00000000..b9fcdce1 --- /dev/null +++ b/server/admin/migrations/006_admin_app_banners.sql @@ -0,0 +1,17 @@ +CREATE TABLE IF NOT EXISTS admin_app_banners ( + id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, + app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', + cover_url VARCHAR(1024) NOT NULL, + banner_type VARCHAR(16) NOT NULL, + param VARCHAR(2048) NOT NULL DEFAULT '', + status VARCHAR(24) NOT NULL DEFAULT 'active', + platform VARCHAR(24) NOT NULL, + sort_order INT NOT NULL DEFAULT 0, + region_id BIGINT NOT NULL DEFAULT 0, + country_code VARCHAR(8) NOT NULL DEFAULT '', + description VARCHAR(255) NOT NULL DEFAULT '', + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + INDEX idx_admin_app_banners_app_sort (app_code, status, sort_order, id), + INDEX idx_admin_app_banners_scope (app_code, platform, region_id, country_code) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/services/gateway-service/internal/appconfig/mysql.go b/services/gateway-service/internal/appconfig/mysql.go index 5e7bbdf9..187d66d8 100644 --- a/services/gateway-service/internal/appconfig/mysql.go +++ b/services/gateway-service/internal/appconfig/mysql.go @@ -13,6 +13,14 @@ import ( const h5LinkGroup = "h5-links" const listH5LinksSQL = "SELECT `key`, COALESCE(value, ''), updated_at FROM admin_app_configs WHERE `group` = ?" +const listAppBannersSQL = ` + SELECT id, app_code, cover_url, banner_type, param, platform, sort_order, region_id, country_code, description, updated_at + FROM admin_app_banners + WHERE app_code = ? AND status = 'active' + AND (? = '' OR platform = ?) + AND (region_id = 0 OR region_id = ?) + AND (country_code = '' OR country_code = ?) + ORDER BY sort_order ASC, id DESC` // H5Link 是 gateway 下发给 App 的 H5 入口配置。 type H5Link struct { @@ -22,9 +30,32 @@ type H5Link struct { UpdatedAtMs int64 `json:"updated_at_ms"` } +// BannerQuery 是 App 首页 banner 的公开筛选条件。 +type BannerQuery struct { + AppCode string + Platform string + RegionID int64 + Country string +} + +// Banner 是 gateway 下发给 App 首页的 banner 配置。 +type Banner struct { + ID uint `json:"id"` + CoverURL string `json:"cover_url"` + BannerType string `json:"type"` + Param string `json:"param"` + Platform string `json:"platform"` + SortOrder int `json:"sort_order"` + RegionID int64 `json:"region_id,omitempty"` + CountryCode string `json:"country_code,omitempty"` + Description string `json:"description,omitempty"` + UpdatedAtMs int64 `json:"updated_at_ms"` +} + // Reader 是 HTTP 层读取 H5 配置的最小依赖。 type Reader interface { ListH5Links(ctx context.Context) ([]H5Link, error) + ListBanners(ctx context.Context, query BannerQuery) ([]Banner, error) } type h5LinkDefinition struct { @@ -115,10 +146,57 @@ func (r *MySQLReader) ListH5Links(ctx context.Context) ([]H5Link, error) { return items, nil } +// ListBanners 返回当前 App、平台和地域可见的首页 banner。 +func (r *MySQLReader) ListBanners(ctx context.Context, query BannerQuery) ([]Banner, error) { + if r == nil || r.db == nil { + return nil, errors.New("app config reader is not configured") + } + + appCode := normalizeAppCode(query.AppCode) + platform := normalizePlatform(query.Platform) + country := normalizeCountry(query.Country) + rows, err := r.db.QueryContext(ctx, listAppBannersSQL, appCode, platform, platform, query.RegionID, country) + if err != nil { + return nil, err + } + defer rows.Close() + + items := make([]Banner, 0) + for rows.Next() { + var item Banner + var appCode string + var updatedAt sql.NullTime + if err := rows.Scan( + &item.ID, + &appCode, + &item.CoverURL, + &item.BannerType, + &item.Param, + &item.Platform, + &item.SortOrder, + &item.RegionID, + &item.CountryCode, + &item.Description, + &updatedAt, + ); err != nil { + return nil, err + } + if updatedAt.Valid { + item.UpdatedAtMs = updatedAt.Time.UnixMilli() + } + items = append(items, item) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + // StaticReader 给测试和临时环境提供内存版 H5 配置读取。 type StaticReader struct { - Links []H5Link - Err error + Links []H5Link + Banners []Banner + Err error } // ListH5Links 返回预置 H5 配置。 @@ -131,3 +209,30 @@ func (r StaticReader) ListH5Links(context.Context) ([]H5Link, error) { copy(out, r.Links) return out, nil } + +// ListBanners 返回预置 App banner 配置。 +func (r StaticReader) ListBanners(context.Context, BannerQuery) ([]Banner, error) { + if r.Err != nil { + return nil, r.Err + } + + out := make([]Banner, len(r.Banners)) + copy(out, r.Banners) + return out, nil +} + +func normalizeAppCode(value string) string { + value = strings.ToLower(strings.TrimSpace(value)) + if value == "" { + return "lalu" + } + return value +} + +func normalizePlatform(value string) string { + return strings.ToLower(strings.TrimSpace(value)) +} + +func normalizeCountry(value string) string { + return strings.ToUpper(strings.TrimSpace(value)) +} diff --git a/services/gateway-service/internal/transport/http/app_config_handler.go b/services/gateway-service/internal/transport/http/app_config_handler.go index 611a20be..72f1641c 100644 --- a/services/gateway-service/internal/transport/http/app_config_handler.go +++ b/services/gateway-service/internal/transport/http/app_config_handler.go @@ -3,13 +3,17 @@ package http import ( "context" "net/http" + "strconv" + "strings" + "hyapp/pkg/appcode" "hyapp/services/gateway-service/internal/appconfig" ) // appConfigReader 是 gateway 对后台 App 配置的只读依赖。 type appConfigReader interface { ListH5Links(ctx context.Context) ([]appconfig.H5Link, error) + ListBanners(ctx context.Context, query appconfig.BannerQuery) ([]appconfig.Banner, error) } // listH5Links 返回后台 APP配置/H5配置 中维护的 H5 入口地址。 @@ -29,3 +33,43 @@ func (h *Handler) listH5Links(writer http.ResponseWriter, request *http.Request) writeOK(writer, request, map[string]any{"items": items, "total": len(items)}) } + +// listAppBanners 返回后台 APP配置/BANNER配置 中维护的首页 banner。 +func (h *Handler) listAppBanners(writer http.ResponseWriter, request *http.Request) { + if h.appConfigReader == nil { + writeError(writer, request, http.StatusBadGateway, codeUpstreamError, "upstream service error") + return + } + + items, err := h.appConfigReader.ListBanners(request.Context(), appconfig.BannerQuery{ + AppCode: appcode.FromContext(request.Context()), + Platform: firstQueryOrHeader(request, "platform", "X-App-Platform", "X-Platform"), + RegionID: optionalInt64Query(request, "region_id"), + Country: firstQueryOrHeader(request, "country", "X-Country-Code", "X-App-Country"), + }) + if err != nil { + writeError(writer, request, http.StatusBadGateway, codeUpstreamError, "upstream service error") + return + } + + writeOK(writer, request, map[string]any{"items": items, "total": len(items)}) +} + +func firstQueryOrHeader(request *http.Request, queryKey string, headerNames ...string) string { + if value := strings.TrimSpace(request.URL.Query().Get(queryKey)); value != "" { + return value + } + return firstHeader(request, headerNames...) +} + +func optionalInt64Query(request *http.Request, key string) int64 { + value := strings.TrimSpace(request.URL.Query().Get(key)) + if value == "" { + return 0 + } + parsed, err := strconv.ParseInt(value, 10, 64) + if err != nil || parsed < 0 { + return 0 + } + return parsed +} diff --git a/services/gateway-service/internal/transport/http/resource_handler.go b/services/gateway-service/internal/transport/http/resource_handler.go index 10c893d8..c06c33a5 100644 --- a/services/gateway-service/internal/transport/http/resource_handler.go +++ b/services/gateway-service/internal/transport/http/resource_handler.go @@ -65,9 +65,14 @@ type giftConfigData struct { SortOrder int32 `json:"sort_order"` PresentationJSON string `json:"presentation_json"` PriceVersion string `json:"price_version"` + GiftTypeCode string `json:"gift_type_code"` + ChargeAssetType string `json:"charge_asset_type"` CoinPrice int64 `json:"coin_price"` GiftPointAmount int64 `json:"gift_point_amount"` HeatValue int64 `json:"heat_value"` + EffectiveFromMS int64 `json:"effective_from_ms"` + EffectiveToMS int64 `json:"effective_to_ms"` + EffectTypes []string `json:"effect_types"` CreatedAtMS int64 `json:"created_at_ms"` UpdatedAtMS int64 `json:"updated_at_ms"` RegionIDs []int64 `json:"region_ids"` @@ -317,9 +322,14 @@ func giftFromProto(gift *walletv1.GiftConfig) giftConfigData { SortOrder: gift.GetSortOrder(), PresentationJSON: gift.GetPresentationJson(), PriceVersion: gift.GetPriceVersion(), + GiftTypeCode: gift.GetGiftTypeCode(), + ChargeAssetType: gift.GetChargeAssetType(), CoinPrice: gift.GetCoinPrice(), GiftPointAmount: gift.GetGiftPointAmount(), HeatValue: gift.GetHeatValue(), + EffectiveFromMS: gift.GetEffectiveFromMs(), + EffectiveToMS: gift.GetEffectiveToMs(), + EffectTypes: gift.GetEffectTypes(), CreatedAtMS: gift.GetCreatedAtMs(), UpdatedAtMS: gift.GetUpdatedAtMs(), RegionIDs: gift.GetRegionIds(), diff --git a/services/gateway-service/internal/transport/http/response_test.go b/services/gateway-service/internal/transport/http/response_test.go index ac6de8a6..a7840a9b 100644 --- a/services/gateway-service/internal/transport/http/response_test.go +++ b/services/gateway-service/internal/transport/http/response_test.go @@ -918,6 +918,57 @@ func TestListH5LinksRequiresConfigReader(t *testing.T) { assertEnvelope(t, recorder, http.StatusBadGateway, codeUpstreamError, "req-h5-links-missing") } +func TestListAppBannersReturnsAdminAppConfig(t *testing.T) { + handler := NewHandlerWithClients(&fakeRoomClient{}, nil, nil, &fakeUserProfileClient{}) + handler.SetAppConfigReader(appconfig.StaticReader{Banners: []appconfig.Banner{ + { + ID: 8, + CoverURL: "https://cdn.example.com/banner.png", + BannerType: "h5", + Param: "https://h5.example.com/activity", + Platform: "android", + SortOrder: 10, + RegionID: 1, + CountryCode: "CN", + Description: "homepage", + UpdatedAtMs: 1700000002000, + }, + }}) + router := handler.Routes(auth.NewVerifier("secret")) + request := httptest.NewRequest(http.MethodGet, "/api/v1/app/banners?platform=android&country=CN®ion_id=1", nil) + request.Header.Set("X-Request-ID", "req-app-banners") + request.Header.Set("X-App-Package", "com.org.laluparty") + recorder := httptest.NewRecorder() + + router.ServeHTTP(recorder, request) + + if recorder.Code != http.StatusOK { + t.Fatalf("status mismatch: got %d body=%s", recorder.Code, recorder.Body.String()) + } + var response responseEnvelope + if err := json.NewDecoder(recorder.Body).Decode(&response); err != nil { + t.Fatalf("decode response failed: %v", err) + } + data, ok := response.Data.(map[string]any) + if response.Code != codeOK || !ok { + t.Fatalf("unexpected envelope: %+v", response) + } + if data["total"].(float64) != 1 { + t.Fatalf("banner total mismatch: %+v", data) + } + items, ok := data["items"].([]any) + if !ok || len(items) != 1 { + t.Fatalf("banner items shape mismatch: %+v", data) + } + first, ok := items[0].(map[string]any) + if !ok || first["cover_url"] != "https://cdn.example.com/banner.png" || first["type"] != "h5" || first["param"] != "https://h5.example.com/activity" { + t.Fatalf("banner item mismatch: %+v", first) + } + if first["platform"] != "android" || first["sort_order"].(float64) != 10 || first["updated_at_ms"].(float64) != 1700000002000 { + t.Fatalf("banner metadata mismatch: %+v", first) + } +} + func TestGetMyHostIdentityCombinesActiveHostAndBDProfiles(t *testing.T) { hostClient := &fakeUserHostClient{ hostProfile: &userv1.HostProfile{ diff --git a/services/gateway-service/internal/transport/http/router.go b/services/gateway-service/internal/transport/http/router.go index 9230d9d2..ed80e659 100644 --- a/services/gateway-service/internal/transport/http/router.go +++ b/services/gateway-service/internal/transport/http/router.go @@ -21,6 +21,7 @@ func (h *Handler) Routes(jwtVerifier *auth.Verifier) http.Handler { mux.Handle(apiV1Prefix+"/countries", h.publicAPIHandler(h.listRegistrationCountries)) mux.Handle(apiV1Prefix+"/app/h5-links", h.publicAPIHandler(h.listH5Links)) + mux.Handle(apiV1Prefix+"/app/banners", h.publicAPIHandler(h.listAppBanners)) mux.Handle(apiV1Prefix+"/resources", h.publicAPIHandler(h.listResources)) mux.Handle(apiV1Prefix+"/resource-groups/", h.publicAPIHandler(h.getResourceGroup)) mux.Handle(apiV1Prefix+"/gifts", h.publicAPIHandler(h.listGifts)) diff --git a/services/user-service/deploy/mysql/initdb/001_user_service.sql b/services/user-service/deploy/mysql/initdb/001_user_service.sql index af3bad1d..08725943 100644 --- a/services/user-service/deploy/mysql/initdb/001_user_service.sql +++ b/services/user-service/deploy/mysql/initdb/001_user_service.sql @@ -596,30 +596,24 @@ ON DUPLICATE KEY UPDATE updated_at_ms = VALUES(updated_at_ms); INSERT INTO regions (region_code, name, status, sort_order, created_at_ms, updated_at_ms) VALUES + ('GLOBAL', 'GLOBAL', 'active', 0, 0, 0), ('Southern Europe', '南欧', 'active', 10, 0, 0), ('Western Asia', '西亚', 'active', 20, 0, 0), ('Southern Asia', '南亚', 'active', 30, 0, 0), - ('Caribbean', '加勒比地区', 'active', 40, 0, 0), ('Southeast Europe', '东南欧', 'active', 50, 0, 0), ('Middle Africa', '中非', 'active', 60, 0, 0), - ('UNSPECIFIED', 'UNSPECIFIED', 'active', 70, 0, 0), ('South America', '南美洲', 'active', 80, 0, 0), - ('Polynesia', '波利尼西亚', 'active', 90, 0, 0), ('Central Europe', '中欧', 'active', 100, 0, 0), - ('Australia and New Zealand', '澳大利亚和新西兰', 'active', 110, 0, 0), ('Northern Europe', '北欧', 'active', 120, 0, 0), ('Western Europe', '西欧', 'active', 130, 0, 0), ('Western Africa', '西非', 'active', 140, 0, 0), ('Eastern Africa', '东非', 'active', 150, 0, 0), ('North America', '北美洲', 'active', 160, 0, 0), ('South-Eastern Asia', '东南亚', 'active', 170, 0, 0), - ('Southern Africa', '南部非洲', 'active', 180, 0, 0), ('Eastern Europe', '东欧', 'active', 190, 0, 0), ('Central America', '中美洲', 'active', 200, 0, 0), ('Eastern Asia', '东亚', 'active', 210, 0, 0), ('Northern Africa', '北非', 'active', 220, 0, 0), - ('Melanesia', '美拉尼西亚', 'active', 230, 0, 0), - ('Micronesia', '密克罗尼西亚', 'active', 240, 0, 0), ('Central Asia', '中亚', 'active', 250, 0, 0) ON DUPLICATE KEY UPDATE name = VALUES(name), @@ -1131,6 +1125,7 @@ FROM ( SELECT 'ZW' AS country_code, 'Eastern Africa' AS region_code ) AS seed INNER JOIN regions r ON r.app_code = 'lalu' AND r.region_code = seed.region_code + AND r.region_code NOT IN ('Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED') INNER JOIN countries c ON c.app_code = 'lalu' AND c.country_code = seed.country_code ON DUPLICATE KEY UPDATE region_id = VALUES(region_id), diff --git a/services/user-service/internal/domain/user/region.go b/services/user-service/internal/domain/user/region.go index 6e42e589..702f5904 100644 --- a/services/user-service/internal/domain/user/region.go +++ b/services/user-service/internal/domain/user/region.go @@ -6,6 +6,9 @@ import ( ) const ( + // GlobalRegionCode 是没有命中任何显式国家映射时使用的兜底区域。 + GlobalRegionCode = "GLOBAL" + // RegionStatusActive 表示区域映射参与国家到区域的实时解析。 RegionStatusActive = "active" // RegionStatusDisabled 表示区域停止解析并释放 active 国家归属。 @@ -30,6 +33,15 @@ var ( phoneCountryCodePattern = regexp.MustCompile(`^\+[1-9][0-9]{0,2}$`) shortRegionCodePattern = regexp.MustCompile(`^[A-Za-z0-9_]{2,32}$`) descriptiveRegionCodePattern = regexp.MustCompile(`^[A-Za-z0-9][A-Za-z0-9 _-]{1,63}$`) + retiredRegionCodes = map[string]struct{}{ + "AUSTRALIA AND NEW ZEALAND": {}, + "CARIBBEAN": {}, + "MELANESIA": {}, + "MICRONESIA": {}, + "POLYNESIA": {}, + "SOUTHERN AFRICA": {}, + "UNSPECIFIED": {}, + } ) // Country 是国家主数据;enabled 是唯一可用性开关,外部只提交 CountryCode。 @@ -223,3 +235,14 @@ func NormalizeRegionCode(code string) string { func ValidRegionCode(code string) bool { return shortRegionCodePattern.MatchString(code) || descriptiveRegionCodePattern.MatchString(code) } + +// IsGlobalRegionCode 判断区域是否是兜底 GLOBAL 区域。 +func IsGlobalRegionCode(code string) bool { + return NormalizeRegionCode(code) == GlobalRegionCode +} + +// IsRetiredRegionCode 判断区域是否已从业务区域集合中移除。 +func IsRetiredRegionCode(code string) bool { + _, ok := retiredRegionCodes[strings.ToUpper(NormalizeRegionCode(code))] + return ok +} diff --git a/services/user-service/internal/domain/user/user.go b/services/user-service/internal/domain/user/user.go index 0add4a43..ccd0a416 100644 --- a/services/user-service/internal/domain/user/user.go +++ b/services/user-service/internal/domain/user/user.go @@ -227,7 +227,7 @@ type CompleteOnboardingCommand struct { Gender string // Country 是 active countries.country_code 中的规范国家码。 Country string - // RegionID 是按 Country 当前 active 映射解析出的区域快照,0 表示进入 GLOBAL。 + // RegionID 是按 Country 当前 active 映射解析出的区域快照,0 表示 GLOBAL 兜底桶。 RegionID int64 // CompletedAtMs 是资料完成时间,同时作为 updated_at_ms。 CompletedAtMs int64 @@ -241,7 +241,7 @@ type CountryChangeCommand struct { UserID int64 // NewCountry 是新的国家或地区。 NewCountry string - // NewRegionID 是按 NewCountry 解析出的区域快照,0 表示无区域。 + // NewRegionID 是按 NewCountry 解析出的区域快照,0 表示 GLOBAL 兜底桶。 NewRegionID int64 // RequestID 是入口请求 ID,写入国家修改日志。 RequestID string diff --git a/services/user-service/internal/service/user/profile.go b/services/user-service/internal/service/user/profile.go index dc476ac3..e3b08161 100644 --- a/services/user-service/internal/service/user/profile.go +++ b/services/user-service/internal/service/user/profile.go @@ -129,7 +129,7 @@ func (s *Service) CompleteOnboarding(ctx context.Context, userID int64, username if region, ok, err := s.countryRegionRepository.ResolveActiveRegionByCountry(ctx, resolvedCountry.CountryCode); err != nil { return userdomain.User{}, err } else if ok { - // 国家可能暂时没有区域映射,region_id=0 时由房间列表落到 GLOBAL。 + // 国家未命中显式区域时,user-service 会返回 region_id=0 的 GLOBAL 兜底桶。 regionID = region.RegionID } diff --git a/services/user-service/internal/service/user/region.go b/services/user-service/internal/service/user/region.go index 89d407f2..4f5a6c29 100644 --- a/services/user-service/internal/service/user/region.go +++ b/services/user-service/internal/service/user/region.go @@ -176,6 +176,9 @@ func validateRegionPayload(regionCode string, name string) error { if !userdomain.ValidRegionCode(regionCode) { return xerr.New(xerr.InvalidArgument, "region_code is invalid") } + if userdomain.IsRetiredRegionCode(regionCode) { + return xerr.New(xerr.InvalidArgument, "region has been retired") + } if name == "" || utf8.RuneCountInString(name) > maxRegionNameLength { return xerr.New(xerr.InvalidArgument, "region name length is invalid") } diff --git a/services/user-service/internal/service/user/service.go b/services/user-service/internal/service/user/service.go index 361d8226..fe5add47 100644 --- a/services/user-service/internal/service/user/service.go +++ b/services/user-service/internal/service/user/service.go @@ -38,7 +38,7 @@ type CountryRegionRepository interface { ResolveEnabledCountryByCode(ctx context.Context, countryCode string) (userdomain.Country, bool, error) // ListRegistrationCountries 返回 App 注册页可选国家列表。 ListRegistrationCountries(ctx context.Context) ([]userdomain.Country, error) - // ResolveActiveRegionByCountry 按国家码读取当前 active 区域;无映射返回 ok=false。 + // ResolveActiveRegionByCountry 按国家码读取当前 active 区域;无显式映射时返回 GLOBAL 兜底区域。 ResolveActiveRegionByCountry(ctx context.Context, countryCode string) (userdomain.Region, bool, error) } diff --git a/services/user-service/internal/service/user/service_test.go b/services/user-service/internal/service/user/service_test.go index 3c32d46e..934f948b 100644 --- a/services/user-service/internal/service/user/service_test.go +++ b/services/user-service/internal/service/user/service_test.go @@ -252,6 +252,34 @@ func TestCompleteOnboardingWritesProfileRegionAndSkipsCountryCooldown(t *testing } } +func TestCountryWithoutExplicitRegionFallsBackToGlobal(t *testing.T) { + ctx := context.Background() + repository := mysqltest.NewRepository(t) + seedCountry(t, repository, "ZZ") + repository.PutUser(userdomain.User{ + UserID: 10001, + CurrentDisplayUserID: "100001", + Status: userdomain.StatusActive, + }) + svc := newUserService(repository) + + region, ok, err := repository.ResolveActiveRegionByCountry(ctx, "ZZ") + if err != nil { + t.Fatalf("ResolveActiveRegionByCountry failed: %v", err) + } + if !ok || region.RegionID != 0 || region.RegionCode != userdomain.GlobalRegionCode { + t.Fatalf("country without mapping should resolve to GLOBAL: ok=%t region=%+v", ok, region) + } + + user, err := svc.CompleteOnboarding(ctx, 10001, "hy", "https://cdn.example/a.png", "male", "ZZ") + if err != nil { + t.Fatalf("CompleteOnboarding failed: %v", err) + } + if user.RegionID != 0 || user.RegionCode != userdomain.GlobalRegionCode || user.RegionName != userdomain.GlobalRegionCode { + t.Fatalf("user should enter GLOBAL region: %+v", user) + } +} + func TestCompleteOnboardingValidation(t *testing.T) { // 必填字段和展示资料格式在 service 层稳定返回 INVALID_ARGUMENT,不能依赖 MySQL 约束报错。 ctx := context.Background() diff --git a/services/user-service/internal/storage/mysql/region/countries.go b/services/user-service/internal/storage/mysql/region/countries.go index dfe45576..2773df73 100644 --- a/services/user-service/internal/storage/mysql/region/countries.go +++ b/services/user-service/internal/storage/mysql/region/countries.go @@ -23,7 +23,7 @@ func (r *Repository) ListRegistrationCountries(ctx context.Context) ([]userdomai return listCountries(ctx, r.db, userdomain.CountryFilter{Enabled: boolPtr(true)}) } -// ResolveActiveRegionByCountry 按国家码读取当前 active 区域映射;无映射返回 ok=false。 +// ResolveActiveRegionByCountry 按国家码读取当前 active 区域映射;无显式映射时由 regions.go 返回 GLOBAL。 // UpdateCountry 修改国家展示字段;country_code 不允许原地修改。 diff --git a/services/user-service/internal/storage/mysql/region/regions.go b/services/user-service/internal/storage/mysql/region/regions.go index 64a035d8..03d3dea7 100644 --- a/services/user-service/internal/storage/mysql/region/regions.go +++ b/services/user-service/internal/storage/mysql/region/regions.go @@ -15,6 +15,8 @@ import ( "hyapp/services/user-service/internal/storage/mysql/shared" ) +const retiredRegionCodeSQLList = "'Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED'" + func (r *Repository) ResolveActiveRegionByCountry(ctx context.Context, countryCode string) (userdomain.Region, bool, error) { country, ok, err := resolveCountryByCode(ctx, r.db, countryCode, true) if err != nil || !ok { @@ -27,6 +29,7 @@ func (r *Repository) ResolveActiveRegionByCountry(ctx context.Context, countryCo FROM region_countries rc INNER JOIN regions rg ON rg.app_code = rc.app_code AND rg.region_id = rc.region_id WHERE rc.app_code = ? AND rc.country_code = ? AND rc.status = ? AND rg.status = ? + AND rg.region_code NOT IN (`+retiredRegionCodeSQLList+`) LIMIT 1 `, appcode.FromContext(ctx), country.CountryCode, userdomain.RegionStatusActive, userdomain.RegionStatusActive).Scan( ®ion.AppCode, @@ -41,7 +44,7 @@ func (r *Repository) ResolveActiveRegionByCountry(ctx context.Context, countryCo ®ion.UpdatedAtMs, ) if err == sql.ErrNoRows { - return userdomain.Region{}, false, nil + return globalRegionFromContext(ctx), true, nil } if err != nil { return userdomain.Region{}, false, err @@ -71,6 +74,12 @@ func (r *Repository) UpdateRegion(ctx context.Context, command userdomain.Update if err != nil { return userdomain.Region{}, err } + if userdomain.IsRetiredRegionCode(before.RegionCode) { + return userdomain.Region{}, xerr.New(xerr.RegionNotFound, "region not found") + } + if userdomain.IsGlobalRegionCode(before.RegionCode) && !userdomain.IsGlobalRegionCode(command.RegionCode) { + return userdomain.Region{}, xerr.New(xerr.InvalidArgument, "global region code cannot be changed") + } if _, err := tx.ExecContext(ctx, ` UPDATE regions SET region_code = ?, name = ?, sort_order = ?, updated_by_user_id = ?, updated_at_ms = ? @@ -107,6 +116,7 @@ func (r *Repository) ListRegions(ctx context.Context, filter userdomain.RegionFi conditions = append(conditions, "status = ?") args = append(args, filter.Status) } + conditions = append(conditions, "region_code NOT IN ("+retiredRegionCodeSQLList+")") query += " WHERE " + strings.Join(conditions, " AND ") query += " ORDER BY sort_order ASC, region_code ASC" rows, err := r.db.QueryContext(ctx, query, args...) @@ -116,20 +126,35 @@ func (r *Repository) ListRegions(ctx context.Context, filter userdomain.RegionFi defer rows.Close() regions := []userdomain.Region{} + hasGlobal := false for rows.Next() { region, err := scanRegion(rows) if err != nil { return nil, err } + if userdomain.IsGlobalRegionCode(region.RegionCode) { + hasGlobal = true + } countries, err := activeCountriesForRegion(ctx, r.db, region.RegionID) if err != nil { return nil, err } region.Countries = countries + if userdomain.IsGlobalRegionCode(region.RegionCode) { + region.RegionID = 0 + region.Countries = []string{} + } regions = append(regions, region) } - return regions, rows.Err() + if err := rows.Err(); err != nil { + return nil, err + } + if !hasGlobal && (filter.Status == "" || filter.Status == userdomain.RegionStatusActive) { + regions = append([]userdomain.Region{globalRegionFromContext(ctx)}, regions...) + } + + return regions, nil } // GetRegion 返回单个区域及其 active 国家列表。 @@ -142,6 +167,9 @@ func (r *Repository) GetRegion(ctx context.Context, regionID int64) (userdomain. if err != nil { return userdomain.Region{}, err } + if userdomain.IsRetiredRegionCode(region.RegionCode) { + return userdomain.Region{}, xerr.New(xerr.RegionNotFound, "region not found") + } return region, nil } @@ -162,6 +190,12 @@ func (r *Repository) ReplaceRegionCountries(ctx context.Context, command userdom if err != nil { return userdomain.Region{}, err } + if userdomain.IsRetiredRegionCode(before.RegionCode) { + return userdomain.Region{}, xerr.New(xerr.RegionNotFound, "region not found") + } + if userdomain.IsGlobalRegionCode(before.RegionCode) { + return userdomain.Region{}, xerr.New(xerr.InvalidArgument, "global region countries are implicit") + } if before.Status != userdomain.RegionStatusActive { return userdomain.Region{}, xerr.New(xerr.RegionDisabled, "region is disabled") } @@ -169,6 +203,9 @@ func (r *Repository) ReplaceRegionCountries(ctx context.Context, command userdom if err != nil { return userdomain.Region{}, err } + if err := releaseRetiredCountryMappings(ctx, tx, appcode.Normalize(command.AppCode), countries, command.OperatorUserID, command.NowMs); err != nil { + return userdomain.Region{}, err + } if err := ensureCountriesAssignableToRegion(ctx, tx, countries, command.RegionID); err != nil { return userdomain.Region{}, err } @@ -248,6 +285,17 @@ func scanRegion(scanner interface{ Scan(dest ...any) error }) (userdomain.Region return region, err } +func globalRegionFromContext(ctx context.Context) userdomain.Region { + return userdomain.Region{ + AppCode: appcode.FromContext(ctx), + RegionID: 0, + RegionCode: userdomain.GlobalRegionCode, + Name: userdomain.GlobalRegionCode, + Status: userdomain.RegionStatusActive, + Countries: []string{}, + } +} + func activeCountriesForRegion(ctx context.Context, q queryer, regionID int64) ([]string, error) { rows, err := queryRows(ctx, q, ` SELECT country_code @@ -272,6 +320,21 @@ func activeCountriesForRegion(ctx context.Context, q queryer, regionID int64) ([ return countries, rows.Err() } +func releaseRetiredCountryMappings(ctx context.Context, tx *sql.Tx, appCode string, countries []string, operatorUserID int64, nowMs int64) error { + for _, country := range countries { + if _, err := tx.ExecContext(ctx, ` + UPDATE region_countries rc + INNER JOIN regions rg ON rg.app_code = rc.app_code AND rg.region_id = rc.region_id + SET rc.status = ?, rc.updated_by_user_id = ?, rc.updated_at_ms = ? + WHERE rc.app_code = ? AND rc.country_code = ? AND rc.status = ? + AND rg.region_code IN (`+retiredRegionCodeSQLList+`) + `, userdomain.RegionStatusDisabled, shared.NullableOperator(operatorUserID), nowMs, appcode.Normalize(appCode), country, userdomain.RegionStatusActive); err != nil { + return err + } + } + return nil +} + func insertRegionChangeLog(ctx context.Context, tx *sql.Tx, regionID int64, operation string, before any, after any, operatorUserID int64, requestID string, nowMs int64) error { beforeJSON, err := marshalNullableJSON(before) if err != nil { diff --git a/services/user-service/internal/storage/mysql/user/common.go b/services/user-service/internal/storage/mysql/user/common.go index ee609931..590ea9d2 100644 --- a/services/user-service/internal/storage/mysql/user/common.go +++ b/services/user-service/internal/storage/mysql/user/common.go @@ -32,15 +32,49 @@ const userSelectColumns = ` COALESCE(username, ''), COALESCE(gender, ''), COALESCE(country, ''), - COALESCE(region_id, 0), + CASE + WHEN COALESCE(region_id, 0) = 0 THEN 0 + WHEN EXISTS ( + SELECT 1 + FROM regions rg + WHERE rg.app_code = users.app_code + AND rg.region_id = users.region_id + AND rg.status = 'active' + AND rg.region_code NOT IN ('Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED') + LIMIT 1 + ) THEN users.region_id + ELSE 0 + END, COALESCE((SELECT c.country_id FROM countries c WHERE c.app_code = users.app_code AND c.country_code = users.country LIMIT 1), 0), COALESCE((SELECT c.country_name FROM countries c WHERE c.app_code = users.app_code AND c.country_code = users.country LIMIT 1), ''), COALESCE((SELECT c.country_display_name FROM countries c WHERE c.app_code = users.app_code AND c.country_code = users.country LIMIT 1), ''), COALESCE((SELECT c.iso_numeric FROM countries c WHERE c.app_code = users.app_code AND c.country_code = users.country LIMIT 1), ''), COALESCE((SELECT c.phone_country_code FROM countries c WHERE c.app_code = users.app_code AND c.country_code = users.country LIMIT 1), ''), COALESCE((SELECT c.enabled FROM countries c WHERE c.app_code = users.app_code AND c.country_code = users.country LIMIT 1), 0), - COALESCE((SELECT rg.region_code FROM regions rg WHERE rg.app_code = users.app_code AND rg.region_id = users.region_id LIMIT 1), ''), - COALESCE((SELECT rg.name FROM regions rg WHERE rg.app_code = users.app_code AND rg.region_id = users.region_id LIMIT 1), ''), + CASE + WHEN COALESCE(users.region_id, 0) = 0 OR NOT EXISTS ( + SELECT 1 + FROM regions rg + WHERE rg.app_code = users.app_code + AND rg.region_id = users.region_id + AND rg.status = 'active' + AND rg.region_code NOT IN ('Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED') + LIMIT 1 + ) THEN 'GLOBAL' + ELSE COALESCE((SELECT rg.region_code FROM regions rg WHERE rg.app_code = users.app_code AND rg.region_id = users.region_id LIMIT 1), '') + END, + CASE + WHEN COALESCE(users.region_id, 0) = 0 OR NOT EXISTS ( + SELECT 1 + FROM regions rg + WHERE rg.app_code = users.app_code + AND rg.region_id = users.region_id + AND rg.status = 'active' + AND rg.region_code NOT IN ('Australia and New Zealand', 'Caribbean', 'Melanesia', 'Micronesia', 'Polynesia', 'Southern Africa', 'UNSPECIFIED') + LIMIT 1 + ) THEN 'GLOBAL' + ELSE COALESCE((SELECT rg.name FROM regions rg WHERE rg.app_code = users.app_code AND rg.region_id = users.region_id LIMIT 1), '') + END, COALESCE(invite_code, ''), COALESCE(register_ip, ''), COALESCE(register_user_agent, ''), diff --git a/services/user-service/internal/transport/grpc/convert.go b/services/user-service/internal/transport/grpc/convert.go index 0cacdfe7..630a0a51 100644 --- a/services/user-service/internal/transport/grpc/convert.go +++ b/services/user-service/internal/transport/grpc/convert.go @@ -104,7 +104,7 @@ func toProtoRegion(region userdomain.Region) *userv1.Region { RegionCode: region.RegionCode, Name: region.Name, Status: region.Status, - Countries: append([]string(nil), region.Countries...), + Countries: append([]string{}, region.Countries...), SortOrder: region.SortOrder, CreatedAtMs: region.CreatedAtMs, UpdatedAtMs: region.UpdatedAtMs, diff --git a/services/wallet-service/deploy/mysql/initdb/001_wallet_service.sql b/services/wallet-service/deploy/mysql/initdb/001_wallet_service.sql index 733af47e..11cbddb5 100644 --- a/services/wallet-service/deploy/mysql/initdb/001_wallet_service.sql +++ b/services/wallet-service/deploy/mysql/initdb/001_wallet_service.sql @@ -77,6 +77,7 @@ CREATE TABLE IF NOT EXISTS wallet_gift_prices ( gift_id VARCHAR(96) NOT NULL, price_version VARCHAR(64) NOT NULL, status VARCHAR(32) NOT NULL, + charge_asset_type VARCHAR(32) NOT NULL DEFAULT 'COIN', coin_price BIGINT NOT NULL, gift_point_amount BIGINT NOT NULL, heat_value BIGINT NOT NULL, @@ -192,15 +193,65 @@ CREATE TABLE IF NOT EXISTS gift_configs ( name VARCHAR(128) NOT NULL, sort_order INT NOT NULL DEFAULT 0, presentation_json JSON NULL, + gift_type_code VARCHAR(32) NOT NULL DEFAULT 'normal', + effective_from_ms BIGINT NOT NULL DEFAULT 0, + effective_to_ms BIGINT NOT NULL DEFAULT 0, + effect_types_json JSON NULL, created_by_user_id BIGINT NOT NULL DEFAULT 0, updated_by_user_id BIGINT NOT NULL DEFAULT 0, created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, PRIMARY KEY (app_code, gift_id), KEY idx_gift_configs_resource (app_code, resource_id), - KEY idx_gift_configs_status_sort (app_code, status, sort_order) + KEY idx_gift_configs_status_sort (app_code, status, sort_order), + KEY idx_gift_configs_effective (app_code, status, effective_from_ms, effective_to_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +SET @ddl := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wallet_gift_prices' AND COLUMN_NAME = 'charge_asset_type') = 0, + 'ALTER TABLE wallet_gift_prices ADD COLUMN charge_asset_type VARCHAR(32) NOT NULL DEFAULT ''COIN'' AFTER status', + 'SELECT 1' +); +PREPARE stmt FROM @ddl; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @ddl := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gift_configs' AND COLUMN_NAME = 'gift_type_code') = 0, + 'ALTER TABLE gift_configs ADD COLUMN gift_type_code VARCHAR(32) NOT NULL DEFAULT ''normal'' AFTER presentation_json', + 'SELECT 1' +); +PREPARE stmt FROM @ddl; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @ddl := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gift_configs' AND COLUMN_NAME = 'effective_from_ms') = 0, + 'ALTER TABLE gift_configs ADD COLUMN effective_from_ms BIGINT NOT NULL DEFAULT 0 AFTER gift_type_code', + 'SELECT 1' +); +PREPARE stmt FROM @ddl; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @ddl := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gift_configs' AND COLUMN_NAME = 'effective_to_ms') = 0, + 'ALTER TABLE gift_configs ADD COLUMN effective_to_ms BIGINT NOT NULL DEFAULT 0 AFTER effective_from_ms', + 'SELECT 1' +); +PREPARE stmt FROM @ddl; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @ddl := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gift_configs' AND COLUMN_NAME = 'effect_types_json') = 0, + 'ALTER TABLE gift_configs ADD COLUMN effect_types_json JSON NULL AFTER effective_to_ms', + 'SELECT 1' +); +PREPARE stmt FROM @ddl; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + CREATE TABLE IF NOT EXISTS gift_config_regions ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', gift_id VARCHAR(96) NOT NULL, @@ -276,11 +327,11 @@ CREATE TABLE IF NOT EXISTS user_resource_equipment ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT IGNORE INTO wallet_gift_prices ( - app_code, gift_id, price_version, status, coin_price, gift_point_amount, heat_value, + app_code, gift_id, price_version, status, charge_asset_type, coin_price, gift_point_amount, heat_value, effective_at_ms, created_at_ms, updated_at_ms ) VALUES - ('lalu', 'rose', 'v1', 'active', 10, 10, 10, 0, 0, 0), - ('lalu', 'rocket', 'v1', 'active', 100, 100, 100, 0, 0, 0); + ('lalu', 'rose', 'v1', 'active', 'COIN', 10, 10, 10, 0, 0, 0), + ('lalu', 'rocket', 'v1', 'active', 'COIN', 100, 100, 100, 0, 0, 0); INSERT IGNORE INTO resources ( app_code, resource_code, resource_type, name, status, grantable, grant_strategy, @@ -293,18 +344,24 @@ INSERT IGNORE INTO resources ( INSERT IGNORE INTO gift_configs ( app_code, gift_id, resource_id, status, name, sort_order, presentation_json, + gift_type_code, effective_from_ms, effective_to_ms, effect_types_json, created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms ) -SELECT 'lalu', 'rose', resource_id, 'active', 'Rose', 10, JSON_OBJECT(), 0, 0, 0, 0 +SELECT 'lalu', 'rose', resource_id, 'active', 'Rose', 10, JSON_OBJECT(), + 'normal', 0, 0, JSON_ARRAY(), + 0, 0, 0, 0 FROM resources WHERE app_code = 'lalu' AND resource_code = 'gift_rose' LIMIT 1; INSERT IGNORE INTO gift_configs ( app_code, gift_id, resource_id, status, name, sort_order, presentation_json, + gift_type_code, effective_from_ms, effective_to_ms, effect_types_json, created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms ) -SELECT 'lalu', 'rocket', resource_id, 'active', 'Rocket', 20, JSON_OBJECT(), 0, 0, 0, 0 +SELECT 'lalu', 'rocket', resource_id, 'active', 'Rocket', 20, JSON_OBJECT(), + 'normal', 0, 0, JSON_ARRAY('animation', 'global_broadcast'), + 0, 0, 0, 0 FROM resources WHERE app_code = 'lalu' AND resource_code = 'gift_rocket' LIMIT 1; diff --git a/services/wallet-service/internal/domain/ledger/ledger.go b/services/wallet-service/internal/domain/ledger/ledger.go index 84fe0da7..15bd186f 100644 --- a/services/wallet-service/internal/domain/ledger/ledger.go +++ b/services/wallet-service/internal/domain/ledger/ledger.go @@ -1,5 +1,7 @@ package ledger +import "strings" + const ( // AssetCoin 是用户送礼消费资产。 AssetCoin = "COIN" @@ -31,6 +33,8 @@ type Receipt struct { BillingReceiptID string TransactionID string CoinSpent int64 + ChargeAssetType string + ChargeAmount int64 GiftPointAdded int64 HeatValue int64 PriceVersion string @@ -63,6 +67,43 @@ type CoinSellerTransferReceipt struct { RechargePolicyUSDMinorUnit int64 } +// RechargeBill 是充值账单的只读投影;充值事实由 wallet_recharge_records 保存。 +type RechargeBill struct { + AppCode string + TransactionID string + CommandID string + RechargeType string + Status string + ExternalRef string + UserID int64 + SellerUserID int64 + SellerRegionID int64 + TargetRegionID int64 + PolicyID int64 + PolicyVersion string + CurrencyCode string + CoinAmount int64 + USDMinorAmount int64 + ExchangeCoinAmount int64 + ExchangeUSDMinorAmount int64 + CreatedAtMS int64 +} + +// ListRechargeBillsQuery 是后台查询所有充值渠道账单的筛选条件。 +type ListRechargeBillsQuery struct { + AppCode string + UserID int64 + SellerUserID int64 + RegionID int64 + RechargeType string + Status string + Keyword string + StartAtMS int64 + EndAtMS int64 + Page int32 + PageSize int32 +} + // AssetBalance 是账户当前可用/冻结余额投影。 type AssetBalance struct { AppCode string @@ -95,3 +136,21 @@ func ValidAssetType(assetType string) bool { return false } } + +func NormalizeGiftChargeAssetType(assetType string) string { + switch strings.ToUpper(strings.TrimSpace(assetType)) { + case AssetDiamond: + return AssetDiamond + default: + return AssetCoin + } +} + +func ValidGiftChargeAssetType(assetType string) bool { + switch strings.ToUpper(strings.TrimSpace(assetType)) { + case AssetCoin, AssetDiamond: + return true + default: + return false + } +} diff --git a/services/wallet-service/internal/domain/resource/resource.go b/services/wallet-service/internal/domain/resource/resource.go index 78bf28d8..0959baaa 100644 --- a/services/wallet-service/internal/domain/resource/resource.go +++ b/services/wallet-service/internal/domain/resource/resource.go @@ -34,6 +34,21 @@ const ( GroupItemTypeResource = "resource" GroupItemTypeWalletAsset = "wallet_asset" + + GiftTypeNormal = "normal" + GiftTypeCP = "cp" + GiftTypeLucky = "lucky" + GiftTypeSuperLucky = "super_lucky" + GiftTypeExclusive = "exclusive" + GiftTypeNoble = "noble" + GiftTypeFlag = "flag" + GiftTypeActivity = "activity" + GiftTypeMagic = "magic" + GiftTypeCustom = "custom" + + GiftEffectAnimation = "animation" + GiftEffectMusic = "music" + GiftEffectGlobalBroadcast = "global_broadcast" ) type Resource struct { @@ -102,6 +117,11 @@ type GiftConfig struct { CoinPrice int64 GiftPointAmount int64 HeatValue int64 + GiftTypeCode string + ChargeAssetType string + EffectiveFromMS int64 + EffectiveToMS int64 + EffectTypes []string CreatedByUserID int64 UpdatedByUserID int64 CreatedAtMS int64 @@ -247,6 +267,11 @@ type GiftConfigCommand struct { GiftPointAmount int64 HeatValue int64 EffectiveAtMS int64 + GiftTypeCode string + ChargeAssetType string + EffectiveFromMS int64 + EffectiveToMS int64 + EffectTypes []string OperatorUserID int64 RegionIDs []int64 } @@ -367,6 +392,36 @@ func NormalizeWalletAssetType(value string) string { return strings.ToUpper(strings.TrimSpace(value)) } +func NormalizeGiftTypeCode(value string) string { + value = strings.ToLower(strings.TrimSpace(value)) + if value == "" { + return GiftTypeNormal + } + return value +} + +func ValidGiftTypeCode(value string) bool { + switch NormalizeGiftTypeCode(value) { + case GiftTypeNormal, GiftTypeCP, GiftTypeLucky, GiftTypeSuperLucky, GiftTypeExclusive, GiftTypeNoble, GiftTypeFlag, GiftTypeActivity, GiftTypeMagic, GiftTypeCustom: + return true + default: + return false + } +} + +func NormalizeGiftEffectType(value string) string { + return strings.ToLower(strings.TrimSpace(value)) +} + +func ValidGiftEffectType(value string) bool { + switch NormalizeGiftEffectType(value) { + case GiftEffectAnimation, GiftEffectMusic, GiftEffectGlobalBroadcast: + return true + default: + return false + } +} + func IsWalletCredit(resource Resource) bool { return NormalizeGrantStrategy(resource.GrantStrategy) == GrantStrategyWalletCredit } diff --git a/services/wallet-service/internal/service/wallet/service.go b/services/wallet-service/internal/service/wallet/service.go index a38ff76e..0d0c4a79 100644 --- a/services/wallet-service/internal/service/wallet/service.go +++ b/services/wallet-service/internal/service/wallet/service.go @@ -16,6 +16,7 @@ type Repository interface { GetBalances(ctx context.Context, userID int64, assetTypes []string) ([]ledger.AssetBalance, error) AdminCreditAsset(ctx context.Context, command ledger.AdminCreditAssetCommand) (ledger.AssetBalance, string, error) TransferCoinFromSeller(ctx context.Context, command ledger.CoinSellerTransferCommand) (ledger.CoinSellerTransferReceipt, error) + ListRechargeBills(ctx context.Context, query ledger.ListRechargeBillsQuery) ([]ledger.RechargeBill, int64, error) ListResources(ctx context.Context, query resourcedomain.ListResourcesQuery) ([]resourcedomain.Resource, int64, error) GetResource(ctx context.Context, resourceID int64) (resourcedomain.Resource, error) CreateResource(ctx context.Context, command resourcedomain.ResourceCommand) (resourcedomain.Resource, error) @@ -138,3 +139,14 @@ func (s *Service) TransferCoinFromSeller(ctx context.Context, command ledger.Coi return s.repository.TransferCoinFromSeller(ctx, command) } + +// ListRechargeBills 返回充值账单只读列表;所有充值来源必须先在 wallet-service 落充值记录。 +func (s *Service) ListRechargeBills(ctx context.Context, query ledger.ListRechargeBillsQuery) ([]ledger.RechargeBill, int64, error) { + if s.repository == nil { + return nil, 0, xerr.New(xerr.Unavailable, "wallet repository is not configured") + } + query.AppCode = appcode.Normalize(query.AppCode) + ctx = appcode.WithContext(ctx, query.AppCode) + + return s.repository.ListRechargeBills(ctx, query) +} diff --git a/services/wallet-service/internal/service/wallet/service_test.go b/services/wallet-service/internal/service/wallet/service_test.go index 8471fa44..83f709ed 100644 --- a/services/wallet-service/internal/service/wallet/service_test.go +++ b/services/wallet-service/internal/service/wallet/service_test.go @@ -3,6 +3,7 @@ package wallet_test import ( "context" "testing" + "time" "hyapp/pkg/xerr" "hyapp/services/wallet-service/internal/domain/ledger" @@ -378,6 +379,66 @@ func TestGiftConfigMustSelectGiftResource(t *testing.T) { } } +func TestGiftConfigSupportsDiamondChargeAndEffectiveRange(t *testing.T) { + repository := mysqltest.NewRepository(t) + svc := walletservice.New(repository) + ctx := context.Background() + nowMs := time.Now().UnixMilli() + + giftResource, err := svc.CreateResource(ctx, resourcedomain.ResourceCommand{ + ResourceCode: "gift_diamond_magic", + ResourceType: resourcedomain.TypeGift, + Name: "Diamond Magic", + Status: resourcedomain.StatusActive, + Grantable: true, + GrantStrategy: resourcedomain.GrantStrategyIncreaseQuantity, + UsageScopes: []string{"gift"}, + OperatorUserID: 90001, + }) + if err != nil { + t.Fatalf("create diamond gift resource failed: %v", err) + } + gift, err := svc.CreateGiftConfig(ctx, resourcedomain.GiftConfigCommand{ + GiftID: "diamond-magic", + ResourceID: giftResource.ResourceID, + Status: resourcedomain.StatusActive, + Name: "Diamond Magic", + PriceVersion: "v1", + ChargeAssetType: ledger.AssetDiamond, + CoinPrice: 7, + GiftPointAmount: 3, + HeatValue: 9, + GiftTypeCode: resourcedomain.GiftTypeMagic, + EffectiveFromMS: nowMs - 1000, + EffectiveToMS: nowMs + 60_000, + EffectTypes: []string{resourcedomain.GiftEffectAnimation, resourcedomain.GiftEffectMusic}, + OperatorUserID: 90001, + RegionIDs: []int64{0}, + }) + if err != nil { + t.Fatalf("create diamond gift config failed: %v", err) + } + if gift.ChargeAssetType != ledger.AssetDiamond || gift.GiftTypeCode != resourcedomain.GiftTypeMagic || len(gift.EffectTypes) != 2 { + t.Fatalf("diamond gift config mismatch: %+v", gift) + } + + repository.SetAssetBalance(52001, ledger.AssetDiamond, 100) + receipt, err := svc.DebitGift(ctx, ledger.DebitGiftCommand{ + CommandID: "cmd-diamond-gift", + RoomID: "room-diamond", + SenderUserID: 52001, + TargetUserID: 52002, + GiftID: "diamond-magic", + GiftCount: 2, + }) + if err != nil { + t.Fatalf("DebitGift with diamond-backed gift failed: %v", err) + } + if receipt.ChargeAssetType != ledger.AssetDiamond || receipt.ChargeAmount != 14 || receipt.BalanceAfter != 86 { + t.Fatalf("diamond gift settlement mismatch: %+v", receipt) + } +} + // TestGiftConfigRegionFilter 验证礼物列表和送礼扣费都按区域配置校验,region_id=0 作为 GLOBAL 兜底区域。 func TestGiftConfigRegionFilter(t *testing.T) { repository := mysqltest.NewRepository(t) diff --git a/services/wallet-service/internal/storage/mysql/recharge_repository.go b/services/wallet-service/internal/storage/mysql/recharge_repository.go new file mode 100644 index 00000000..71c4aa1d --- /dev/null +++ b/services/wallet-service/internal/storage/mysql/recharge_repository.go @@ -0,0 +1,138 @@ +package mysql + +import ( + "context" + "strings" + + "hyapp/pkg/appcode" + "hyapp/pkg/xerr" + "hyapp/services/wallet-service/internal/domain/ledger" +) + +// ListRechargeBills 查询 wallet-service 的充值账单投影,后台不能直接读写业务库内部语义。 +func (r *Repository) ListRechargeBills(ctx context.Context, query ledger.ListRechargeBillsQuery) ([]ledger.RechargeBill, int64, error) { + if r == nil || r.db == nil { + return nil, 0, xerr.New(xerr.Unavailable, "mysql repository is not configured") + } + ctx = contextWithCommandApp(ctx, query.AppCode) + query = normalizeRechargeBillsQuery(query) + query.AppCode = appcode.FromContext(ctx) + + where, args := rechargeBillsWhereSQL(query) + total, err := r.countRechargeBillRows(ctx, where, args...) + if err != nil { + return nil, 0, err + } + rows, err := r.db.QueryContext(ctx, ` + SELECT rr.app_code, rr.transaction_id, wt.command_id, wt.biz_type, wt.status, wt.external_ref, + rr.user_id, rr.seller_user_id, rr.seller_region_id, rr.target_region_id, + rr.policy_id, rr.policy_version, rr.currency_code, + rr.coin_amount, rr.usd_minor_amount, rr.exchange_coin_amount, rr.exchange_usd_minor_amount, + rr.created_at_ms + FROM wallet_recharge_records rr + JOIN wallet_transactions wt ON wt.app_code = rr.app_code AND wt.transaction_id = rr.transaction_id + `+where+` + ORDER BY rr.created_at_ms DESC, rr.transaction_id DESC + LIMIT ? OFFSET ?`, + append(args, query.PageSize, resourceOffset(query.Page, query.PageSize))..., + ) + if err != nil { + return nil, 0, err + } + defer rows.Close() + + items := make([]ledger.RechargeBill, 0, query.PageSize) + for rows.Next() { + var item ledger.RechargeBill + if err := rows.Scan( + &item.AppCode, + &item.TransactionID, + &item.CommandID, + &item.RechargeType, + &item.Status, + &item.ExternalRef, + &item.UserID, + &item.SellerUserID, + &item.SellerRegionID, + &item.TargetRegionID, + &item.PolicyID, + &item.PolicyVersion, + &item.CurrencyCode, + &item.CoinAmount, + &item.USDMinorAmount, + &item.ExchangeCoinAmount, + &item.ExchangeUSDMinorAmount, + &item.CreatedAtMS, + ); err != nil { + return nil, 0, err + } + items = append(items, item) + } + if err := rows.Err(); err != nil { + return nil, 0, err + } + return items, total, nil +} + +func (r *Repository) countRechargeBillRows(ctx context.Context, where string, args ...any) (int64, error) { + var total int64 + err := r.db.QueryRowContext(ctx, ` + SELECT COUNT(*) + FROM wallet_recharge_records rr + JOIN wallet_transactions wt ON wt.app_code = rr.app_code AND wt.transaction_id = rr.transaction_id + `+where, + args..., + ).Scan(&total) + return total, err +} + +func normalizeRechargeBillsQuery(query ledger.ListRechargeBillsQuery) ledger.ListRechargeBillsQuery { + query.AppCode = appcode.Normalize(query.AppCode) + query.RechargeType = strings.ToLower(strings.TrimSpace(query.RechargeType)) + query.Status = strings.ToLower(strings.TrimSpace(query.Status)) + query.Keyword = strings.TrimSpace(query.Keyword) + query.Page, query.PageSize = normalizePage(query.Page, query.PageSize) + if query.EndAtMS > 0 && query.StartAtMS > query.EndAtMS { + query.StartAtMS, query.EndAtMS = query.EndAtMS, query.StartAtMS + } + return query +} + +func rechargeBillsWhereSQL(query ledger.ListRechargeBillsQuery) (string, []any) { + where := `WHERE rr.app_code = ?` + args := []any{query.AppCode} + if query.UserID > 0 { + where += ` AND rr.user_id = ?` + args = append(args, query.UserID) + } + if query.SellerUserID > 0 { + where += ` AND rr.seller_user_id = ?` + args = append(args, query.SellerUserID) + } + if query.RegionID > 0 { + where += ` AND rr.target_region_id = ?` + args = append(args, query.RegionID) + } + if query.RechargeType != "" { + where += ` AND wt.biz_type = ?` + args = append(args, query.RechargeType) + } + if query.Status != "" { + where += ` AND wt.status = ?` + args = append(args, query.Status) + } + if query.StartAtMS > 0 { + where += ` AND rr.created_at_ms >= ?` + args = append(args, query.StartAtMS) + } + if query.EndAtMS > 0 { + where += ` AND rr.created_at_ms <= ?` + args = append(args, query.EndAtMS) + } + if query.Keyword != "" { + like := "%" + query.Keyword + "%" + where += ` AND (rr.transaction_id LIKE ? OR wt.command_id LIKE ? OR wt.external_ref LIKE ? OR rr.policy_version LIKE ?)` + args = append(args, like, like, like, like) + } + return where, args +} diff --git a/services/wallet-service/internal/storage/mysql/repository.go b/services/wallet-service/internal/storage/mysql/repository.go index 90994ddf..2001bae9 100644 --- a/services/wallet-service/internal/storage/mysql/repository.go +++ b/services/wallet-service/internal/storage/mysql/repository.go @@ -109,7 +109,7 @@ func (r *Repository) DebitGift(ctx context.Context, command ledger.DebitGiftComm if err != nil { return ledger.Receipt{}, err } - coinSpent, err := checkedMul(price.CoinPrice, int64(command.GiftCount)) + chargeAmount, err := checkedMul(price.CoinPrice, int64(command.GiftCount)) if err != nil { return ledger.Receipt{}, err } @@ -122,11 +122,11 @@ func (r *Repository) DebitGift(ctx context.Context, command ledger.DebitGiftComm return ledger.Receipt{}, err } - sender, err := r.lockAccount(ctx, tx, command.SenderUserID, ledger.AssetCoin, false, nowMs) + sender, err := r.lockAccount(ctx, tx, command.SenderUserID, price.ChargeAssetType, false, nowMs) if err != nil { return ledger.Receipt{}, err } - if sender.AvailableAmount < coinSpent { + if sender.AvailableAmount < chargeAmount { return ledger.Receipt{}, xerr.New(xerr.InsufficientBalance, "insufficient balance") } target, err := r.lockAccount(ctx, tx, command.TargetUserID, ledger.AssetGiftPoint, true, nowMs) @@ -143,10 +143,12 @@ func (r *Repository) DebitGift(ctx context.Context, command ledger.DebitGiftComm ResourceSnapshot: mustJSON(giftConfig.Resource), GiftCount: command.GiftCount, PriceVersion: price.PriceVersion, - CoinSpent: coinSpent, + ChargeAssetType: price.ChargeAssetType, + ChargeAmount: chargeAmount, + CoinSpent: chargeAmount, GiftPointAdded: giftPointAdded, HeatValue: heatValue, - BalanceAfter: sender.AvailableAmount - coinSpent, + BalanceAfter: sender.AvailableAmount - chargeAmount, BillingReceipt: billingReceiptID(command.AppCode, command.CommandID), SenderUserID: command.SenderUserID, TargetUserID: command.TargetUserID, @@ -158,15 +160,15 @@ func (r *Repository) DebitGift(ctx context.Context, command ledger.DebitGiftComm if err := r.insertTransaction(ctx, tx, transactionID, command.CommandID, bizTypeGiftDebit, requestHash, fmt.Sprintf("%s:%s", command.GiftID, price.PriceVersion), metadata, nowMs); err != nil { return ledger.Receipt{}, err } - if err := r.applyAccountDelta(ctx, tx, sender, -coinSpent, 0, nowMs); err != nil { + if err := r.applyAccountDelta(ctx, tx, sender, -chargeAmount, 0, nowMs); err != nil { return ledger.Receipt{}, err } - senderAfter := sender.AvailableAmount - coinSpent + senderAfter := sender.AvailableAmount - chargeAmount if err := r.insertEntry(ctx, tx, walletEntry{ TransactionID: transactionID, UserID: command.SenderUserID, - AssetType: ledger.AssetCoin, - AvailableDelta: -coinSpent, + AssetType: price.ChargeAssetType, + AvailableDelta: -chargeAmount, FrozenDelta: 0, AvailableAfter: senderAfter, FrozenAfter: sender.FrozenAmount, @@ -195,9 +197,9 @@ func (r *Repository) DebitGift(ctx context.Context, command ledger.DebitGiftComm return ledger.Receipt{}, err } if err := r.insertWalletOutbox(ctx, tx, []walletOutboxEvent{ - balanceChangedEvent(transactionID, command.CommandID, command.SenderUserID, ledger.AssetCoin, -coinSpent, 0, senderAfter, sender.FrozenAmount, metadata, nowMs), + balanceChangedEvent(transactionID, command.CommandID, command.SenderUserID, price.ChargeAssetType, -chargeAmount, 0, senderAfter, sender.FrozenAmount, metadata, nowMs), balanceChangedEvent(transactionID, command.CommandID, command.TargetUserID, ledger.AssetGiftPoint, giftPointAdded, 0, targetAfter, target.FrozenAmount, metadata, nowMs), - giftDebitedEvent(transactionID, command.CommandID, command.SenderUserID, ledger.AssetCoin, -coinSpent, 0, metadata, nowMs), + giftDebitedEvent(transactionID, command.CommandID, command.SenderUserID, price.ChargeAssetType, -chargeAmount, 0, metadata, nowMs), }); err != nil { return ledger.Receipt{}, err } @@ -590,6 +592,7 @@ func (r *Repository) applyAccountDelta(ctx context.Context, tx *sql.Tx, account type giftPrice struct { GiftID string PriceVersion string + ChargeAssetType string CoinPrice int64 GiftPointAmount int64 HeatValue int64 @@ -609,14 +612,14 @@ func (r *Repository) resolveGiftPrice(ctx context.Context, tx *sql.Tx, giftID st var row *sql.Row if strings.TrimSpace(priceVersion) != "" { row = tx.QueryRowContext(ctx, - `SELECT gift_id, price_version, coin_price, gift_point_amount, heat_value + `SELECT gift_id, price_version, COALESCE(charge_asset_type, 'COIN'), coin_price, gift_point_amount, heat_value FROM wallet_gift_prices WHERE app_code = ? AND gift_id = ? AND price_version = ? AND status = 'active' AND effective_at_ms <= ?`, appcode.FromContext(ctx), giftID, priceVersion, nowMs, ) } else { row = tx.QueryRowContext(ctx, - `SELECT gift_id, price_version, coin_price, gift_point_amount, heat_value + `SELECT gift_id, price_version, COALESCE(charge_asset_type, 'COIN'), coin_price, gift_point_amount, heat_value FROM wallet_gift_prices WHERE app_code = ? AND gift_id = ? AND status = 'active' AND effective_at_ms <= ? ORDER BY effective_at_ms DESC, price_version DESC @@ -626,7 +629,7 @@ func (r *Repository) resolveGiftPrice(ctx context.Context, tx *sql.Tx, giftID st } var price giftPrice - if err := row.Scan(&price.GiftID, &price.PriceVersion, &price.CoinPrice, &price.GiftPointAmount, &price.HeatValue); err != nil { + if err := row.Scan(&price.GiftID, &price.PriceVersion, &price.ChargeAssetType, &price.CoinPrice, &price.GiftPointAmount, &price.HeatValue); err != nil { if errors.Is(err, sql.ErrNoRows) { return giftPrice{}, xerr.New(xerr.NotFound, "gift price is not active") } @@ -635,6 +638,7 @@ func (r *Repository) resolveGiftPrice(ctx context.Context, tx *sql.Tx, giftID st if price.CoinPrice <= 0 || price.GiftPointAmount < 0 || price.HeatValue < 0 { return giftPrice{}, xerr.New(xerr.Internal, "gift price is invalid") } + price.ChargeAssetType = ledger.NormalizeGiftChargeAssetType(price.ChargeAssetType) return price, nil } @@ -849,6 +853,8 @@ type giftMetadata struct { CoinPrice int64 `json:"coin_price"` GiftPointAmount int64 `json:"gift_point_amount"` HeatUnitValue int64 `json:"heat_unit_value"` + ChargeAssetType string `json:"charge_asset_type"` + ChargeAmount int64 `json:"charge_amount"` CoinSpent int64 `json:"coin_spent"` GiftPointAdded int64 `json:"gift_point_added"` HeatValue int64 `json:"heat_value"` @@ -890,10 +896,17 @@ type coinSellerTransferMetadata struct { } func receiptFromGiftMetadata(transactionID string, metadata giftMetadata) ledger.Receipt { + chargeAssetType := ledger.NormalizeGiftChargeAssetType(metadata.ChargeAssetType) + chargeAmount := metadata.ChargeAmount + if chargeAmount == 0 { + chargeAmount = metadata.CoinSpent + } return ledger.Receipt{ BillingReceiptID: metadata.BillingReceipt, TransactionID: transactionID, CoinSpent: metadata.CoinSpent, + ChargeAssetType: chargeAssetType, + ChargeAmount: chargeAmount, GiftPointAdded: metadata.GiftPointAdded, HeatValue: metadata.HeatValue, PriceVersion: metadata.PriceVersion, diff --git a/services/wallet-service/internal/storage/mysql/resource_repository.go b/services/wallet-service/internal/storage/mysql/resource_repository.go index 7bcaf6f9..68dbf0c4 100644 --- a/services/wallet-service/internal/storage/mysql/resource_repository.go +++ b/services/wallet-service/internal/storage/mysql/resource_repository.go @@ -540,6 +540,7 @@ func (r *Repository) ListGiftConfigs(ctx context.Context, query resourcedomain.L price, priceErr := r.latestGiftPrice(ctx, r.db, item.GiftID, nowMs) if priceErr == nil { item.PriceVersion = price.PriceVersion + item.ChargeAssetType = price.ChargeAssetType item.CoinPrice = price.CoinPrice item.GiftPointAmount = price.GiftPointAmount item.HeatValue = price.HeatValue @@ -898,13 +899,19 @@ func (r *Repository) upsertGiftConfig(ctx context.Context, command resourcedomai } nowMs := time.Now().UnixMilli() presentation := normalizeJSONObject(command.PresentationJSON) + effectTypesJSON, err := json.Marshal(command.EffectTypes) + if err != nil { + return resourcedomain.GiftConfig{}, err + } if !update { if _, err := tx.ExecContext(ctx, ` INSERT INTO gift_configs ( app_code, gift_id, resource_id, status, name, sort_order, presentation_json, + gift_type_code, effective_from_ms, effective_to_ms, effect_types_json, created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, command.AppCode, command.GiftID, command.ResourceID, command.Status, command.Name, command.SortOrder, presentation, + command.GiftTypeCode, command.EffectiveFromMS, command.EffectiveToMS, string(effectTypesJSON), command.OperatorUserID, command.OperatorUserID, nowMs, nowMs, ); err != nil { return resourcedomain.GiftConfig{}, err @@ -913,9 +920,11 @@ func (r *Repository) upsertGiftConfig(ctx context.Context, command resourcedomai result, err := tx.ExecContext(ctx, ` UPDATE gift_configs SET resource_id = ?, status = ?, name = ?, sort_order = ?, presentation_json = ?, + gift_type_code = ?, effective_from_ms = ?, effective_to_ms = ?, effect_types_json = ?, updated_by_user_id = ?, updated_at_ms = ? WHERE app_code = ? AND gift_id = ?`, command.ResourceID, command.Status, command.Name, command.SortOrder, presentation, + command.GiftTypeCode, command.EffectiveFromMS, command.EffectiveToMS, string(effectTypesJSON), command.OperatorUserID, nowMs, command.AppCode, command.GiftID, ) if err != nil { @@ -1315,17 +1324,18 @@ func (r *Repository) listResourceGrantItemsWithQuery(ctx context.Context, querie func (r *Repository) upsertGiftPriceTx(ctx context.Context, tx *sql.Tx, command resourcedomain.GiftConfigCommand, nowMs int64) error { _, err := tx.ExecContext(ctx, ` INSERT INTO wallet_gift_prices ( - app_code, gift_id, price_version, status, coin_price, gift_point_amount, + app_code, gift_id, price_version, status, charge_asset_type, coin_price, gift_point_amount, heat_value, effective_at_ms, created_at_ms, updated_at_ms - ) VALUES (?, ?, ?, 'active', ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, 'active', ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE status = VALUES(status), + charge_asset_type = VALUES(charge_asset_type), coin_price = VALUES(coin_price), gift_point_amount = VALUES(gift_point_amount), heat_value = VALUES(heat_value), effective_at_ms = VALUES(effective_at_ms), updated_at_ms = VALUES(updated_at_ms)`, - appcode.FromContext(ctx), command.GiftID, command.PriceVersion, command.CoinPrice, + appcode.FromContext(ctx), command.GiftID, command.PriceVersion, command.ChargeAssetType, command.CoinPrice, command.GiftPointAmount, command.HeatValue, command.EffectiveAtMS, nowMs, nowMs, ) return err @@ -1333,7 +1343,7 @@ func (r *Repository) upsertGiftPriceTx(ctx context.Context, tx *sql.Tx, command func (r *Repository) latestGiftPrice(ctx context.Context, querier sqlRowQuerier, giftID string, nowMs int64) (giftPrice, error) { row := querier.QueryRowContext(ctx, - `SELECT gift_id, price_version, coin_price, gift_point_amount, heat_value + `SELECT gift_id, price_version, COALESCE(charge_asset_type, 'COIN'), coin_price, gift_point_amount, heat_value FROM wallet_gift_prices WHERE app_code = ? AND gift_id = ? AND status = 'active' AND effective_at_ms <= ? ORDER BY effective_at_ms DESC, price_version DESC @@ -1341,12 +1351,13 @@ func (r *Repository) latestGiftPrice(ctx context.Context, querier sqlRowQuerier, appcode.FromContext(ctx), giftID, nowMs, ) var price giftPrice - if err := row.Scan(&price.GiftID, &price.PriceVersion, &price.CoinPrice, &price.GiftPointAmount, &price.HeatValue); err != nil { + if err := row.Scan(&price.GiftID, &price.PriceVersion, &price.ChargeAssetType, &price.CoinPrice, &price.GiftPointAmount, &price.HeatValue); err != nil { if errors.Is(err, sql.ErrNoRows) { return giftPrice{}, xerr.New(xerr.NotFound, "gift price is not active") } return giftPrice{}, err } + price.ChargeAssetType = ledger.NormalizeGiftChargeAssetType(price.ChargeAssetType) return price, nil } @@ -1362,6 +1373,7 @@ func (r *Repository) getGiftConfig(ctx context.Context, giftID string) (resource price, priceErr := r.latestGiftPrice(ctx, r.db, gift.GiftID, time.Now().UnixMilli()) if priceErr == nil { gift.PriceVersion = price.PriceVersion + gift.ChargeAssetType = price.ChargeAssetType gift.CoinPrice = price.CoinPrice gift.GiftPointAmount = price.GiftPointAmount gift.HeatValue = price.HeatValue @@ -1374,8 +1386,11 @@ func (r *Repository) getGiftConfig(ctx context.Context, giftID string) (resource } func (r *Repository) resolveActiveGiftConfig(ctx context.Context, tx *sql.Tx, giftID string, regionID int64) (resourcedomain.GiftConfig, error) { + nowMs := time.Now().UnixMilli() row := tx.QueryRowContext(ctx, giftConfigSelectSQL()+` WHERE gc.app_code = ? AND gc.gift_id = ? AND gc.status = 'active' AND r.status = 'active' AND r.resource_type = 'gift' + AND (COALESCE(gc.effective_from_ms, 0) = 0 OR gc.effective_from_ms <= ?) + AND (COALESCE(gc.effective_to_ms, 0) = 0 OR gc.effective_to_ms > ?) AND EXISTS ( SELECT 1 FROM gift_config_regions gcr @@ -1384,7 +1399,7 @@ func (r *Repository) resolveActiveGiftConfig(ctx context.Context, tx *sql.Tx, gi AND (gcr.region_id = 0 OR gcr.region_id = ?) ) FOR UPDATE`, - appcode.FromContext(ctx), giftID, regionID, + appcode.FromContext(ctx), giftID, nowMs, nowMs, regionID, ) gift, err := scanGiftConfig(row) if errors.Is(err, sql.ErrNoRows) { @@ -1709,6 +1724,7 @@ func scanGiftConfig(scanner scanTarget) (resourcedomain.GiftConfig, error) { var gift resourcedomain.GiftConfig var resource resourcedomain.Resource var scopesJSON string + var effectTypesJSON string if err := scanner.Scan( &gift.AppCode, &gift.GiftID, @@ -1717,6 +1733,10 @@ func scanGiftConfig(scanner scanTarget) (resourcedomain.GiftConfig, error) { &gift.Name, &gift.SortOrder, &gift.PresentationJSON, + &gift.GiftTypeCode, + &gift.EffectiveFromMS, + &gift.EffectiveToMS, + &effectTypesJSON, &gift.CreatedByUserID, &gift.UpdatedByUserID, &gift.CreatedAtMS, @@ -1746,6 +1766,7 @@ func scanGiftConfig(scanner scanTarget) (resourcedomain.GiftConfig, error) { } resource.UsageScopes = parseStringArray(scopesJSON) gift.Resource = resource + gift.EffectTypes = parseStringArray(effectTypesJSON) return gift, nil } @@ -1848,6 +1869,8 @@ func giftConfigSelectSQL() string { return ` SELECT gc.app_code, gc.gift_id, gc.resource_id, gc.status, gc.name, gc.sort_order, COALESCE(CAST(gc.presentation_json AS CHAR), '{}'), + COALESCE(gc.gift_type_code, 'normal'), COALESCE(gc.effective_from_ms, 0), COALESCE(gc.effective_to_ms, 0), + COALESCE(CAST(gc.effect_types_json AS CHAR), '[]'), gc.created_by_user_id, gc.updated_by_user_id, gc.created_at_ms, gc.updated_at_ms, ` + resourceColumnsWithAlias("r") + ` FROM gift_configs gc @@ -1916,7 +1939,11 @@ func giftConfigWhereSQL(query resourcedomain.ListGiftConfigsQuery) (string, []an where := `WHERE gc.app_code = ?` args := []any{query.AppCode} if query.ActiveOnly { - where += ` AND gc.status = 'active' AND r.status = 'active' AND r.resource_type = 'gift'` + where += ` AND gc.status = 'active' AND r.status = 'active' AND r.resource_type = 'gift' + AND (COALESCE(gc.effective_from_ms, 0) = 0 OR gc.effective_from_ms <= ?) + AND (COALESCE(gc.effective_to_ms, 0) = 0 OR gc.effective_to_ms > ?)` + nowMs := time.Now().UnixMilli() + args = append(args, nowMs, nowMs) } else if query.Status != "" { where += ` AND gc.status = ?` args = append(args, query.Status) @@ -2107,9 +2134,21 @@ func normalizeGiftConfigCommand(command resourcedomain.GiftConfigCommand) resour command.PresentationJSON = normalizeJSONObject(command.PresentationJSON) command.PriceVersion = strings.TrimSpace(command.PriceVersion) command.RegionIDs = normalizeRegionIDs(command.RegionIDs) + command.GiftTypeCode = resourcedomain.NormalizeGiftTypeCode(command.GiftTypeCode) + command.ChargeAssetType = strings.ToUpper(strings.TrimSpace(command.ChargeAssetType)) + if command.ChargeAssetType == "" { + command.ChargeAssetType = ledger.AssetCoin + } + command.EffectTypes = normalizeGiftEffectTypes(command.EffectTypes) if command.EffectiveAtMS < 0 { command.EffectiveAtMS = 0 } + if command.EffectiveFromMS < 0 { + command.EffectiveFromMS = 0 + } + if command.EffectiveToMS < 0 { + command.EffectiveToMS = 0 + } return command } @@ -2123,6 +2162,20 @@ func validateGiftConfigCommand(command resourcedomain.GiftConfigCommand) error { if command.CoinPrice <= 0 || command.GiftPointAmount < 0 || command.HeatValue < 0 { return xerr.New(xerr.InvalidArgument, "gift price is invalid") } + if !resourcedomain.ValidGiftTypeCode(command.GiftTypeCode) { + return xerr.New(xerr.InvalidArgument, "gift type is invalid") + } + if !ledger.ValidGiftChargeAssetType(command.ChargeAssetType) { + return xerr.New(xerr.InvalidArgument, "gift charge asset type is invalid") + } + if command.EffectiveFromMS > 0 && command.EffectiveToMS > 0 && command.EffectiveToMS <= command.EffectiveFromMS { + return xerr.New(xerr.InvalidArgument, "gift effective time range is invalid") + } + for _, effectType := range command.EffectTypes { + if !resourcedomain.ValidGiftEffectType(effectType) { + return xerr.New(xerr.InvalidArgument, "gift effect type is invalid") + } + } if len(command.RegionIDs) == 0 { return xerr.New(xerr.InvalidArgument, "gift regions are required") } @@ -2264,6 +2317,24 @@ func normalizeRegionIDs(values []int64) []int64 { return out } +func normalizeGiftEffectTypes(values []string) []string { + seen := make(map[string]struct{}, len(values)) + out := make([]string, 0, len(values)) + for _, value := range values { + value = resourcedomain.NormalizeGiftEffectType(value) + if value == "" { + continue + } + if _, ok := seen[value]; ok { + continue + } + seen[value] = struct{}{} + out = append(out, value) + } + sort.Strings(out) + return out +} + func parseStringArray(value string) []string { var out []string if err := json.Unmarshal([]byte(value), &out); err != nil { diff --git a/services/wallet-service/internal/testutil/mysqltest/mysqltest.go b/services/wallet-service/internal/testutil/mysqltest/mysqltest.go index ec842d91..1addd006 100644 --- a/services/wallet-service/internal/testutil/mysqltest/mysqltest.go +++ b/services/wallet-service/internal/testutil/mysqltest/mysqltest.go @@ -80,18 +80,23 @@ func (r *Repository) Close() { // SetBalance prepares a sender COIN account for debit tests. func (r *Repository) SetBalance(userID int64, balance int64) { + r.SetAssetBalance(userID, "COIN", balance) +} + +// SetAssetBalance prepares a sender account for debit tests. +func (r *Repository) SetAssetBalance(userID int64, assetType string, balance int64) { r.t.Helper() nowMs := time.Now().UnixMilli() _, err := r.schema.DB.ExecContext(context.Background(), ` INSERT INTO wallet_accounts (user_id, asset_type, available_amount, frozen_amount, version, created_at_ms, updated_at_ms) - VALUES (?, 'COIN', ?, 0, 1, ?, ?) + VALUES (?, ?, ?, 0, 1, ?, ?) ON DUPLICATE KEY UPDATE available_amount = VALUES(available_amount), frozen_amount = VALUES(frozen_amount), version = version + 1, updated_at_ms = VALUES(updated_at_ms) - `, userID, balance, nowMs, nowMs) + `, userID, assetType, balance, nowMs, nowMs) if err != nil { r.t.Fatalf("seed wallet balance failed: %v", err) } diff --git a/services/wallet-service/internal/transport/grpc/recharge.go b/services/wallet-service/internal/transport/grpc/recharge.go new file mode 100644 index 00000000..325dc70e --- /dev/null +++ b/services/wallet-service/internal/transport/grpc/recharge.go @@ -0,0 +1,60 @@ +package grpc + +import ( + "context" + + walletv1 "hyapp.local/api/proto/wallet/v1" + "hyapp/pkg/appcode" + "hyapp/pkg/xerr" + "hyapp/services/wallet-service/internal/domain/ledger" +) + +// ListRechargeBills 暴露充值账单只读查询;后台 HTTP 层负责登录态和菜单权限。 +func (s *Server) ListRechargeBills(ctx context.Context, req *walletv1.ListRechargeBillsRequest) (*walletv1.ListRechargeBillsResponse, error) { + ctx = appcode.WithContext(ctx, req.GetAppCode()) + items, total, err := s.svc.ListRechargeBills(ctx, ledger.ListRechargeBillsQuery{ + AppCode: req.GetAppCode(), + UserID: req.GetUserId(), + SellerUserID: req.GetSellerUserId(), + RegionID: req.GetRegionId(), + RechargeType: req.GetRechargeType(), + Status: req.GetStatus(), + Keyword: req.GetKeyword(), + StartAtMS: req.GetStartAtMs(), + EndAtMS: req.GetEndAtMs(), + Page: req.GetPage(), + PageSize: req.GetPageSize(), + }) + if err != nil { + return nil, xerr.ToGRPCError(err) + } + + resp := &walletv1.ListRechargeBillsResponse{Bills: make([]*walletv1.RechargeBill, 0, len(items)), Total: total} + for _, item := range items { + resp.Bills = append(resp.Bills, rechargeBillToProto(item)) + } + return resp, nil +} + +func rechargeBillToProto(item ledger.RechargeBill) *walletv1.RechargeBill { + return &walletv1.RechargeBill{ + AppCode: item.AppCode, + TransactionId: item.TransactionID, + CommandId: item.CommandID, + RechargeType: item.RechargeType, + Status: item.Status, + ExternalRef: item.ExternalRef, + UserId: item.UserID, + SellerUserId: item.SellerUserID, + SellerRegionId: item.SellerRegionID, + TargetRegionId: item.TargetRegionID, + PolicyId: item.PolicyID, + PolicyVersion: item.PolicyVersion, + CurrencyCode: item.CurrencyCode, + CoinAmount: item.CoinAmount, + UsdMinorAmount: item.USDMinorAmount, + ExchangeCoinAmount: item.ExchangeCoinAmount, + ExchangeUsdMinorAmount: item.ExchangeUSDMinorAmount, + CreatedAtMs: item.CreatedAtMS, + } +} diff --git a/services/wallet-service/internal/transport/grpc/resource.go b/services/wallet-service/internal/transport/grpc/resource.go index 5b263747..d4f9b971 100644 --- a/services/wallet-service/internal/transport/grpc/resource.go +++ b/services/wallet-service/internal/transport/grpc/resource.go @@ -339,6 +339,11 @@ func giftConfigCommandFromCreate(req *walletv1.CreateGiftConfigRequest) resource GiftPointAmount: req.GetGiftPointAmount(), HeatValue: req.GetHeatValue(), EffectiveAtMS: req.GetEffectiveAtMs(), + GiftTypeCode: req.GetGiftTypeCode(), + ChargeAssetType: req.GetChargeAssetType(), + EffectiveFromMS: req.GetEffectiveFromMs(), + EffectiveToMS: req.GetEffectiveToMs(), + EffectTypes: req.GetEffectTypes(), OperatorUserID: req.GetOperatorUserId(), RegionIDs: req.GetRegionIds(), } @@ -358,6 +363,11 @@ func giftConfigCommandFromUpdate(req *walletv1.UpdateGiftConfigRequest) resource GiftPointAmount: req.GetGiftPointAmount(), HeatValue: req.GetHeatValue(), EffectiveAtMS: req.GetEffectiveAtMs(), + GiftTypeCode: req.GetGiftTypeCode(), + ChargeAssetType: req.GetChargeAssetType(), + EffectiveFromMS: req.GetEffectiveFromMs(), + EffectiveToMS: req.GetEffectiveToMs(), + EffectTypes: req.GetEffectTypes(), OperatorUserID: req.GetOperatorUserId(), RegionIDs: req.GetRegionIds(), } @@ -452,9 +462,14 @@ func giftConfigToProto(gift resourcedomain.GiftConfig) *walletv1.GiftConfig { SortOrder: gift.SortOrder, PresentationJson: gift.PresentationJSON, PriceVersion: gift.PriceVersion, + ChargeAssetType: gift.ChargeAssetType, CoinPrice: gift.CoinPrice, GiftPointAmount: gift.GiftPointAmount, HeatValue: gift.HeatValue, + GiftTypeCode: gift.GiftTypeCode, + EffectiveFromMs: gift.EffectiveFromMS, + EffectiveToMs: gift.EffectiveToMS, + EffectTypes: gift.EffectTypes, CreatedByUserId: gift.CreatedByUserID, UpdatedByUserId: gift.UpdatedByUserID, CreatedAtMs: gift.CreatedAtMS, diff --git a/services/wallet-service/internal/transport/grpc/server.go b/services/wallet-service/internal/transport/grpc/server.go index b73ede72..195b5f03 100644 --- a/services/wallet-service/internal/transport/grpc/server.go +++ b/services/wallet-service/internal/transport/grpc/server.go @@ -45,6 +45,8 @@ func (s *Server) DebitGift(ctx context.Context, req *walletv1.DebitGiftRequest) BalanceAfter: receipt.BalanceAfter, TransactionId: receipt.TransactionID, CoinSpent: receipt.CoinSpent, + ChargeAssetType: receipt.ChargeAssetType, + ChargeAmount: receipt.ChargeAmount, GiftPointAdded: receipt.GiftPointAdded, HeatValue: receipt.HeatValue, PriceVersion: receipt.PriceVersion,