spree_api 2.2.14 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -1
  3. data/app/controllers/spree/api/base_controller.rb +8 -12
  4. data/app/controllers/spree/api/checkouts_controller.rb +4 -58
  5. data/app/controllers/spree/api/inventory_units_controller.rb +0 -1
  6. data/app/controllers/spree/api/line_items_controller.rb +3 -3
  7. data/app/controllers/spree/api/option_types_controller.rb +2 -2
  8. data/app/controllers/spree/api/orders_controller.rb +11 -36
  9. data/app/controllers/spree/api/payments_controller.rb +2 -2
  10. data/app/controllers/spree/api/products_controller.rb +6 -36
  11. data/app/controllers/spree/api/shipments_controller.rb +6 -25
  12. data/app/controllers/spree/api/taxonomies_controller.rb +8 -6
  13. data/app/controllers/spree/api/taxons_controller.rb +1 -1
  14. data/app/controllers/spree/api/variants_controller.rb +16 -19
  15. data/app/helpers/spree/api/api_helpers.rb +6 -1
  16. data/app/views/spree/api/errors/invalid_resource.v1.rabl +1 -1
  17. data/app/views/spree/api/orders/could_not_transition.v1.rabl +1 -1
  18. data/app/views/spree/api/orders/order.v1.rabl +1 -1
  19. data/app/views/spree/api/orders/show.v1.rabl +10 -4
  20. data/app/views/spree/api/shipments/small.v1.rabl +33 -0
  21. data/app/views/spree/api/taxonomies/show.v1.rabl +2 -2
  22. data/app/views/spree/api/users/show.v1.rabl +7 -0
  23. data/config/routes.rb +19 -28
  24. data/lib/spree/api/engine.rb +3 -3
  25. data/lib/spree/api/responders/rabl_template.rb +1 -1
  26. data/lib/spree/api/testing_support/helpers.rb +8 -3
  27. data/spec/controllers/spree/api/base_controller_spec.rb +15 -12
  28. data/spec/controllers/spree/api/checkouts_controller_spec.rb +78 -90
  29. data/spec/controllers/spree/api/line_items_controller_spec.rb +13 -9
  30. data/spec/controllers/spree/api/orders_controller_spec.rb +53 -31
  31. data/spec/controllers/spree/api/payments_controller_spec.rb +9 -8
  32. data/spec/controllers/spree/api/products_controller_spec.rb +1 -1
  33. data/spec/controllers/spree/api/promotion_application_spec.rb +5 -5
  34. data/spec/controllers/spree/api/shipments_controller_spec.rb +1 -11
  35. data/spec/controllers/spree/api/taxonomies_controller_spec.rb +2 -2
  36. data/spec/controllers/spree/api/users_controller_spec.rb +23 -23
  37. data/spec/controllers/spree/api/zones_controller_spec.rb +22 -0
  38. data/spec/requests/rabl_cache_spec.rb +2 -2
  39. data/spec/spec_helper.rb +0 -1
  40. data/spec/support/controller_hacks.rb +1 -1
  41. data/spree_api.gemspec +2 -2
  42. metadata +12 -15
  43. data/app/views/spree/api/orders/delivery.v1.rabl +0 -3
  44. data/lib/spree/api/version.rb +0 -5
  45. data/spec/requests/ransackable_attributes_spec.rb +0 -79
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3bd604d7be8b5ce2ad7e836ea4b0780fb341ba8f
4
- data.tar.gz: ae0288be52192b331e5c5fdb5d3669b6b4d52b9b
3
+ metadata.gz: f9382ec4d33c38fa47416c8870483987c4091d5b
4
+ data.tar.gz: 1ebe36b2b47efa8dea70bb402595b9ac4cee46a0
5
5
  SHA512:
