mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-06 02:51:34 +00:00
Pull apart OrderCompletionReset service
This commit is contained in:
@@ -6,6 +6,7 @@ class CheckoutController < ::BaseController
|
||||
layout 'darkswarm'
|
||||
|
||||
include OrderStockCheck
|
||||
include OrderCompletion
|
||||
|
||||
helper 'terms_and_conditions'
|
||||
helper 'checkout'
|
||||
@@ -56,14 +57,6 @@ class CheckoutController < ::BaseController
|
||||
@order.update_order!
|
||||
end
|
||||
|
||||
# Clears the cached order. Required for #current_order to return a new order
|
||||
# to serve as cart. See https://github.com/spree/spree/blob/1-3-stable/core/lib/spree/core/controller_helpers/order.rb#L14
|
||||
# for details.
|
||||
def expire_current_order
|
||||
session[:order_id] = nil
|
||||
@current_order = nil
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_authorization
|
||||
@@ -221,8 +214,8 @@ class CheckoutController < ::BaseController
|
||||
|
||||
def checkout_succeeded
|
||||
Checkout::PostCheckoutActions.new(@order).success(params, spree_current_user)
|
||||
OrderCompletionReset.new(self, @order).call
|
||||
|
||||
order_completion_reset(@order)
|
||||
session[:access_token] = current_order.token
|
||||
flash[:notice] = t(:order_processed_successfully)
|
||||
end
|
||||
|
||||
30
app/controllers/concerns/order_completion.rb
Normal file
30
app/controllers/concerns/order_completion.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module OrderCompletion
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
def order_completion_reset(order)
|
||||
distributor = order.distributor
|
||||
token = order.token
|
||||
|
||||
expire_current_order
|
||||
build_new_order(distributor, token)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Clears the cached order. Required for #current_order to return a new order to serve as cart.
|
||||
# See https://github.com/spree/spree/blob/1-3-stable/core/lib/spree/core/controller_helpers/order.rb#L14
|
||||
def expire_current_order
|
||||
session[:order_id] = nil
|
||||
@current_order = nil
|
||||
end
|
||||
|
||||
# Builds an order setting the token and distributor of the one specified
|
||||
def build_new_order(distributor, token)
|
||||
new_order = current_order(true)
|
||||
new_order.set_distributor!(distributor)
|
||||
new_order.tokenized_permission.token = token
|
||||
new_order.tokenized_permission.save!
|
||||
end
|
||||
end
|
||||
@@ -3,6 +3,7 @@
|
||||
module PaymentGateways
|
||||
class PaypalController < ::BaseController
|
||||
include OrderStockCheck
|
||||
include OrderCompletion
|
||||
|
||||
before_action :enable_embedded_shopfront
|
||||
before_action :destroy_orphaned_paypal_payments, only: :confirm
|
||||
@@ -67,12 +68,6 @@ module PaymentGateways
|
||||
redirect_to main_app.checkout_path
|
||||
end
|
||||
|
||||
# Clears the cached order. Required for #current_order to return a new order to serve as cart.
|
||||
def expire_current_order
|
||||
session[:order_id] = nil
|
||||
@current_order = nil
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def express_checkout_request_details(order)
|
||||
@@ -104,8 +99,8 @@ module PaymentGateways
|
||||
def reset_order_when_complete
|
||||
return unless current_order.complete?
|
||||
|
||||
order_completion_reset(current_order)
|
||||
flash[:notice] = t(:order_processed_successfully)
|
||||
OrderCompletionReset.new(self, current_order).call
|
||||
session[:access_token] = current_order.token
|
||||
end
|
||||
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
# frozen_string_literal: false
|
||||
|
||||
# Resets a completed order by building a new order based on the one specified.
|
||||
# This implements the "continue shopping" feature once an order is completed.
|
||||
class OrderCompletionReset
|
||||
# Constructor
|
||||
#
|
||||
# @param controller [#expire_current_order, #current_order]
|
||||
# @param order [Spree::Order]
|
||||
def initialize(controller, order)
|
||||
@controller = controller
|
||||
@distributor = order.distributor
|
||||
@token = order.token
|
||||
end
|
||||
|
||||
# Expires the order currently in use and builds a new one based on it
|
||||
def call
|
||||
controller.expire_current_order
|
||||
build_new_order
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
attr_reader :controller, :distributor, :token
|
||||
|
||||
# Builds an order setting the token and distributor of the one specified
|
||||
def build_new_order
|
||||
new_order = controller.current_order(true)
|
||||
new_order.set_distributor!(distributor)
|
||||
new_order.tokenized_permission.token = token
|
||||
new_order.tokenized_permission.save!
|
||||
end
|
||||
end
|
||||
@@ -1,66 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
describe OrderCompletionReset do
|
||||
let(:current_token) { double(:current_token) }
|
||||
let(:current_distributor) { double(:distributor) }
|
||||
let(:current_order) do
|
||||
double(
|
||||
:current_order,
|
||||
token: current_token,
|
||||
distributor: current_distributor
|
||||
)
|
||||
end
|
||||
let(:tokenized_permission) { double(:tokenized_permission, save!: true) }
|
||||
let(:new_order) do
|
||||
double(
|
||||
:new_order,
|
||||
set_distributor!: true,
|
||||
tokenized_permission: tokenized_permission,
|
||||
)
|
||||
end
|
||||
let(:controller) do
|
||||
double(
|
||||
:controller,
|
||||
current_order: new_order,
|
||||
expire_current_order: true
|
||||
)
|
||||
end
|
||||
let(:reset_order_service) { described_class.new(controller, current_order) }
|
||||
|
||||
before do
|
||||
allow(new_order)
|
||||
.to receive(:tokenized_permission)
|
||||
.and_return(tokenized_permission)
|
||||
|
||||
allow(tokenized_permission).to receive(:token=)
|
||||
end
|
||||
|
||||
describe '#call' do
|
||||
it 'creates a new order' do
|
||||
reset_order_service.call
|
||||
expect(controller).to have_received(:current_order).once.with(true)
|
||||
end
|
||||
|
||||
it 'sets the new order\'s distributor to the same as the old order' do
|
||||
reset_order_service.call
|
||||
|
||||
expect(new_order)
|
||||
.to have_received(:set_distributor!)
|
||||
.with(current_distributor)
|
||||
end
|
||||
|
||||
it 'sets the token of the tokenized permissions' do
|
||||
reset_order_service.call
|
||||
|
||||
expect(new_order.tokenized_permission)
|
||||
.to have_received(:token=).with(current_token)
|
||||
end
|
||||
|
||||
it 'persists the tokenized permissions' do
|
||||
reset_order_service.call
|
||||
expect(tokenized_permission).to have_received(:save!)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user