diff --git a/app/controllers/api/v0/orders_controller.rb b/app/controllers/api/v0/orders_controller.rb index 3f23a32e40..f36157db21 100644 --- a/app/controllers/api/v0/orders_controller.rb +++ b/app/controllers/api/v0/orders_controller.rb @@ -47,17 +47,15 @@ module Api def capture authorize! :admin, order - pending_payment = order.pending_payments.first + payment_capture = OrderCaptureService.new(order) - return payment_capture_failed unless order.payment_required? && pending_payment - - if pending_payment.capture! + if payment_capture.call render json: order.reload, serializer: Api::Admin::OrderSerializer, status: :ok + elsif payment_capture.gateway_error.present? + error_during_processing(payment_capture.gateway_error) else payment_capture_failed end - rescue Spree::Core::GatewayError => e - error_during_processing(e) end private diff --git a/app/services/order_capture_service.rb b/app/services/order_capture_service.rb new file mode 100644 index 0000000000..78e69c9a1d --- /dev/null +++ b/app/services/order_capture_service.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +# Use `authorize! :admin order` before calling this service + +class OrderCaptureService + attr_reader :gateway_error + + def initialize(order) + @order = order + @gateway_error = nil + end + + def call + return false unless @order.payment_required? + return false unless (pending_payment = @order.pending_payments.first) + + pending_payment.capture! + rescue Spree::Core::GatewayError => e + @gateway_error = e + false + end +end