6
- metadata.gz: b7f5a27d73d130a2b44e2ba927dfa79b110ef821404e4494bfd9ce1703ce286dc605a1853552e5e906f2aca9f1fe2fa20531cbef4148722122a26182550ce9fd
7
- data.tar.gz: cb40f75ca437a68f9f4d1d51d9f29910c903668fe16fde77f4ea1f46011140b1d40dec24072cbe04611f8edd8d707447c05d7bb08ed8f5b84cf281f687eddd52
6
+ metadata.gz: d4f4adc24185720919817b204e649d5d295f86ddfd9368becaf875780c868676dfaa1c9d8a6a70714d906679922829a32cf80ea2fcf43ec32509fecd0b4fae00
7
+ data.tar.gz: d8265a70d2d7dd78ddaf0aa7c006e32d3ee2d393b5b6beb4f08cec387c291c45fcc49a44102da52c5cc601598a061b76e39ada2e6f0cec052b62e1717134f3b7
data/CHANGELOG.md CHANGED
@@ -1 +1,43 @@
1
- ## Spree 2.2.5 (unreleased) ##
1
+ ## Spree 2.3.0 (unreleased) ##
2
+
3
+ * Support existing credit card feature on checkout.
4
+
5
+ Checkouts_controller#update now uses the same Order::Checkout#update_from_params
6
+ from spree frontend which help us to remove a lot of duplicated logic. As a
7
+ result of that `payment_source` params must be sent now outsite the `order` key.
8
+
9
+ Before you'd send a request like this:
10
+
11
+ ```ruby
12
+ api_put :update, :id => order.to_param, :order_token => order.guest_token,
13
+ :order => {
14
+ :payments_attributes => [{ :payment_method_id => @payment_method.id.to_s }],
15
+ :payment_source => { @payment_method.id.to_s => { name: "Spree" } }
16
+ }
17
+ ```
18
+
19
+ Now it should look like this:
20
+
21
+ ```ruby
22
+ api_put :update, :id => order.to_param, :order_token => order.guest_token,
23
+ :order => {
24
+ :payments_attributes => [{ :payment_method_id => @payment_method.id.to_s }]
25
+ },
26
+ :payment_source => {
27
+ @payment_method.id.to_s => { name: "Spree" }
28
+ }
29
+ ```
30
+
31
+ Josh Hepworth and Washington
32
+
33
+ * api/orders/show now display credit cards as source under payment
34
+
35
+ Washington Luiz
36
+
37
+ * refactor the api to use a general importer in core gem.
38
+
39
+ Peter Berkenbosch
40
+
41
+ * Shipment manifests viewed within the context of an order no longer return variant info. The line items for the order already contains this information. #4498
42
+
43
+ * Ryan Bigg
@@ -5,6 +5,7 @@ module Spree
5
5
  class BaseController < ActionController::Base
6
6
  include Spree::Api::ControllerSetup
7
7
  include Spree::Core::ControllerHelpers::SSL
8
+ include Spree::Core::ControllerHelpers::Store
8
9
  include Spree::Core::ControllerHelpers::StrongParameters
9
10
 
10
11
  attr_accessor :current_api_user
@@ -42,7 +43,7 @@ module Spree
42
43
  # users should be able to set price when importing orders via api
43
44
  def permitted_line_item_attributes
44
45
  if current_api_user.has_spree_role?("admin")
45
- super + [:price, :variant_id, :sku]
46
+ super << [:price, :variant_id, :sku]
46
47
  else
47
48
  super
48
49
  end
@@ -61,7 +62,7 @@ module Spree
61
62
  end
62
63
 
63
64
  def load_user
64
- @current_api_user = Spree.user_class.find_by(spree_api_key: api_key.to_s)
65
+ @current_api_user = (try_spree_current_user || Spree.user_class.find_by(spree_api_key: api_key.to_s))
65
66
  end
66
67
 
67
68
  def authenticate_user
@@ -129,27 +130,22 @@ module Spree
129
130
  end
130
131
 
131
132
  def product_scope
