67 lines
1.9 KiB
Go
67 lines
1.9 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
var ErrInvalidAuthorizationTransition = errors.New("invalid authorization status transition")
|
|
|
|
type AuthorizationStatus string
|
|
|
|
const (
|
|
AuthorizationStatusActive AuthorizationStatus = "ACTIVE"
|
|
AuthorizationStatusClaimed AuthorizationStatus = "CLAIMED"
|
|
AuthorizationStatusFenced AuthorizationStatus = "FENCED"
|
|
AuthorizationStatusConsumed AuthorizationStatus = "CONSUMED"
|
|
AuthorizationStatusExpired AuthorizationStatus = "EXPIRED"
|
|
AuthorizationStatusAbandoned AuthorizationStatus = "ABANDONED"
|
|
)
|
|
|
|
type OrderAuthorization struct {
|
|
ID string
|
|
TaskID string
|
|
TaskVersion int
|
|
StartKey string
|
|
GoodsID string
|
|
SKUColor string
|
|
SKUSize string
|
|
Quantity int
|
|
TotalPriceCap string
|
|
Status AuthorizationStatus
|
|
CreatedBy string
|
|
CreatedAt time.Time
|
|
ExpiresAt time.Time
|
|
}
|
|
|
|
// CanTransitionTo 围栏后的授权只能消费,不能回到可领取或可过期状态,以防重复采购。
|
|
func (status AuthorizationStatus) CanTransitionTo(next AuthorizationStatus) bool {
|
|
_, allowed := authorizationTransitions[status][next]
|
|
return allowed
|
|
}
|
|
|
|
// TransitionAuthorization 返回下一状态;未定义的授权状态转移一律失败。
|
|
func TransitionAuthorization(current, next AuthorizationStatus) (AuthorizationStatus, error) {
|
|
if !current.CanTransitionTo(next) {
|
|
return current, ErrInvalidAuthorizationTransition
|
|
}
|
|
|
|
return next, nil
|
|
}
|
|
|
|
var authorizationTransitions = map[AuthorizationStatus]map[AuthorizationStatus]struct{}{
|
|
AuthorizationStatusActive: {
|
|
AuthorizationStatusClaimed: {},
|
|
AuthorizationStatusExpired: {},
|
|
AuthorizationStatusAbandoned: {},
|
|
},
|
|
AuthorizationStatusClaimed: {
|
|
AuthorizationStatusFenced: {},
|
|
AuthorizationStatusExpired: {},
|
|
AuthorizationStatusAbandoned: {},
|
|
},
|
|
AuthorizationStatusFenced: {
|
|
AuthorizationStatusConsumed: {},
|
|
},
|
|
}
|