fix family member renewal target
Build docker and publish / build (20.15.1) (push) Has been cancelled
Build docker and publish / build (20.15.1) (push) Has been cancelled
This commit is contained in:
@@ -41,6 +41,67 @@ func NewRenewalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RenewalLo
|
||||
}
|
||||
}
|
||||
|
||||
func (l *RenewalLogic) resolveRenewalTargetSubscribe(requested *user.SubscribeDetails, entitlement *commonLogic.EntitlementContext, currentUserID int64) (*user.SubscribeDetails, error) {
|
||||
if requested == nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidParams), "requested user subscribe is empty")
|
||||
}
|
||||
|
||||
effectiveUserID := currentUserID
|
||||
if entitlement != nil && entitlement.EffectiveUserID > 0 {
|
||||
effectiveUserID = entitlement.EffectiveUserID
|
||||
}
|
||||
|
||||
if effectiveUserID == currentUserID {
|
||||
if requested.UserId != currentUserID {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidAccess), "user subscribe does not belong to current user")
|
||||
}
|
||||
return requested, nil
|
||||
}
|
||||
|
||||
if requested.UserId != currentUserID && requested.UserId != effectiveUserID {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidAccess), "user subscribe does not belong to current family entitlement")
|
||||
}
|
||||
if requested.UserId == effectiveUserID {
|
||||
return requested, nil
|
||||
}
|
||||
|
||||
ownerSubscribe, err := l.findOwnerRenewalSubscribe(effectiveUserID, requested.SubscribeId)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
commonLogic.SubscriptionTraceInfo(l.Logger, commonLogic.SubscriptionTraceFlowOrder, "renewal_target_resolved",
|
||||
"[SubscriptionFlow] renewal target redirected to family owner subscription",
|
||||
logger.Field("user_id", currentUserID),
|
||||
logger.Field("effective_user_id", effectiveUserID),
|
||||
logger.Field("requested_user_subscribe_id", requested.Id),
|
||||
logger.Field("requested_subscribe_owner_user_id", requested.UserId),
|
||||
logger.Field("resolved_user_subscribe_id", ownerSubscribe.Id),
|
||||
logger.Field("resolved_subscribe_owner_user_id", ownerSubscribe.UserId),
|
||||
logger.Field("subscribe_id", requested.SubscribeId),
|
||||
)
|
||||
return ownerSubscribe, nil
|
||||
}
|
||||
|
||||
func (l *RenewalLogic) findOwnerRenewalSubscribe(ownerUserID, subscribeID int64) (*user.SubscribeDetails, error) {
|
||||
var target user.SubscribeDetails
|
||||
err := l.svcCtx.DB.WithContext(l.ctx).
|
||||
Model(&user.Subscribe{}).
|
||||
Preload("Subscribe").
|
||||
Where("user_id = ? AND subscribe_id = ? AND token != ''", ownerUserID, subscribeID).
|
||||
Where("status IN ?", []int64{0, 1, 2, 3}).
|
||||
Order("expire_time DESC").
|
||||
Order("updated_at DESC").
|
||||
Order("id DESC").
|
||||
First(&target).Error
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidAccess), "owner subscribe not found for renewal")
|
||||
}
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find owner subscribe error: %v", err.Error())
|
||||
}
|
||||
return &target, nil
|
||||
}
|
||||
|
||||
// Renewal processes subscription renewal orders including discount calculation,
|
||||
// coupon validation, gift amount deduction, fee calculation, and order creation
|
||||
func (l *RenewalLogic) Renewal(req *types.RenewalOrderRequest) (resp *types.RenewalOrderResponse, err error) {
|
||||
@@ -77,11 +138,15 @@ func (l *RenewalLogic) Renewal(req *types.RenewalOrderRequest) (resp *types.Rene
|
||||
}
|
||||
|
||||
orderNo := tool.GenerateTradeNo()
|
||||
// find user subscribe
|
||||
userSubscribe, err := l.svcCtx.UserModel.FindOneUserSubscribe(l.ctx, req.UserSubscribeID)
|
||||
// find requested user subscribe, then resolve it to the real entitlement owner.
|
||||
requestedSubscribe, err := l.svcCtx.UserModel.FindOneUserSubscribe(l.ctx, req.UserSubscribeID)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find user subscribe error: %v", err.Error())
|
||||
}
|
||||
userSubscribe, err := l.resolveRenewalTargetSubscribe(requestedSubscribe, entitlement, u.Id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// find subscription
|
||||
sub, err := l.svcCtx.SubscribeModel.FindOne(l.ctx, userSubscribe.SubscribeId)
|
||||
if err != nil {
|
||||
@@ -251,7 +316,9 @@ func (l *RenewalLogic) Renewal(req *types.RenewalOrderRequest) (resp *types.Rene
|
||||
"[SubscriptionFlow] renewal order persisted",
|
||||
append(commonLogic.OrderTraceFields(&orderInfo),
|
||||
logger.Field("requested_user_subscribe_id", req.UserSubscribeID),
|
||||
logger.Field("requested_subscribe_owner_user_id", requestedSubscribe.UserId),
|
||||
logger.Field("resolved_user_subscribe_id", userSubscribe.Id),
|
||||
logger.Field("resolved_subscribe_owner_user_id", userSubscribe.UserId),
|
||||
)...,
|
||||
)
|
||||
// Deferred task
|
||||
|
||||
Reference in New Issue
Block a user