133
+ variants_associations = [{ option_values: :option_type }, :default_price, :prices, :images]
132
134
  if current_api_user.has_spree_role?("admin")
133
- scope = Product.with_deleted.accessible_by(current_ability, :read).includes(*product_includes)
135
+ scope = Product.with_deleted.accessible_by(current_ability, :read)
136
+ .includes(:properties, :option_types, variants: variants_associations, master: variants_associations)
134
137
 
135
138
  unless params[:show_deleted]
136
139
  scope = scope.not_deleted
137
140
  end
138
141
  else
139
- scope = Product.accessible_by(current_ability, :read).active.includes(*product_includes)
142
+ scope = Product.accessible_by(current_ability, :read).active
143
+ .includes(:properties, :option_types, variants: variants_associations, master: variants_associations)
140
144
  end
141
145
 
142
146
  scope
143
147
  end
144
148
 
145
- def variants_associations
146
- [{ option_values: :option_type }, :default_price, :images]
147
- end
148
-
149
- def product_includes
150
- [ :option_types, variants: variants_associations, master: variants_associations ]
151
- end
152
-
153
149
  def order_id
154
150
  params[:order_id] || params[:checkout_id] || params[:order_number]
155
151
  end
@@ -8,12 +8,6 @@ module Spree
8
8
  # This before_filter comes from Spree::Core::ControllerHelpers::Order
9
9
  skip_before_filter :set_current_order
10
10
 
11
- def create
12
- authorize! :create, Order
13
- @order = Spree::Core::Importer::Order.import(current_api_user, nested_params)
14
- respond_with(@order, default_template: 'spree/api/orders/show', status: 201)
15
- end
16
-
17
11
  def next
18
12
  load_order(true)
19
13
  authorize! :update, @order, order_token
@@ -30,20 +24,15 @@ module Spree
30
24
  respond_with(@order, default_template: 'spree/api/orders/show', status: 200)
31
25
  end
32
26
 
33
- def show
34
- redirect_to(api_order_path(params[:id]), status: 301)
35
- end
36
-
37
27
  def update
38
28
  load_order(true)
39
29
  authorize! :update, @order, order_token
40
- order_params = object_params
41
- line_items = order_params.delete('line_items_attributes')
42
- if @order.update_attributes(order_params)
43
- @order.update_line_items(line_items)
30
+
31
+ if @order.update_from_params(params, permitted_checkout_attributes, request.headers.env)
44
32
  if current_api_user.has_spree_role?('admin') && user_id.present?
45
33
  @order.associate_user!(Spree.user_class.find(user_id))
46
34
  end
35
+
47
36
  return if after_update_attributes
48
37
  state_callback(:after) if @order.next
49
38
  respond_with(@order, default_template: 'spree/api/orders/show')
@@ -53,41 +42,10 @@ module Spree
53
42
  end
54
43
 
55
44
  private
56
- def object_params
57
- modify_payment_attributes params[:order] || {}
58
-
59
- protected_params = if params[:order]
60
- params.require(:order).permit(permitted_checkout_attributes)
61
- else
62
- {}
63
- end
64
-
65
- map_nested_attributes_keys Order, protected_params
66
- end
67
-
68
45
  def user_id
69
46
  params[:order][:user_id] if params[:order]
70
47
  end
71
48
 
72
- # For payment step, filter order parameters to produce the expected
73
- # nested attributes for a single payment and its source, discarding
74
- # attributes for payment methods other than the one selected
75
- #
76
- # respond_to check is necessary due to issue described in #2910
77
- def modify_payment_attributes(object_params)
78
- if @order.has_checkout_step?('payment') && @order.payment?
79
- if object_params[:payments_attributes].is_a?(Hash)
80
- object_params[:payments_attributes] = [object_params[:payments_attributes]]
81
- end
82
- if object_params[:payment_source].present? && source_params = object_params.delete(:payment_source)[object_params[:payments_attributes].first[:payment_method_id].to_s]
83
- object_params[:payments_attributes].first[:source_attributes] = source_params
84
- end
85
- if object_params[:payments_attributes]
86
- object_params[:payments_attributes].first[:amount] = @order.total.to_s
87
- end
88
- end
89
- end
90
-
91
49
  def nested_params
