frontend/app/controllers/comable/orders_controller.rb
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