appirits/comable

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

Summary

Maintainability
A
55 mins
Test Coverage
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