92
50
  map_nested_attributes_keys Order, params[:order] || {}
93
51
  end
@@ -105,10 +63,6 @@ module Spree
105
63
  state_callback(:before)
106
64
  end
107
65
 
108
- def ip_address
109
- ''
110
- end
111
-
112
66
  def raise_insufficient_quantity
113
67
  respond_with(@order, default_template: 'spree/api/orders/insufficient_quantity')
114
68
  end
@@ -118,16 +72,8 @@ module Spree
118
72
  send(method_name) if respond_to?(method_name, true)
119
73
  end
120
74
 
121
- def next!(options={})
122
- if @order.valid? && @order.next
123
- render 'spree/api/orders/show', status: options[:status] || 200
124
- else
125
- render 'spree/api/orders/could_not_transition', status: 422
126
- end
127
- end
128
-
129
75
  def after_update_attributes
130
- if object_params && object_params[:coupon_code].present?
76
+ if nested_params && nested_params[:coupon_code].present?
131
77
  handler = PromotionHandler::Coupon.new(@order).apply
132
78
 
133
79
  if handler.error.present?
@@ -5,7 +5,6 @@ module Spree
5
5
 
6
6
  def show
7
7
  @inventory_unit = inventory_unit
8
- respond_with(@inventory_unit)
9
8
  end
10
9
 
11
10
  def update
@@ -1,11 +1,12 @@
1
1
  module Spree
2
2
  module Api
3
3
  class LineItemsController < Spree::Api::BaseController
4
-
5
4
  def create
6
5
  variant = Spree::Variant.find(params[:line_item][:variant_id])
7
6
  @line_item = order.contents.add(variant, params[:line_item][:quantity] || 1)
7
+
8
8
  if @line_item.errors.empty?
9
+ @order.ensure_updated_shipments
9
10
  respond_with(@line_item, status: 201, default_template: :show)
10
11
  else
11
12
  invalid_resource!(@line_item)
@@ -15,7 +16,6 @@ module Spree
15
16
  def update
16
17
  @line_item = find_line_item
17
18
  if @order.contents.update_cart(line_items_attributes)
18
- @order.ensure_updated_shipments
19
19
  @line_item.reload
20
20
  respond_with(@line_item, default_template: :show)
21
21
  else
@@ -27,11 +27,11 @@ module Spree
27
27
  @line_item = find_line_item
28
28
  variant = Spree::Variant.find(@line_item.variant_id)
29
29
  @order.contents.remove(variant, @line_item.quantity)
30
+ @order.ensure_updated_shipments
30
31
  respond_with(@line_item, status: 204)
31
32
  end
32
33
 
33
34
  private
34
-
35
35
  def order
36
36
  @order ||= Spree::Order.includes(:line_items).find_by!(number: order_id)
37
37
  authorize! :update, @order, order_token
@@ -3,9 +3,9 @@ module Spree
3
3
  class OptionTypesController < Spree::Api::BaseController
4
4
  def index
5
5
  if params[:ids]
6
- @option_types = Spree::OptionType.includes(:option_values).accessible_by(current_ability, :read).where(id: params[:ids].split(','))
6
+ @option_types = Spree::OptionType.accessible_by(current_ability, :read).where(:id => params[:ids].split(','))
7
7
  else
8
- @option_types = Spree::OptionType.includes(:option_values).accessible_by(current_ability, :read).load.ransack(params[:q]).result
8
+ @option_types = Spree::OptionType.accessible_by(current_ability, :read).load.ransack(params[:q]).result
9
9
  end
10
10
  respond_with(@option_types)
