diff --git a/app/controllers/user/payments_controller.rb b/app/controllers/user/payments_controller.rb index 8cf8e08..75c90a2 100644 --- a/app/controllers/user/payments_controller.rb +++ b/app/controllers/user/payments_controller.rb @@ -9,21 +9,31 @@ module DiscourseSubscriptions def index begin - customer = Customer.find_by(user_id: current_user.id) + customer = Customer.where(user_id: current_user.id) + customer_ids = customer.map { |c| c.customer_id } if customer product_ids = Product.all.pluck(:external_id) data = [] - if customer.present? && product_ids.present? - # lots of matching because the Stripe API doesn't make it easy to match products => payments except from invoices - all_invoices = ::Stripe::Invoice.list(customer: customer[:customer_id]) - invoices_with_products = all_invoices[:data].select { |invoice| product_ids.include?(invoice.dig(:lines, :data, 0, :plan, :product)) } - invoice_ids = invoices_with_products.map { |invoice| invoice[:id] } - payments = ::Stripe::PaymentIntent.list(customer: customer[:customer_id]) - payments_from_invoices = payments[:data].select { |payment| invoice_ids.include?(payment[:invoice]) } - data = payments_from_invoices + if customer_ids.present? && product_ids.present? + customer_ids.each do |customer_id| + # lots of matching because the Stripe API doesn't make it easy to match products => payments except from invoices + all_invoices = ::Stripe::Invoice.list(customer: customer_id) + invoices_with_products = all_invoices[:data].select do |invoice| + # i cannot dig it so we must get iffy with it + if invoice[:lines] && invoice[:lines][:data] && invoice[:lines][:data][0] && invoice[:lines][:data][0][:plan] && invoice[:lines][:data][0][:plan][:product] + product_ids.include?(invoice[:lines][:data][0][:plan][:product]) + end + end + invoice_ids = invoices_with_products.map { |invoice| invoice[:id] } + payments = ::Stripe::PaymentIntent.list(customer: customer_id) + payments_from_invoices = payments[:data].select { |payment| invoice_ids.include?(payment[:invoice]) } + data.concat(payments_from_invoices) + end end + data = data.sort_by { |pmt| pmt[:created] }.reverse + render_json_dump data rescue ::Stripe::InvalidRequestError => e diff --git a/spec/requests/user/payments_controller_spec.rb b/spec/requests/user/payments_controller_spec.rb index 2ea8ea7..5bb95ab 100644 --- a/spec/requests/user/payments_controller_spec.rb +++ b/spec/requests/user/payments_controller_spec.rb @@ -45,8 +45,14 @@ module DiscourseSubscriptions customer: 'c_345678', ).returns( data: [ - { invoice: "inv_900007" }, - { invoice: "inv_007" } + { + invoice: "inv_900007", + created: Time.now + }, + { + invoice: "inv_007", + created: Time.now + } ] ) diff --git a/spec/requests/user/subscriptions_controller_spec.rb b/spec/requests/user/subscriptions_controller_spec.rb index c9fc7a3..f5a88ad 100644 --- a/spec/requests/user/subscriptions_controller_spec.rb +++ b/spec/requests/user/subscriptions_controller_spec.rb @@ -61,7 +61,8 @@ module DiscourseSubscriptions it "gets subscriptions" do ::Stripe::Plan.expects(:list).with( - expand: ['data.product'] + expand: ['data.product'], + limit: 100 ).returns(plans) ::Stripe::Customer.expects(:list).with(