frontend/app/controllers/comable/carts_controller.rb
module Comable
class CartsController < Comable::ApplicationController
before_filter :set_cart_item, only: [:add, :update, :destroy]
before_filter :ensure_found_cart_item, only: [:add, :update, :destroy]
after_filter :reset_shipments, only: [:add, :update, :destroy], if: -> { current_order.shipments.any? }
def add
if current_comable_user.add_cart_item(@cart_item, cart_item_options)
redirect_to comable.cart_path, notice: Comable.t('carts.added')
else
flash.now[:alert] = Comable.t('carts.invalid')
render :show
end
end
def update
if current_comable_user.reset_cart_item(@cart_item, cart_item_options)
redirect_to comable.cart_path, notice: Comable.t('carts.updated')
else
flash.now[:alert] = Comable.t('carts.invalid')
render :show
end
end
def destroy
if current_comable_user.reset_cart_item(@cart_item)
redirect_to comable.cart_path, notice: Comable.t('carts.updated')
else
flash.now[:alert] = Comable.t('carts.invalid')
render :show
end
end
def checkout
current_order.next_state if current_order.state?(:cart)
redirect_to comable.next_order_path(state: :confirm)
end
private
def set_cart_item
@cart_item = find_cart_item
end
def ensure_found_cart_item
return if @cart_item
redirect_to :back, alert: Comable.t('errors.messages.products_not_found')
end
def find_cart_item
cart_item = Comable::Stock.find_by(id: params[:stock_id])
cart_item ||= Comable::Variant.find_by(id: params[:variant_id])
cart_item ||= Comable::Product.find_by(id: params[:product_id])
return unless cart_item
return if cart_item.is_a?(Comable::Product) && cart_item.sku?
cart_item
end
def cart_item_options
options = {}
options.update(quantity: params[:quantity].to_i) if params[:quantity]
options
end
def reset_shipments
current_order.reset_shipments
current_order.update!(state: 'cart')
end
end
end