11
11
  end
@@ -1,11 +1,11 @@
1
1
  module Spree
2
2
  module Api
3
3
  class OrdersController < Spree::Api::BaseController
4
- wrap_parameters false
5
-
6
4
  skip_before_filter :check_for_user_or_api_key, only: :apply_coupon_code
7
5
  skip_before_filter :authenticate_user, only: :apply_coupon_code
8
6
 
7
+ before_filter :find_order, except: [:create, :mine, :index, :update]
8
+
9
9
  # Dynamically defines our stores checkout steps to ensure we check authorization on each step.
10
10
  Order.checkout_steps.keys.each do |step|
11
11
  define_method step do
@@ -15,10 +15,9 @@ module Spree
15
15
  end
16
16
 
17
17
  def cancel
18
- find_order
19
18
  authorize! :update, @order, params[:token]
20
19
  @order.cancel!
21
- respond_with(@order, :default_template => :show)
20
+ render :show
22
21
  end
23
22
 
24
23
  def create
@@ -28,10 +27,8 @@ module Spree
28
27
  end
29
28
 
30
29
  def empty
31
- find_order
32
30
  authorize! :update, @order, order_token
33
31
  @order.empty!
34
- @order.update!
35
32
  render text: nil, status: 200
36
33
  end
37
34
 
@@ -42,7 +39,6 @@ module Spree
42
39
  end
43
40
 
44
41
  def show
45
- find_order
46
42
  authorize! :show, @order, order_token
47
43
  method = "before_#{@order.state}"
48
44
  send(method) if respond_to?(method, true)
@@ -52,16 +48,12 @@ module Spree
52
48
  def update
53
49
  find_order(true)
54
50
  authorize! :update, @order, order_token
55
- # Parsing line items through as an update_attributes call in the API will result in
56
- # many line items for the same variant_id being created. We must be smarter about this,
57
- # hence the use of the update_line_items method, defined within order_decorator.rb.
58
- order_params.delete("line_items_attributes")
59
- if @order.update_attributes(order_params)
60
-
61
- deal_with_line_items if params[:order][:line_items]
62
51
 
63
- @order.line_items.reload
64
- @order.update!
52
+ if @order.contents.update_cart(order_params)
53
+ user_id = params[:order][:user_id]
54
+ if current_api_user.has_spree_role?('admin') && user_id
55
+ @order.associate_user!(Spree.user_class.find(user_id))
56
+ end
65
57
  respond_with(@order, default_template: :show)
66
58
  else
67
59
  invalid_resource!(@order)
@@ -70,7 +62,7 @@ module Spree
70
62
 
71
63
  def mine
72
64
  if current_api_user.persisted?
73
- @orders = current_api_user.orders.reverse_chronological.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
65
+ @orders = current_api_user.orders.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
74
66
  else
75
67
  render "spree/api/errors/unauthorized", status: :unauthorized
76
68
  end
@@ -86,15 +78,6 @@ module Spree
86
78
  end
87
79
 
88
80
  private
89
- def deal_with_line_items
90
- line_item_attributes = params[:order][:line_items]
91
- line_item_attributes.each_key do |key|
92
- # need to call .to_hash to make sure Rails 4's strong parameters don't bite
93
- line_item_attributes[key] = line_item_attributes[key].slice(*permitted_line_item_attributes).to_hash
94
- end
95
- @order.update_line_items(line_item_attributes)
96
- end
97
-
98
81
  def order_params
99
82
  if params[:order]
100
83
  params[:order][:payments_attributes] = params[:order][:payments] if params[:order][:payments]
@@ -111,7 +94,7 @@ module Spree
111
94
 
112
95
  def permitted_order_attributes
113
96
  if current_api_user.has_spree_role? "admin"
114
- super + admin_order_attributes
97
+ super << admin_order_attributes
115
98
  else
116
99
  super
117
100
  end
@@ -119,7 +102,7 @@ module Spree
119
102
 
120
103
  def permitted_shipment_attributes
121
104
  if current_api_user.has_spree_role? "admin"
122
- super + admin_shipment_attributes
105
+ super << admin_shipment_attributes
123
106
  else
124
107
  super
125
108
  end
@@ -133,14 +116,6 @@ module Spree
133
116
  [:import, :number, :completed_at, :locked_at, :channel]
134
117
  end
135
118
 
136
- def next!(options={})
137
- if @order.valid? && @order.next
138
- render :show, status: options[:status] || 200
139
- else
140
- render :could_not_transition, status: 422
141
- end
142
- end
143
-
144
119
  def find_order(lock = false)
145
120
  @order = Spree::Order.lock(lock).find_by!(number: params[:id])
146
121
  end
@@ -11,7 +11,7 @@ module Spree
11
11
  end
12
12
 
13
13
  def new
14
- @payment_methods = Spree::PaymentMethod.available
14
+ @payment_methods = Spree::PaymentMethod.where(environment: Rails.env)
15
15
  respond_with(@payment_method)
16
16
  end
17
17
 
@@ -67,7 +67,7 @@ module Spree
67
67
 
68
68
  def find_order
69
69
  @order = Spree::Order.find_by(number: order_id)
70
- authorize! :read, @order, order_token
70
+ authorize! :read, @order
71
71
  end
72
72
 
73
73
  def find_payment
@@ -12,7 +12,6 @@ module Spree
12
12
  @products = @products.distinct.page(params[:page]).per(params[:per_page])
13
13
  expires_in 15.minutes, :public => true
14
14
  headers['Surrogate-Control'] = "max-age=#{15.minutes}"
15
- respond_with(@products)
16
15
  end
17
16
 
18
17
  def show
@@ -20,7 +19,6 @@ module Spree
20
19
  expires_in 15.minutes, :public => true
21
20
  headers['Surrogate-Control'] = "max-age=#{15.minutes}"
22
21
  headers['Surrogate-Key'] = "product_id=1"
23
- respond_with(@product)
24
22
  end
25
23
 
26
24
  # Takes besides the products attributes either an array of variants or
@@ -61,22 +59,10 @@ module Spree
61
59
  params[:product][:available_on] ||= Time.now
62
60
  set_up_shipping_category
63
61
 
64
- @product = Product.new(product_params)
65
- if @product.save
66
- variants_params.each do |variant_attribute|
67
- # make sure the product is assigned before the options=
68
- @product.variants.create({ product: @product }.merge(variant_attribute))
69
- end
70
-
71
- option_types_params.each do |name|
72
- option_type = OptionType.where(name: name).first_or_initialize do |option_type|
73
- option_type.presentation = name
74
- option_type.save!
75
- end
76
-
77
- @product.option_types << option_type unless @product.option_types.include?(option_type)
78
- end
62
+ options = { variants_attrs: variants_params, options_attrs: option_types_params }
63
+ @product = Core::Importer::Product.new(nil, product_params, options).create
79
64
 
65
+ if @product.persisted?
80
66
  respond_with(@product, :status => 201, :default_template => :show)
81
67
  else
82
68
  invalid_resource!(@product)
@@ -87,26 +73,10 @@ module Spree
87
73
  @product = find_product(params[:id])
88
74
  authorize! :update, @product
89
75
 
90
- if @product.update_attributes(product_params)
91
- variants_params.each do |variant_attribute|
92
- # update the variant if the id is present in the payload
93
- if variant_attribute['id'].present?
94
- @product.variants.find(variant_attribute['id'].to_i).update_attributes(variant_attribute)
95
- else
96
- # make sure the product is assigned before the options=
97
- @product.variants.create({ product: @product }.merge(variant_attribute))
98
- end
99
- end
100
-
101
- option_types_params.each do |name|
102
- option_type = OptionType.where(name: name).first_or_initialize do |option_type|
103
- option_type.presentation = name
104
- option_type.save!
105
- end
106
-
107
- @product.option_types << option_type unless @product.option_types.include?(option_type)
108
- end
76
+ options = { variants_attrs: variants_params, options_attrs: option_types_params }
77
+ @product = Core::Importer::Product.new(@product, product_params, options).update
109
78
 
