app-cloudep-wallet-service/pkg/domain/repository/user_wallet_action.go

99 lines
5.9 KiB
Go
Raw Normal View History

2025-04-11 09:10:34 +00:00
package repository
import (
"code.30cm.net/digimon/app-cloudep-wallet-service/pkg/domain/entity"
"code.30cm.net/digimon/app-cloudep-wallet-service/pkg/domain/wallet"
"context"
"github.com/shopspring/decimal"
)
// WalletReader 定義查詢錢包餘額的操作,純讀取,不涉及鎖或修改。
type WalletReader interface {
// AllBalances 查詢此用戶單一幣別所有錢包(可用/凍結/...)
AllBalances(ctx context.Context) ([]entity.Wallet, error)
// Balance 查詢單一餘額種類
Balance(ctx context.Context, kind wallet.Types) (entity.Wallet, error)
// Balances 查詢多個餘額種類
Balances(ctx context.Context, kind []wallet.Types) ([]entity.Wallet, error)
// LocalBalance 取得本地記憶體暫存餘額
LocalBalance(kind wallet.Types) decimal.Decimal
}
// WalletLocker 提供所有需要「加鎖XLock」的錢包操作用於避免併發交易衝突。
// 通常搭配交易流程使用,保證同時只有一個執行緒可以修改該錢包類型或訂單相關餘額。
type WalletLocker interface {
// BalanceXLock 查詢指定錢包類型的餘額並加上排他鎖FOR UPDATE
BalanceXLock(ctx context.Context, kind wallet.Types) (entity.Wallet, error)
// BalancesXLock 查詢多個錢包類型的餘額並加上排他鎖FOR UPDATE
BalancesXLock(ctx context.Context, kind []wallet.Types) ([]entity.Wallet, error)
// XLock 針對指定錢包紀錄 ID 加鎖FOR UPDATE
XLock(ctx context.Context, id int64) (entity.Wallet, error)
// XLocks 針對多筆錢包紀錄 ID 加鎖FOR UPDATE
XLocks(ctx context.Context, ids []int64) ([]entity.Wallet, error)
// GetAvailableBalanceXLock 查詢指定業務邏輯下的可用餘額並加鎖
GetAvailableBalanceXLock(ctx context.Context, b wallet.BusinessName) (entity.Wallet, error)
// GetFreezeBalanceXLock 查詢指定業務邏輯下的凍結餘額並加鎖
GetFreezeBalanceXLock(ctx context.Context, b wallet.BusinessName) (entity.Wallet, error)
// GetUnconfirmedBalanceXLock 查詢尚未確認unconfirmed的餘額並加鎖
GetUnconfirmedBalanceXLock(ctx context.Context) (entity.Wallet, error)
// GetOrderBalanceXLock 查詢某筆訂單的餘額資料並加鎖
GetOrderBalanceXLock(ctx context.Context, id int64) (entity.Transaction, error)
}
// WalletOperator 負責錢包的餘額加減操作與訂單金額變動邏輯。
// 此介面不包含「資料鎖定Lock」與「資料持久化Execute」等責任單純聚焦於記錄錢包與訂單餘額的變動邏輯。
type WalletOperator interface {
// AddBalance 增加指定錢包類型的餘額(使用前必須已查詢該餘額並存在本地記憶體)
AddBalance(kind wallet.Types, amount decimal.Decimal) error
// AddBalanceSetOrderID 增加指定錢包類型的餘額並記錄訂單 ID用於與訂單綁定的交易
AddBalanceSetOrderID(orderID string, kind wallet.Types, amount decimal.Decimal) error
// AddAvailable 增加可用餘額(根據業務類型自動判斷使用哪種錢包)
AddAvailable(b wallet.BusinessName, amount decimal.Decimal) error
// AddFreeze 增加凍結餘額(根據業務類型自動判斷使用哪種錢包)
AddFreeze(b wallet.BusinessName, amount decimal.Decimal) error
// AddUnconfirmed 增加尚未確認unconfirmed的餘額
AddUnconfirmed(amount decimal.Decimal) error
// AddOrder 增加與訂單相關的餘額(僅適用於交易表中訂單類型紀錄)
AddOrder(id int64, amount decimal.Decimal) error
// SubAvailable 減少可用餘額(根據業務類型自動判斷使用哪種錢包)
SubAvailable(b wallet.BusinessName, amount decimal.Decimal) error
// SubFreeze 減少凍結餘額(根據業務類型自動判斷使用哪種錢包)
SubFreeze(b wallet.BusinessName, amount decimal.Decimal) error
// SubUnconfirmed 減少尚未確認unconfirmed的餘額
SubUnconfirmed(amount decimal.Decimal) error
// GetAvailableBalance 查詢某業務類型對應的可用餘額
GetAvailableBalance(ctx context.Context, b wallet.BusinessName) (entity.Wallet, error)
// GetFreezeBalance 查詢某業務類型對應的凍結餘額
GetFreezeBalance(ctx context.Context, b wallet.BusinessName) (entity.Wallet, error)
// GetUnconfirmedBalance 查詢尚未確認的餘額
GetUnconfirmedBalance(ctx context.Context) (entity.Wallet, error)
// GetOrderBalance 查詢與指定訂單 ID 相關的餘額紀錄(訂單錢包交易)
GetOrderBalance(ctx context.Context, orderID string) (entity.Transaction, error)
// CheckWallet 確認錢包是否存在(通常用於初始化前檢查)
CheckWallet(ctx context.Context) (bool, error)
}
// WalletTransactional 負責執行錢包與訂單餘額的最終更新(實際寫入資料庫),
// 並提供錢包交易紀錄的取得方法,主要用途為提交交易與後續紀錄保存。
type WalletTransactional interface {
// Execute 實際寫入錢包餘額的變動(例如:可用、凍結、未確認餘額等)
// 此方法應在交易邏輯處理完畢後被呼叫,用於同步 local 記憶體中的餘額至資料庫。
Execute(ctx context.Context) error
// ExecuteOrder 實際寫入訂單餘額的變動(通常指向 Transaction 表中的餘額欄位)
// 適用於與特定訂單相關的錢包操作(如訂單鎖定、釋放等)。
ExecuteOrder(ctx context.Context) error
// Transactions 建立錢包交易紀錄列表,用於最終寫入錢包交易表 wallet_transaction。
// 會補齊必要的交易相關欄位(如 txID、orderID、brand、businessType
Transactions(txID int64, orderID, brand string, businessType wallet.BusinessName) []entity.WalletTransaction
// GetTransactions 回傳目前記憶體中所累積的錢包交易紀錄,用於外部查詢或後續處理。
GetTransactions() []entity.WalletTransaction
}
// UserWalletService 統整所有錢包相關功能,對外仍可以使用這個 interface。
type UserWalletService interface {
WalletReader
WalletLocker
WalletOperator
WalletTransactional
}