package wallet import ( "context" "hyapp/pkg/appcode" "hyapp/pkg/xerr" "hyapp/services/wallet-service/internal/domain/ledger" "strings" ) // GetBalances 返回用户多资产余额;鉴权范围由 gateway 或后台入口控制。 func (s *Service) GetBalances(ctx context.Context, userID int64, assetTypes []string) ([]ledger.AssetBalance, error) { if userID <= 0 { return nil, xerr.New(xerr.InvalidArgument, "user_id is required") } if s.repository == nil { return nil, xerr.New(xerr.Unavailable, "wallet repository is not configured") } ctx = appcode.WithContext(ctx, appcode.FromContext(ctx)) normalized := make([]string, 0, len(assetTypes)) for _, assetType := range assetTypes { assetType = strings.ToUpper(strings.TrimSpace(assetType)) if assetType == "" { continue } if !ledger.ValidAssetType(assetType) { return nil, xerr.New(xerr.InvalidArgument, "asset_type is invalid") } normalized = append(normalized, assetType) } return s.repository.GetBalances(ctx, userID, normalized) } // GetWalletOverview 返回钱包首页摘要,余额和能力开关都由 wallet-service 统一给出。 func (s *Service) GetWalletOverview(ctx context.Context, userID int64) (ledger.WalletOverview, error) { if userID <= 0 { return ledger.WalletOverview{}, xerr.New(xerr.InvalidArgument, "user_id is required") } if s.repository == nil { return ledger.WalletOverview{}, xerr.New(xerr.Unavailable, "wallet repository is not configured") } ctx = appcode.WithContext(ctx, appcode.FromContext(ctx)) return s.repository.GetWalletOverview(ctx, userID) } // GetWalletValueSummary 返回我的页钱包卡片摘要,只读取 COIN 账户。 func (s *Service) GetWalletValueSummary(ctx context.Context, userID int64) (ledger.WalletValueSummary, error) { if userID <= 0 { return ledger.WalletValueSummary{}, xerr.New(xerr.InvalidArgument, "user_id is required") } if s.repository == nil { return ledger.WalletValueSummary{}, xerr.New(xerr.Unavailable, "wallet repository is not configured") } ctx = appcode.WithContext(ctx, appcode.FromContext(ctx)) return s.repository.GetWalletValueSummary(ctx, userID) } // GetUserGiftWall 返回用户收礼聚合投影;收礼事实只来自成功送礼账务,不读取房间运行态。 func (s *Service) GetUserGiftWall(ctx context.Context, userID int64) (ledger.UserGiftWall, error) { if userID <= 0 { return ledger.UserGiftWall{}, xerr.New(xerr.InvalidArgument, "user_id is required") } if s.repository == nil { return ledger.UserGiftWall{}, xerr.New(xerr.Unavailable, "wallet repository is not configured") } ctx = appcode.WithContext(ctx, appcode.FromContext(ctx)) return s.repository.GetUserGiftWall(ctx, userID) } // GetDiamondExchangeConfig 返回当前 App 支持的钻石兑换规则。 func (s *Service) GetDiamondExchangeConfig(ctx context.Context, userID int64) ([]ledger.DiamondExchangeRule, error) { if userID <= 0 { return nil, xerr.New(xerr.InvalidArgument, "user_id is required") } if s.repository == nil { return nil, xerr.New(xerr.Unavailable, "wallet repository is not configured") } ctx = appcode.WithContext(ctx, appcode.FromContext(ctx)) return s.repository.GetDiamondExchangeConfig(ctx, userID) } // ListWalletTransactions 返回当前用户钱包流水,避免我的页首屏扫描流水表。 func (s *Service) ListWalletTransactions(ctx context.Context, query ledger.ListWalletTransactionsQuery) ([]ledger.WalletTransaction, int64, error) { if query.UserID <= 0 { return nil, 0, xerr.New(xerr.InvalidArgument, "user_id is required") } query.AssetType = strings.ToUpper(strings.TrimSpace(query.AssetType)) if query.AssetType != "" && !ledger.ValidAssetType(query.AssetType) { return nil, 0, xerr.New(xerr.InvalidArgument, "asset_type is invalid") } 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.ListWalletTransactions(ctx, query) }