spree_api 2.2.14 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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