From c02193943b67f89d5aa7c0ebd8a618e6bb12231b Mon Sep 17 00:00:00 2001 From: Blake Erickson Date: Fri, 12 Jul 2024 14:33:04 -0600 Subject: [PATCH] FIX: Admins unable to cancel a subscription for a user (#220) --- .../admin/subscriptions_controller.rb | 5 +---- .../components/modal/admin-cancel-subscription.gjs | 6 +++++- ...plugins-discourse-subscriptions-subscriptions.js | 3 +++ .../requests/admin/subscriptions_controller_spec.rb | 13 +++++++------ 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/controllers/discourse_subscriptions/admin/subscriptions_controller.rb b/app/controllers/discourse_subscriptions/admin/subscriptions_controller.rb index ffa7592..5e0b075 100644 --- a/app/controllers/discourse_subscriptions/admin/subscriptions_controller.rb +++ b/app/controllers/discourse_subscriptions/admin/subscriptions_controller.rb @@ -53,7 +53,7 @@ module DiscourseSubscriptions params.require(:id) begin refund_subscription(params[:id]) if params[:refund] - subscription = ::Stripe::Subscription.delete(params[:id]) + subscription = ::Stripe::Subscription.cancel(params[:id]) customer = Customer.find_by( @@ -61,11 +61,8 @@ module DiscourseSubscriptions customer_id: subscription[:customer], ) - Subscription.delete_by(external_id: params[:id]) - if customer user = ::User.find(customer.user_id) - customer.delete group = plan_group(subscription[:plan]) group.remove(user) if group end diff --git a/assets/javascripts/discourse/components/modal/admin-cancel-subscription.gjs b/assets/javascripts/discourse/components/modal/admin-cancel-subscription.gjs index 2330e20..e925dee 100644 --- a/assets/javascripts/discourse/components/modal/admin-cancel-subscription.gjs +++ b/assets/javascripts/discourse/components/modal/admin-cancel-subscription.gjs @@ -25,7 +25,11 @@ export default class AdminCancelSubscription extends Component { @label="yes_value" @action={{fn @model.cancelSubscription - (hash subscription=@model.subscription refund=this.refund) + (hash + subscription=@model.subscription + refund=this.refund + closeModal=@closeModal + ) }} @icon="times" @isLoading={{@model.subscription.loading}} diff --git a/assets/javascripts/discourse/controllers/admin-plugins-discourse-subscriptions-subscriptions.js b/assets/javascripts/discourse/controllers/admin-plugins-discourse-subscriptions-subscriptions.js index 3c294e6..96f7518 100644 --- a/assets/javascripts/discourse/controllers/admin-plugins-discourse-subscriptions-subscriptions.js +++ b/assets/javascripts/discourse/controllers/admin-plugins-discourse-subscriptions-subscriptions.js @@ -40,6 +40,8 @@ export default Controller.extend({ cancelSubscription(model) { const subscription = model.subscription; const refund = model.refund; + const closeModal = model.closeModal; + subscription.set("loading", true); subscription .destroy(refund) @@ -52,6 +54,7 @@ export default Controller.extend({ ) .finally(() => { subscription.set("loading", false); + closeModal(); }); }, }); diff --git a/spec/requests/admin/subscriptions_controller_spec.rb b/spec/requests/admin/subscriptions_controller_spec.rb index b39e3df..fb371ef 100644 --- a/spec/requests/admin/subscriptions_controller_spec.rb +++ b/spec/requests/admin/subscriptions_controller_spec.rb @@ -77,18 +77,19 @@ RSpec.describe DiscourseSubscriptions::Admin::SubscriptionsController do it "deletes a customer" do ::Stripe::Subscription - .expects(:delete) + .expects(:cancel) .with("sub_12345") .returns(plan: { product: "pr_34578" }, customer: "c_123") - expect { delete "/s/admin/subscriptions/sub_12345.json" }.to change { + # We don't want to delete the customer record. The webhook hook will update the status instead. + expect { delete "/s/admin/subscriptions/sub_12345.json" }.not_to change { DiscourseSubscriptions::Customer.count - }.by(-1) + } end it "removes the user from the group" do ::Stripe::Subscription - .expects(:delete) + .expects(:cancel) .with("sub_12345") .returns( plan: { @@ -107,7 +108,7 @@ RSpec.describe DiscourseSubscriptions::Admin::SubscriptionsController do it "does not remove the user from the group" do ::Stripe::Subscription - .expects(:delete) + .expects(:cancel) .with("sub_12345") .returns( plan: { @@ -126,7 +127,7 @@ RSpec.describe DiscourseSubscriptions::Admin::SubscriptionsController do it "refunds if params[:refund] present" do ::Stripe::Subscription - .expects(:delete) + .expects(:cancel) .with("sub_12345") .returns(plan: { product: "pr_34578" }, customer: "c_123") ::Stripe::Subscription