211 lines
7.8 KiB
Go
211 lines
7.8 KiB
Go
package grpc
|
|
|
|
import (
|
|
"context"
|
|
|
|
walletv1 "hyapp.local/api/proto/wallet/v1"
|
|
"hyapp/pkg/appcode"
|
|
"hyapp/pkg/xerr"
|
|
"hyapp/services/wallet-service/internal/domain/ledger"
|
|
)
|
|
|
|
// GetBalances 返回用户多资产余额投影。
|
|
func (s *Server) GetBalances(ctx context.Context, req *walletv1.GetBalancesRequest) (*walletv1.GetBalancesResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
balances, err := s.svc.GetBalances(ctx, req.GetUserId(), req.GetAssetTypes())
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
|
|
response := &walletv1.GetBalancesResponse{Balances: make([]*walletv1.AssetBalance, 0, len(balances))}
|
|
for _, balance := range balances {
|
|
response.Balances = append(response.Balances, &walletv1.AssetBalance{
|
|
AppCode: balance.AppCode,
|
|
AssetType: balance.AssetType,
|
|
AvailableAmount: balance.AvailableAmount,
|
|
FrozenAmount: balance.FrozenAmount,
|
|
Version: balance.Version,
|
|
})
|
|
}
|
|
|
|
return response, nil
|
|
}
|
|
|
|
// GetWalletOverview 返回钱包首页摘要,供我的页和钱包二级页复用。
|
|
func (s *Server) GetWalletOverview(ctx context.Context, req *walletv1.GetWalletOverviewRequest) (*walletv1.GetWalletOverviewResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
overview, err := s.svc.GetWalletOverview(ctx, req.GetUserId())
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
return &walletv1.GetWalletOverviewResponse{
|
|
Balances: balancesToProto(overview.Balances),
|
|
FeatureFlags: walletFeatureFlagsToProto(overview.FeatureFlags),
|
|
}, nil
|
|
}
|
|
|
|
// GetWalletValueSummary 返回我的页钱包卡片最小金币余额。
|
|
func (s *Server) GetWalletValueSummary(ctx context.Context, req *walletv1.GetWalletValueSummaryRequest) (*walletv1.GetWalletValueSummaryResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
summary, err := s.svc.GetWalletValueSummary(ctx, req.GetUserId())
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
return &walletv1.GetWalletValueSummaryResponse{Summary: &walletv1.WalletValueSummary{
|
|
CoinAmount: summary.CoinAmount,
|
|
UpdatedAtMs: summary.UpdatedAtMS,
|
|
}}, nil
|
|
}
|
|
|
|
// GetUserGiftWall 返回当前用户收到礼物的聚合墙;调用方负责限定 user_id 为当前登录用户。
|
|
func (s *Server) GetUserGiftWall(ctx context.Context, req *walletv1.GetUserGiftWallRequest) (*walletv1.GetUserGiftWallResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
wall, err := s.svc.GetUserGiftWall(ctx, req.GetUserId())
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
resp := &walletv1.GetUserGiftWallResponse{
|
|
Items: make([]*walletv1.GiftWallItem, 0, len(wall.Items)),
|
|
GiftKindCount: wall.GiftKindCount,
|
|
GiftTotalCount: wall.GiftTotalCount,
|
|
TotalValue: wall.TotalValue,
|
|
TotalCoinValue: wall.TotalCoinValue,
|
|
TotalDiamondValue: wall.TotalDiamondValue,
|
|
TotalGiftPoint: wall.TotalGiftPoint,
|
|
TotalHeatValue: wall.TotalHeatValue,
|
|
}
|
|
for _, item := range wall.Items {
|
|
resp.Items = append(resp.Items, giftWallItemToProto(item))
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
// GetDiamondExchangeConfig 返回钻石兑换配置。
|
|
func (s *Server) GetDiamondExchangeConfig(ctx context.Context, req *walletv1.GetDiamondExchangeConfigRequest) (*walletv1.GetDiamondExchangeConfigResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
rules, err := s.svc.GetDiamondExchangeConfig(ctx, req.GetUserId())
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
resp := &walletv1.GetDiamondExchangeConfigResponse{Rules: make([]*walletv1.DiamondExchangeRule, 0, len(rules))}
|
|
for _, rule := range rules {
|
|
resp.Rules = append(resp.Rules, &walletv1.DiamondExchangeRule{
|
|
ExchangeType: rule.ExchangeType,
|
|
FromAssetType: rule.FromAssetType,
|
|
ToAssetType: rule.ToAssetType,
|
|
FromAmount: rule.FromAmount,
|
|
ToAmount: rule.ToAmount,
|
|
Enabled: rule.Enabled,
|
|
})
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
// ListWalletTransactions 返回当前用户钱包流水。
|
|
func (s *Server) ListWalletTransactions(ctx context.Context, req *walletv1.ListWalletTransactionsRequest) (*walletv1.ListWalletTransactionsResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
items, total, err := s.svc.ListWalletTransactions(ctx, ledger.ListWalletTransactionsQuery{
|
|
AppCode: req.GetAppCode(),
|
|
UserID: req.GetUserId(),
|
|
AssetType: req.GetAssetType(),
|
|
Page: req.GetPage(),
|
|
PageSize: req.GetPageSize(),
|
|
})
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
resp := &walletv1.ListWalletTransactionsResponse{Transactions: make([]*walletv1.WalletTransaction, 0, len(items)), Total: total}
|
|
for _, item := range items {
|
|
resp.Transactions = append(resp.Transactions, &walletv1.WalletTransaction{
|
|
EntryId: item.EntryID,
|
|
TransactionId: item.TransactionID,
|
|
BizType: item.BizType,
|
|
AssetType: item.AssetType,
|
|
AvailableDelta: item.AvailableDelta,
|
|
FrozenDelta: item.FrozenDelta,
|
|
AvailableAfter: item.AvailableAfter,
|
|
FrozenAfter: item.FrozenAfter,
|
|
CounterpartyUserId: item.CounterpartyUserID,
|
|
RoomId: item.RoomID,
|
|
CreatedAtMs: item.CreatedAtMS,
|
|
TransferUsdMinor: item.TransferUSDMinor,
|
|
TransferCurrencyCode: item.TransferCurrencyCode,
|
|
})
|
|
}
|
|
return resp, nil
|
|
}
|
|
|
|
func balancesToProto(balances []ledger.AssetBalance) []*walletv1.AssetBalance {
|
|
items := make([]*walletv1.AssetBalance, 0, len(balances))
|
|
for _, balance := range balances {
|
|
items = append(items, balanceToProto(balance))
|
|
}
|
|
return items
|
|
}
|
|
|
|
func balanceToProto(balance ledger.AssetBalance) *walletv1.AssetBalance {
|
|
return &walletv1.AssetBalance{
|
|
AppCode: balance.AppCode,
|
|
AssetType: balance.AssetType,
|
|
AvailableAmount: balance.AvailableAmount,
|
|
FrozenAmount: balance.FrozenAmount,
|
|
Version: balance.Version,
|
|
}
|
|
}
|
|
|
|
func giftWallItemToProto(item ledger.GiftWallItem) *walletv1.GiftWallItem {
|
|
return &walletv1.GiftWallItem{
|
|
GiftId: item.GiftID,
|
|
GiftName: item.GiftName,
|
|
ResourceId: item.ResourceID,
|
|
Resource: giftWallResourceToProto(item.Resource),
|
|
ResourceSnapshotJson: item.ResourceSnapshotJSON,
|
|
GiftTypeCode: item.GiftTypeCode,
|
|
PresentationJson: item.PresentationJSON,
|
|
GiftCount: item.GiftCount,
|
|
TotalValue: item.TotalValue,
|
|
TotalCoinValue: item.TotalCoinValue,
|
|
TotalDiamondValue: item.TotalDiamondValue,
|
|
TotalGiftPoint: item.TotalGiftPoint,
|
|
TotalHeatValue: item.TotalHeatValue,
|
|
ChargeAssetType: item.ChargeAssetType,
|
|
LastPriceVersion: item.LastPriceVersion,
|
|
FirstReceivedAtMs: item.FirstReceivedAtMS,
|
|
LastReceivedAtMs: item.LastReceivedAtMS,
|
|
SortOrder: item.SortOrder,
|
|
}
|
|
}
|
|
|
|
func giftWallResourceToProto(resource ledger.GiftWallResource) *walletv1.Resource {
|
|
if resource.ResourceID == 0 {
|
|
return nil
|
|
}
|
|
return &walletv1.Resource{
|
|
AppCode: resource.AppCode,
|
|
ResourceId: resource.ResourceID,
|
|
ResourceCode: resource.ResourceCode,
|
|
ResourceType: resource.ResourceType,
|
|
Name: resource.Name,
|
|
Status: resource.Status,
|
|
Grantable: resource.Grantable,
|
|
GrantStrategy: resource.GrantStrategy,
|
|
WalletAssetType: resource.WalletAssetType,
|
|
WalletAssetAmount: resource.WalletAssetAmount,
|
|
UsageScopes: resource.UsageScopes,
|
|
AssetUrl: resource.AssetURL,
|
|
PreviewUrl: resource.PreviewURL,
|
|
AnimationUrl: resource.AnimationURL,
|
|
MetadataJson: resource.MetadataJSON,
|
|
SortOrder: resource.SortOrder,
|
|
CreatedAtMs: resource.CreatedAtMS,
|
|
UpdatedAtMs: resource.UpdatedAtMS,
|
|
}
|
|
}
|
|
|
|
func walletFeatureFlagsToProto(flags ledger.WalletFeatureFlags) *walletv1.WalletFeatureFlags {
|
|
return &walletv1.WalletFeatureFlags{
|
|
RechargeEnabled: flags.RechargeEnabled,
|
|
DiamondExchangeEnabled: flags.DiamondExchangeEnabled,
|
|
}
|
|
}
|