collab: Prevent users from creating a new subscription when they have overdue subscriptions (#22870)
This PR adjusts the create billing subscription endpoint to prevent initiating a checkout flow when a user has existing subscriptions that are overdue. A subscription is considered "overdue" when either: - The status is `past_due` - The status is `canceled` and the cancellation reason is `payment_failed` In Stripe, when a subscription has failed payment a certain number of times, it is canceled with a reason of `payment_failed`. However, today there is nothing stopping someone from simply creating a new subscription without paying the outstanding invoices. With this change a user will need to reconcile their outstanding invoices before they can sign up for a new subscription. Release Notes: - N/A
This commit is contained in:
parent
a0fca24e3f
commit
a4dd92fe06
3 changed files with 162 additions and 1 deletions
|
@ -249,6 +249,13 @@ async fn create_billing_subscription(
|
|||
));
|
||||
}
|
||||
|
||||
if app.db.has_overdue_billing_subscriptions(user.id).await? {
|
||||
return Err(Error::http(
|
||||
StatusCode::PAYMENT_REQUIRED,
|
||||
"user has overdue billing subscriptions".into(),
|
||||
));
|
||||
}
|
||||
|
||||
let customer_id =
|
||||
if let Some(existing_customer) = app.db.get_billing_customer_by_user_id(user.id).await? {
|
||||
CustomerId::from_str(&existing_customer.stripe_customer_id)
|
||||
|
@ -719,6 +726,10 @@ async fn handle_customer_subscription_event(
|
|||
billing_customer_id: billing_customer.id,
|
||||
stripe_subscription_id: subscription.id.to_string(),
|
||||
stripe_subscription_status: subscription.status.into(),
|
||||
stripe_cancellation_reason: subscription
|
||||
.cancellation_details
|
||||
.and_then(|details| details.reason)
|
||||
.map(|reason| reason.into()),
|
||||
})
|
||||
.await?;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue