Class: Spree::Api::ProductsController

Inherits:
BaseController
  • Object
show all
Defined in:
app/controllers/spree/api/products_controller.rb

Instance Attribute Summary

Attributes inherited from BaseController

#current_api_user

Instance Method Summary collapse

Methods inherited from BaseController

#map_nested_attributes_keys, #permitted_line_item_attributes, #set_jsonp_format

Methods included from ControllerSetup

included

Instance Method Details

#createObject

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"
}


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'app/controllers/spree/api/products_controller.rb', line 57

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

  @product = Product.new(product_params)
  if @product.save
    variants_params.each do |variant_attribute|
      # make sure the product is assigned before the options=
      @product.variants.create({ product: @product }.merge(variant_attribute))
    end

    option_types_params.each do |name|
      option_type = OptionType.where(name: name).first_or_initialize do |option_type|
        option_type.presentation = name
        option_type.save!
      end

      @product.option_types << option_type unless @product.option_types.include?(option_type)
    end

    respond_with(@product, :status => 201, :default_template => :show)
  else
    invalid_resource!(@product)
  end
end

#destroyObject



114
115
116
117
118
119
# File 'app/controllers/spree/api/products_controller.rb', line 114

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

#indexObject



5
6
7
8
9
10
11
12
13
14
15
# File 'app/controllers/spree/api/products_controller.rb', line 5

def index
  if params[:ids]
    @products = product_scope.where(:id => params[:ids].split(","))
  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}"
end

#showObject



17
18
19
20
21
22
# File 'app/controllers/spree/api/products_controller.rb', line 17

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"
end

#updateObject



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'app/controllers/spree/api/products_controller.rb', line 84

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

  if @product.update_attributes(product_params)
    variants_params.each do |variant_attribute|
      # update the variant if the id is present in the payload
      if variant_attribute['id'].present?
        @product.variants.find(variant_attribute['id'].to_i).update_attributes(variant_attribute)
      else
        # make sure the product is assigned before the options=
        @product.variants.create({ product: @product }.merge(variant_attribute))
      end
    end

    option_types_params.each do |name|
      option_type = OptionType.where(name: name).first_or_initialize do |option_type|
        option_type.presentation = name
        option_type.save!
      end

      @product.option_types << option_type unless @product.option_types.include?(option_type)
    end

    respond_with(@product.reload, :status => 200, :default_template => :show)
  else
    invalid_resource!(@product)
  end
end