diff --git a/app/controllers/spree/orders_controller.rb b/app/controllers/spree/orders_controller.rb index 92c7d4ad81..345ca4a2c3 100644 --- a/app/controllers/spree/orders_controller.rb +++ b/app/controllers/spree/orders_controller.rb @@ -25,7 +25,7 @@ module Spree before_action :check_at_least_one_line_item, only: :update def show - process_payment_intent!(params["payment_intent"]) + ProcessPaymentIntent.new(params["payment_intent"], params[:id]).call! @order = Spree::Order.find_by!(number: params[:id]) end @@ -216,17 +216,5 @@ module Spree line_items_attributes: [:id, :quantity] ) end - - def process_payment_intent!(payment_intent) - return unless payment_intent&.starts_with?("pi_") - return unless order = Spree::Order.find_by!(number: params[:id]) - - last_payment = OrderPaymentFinder.new(order).last_payment - return unless last_payment&.state == "pending" && - last_payment&.response_code == payment_intent - - last_payment.update_attribute(:cvv_response_message, nil) - last_payment.complete! - end end end diff --git a/app/services/process_payment_intent.rb b/app/services/process_payment_intent.rb new file mode 100644 index 0000000000..a4932159ca --- /dev/null +++ b/app/services/process_payment_intent.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class ProcessPaymentIntent + def initialize(payment_intent, order_number) + @payment_intent = payment_intent + @order = Spree::Order.find_by!(number: order_number) + @last_payment = OrderPaymentFinder.new(@order).last_payment + end + + def call! + return unless valid? + + @last_payment.update_attribute(:cvv_response_message, nil) + @last_payment.complete! + end + + private + + def valid? + @order.present? && valid_intent_string? && matches_last_payment? + end + + def valid_intent_string? + @payment_intent&.starts_with?("pi_") + end + + def matches_last_payment? + @last_payment&.state == "pending" && @last_payment&.response_code == @payment_intent + end +end