FIX: Prevent duplicate stripe subscription list requests (#208)
Users can have multiple customer records in our db, so we need to filter out non-unique stripe customer ids before fetching subscriptions for each.
This commit is contained in:
parent
66e8857c20
commit
5eba613f8f
|
@ -15,7 +15,7 @@ module DiscourseSubscriptions
|
||||||
begin
|
begin
|
||||||
customer = Customer.where(user_id: current_user.id)
|
customer = Customer.where(user_id: current_user.id)
|
||||||
customer_ids = customer.map { |c| c.id } if customer
|
customer_ids = customer.map { |c| c.id } if customer
|
||||||
stripe_customer_ids = customer.map { |c| c.customer_id } if customer
|
stripe_customer_ids = customer.map { |c| c.customer_id }.uniq if customer
|
||||||
subscription_ids =
|
subscription_ids =
|
||||||
Subscription.where("customer_id in (?)", customer_ids).pluck(
|
Subscription.where("customer_id in (?)", customer_ids).pluck(
|
||||||
:external_id,
|
:external_id,
|
||||||
|
@ -32,6 +32,7 @@ module DiscourseSubscriptions
|
||||||
::Stripe::Subscription.list(customer: stripe_customer_id, status: "all")
|
::Stripe::Subscription.list(customer: stripe_customer_id, status: "all")
|
||||||
all_subscriptions.concat(customer_subscriptions[:data])
|
all_subscriptions.concat(customer_subscriptions[:data])
|
||||||
end
|
end
|
||||||
|
|
||||||
subscriptions = all_subscriptions.select { |sub| subscription_ids.include?(sub[:id]) }
|
subscriptions = all_subscriptions.select { |sub| subscription_ids.include?(sub[:id]) }
|
||||||
subscriptions.map! do |subscription|
|
subscriptions.map! do |subscription|
|
||||||
plan = plans[:data].find { |p| p[:id] == subscription[:items][:data][0][:price][:id] }
|
plan = plans[:data].find { |p| p[:id] == subscription[:items][:data][0][:price][:id] }
|
||||||
|
|
|
@ -7,11 +7,14 @@ describe "Subscription products", type: :system do
|
||||||
fab!(:customer) do
|
fab!(:customer) do
|
||||||
Fabricate(:customer, customer_id: "cus_Q1n", product_id: product.external_id, user_id: user.id)
|
Fabricate(:customer, customer_id: "cus_Q1n", product_id: product.external_id, user_id: user.id)
|
||||||
end
|
end
|
||||||
|
fab!(:customer2) do
|
||||||
|
Fabricate(:customer, customer_id: "cus_Q1n", product_id: product.external_id, user_id: user.id)
|
||||||
|
end
|
||||||
fab!(:subscription) do
|
fab!(:subscription) do
|
||||||
Fabricate(:subscription, customer_id: customer.id, external_id: "sub_10z", status: "active")
|
Fabricate(:subscription, customer_id: customer.id, external_id: "sub_10z", status: "active")
|
||||||
end
|
end
|
||||||
fab!(:subscription) do
|
fab!(:subscription2) do
|
||||||
Fabricate(:subscription, customer_id: customer.id, external_id: "sub_32b", status: "canceled")
|
Fabricate(:subscription, customer_id: customer2.id, external_id: "sub_32b", status: "canceled")
|
||||||
end
|
end
|
||||||
let(:dialog) { PageObjects::Components::Dialog.new }
|
let(:dialog) { PageObjects::Components::Dialog.new }
|
||||||
let(:product_subscriptions_page) { PageObjects::Pages::AdminSubscriptionProduct.new }
|
let(:product_subscriptions_page) { PageObjects::Pages::AdminSubscriptionProduct.new }
|
||||||
|
@ -82,11 +85,12 @@ describe "Subscription products", type: :system do
|
||||||
it "shows active and canceled subscriptions for users" do
|
it "shows active and canceled subscriptions for users" do
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
|
|
||||||
active_subscription_row =
|
user_billing_subscriptions_page.visit_subscriptions
|
||||||
user_billing_subscriptions_page.visit_subscriptions.subscription_row("sub_10z")
|
user_billing_subscriptions_page.has_number_of_subscriptions?(2)
|
||||||
|
|
||||||
|
active_subscription_row = user_billing_subscriptions_page.subscription_row("sub_10z")
|
||||||
expect(active_subscription_row).to have_text("active")
|
expect(active_subscription_row).to have_text("active")
|
||||||
canceled_subscription_row =
|
canceled_subscription_row = user_billing_subscriptions_page.subscription_row("sub_32b")
|
||||||
user_billing_subscriptions_page.visit_subscriptions.subscription_row("sub_32b")
|
|
||||||
expect(canceled_subscription_row).to have_text("canceled")
|
expect(canceled_subscription_row).to have_text("canceled")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue