68 lines
1.4 KiB
Go
68 lines
1.4 KiB
Go
|
package repository
|
||
|
|
||
|
import (
|
||
|
"app-cloudep-trade-service/internal/domain"
|
||
|
|
||
|
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
||
|
|
||
|
"github.com/shopspring/decimal"
|
||
|
)
|
||
|
|
||
|
// WalletOperatorOption 選項模式
|
||
|
type WalletOperatorOption func(*WalletOptions)
|
||
|
|
||
|
type WalletOptions struct {
|
||
|
WithLock bool
|
||
|
OrderID string
|
||
|
Amount decimal.Decimal
|
||
|
Kind domain.WalletType
|
||
|
Business domain.BusinessName
|
||
|
Tx *sqlx.SqlConn
|
||
|
}
|
||
|
|
||
|
// ApplyOptions 將多個 WalletOperatorOption 應用到一個 walletOptions 中
|
||
|
func ApplyOptions(opts ...WalletOperatorOption) WalletOptions {
|
||
|
options := WalletOptions{}
|
||
|
for _, opt := range opts {
|
||
|
opt(&options)
|
||
|
}
|
||
|
|
||
|
return options
|
||
|
}
|
||
|
|
||
|
func WithLock() WalletOperatorOption {
|
||
|
return func(opts *WalletOptions) {
|
||
|
opts.WithLock = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func WithOrderID(orderID string) WalletOperatorOption {
|
||
|
return func(opts *WalletOptions) {
|
||
|
opts.OrderID = orderID
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func WithAmount(amount decimal.Decimal) WalletOperatorOption {
|
||
|
return func(opts *WalletOptions) {
|
||
|
opts.Amount = amount
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func WithKind(kind domain.WalletType) WalletOperatorOption {
|
||
|
return func(opts *WalletOptions) {
|
||
|
opts.Kind = kind
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func WithBusiness(business domain.BusinessName) WalletOperatorOption {
|
||
|
return func(opts *WalletOptions) {
|
||
|
opts.Business = business
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func WithSession(session *sqlx.SqlConn) WalletOperatorOption {
|
||
|
return func(opts *WalletOptions) {
|
||
|
opts.Tx = session
|
||
|
}
|
||
|
}
|