79
+ if @product.errors.empty?
110
80
  respond_with(@product.reload, :status => 200, :default_template => :show)
111
81
  else
112
82
  invalid_resource!(@product)
@@ -2,34 +2,27 @@ module Spree
2
2
  module Api
3
3
  class ShipmentsController < Spree::Api::BaseController
4
4
 
5
- before_filter :find_order
6
5
  before_filter :find_and_update_shipment, only: [:ship, :ready, :add, :remove]
7
6
 
8
7
  def create
9
- # TODO Can remove conditional here once deprecated #find_order is removed.
10
- unless @order.present?
11
- @order = Spree::Order.find_by!(number: params[:shipment][:order_id])
12
- authorize! :read, @order
13
- end
8
+ @order = Spree::Order.find_by!(number: params[:shipment][:order_id])
9
+ authorize! :read, @order
14
10
  authorize! :create, Shipment
15
11
  variant = Spree::Variant.find(params[:variant_id])
16
12
  quantity = params[:quantity].to_i
17
13
  @shipment = @order.shipments.create(stock_location_id: params[:stock_location_id])
18
14
  @order.contents.add(variant, quantity, nil, @shipment)
19
15
 
16
+ @shipment.refresh_rates
20
17
  @shipment.save!
21
18
 
22
19
  respond_with(@shipment.reload, default_template: :show)
23
20
  end
24
21
 
25
22
  def update
26
- if @order.present?
27
- @shipment = @order.shipments.accessible_by(current_ability, :update).find_by!(number: params[:id])
28
- else
29
- @shipment = Spree::Shipment.accessible_by(current_ability, :update).readonly(false).find_by!(number: params[:id])
30
- end
31
-
23
+ @shipment = Spree::Shipment.accessible_by(current_ability, :update).readonly(false).find_by!(number: params[:id])
32
24
  @shipment.update_attributes_and_order(shipment_params)
25
+
33
26
  respond_with(@shipment.reload, default_template: :show)
34
27
  end
35
28
 
@@ -71,20 +64,8 @@ module Spree
71
64
 
72
65
  private
73
66
 
74
- def find_order
75
- if params[:order_id].present?
76
- ActiveSupport::Deprecation.warn "Spree::Api::ShipmentsController#find_order is deprecated and will be removed from Spree 2.3.x, access shipments directly without being nested to orders route instead.", caller
77
- @order = Spree::Order.find_by!(number: params[:order_id])
78
- authorize! :read, @order
79
- end
80
- end
81
-
82
67
  def find_and_update_shipment
83
- if @order.present?
84
- @shipment = @order.shipments.accessible_by(current_ability, :update).find_by!(number: params[:id])
85
- else
86
- @shipment = Spree::Shipment.accessible_by(current_ability, :update).readonly(false).find_by!(number: params[:id])
87
- end
68
+ @shipment = Spree::Shipment.accessible_by(current_ability, :update).readonly(false).find_by!(number: params[:id])
88
69
  @shipment.update_attributes(shipment_params)
89
70
  @shipment.reload
90
71
  end
@@ -3,15 +3,11 @@ module Spree
3
3
  class TaxonomiesController < Spree::Api::BaseController
4
4
 
5
5
  def index
6
- @taxonomies = Taxonomy.accessible_by(current_ability, :read).order('name').includes(:root => :children).
7
- ransack(params[:q]).result.
8
- page(params[:page]).per(params[:per_page])
9
- respond_with(@taxonomies)
6
+ respond_with(taxonomies)
10
7
  end
11
8
 
