appirits/comable

View on GitHub
frontend/app/controllers/comable/orders_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Comable
  class OrdersController < Comable::ApplicationController
    # TODO: Change the method name to load_order_with_params
    before_filter :load_order
    before_filter :ensure_cart_not_empty
    before_filter :ensure_saleable_stocks
    before_filter :ensure_correct_flow, only: :create

    prepend Comable::SigninAction
    prepend Comable::ShipmentAction
    prepend Comable::PaymentAction
    include Comable::PermittedAttributes

    def edit
      if @order.state?(params[:state]) || @order.stated?(params[:state])
        render params[:state]
      else
        redirect_to next_order_path
      end
    end

    def update
      if @order.stated?(params[:state]) ? @order.save : @order.next_state
        redirect_to next_order_path
      else
        render @order.state
      end
    end

    def create
      @order.next_state!

      flash.now[:notice] = Comable.t('orders.success')
      send_order_complete_mail
    rescue ActiveRecord::RecordInvalid, Comable::PaymentError
      flash[:alert] = @order.errors.full_messages.join
      redirect_to next_order_path
    end

    private

    def send_order_complete_mail
      return unless current_store.can_send_mail?
      if Rails.version =~ /^4.2./
        Comable::OrderMailer.complete(@order).deliver_now
      else
        Comable::OrderMailer.complete(@order).deliver
      end
    end

    def ensure_cart_not_empty
      return if current_comable_user.cart.any?
      flash[:alert] = Comable.t('carts.empty')
      redirect_to comable.cart_path
    end

    def ensure_saleable_stocks
      return if current_order.unstocked_items.empty?
      flash[:alert] = Comable.t('errors.messages.out_of_stocks')
      redirect_to comable.cart_path
    end

    def ensure_correct_flow
      return if @order.state?(:confirm)
      redirect_to next_order_path
    end

    def load_order
      @order = current_order
      @order.attributes = order_params if order_params
    end

    def order_params
      return unless params[:order]
      return unless params[:state]
      case params[:state].to_sym
      when :orderer
        order_params_for_orderer
      when :delivery
        order_params_for_delivery
      end
    end

    def order_params_for_orderer
      params.require(:order).permit(
        :email,
        bill_address_attributes: permitted_address_attributes
      )
    end

    def order_params_for_delivery
      params.require(:order).permit(
        ship_address_attributes: permitted_address_attributes
      )
    end
  end
end