This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"github.com/perfect-panel/server/internal/model/user"
|
||||
)
|
||||
|
||||
type PurchaseRoute string
|
||||
|
||||
const (
|
||||
PurchaseRouteNewPurchase PurchaseRoute = "new_purchase"
|
||||
PurchaseRoutePurchaseToRenewal PurchaseRoute = "purchase_to_renewal"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrSingleModePlanMismatch = errors.New("single subscribe mode plan mismatch")
|
||||
)
|
||||
|
||||
type PurchaseRouteDecision struct {
|
||||
SingleMode bool
|
||||
Route PurchaseRoute
|
||||
ResolvedSubscribeID int64
|
||||
Anchor *user.Subscribe
|
||||
}
|
||||
|
||||
type FindSingleModeAnchorFunc func(ctx context.Context, userID int64) (*user.Subscribe, error)
|
||||
|
||||
func ResolvePurchaseRoute(
|
||||
ctx context.Context,
|
||||
singleMode bool,
|
||||
userID int64,
|
||||
requestedSubscribeID int64,
|
||||
findAnchor FindSingleModeAnchorFunc,
|
||||
) (*PurchaseRouteDecision, error) {
|
||||
decision := &PurchaseRouteDecision{
|
||||
SingleMode: singleMode,
|
||||
Route: PurchaseRouteNewPurchase,
|
||||
ResolvedSubscribeID: requestedSubscribeID,
|
||||
}
|
||||
|
||||
if !singleMode || userID == 0 || findAnchor == nil {
|
||||
return decision, nil
|
||||
}
|
||||
|
||||
anchorSub, err := findAnchor(ctx, userID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if anchorSub == nil {
|
||||
return decision, nil
|
||||
}
|
||||
|
||||
if requestedSubscribeID != anchorSub.SubscribeId {
|
||||
return nil, ErrSingleModePlanMismatch
|
||||
}
|
||||
|
||||
decision.Route = PurchaseRoutePurchaseToRenewal
|
||||
decision.ResolvedSubscribeID = anchorSub.SubscribeId
|
||||
decision.Anchor = anchorSub
|
||||
return decision, nil
|
||||
}
|
||||
Reference in New Issue
Block a user