99 lines
5.9 KiB
Go
99 lines
5.9 KiB
Go
|
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
|
|||
|
}
|