From 13a7c19a06e7316c2bdaf6956c878cca3ffba189 Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 4 Jul 2023 19:46:45 +0100 Subject: [PATCH] Extract checkout step(s) validation to a service --- app/controllers/split_checkout_controller.rb | 33 +++------------ app/services/checkout/validation.rb | 42 ++++++++++++++++++++ 2 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 app/services/checkout/validation.rb diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index be4890b544..d631e44ee0 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -68,7 +68,7 @@ class SplitCheckoutController < ::BaseController def confirm_order return unless summary_step? && @order.confirmation? - return unless validate_summary! && @order.errors.empty? + return unless validate_current_step @order.customer.touch :terms_and_conditions_accepted_at @@ -102,9 +102,11 @@ class SplitCheckoutController < ::BaseController @order.update(order_params) @order.update_totals_and_states - validate_current_step! + validate_current_step + end - @order.errors.empty? + def validate_current_step + Checkout::Validation.new(@order, params).call && @order.errors.empty? end def use_shipping_address_from_distributor @@ -136,31 +138,6 @@ class SplitCheckoutController < ::BaseController OrderWorkflow.new(@order).advance_checkout(raw_params.slice(:shipping_method_id)) end - def validate_current_step! - step = ([params[:step]] & ["details", "payment", "summary"]).first - send("validate_#{step}!") - end - - def validate_details! - return true if params[:shipping_method_id].present? - - @order.errors.add :shipping_method, I18n.t('split_checkout.errors.select_a_shipping_method') - end - - def validate_payment! - return true if params.dig(:order, :payments_attributes, 0, :payment_method_id).present? - return true if @order.zero_priced_order? - - @order.errors.add :payment_method, I18n.t('split_checkout.errors.select_a_payment_method') - end - - def validate_summary! - return true if params[:accept_terms] - return true unless TermsOfService.required?(@order.distributor) - - @order.errors.add(:terms_and_conditions, t("split_checkout.errors.terms_not_accepted")) - end - def order_params @order_params ||= Checkout::Params.new(@order, params, spree_current_user).call end diff --git a/app/services/checkout/validation.rb b/app/services/checkout/validation.rb new file mode 100644 index 0000000000..6421860818 --- /dev/null +++ b/app/services/checkout/validation.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Checkout + class Validation + def initialize(order, params) + @params = params + @order = order + end + + def call + __send__ "validate_#{current_step}" + end + + private + + attr_reader :order, :params + + def current_step + ([params[:step]] & ["details", "payment", "summary"]).first + end + + def validate_details + return true if params[:shipping_method_id].present? + + order.errors.add :shipping_method, I18n.t('split_checkout.errors.select_a_shipping_method') + end + + def validate_payment + return true if params.dig(:order, :payments_attributes, 0, :payment_method_id).present? + return true if order.zero_priced_order? + + order.errors.add :payment_method, I18n.t('split_checkout.errors.select_a_payment_method') + end + + def validate_summary + return true if params[:accept_terms] + return true unless TermsOfService.required?(order.distributor) + + order.errors.add(:terms_and_conditions, I18n.t("split_checkout.errors.terms_not_accepted")) + end + end +end