12
9
  def show
13
- @taxonomy = Taxonomy.accessible_by(current_ability, :read).find(params[:id])
14
- respond_with(@taxonomy)
10
+ respond_with(taxonomy)
15
11
  end
16
12
 
17
13
  # Because JSTree wants parameters in a *slightly* different format
@@ -46,6 +42,12 @@ module Spree
46
42
 
47
43
  private
48
44
 
45
+ def taxonomies
46
+ @taxonomies = Taxonomy.accessible_by(current_ability, :read).order('name').includes(:root => :children).
47
+ ransack(params[:q]).result.
48
+ page(params[:page]).per(params[:per_page])
49
+ end
50
+
49
51
  def taxonomy
50
52
  @taxonomy ||= Taxonomy.accessible_by(current_ability, :read).find(params[:id])
51
53
  end
@@ -65,7 +65,7 @@ module Spree
65
65
  # Products#index does not do the sorting.
66
66
  taxon = Spree::Taxon.find(params[:id])
67
67
  @products = taxon.products.ransack(params[:q]).result
68
- @products = @products.page(params[:page]).per(params[:per_page] || 500)
68
+ @products = @products.page(params[:page]).per(500 || params[:per_page])
69
69
  render "spree/api/products/index"
70
70
  end
71
71
 
@@ -1,7 +1,6 @@
1
1
  module Spree
2
2
  module Api
3
3
  class VariantsController < Spree::Api::BaseController
4
-
5
4
  before_filter :product
6
5
 
7
6
  def create
@@ -20,9 +19,13 @@ module Spree
20
19
  respond_with(@variant, status: 204)
21
20
  end
22
21
 
22
+ # The lazyloaded associations here are pretty much attached to which nodes
23
+ # we render on the view so we better update it any time a node is included
24
+ # or removed from the views.
23
25
  def index
24
- @variants = scope.includes(:option_values).ransack(params[:q]).result.
25
- page(params[:page]).per(params[:per_page])
26
+ @variants = scope.includes({ option_values: :option_type }, :product, :default_price, :images, { stock_items: :stock_location })
27
+ .ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
28
+
26
29
  respond_with(@variants)
27
30
  end
28
31
 
@@ -30,7 +33,8 @@ module Spree
30
33
  end
31
34
 
32
35
  def show
33
- @variant = scope.includes(:option_values).find(params[:id])
36
+ @variant = scope.includes({ option_values: :option_type }, :option_values, :product, :default_price, :images, { stock_items: :stock_location })
37
+ .find(params[:id])
34
38
  respond_with(@variant)
35
39
  end
36
40
 
@@ -44,29 +48,22 @@ module Spree
44
48
  end
45
49
 
46
50
  private
47
-
48
51
  def product
49
52
  @product ||= Spree::Product.accessible_by(current_ability, :read).friendly.find(params[:product_id]) if params[:product_id]
50
53
  end
51
54
 
52
55
  def scope
53
56
  if @product
54
- unless current_api_user.has_spree_role?('admin') || params[:show_deleted]
55
- variants = @product.variants_including_master.accessible_by(current_ability, :read)
56
- else
57
- variants = @product.variants_including_master.with_deleted.accessible_by(current_ability, :read)
58
- end
57
+ variants = @product.variants_including_master
59
58
  else
60
- variants = Variant.accessible_by(current_ability, :read)
61
- if current_api_user.has_spree_role?('admin')
62
- unless params[:show_deleted]
63
- variants = Variant.accessible_by(current_ability, :read).active
64
- end
65
- else
66
- variants = variants.active
67
- end
59
+ variants = Variant
68
60
  end
69
- variants
61
+
62
+ if current_ability.can?(:manage, Variant) && params[:show_deleted]
63
+ variants = variants.with_deleted
64
+ end
65
+
66
+ variants.accessible_by(current_ability, :read)
70
67
  end
71
68
 
72
69
  def variant_params