spree/spree

Spree::Api::V1::ProductsController
A

Complex method in #index

        def index
          if params[:ids]
            @products = product_scope.where(id: params[:ids].split(",").flatten)
          else
            @products = product_scope.ransack(params[:q]).result

Long or complex methods can make code harder to understand. In most circumstances, methods are best as a small chunk of code (the "how") with a clear, understandable name (the "what"). Long methods can also lead to duplication, as it's harder to reuse logic that is tightly coupled to surrounding code.

Refactorings

Read More

There are no issues that match your filters.

module Spree
  module Api
    module V1
      class ProductsController < Spree::Api::BaseController

        def index
          if params[:ids]
            @products = product_scope.where(id: params[:ids].split(",").flatten)
          else
            @products = product_scope.ransack(params[:q]).result
          end

          @products = @products.distinct.page(params[:page]).per(params[:per_page])
          expires_in 15.minutes, public: true
          headers['Surrogate-Control'] = "max-age=#{15.minutes}"
          respond_with(@products)
        end

        def show
          @product = find_product(params[:id])
          expires_in 15.minutes, public: true
          headers['Surrogate-Control'] = "max-age=#{15.minutes}"
          headers['Surrogate-Key'] = "product_id=1"
          respond_with(@product)
        end

        # Takes besides the products attributes either an array of variants or
        # an array of option types.
        #
        # By submitting an array of variants the option types will be created
        # using the *name* key in options hash. e.g
        #
        #   product: {
        #     ...
        #     variants: {
        #       price: 19.99,
        #       sku: "hey_you",
        #       options: [
        #         { name: "size", value: "small" },
        #         { name: "color", value: "black" }
        #       ]
        #     }
        #   }
        #
        # Or just pass in the option types hash:
        #
        #   product: {
        #     ...
        #     option_types: ['size', 'color']
        #   }
        #
        # By passing the shipping category name you can fetch or create that
        # shipping category on the fly. e.g.
        #
        #   product: {
        #     ...
        #     shipping_category: "Free Shipping Items"
        #   }
        #
        def new
        end

        def create
          authorize! :create, Product
          params[:product][:available_on] ||= Time.current
          set_up_shipping_category

          options = { variants_attrs: variants_params, options_attrs: option_types_params }
          @product = Core::Importer::Product.new(nil, product_params, options).create

          if @product.persisted?
            respond_with(@product, status: 201, default_template: :show)
          else
            invalid_resource!(@product)
          end
        end

        def update
          @product = find_product(params[:id])
          authorize! :update, @product

          options = { variants_attrs: variants_params, options_attrs: option_types_params }
          @product = Core::Importer::Product.new(@product, product_params, options).update

          if @product.errors.empty?
            respond_with(@product.reload, status: 200, default_template: :show)
          else
            invalid_resource!(@product)
          end
        end

        def destroy
          @product = find_product(params[:id])
          authorize! :destroy, @product
          @product.destroy
          respond_with(@product, status: 204)
        end

        private
          def product_params
            params.require(:product).permit(permitted_product_attributes)
          end

          def variants_params
            variants_key = if params[:product].has_key? :variants
              :variants
            else
              :variants_attributes
            end

            params.require(:product).permit(
              variants_key => [permitted_variant_attributes, :id],
            ).delete(variants_key) || []
          end

          def option_types_params
            params[:product].fetch(:option_types, [])
          end

          def set_up_shipping_category
            if shipping_category = params[:product].delete(:shipping_category)
              id = ShippingCategory.find_or_create_by(name: shipping_category).id
              params[:product][:shipping_category_id] = id
            end
          end
      end
    end
  end
end