spree_api 4.2.0.rc2 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/spree/api/v2/storefront/order_concern.rb +7 -7
  3. data/app/controllers/spree/api/base_controller.rb +10 -2
  4. data/app/controllers/spree/api/v1/shipments_controller.rb +16 -6
  5. data/app/controllers/spree/api/v1/taxons_controller.rb +1 -1
  6. data/app/controllers/spree/api/v2/base_controller.rb +21 -4
  7. data/app/controllers/spree/api/v2/resource_controller.rb +59 -0
  8. data/app/controllers/spree/api/v2/storefront/account/addresses_controller.rb +3 -11
  9. data/app/controllers/spree/api/v2/storefront/account/credit_cards_controller.rb +7 -15
  10. data/app/controllers/spree/api/v2/storefront/account/orders_controller.rb +5 -24
  11. data/app/controllers/spree/api/v2/storefront/account_controller.rb +1 -5
  12. data/app/controllers/spree/api/v2/storefront/cart_controller.rb +1 -1
  13. data/app/controllers/spree/api/v2/storefront/countries_controller.rb +9 -16
  14. data/app/controllers/spree/api/v2/storefront/order_status_controller.rb +1 -5
  15. data/app/controllers/spree/api/v2/storefront/products_controller.rb +4 -14
  16. data/app/controllers/spree/api/v2/storefront/stores_controller.rb +2 -6
  17. data/app/controllers/spree/api/v2/storefront/taxons_controller.rb +3 -13
  18. data/app/helpers/spree/api/api_helpers.rb +1 -1
  19. data/app/helpers/spree/api/v2/display_money_helper.rb +43 -0
  20. data/app/models/spree/api_configuration.rb +1 -0
  21. data/app/models/spree/api_dependencies.rb +6 -2
  22. data/app/serializers/spree/v2/storefront/address_serializer.rb +7 -2
  23. data/app/serializers/spree/v2/storefront/base_serializer.rb +1 -1
  24. data/app/serializers/spree/v2/storefront/cart_serializer.rb +2 -1
  25. data/app/serializers/spree/v2/storefront/country_serializer.rb +6 -0
  26. data/app/serializers/spree/v2/storefront/estimated_shipping_rate_serializer.rb +3 -1
  27. data/app/serializers/spree/v2/storefront/payment_serializer.rb +1 -1
  28. data/app/serializers/spree/v2/storefront/product_property_serializer.rb +7 -2
  29. data/app/serializers/spree/v2/storefront/product_serializer.rb +38 -7
  30. data/app/serializers/spree/v2/storefront/shipment_serializer.rb +3 -1
  31. data/app/serializers/spree/v2/storefront/shipping_rate_serializer.rb +3 -1
  32. data/app/serializers/spree/v2/storefront/store_credit_category_serializer.rb +11 -0
  33. data/app/serializers/spree/v2/storefront/store_credit_serializer.rb +1 -1
  34. data/app/serializers/spree/v2/storefront/store_serializer.rb +1 -1
  35. data/app/serializers/spree/v2/storefront/taxon_serializer.rb +11 -3
  36. data/app/serializers/spree/v2/storefront/user_serializer.rb +3 -1
  37. data/app/serializers/spree/v2/storefront/variant_serializer.rb +34 -5
  38. data/app/services/spree/api/error_handler.rb +40 -0
  39. data/config/initializers/doorkeeper.rb +10 -1
  40. data/config/locales/en.yml +1 -1
  41. data/docs/oauth/index.yml +78 -15
  42. data/docs/v2/storefront/index.yaml +3232 -663
  43. data/lib/spree/api/testing_support/v2/current_order.rb +2 -0
  44. data/lib/spree_api.rb +1 -1
  45. data/spree_api.gemspec +1 -1
  46. metadata +16 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 870bda309064df374e65aee63ddd2d7abb72004dbb6d218f0b1b77b7f5b0219f
4
- data.tar.gz: e8fd20974f60d065473f2fb1303dd86221de56173f6a1e957c7efc8d5dba2aed
3
+ metadata.gz: 3f0d9c08ae94f0dd6c0b5b36f3f52e0cfef1d1aefed538ef3bdeac3c67298ad8
4
+ data.tar.gz: 90665fe4860ccd6de2bbf69eeb2a7f461df86e20338e32455666e8b14637ae48
5
5
  SHA512:
6
- metadata.gz: 37e0a2ef4037067d2ffd5391d70b7c9fd6953d0529721e83ba7935755b1bca9515bc047e16525cae1df3d68e0815082f21e3e5579521f80259c717abe06d0b76
7
- data.tar.gz: 87d24be4132f732043258a35db7b5398f3a63fe99908141e6bbba92786e5897a2c9c9ddf0c3ed5efa9b3da6b65a73f2ac5e4a895fc4bb69038ab5e597ece2932
6
+ metadata.gz: 0b9ca0a68ea05ee7ca88d56ea683aee49bbf8aec2b0521511c71aec8cc9b448e67192b67722e8dc70824de21d140f6df4b512af3a206e437e8ce000362a7fb3a
7
+ data.tar.gz: 1a86d97639ff8a1b31fb0a823b4dfb75e70b1dc605e98537facd3fe9c3138d17f8dae90aae827811700c74b33f27f82a18f3e755de44925f4bb771aa27b2066f
@@ -34,16 +34,16 @@ module Spree
34
34
  )
35
35
  end
36
36
 
37
- def supported_currencies
38
- current_store.supported_currencies_list
37
+ def serialized_current_order
38
+ serialize_resource(spree_current_order)
39
39
  end
40
40
 
41
41
  def serialize_order(order)
42
- resource_serializer.new(order.reload, include: resource_includes, fields: sparse_fields).serializable_hash
43
- end
44
-
45
- def serialized_current_order
46
- serialize_order(spree_current_order)
42
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
43
+ `OrderConcern#serialize_order` is deprecated and will be removed in Spree 5.0.
44
+ Please use `serializer_resource` method
45
+ DEPRECATION
46
+ serialize_resource(order)
47
47
  end
48
48
  end
49
49
  end
@@ -6,6 +6,8 @@ module Spree
6
6
  include Spree::Api::ControllerSetup
7
7
  include Spree::Core::ControllerHelpers::Store
8
8
  include Spree::Core::ControllerHelpers::StrongParameters
9
+ include Spree::Core::ControllerHelpers::Locale
10
+ include Spree::Core::ControllerHelpers::Currency
9
11
 
10
12
  attr_accessor :current_api_user
11
13
 
@@ -81,10 +83,16 @@ module Spree
81
83
  end
82
84
 
83
85
  def error_during_processing(exception)
84
- Rails.logger.error exception.message
86
+ message = if exception.respond_to?(:original_message)
87
+ exception.original_message
88
+ else
89
+ exception.message
90
+ end
91
+
92
+ Rails.logger.error message
85
93
  Rails.logger.error exception.backtrace.join("\n")
86
94
 
87
- unprocessable_entity(exception.message)
95
+ unprocessable_entity(message)
88
96
  end
89
97
 
90
98
  def unprocessable_entity(message)
@@ -92,12 +92,17 @@ module Spree
92
92
  @stock_location = Spree::StockLocation.find(params[:stock_location_id])
93
93
 
94
94
  unless @quantity > 0
95
- unprocessable_entity("#{Spree.t(:shipment_transfer_errors_occured, scope: 'api')} \n #{Spree.t(:negative_quantity, scope: 'api')}")
95
+ unprocessable_entity("#{Spree.t(:shipment_transfer_errors_occurred, scope: 'api')} \n #{Spree.t(:negative_quantity, scope: 'api')}")
96
96
  return
97
97
  end
98
98
 
99
- @original_shipment.transfer_to_location(@variant, @quantity, @stock_location)
100
- render json: { success: true, message: Spree.t(:shipment_transfer_success) }, status: 201
99
+ transfer = @original_shipment.transfer_to_location(@variant, @quantity, @stock_location)
100
+ if transfer.valid?
101
+ transfer.run!
102
+ render json: { message: Spree.t(:shipment_transfer_success) }, status: 201
103
+ else
104
+ render json: { message: transfer.errors.full_messages.to_sentence }, status: 422
105
+ end
101
106
  end
102
107
 
103
108
  def transfer_to_shipment
@@ -113,10 +118,15 @@ module Spree
113
118
  end
114
119
 
115
120
  if error
116
- unprocessable_entity("#{Spree.t(:shipment_transfer_errors_occured, scope: 'api')} \n#{error}")
121
+ unprocessable_entity("#{Spree.t(:shipment_transfer_errors_occurred, scope: 'api')} \n#{error}")
117
122
  else
118
- @original_shipment.transfer_to_shipment(@variant, @quantity, @target_shipment)
119
- render json: { success: true, message: Spree.t(:shipment_transfer_success) }, status: 201
123
+ transfer = @original_shipment.transfer_to_shipment(@variant, @quantity, @target_shipment)
124
+ if transfer.valid?
125
+ transfer.run!
126
+ render json: { message: Spree.t(:shipment_transfer_success) }, status: 201
127
+ else
128
+ render json: { message: transfer.errors.full_messages }, status: 422
129
+ end
120
130
  end
121
131
  end
122
132
 
@@ -37,7 +37,7 @@ module Spree
37
37
  invalid_resource!(@taxon) and return
38
38
  end
39
39
 
40
- @taxon.parent_id = taxonomy.root.id unless params[:taxon][:parent_id]
40
+ @taxon.parent_id = taxonomy.root_id unless params[:taxon][:parent_id]
41
41
 
42
42
  if @taxon.save
43
43
  respond_with(@taxon, status: 201, default_template: :show)
@@ -5,26 +5,31 @@ module Spree
5
5
  include CanCan::ControllerAdditions
6
6
  include Spree::Core::ControllerHelpers::StrongParameters
7
7
  include Spree::Core::ControllerHelpers::Store
8
+ include Spree::Core::ControllerHelpers::Locale
9
+ include Spree::Core::ControllerHelpers::Currency
8
10
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
9
11
  rescue_from CanCan::AccessDenied, with: :access_denied
10
12
  rescue_from Spree::Core::GatewayError, with: :gateway_error
13
+ rescue_from ActionController::ParameterMissing, with: :error_during_processing
14
+ rescue_from ArgumentError, with: :error_during_processing
11
15
 
12
16
  def content_type
13
17
  Spree::Api::Config[:api_v2_content_type]
14
18
  end
15
19
 
16
- private
20
+ protected
17
21
 
18
22
  def serialize_collection(collection)
19
23
  collection_serializer.new(
20
24
  collection,
21
- collection_options(collection)
25
+ collection_options(collection).merge(params: serializer_params)
22
26
  ).serializable_hash
23
27
  end
24
28
 
25
29
  def serialize_resource(resource)
26
30
  resource_serializer.new(
27
31
  resource,
32
+ params: serializer_params,
28
33
  include: resource_includes,
29
34
  fields: sparse_fields
30
35
  ).serializable_hash
@@ -40,8 +45,6 @@ module Spree
40
45
 
41
46
  def render_serialized_payload(status = 200)
42
47
  render json: yield, status: status, content_type: content_type
43
- rescue ArgumentError => exception
44
- render_error_payload(exception.message, 400)
45
48
  end
46
49
 
47
50
  def render_error_payload(error, status = 422)
@@ -107,6 +110,10 @@ module Spree
107
110
  fields.presence
108
111
  end
109
112
 
113
+ def serializer_params
114
+ { currency: current_currency, store: current_store, user: spree_current_user }
115
+ end
116
+
110
117
  def record_not_found
111
118
  render_error_payload(I18n.t(:resource_not_found, scope: 'spree.api'), 404)
112
119
  end
@@ -118,6 +125,16 @@ module Spree
118
125
  def gateway_error(exception)
119
126
  render_error_payload(exception.message)
120
127
  end
128
+
129
+ def error_during_processing(exception)
130
+ result = error_handler.call(exception: exception, opts: { user: spree_current_user })
131
+
132
+ render_error_payload(result.value[:message], 400)
133
+ end
134
+
135
+ def error_handler
136
+ Spree::Api::Dependencies.error_handler.constantize
137
+ end
121
138
  end
122
139
  end
123
140
  end
@@ -0,0 +1,59 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class ResourceController < ::Spree::Api::V2::BaseController
5
+ include Spree::Api::V2::CollectionOptionsHelpers
6
+
7
+ def index
8
+ render_serialized_payload { serialize_collection(paginated_collection) }
9
+ end
10
+
11
+ def show
12
+ render_serialized_payload { serialize_resource(resource) }
13
+ end
14
+
15
+ protected
16
+
17
+ def sorted_collection
18
+ collection_sorter.new(collection, params, allowed_sort_attributes).call
19
+ end
20
+
21
+ def allowed_sort_attributes
22
+ default_sort_atributes
23
+ end
24
+
25
+ def default_sort_atributes
26
+ [:id, :updated_at, :created_at]
27
+ end
28
+
29
+ def scope
30
+ model_class.accessible_by(current_ability, :show).includes(scope_includes)
31
+ end
32
+
33
+ def scope_includes
34
+ []
35
+ end
36
+
37
+ def resource
38
+ @resource ||= if defined?(resource_finder)
39
+ resource_finder.new(scope: scope, params: params).execute
40
+ else
41
+ scope.find(params[:id])
42
+ end
43
+ end
44
+
45
+ def collection
46
+ @collection ||= if defined?(collection_finder)
47
+ collection_finder.new(scope: scope, params: params).execute
48
+ else
49
+ scope
50
+ end
51
+ end
52
+
53
+ def collection_sorter
54
+ Spree::Api::Dependencies.storefront_collection_sorter.constantize
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -3,13 +3,9 @@ module Spree
3
3
  module V2
4
4
  module Storefront
5
5
  module Account
6
- class AddressesController < ::Spree::Api::V2::BaseController
6
+ class AddressesController < ::Spree::Api::V2::ResourceController
7
7
  before_action :require_spree_current_user
8
8
 
9
- def index
10
- render_serialized_payload { serialize_collection(collection) }
11
- end
12
-
13
9
  def create
14
10
  result = create_service.call(user: spree_current_user, address_params: address_params)
15
11
  render_result(result)
@@ -26,12 +22,8 @@ module Spree
26
22
  collection_finder.new(scope: scope, params: params).execute
27
23
  end
28
24
 
29
- def resource
30
- @resource ||= scope.find(params[:id])
31
- end
32
-
33
- def scope
34
- spree_current_user.addresses
25
+ def model_class
26
+ Spree::Address
35
27
  end
36
28
 
37
29
  def collection_finder
@@ -3,27 +3,23 @@ module Spree
3
3
  module V2
4
4
  module Storefront
5
5
  module Account
6
- class CreditCardsController < ::Spree::Api::V2::BaseController
6
+ class CreditCardsController < ::Spree::Api::V2::ResourceController
7
7
  before_action :require_spree_current_user
8
8
 
9
- def index
10
- render_serialized_payload { serialize_collection(resource) }
11
- end
12
-
13
- def show
14
- render_serialized_payload { serialize_resource(resource) }
15
- end
16
-
17
9
  private
18
10
 
19
- def resource
20
- resource_finder.new.execute(scope: scope, params: params)
11
+ def model_class
12
+ Spree::CreditCard
21
13
  end
22
14
 
23
15
  def collection_serializer
24
16
  Spree::Api::Dependencies.storefront_credit_card_serializer.constantize
25
17
  end
26
18
 
19
+ def collection_finder
20
+ Spree::Api::Dependencies.storefront_credit_card_finder.constantize
21
+ end
22
+
27
23
  def resource_serializer
28
24
  Spree::Api::Dependencies.storefront_credit_card_serializer.constantize
29
25
  end
@@ -39,10 +35,6 @@ module Spree
39
35
  fields: sparse_fields
40
36
  ).serializable_hash
41
37
  end
42
-
43
- def scope
44
- spree_current_user.credit_cards.accessible_by(current_ability, :show)
45
- end
46
38
  end
47
39
  end
48
40
  end
@@ -3,26 +3,11 @@ module Spree
3
3
  module V2
4
4
  module Storefront
5
5
  module Account
6
- class OrdersController < ::Spree::Api::V2::BaseController
7
- include Spree::Api::V2::CollectionOptionsHelpers
6
+ class OrdersController < ::Spree::Api::V2::ResourceController
8
7
  before_action :require_spree_current_user
9
8
 
10
- def index
11
- render_serialized_payload { serialize_collection(paginated_collection) }
12
- end
13
-
14
- def show
15
- spree_authorize! :show, resource
16
-
17
- render_serialized_payload { serialize_resource(resource) }
18
- end
19
-
20
9
  private
21
10
 
22
- def sorted_collection
23
- collection_sorter.new(collection, params).call
24
- end
25
-
26
11
  def collection
27
12
  collection_finder.new(user: spree_current_user).execute
28
13
  end
@@ -34,6 +19,10 @@ module Spree
34
19
  resource
35
20
  end
36
21
 
22
+ def allowed_sort_attributes
23
+ super << :completed_at
24
+ end
25
+
37
26
  def collection_serializer
38
27
  Spree::Api::Dependencies.storefront_order_serializer.constantize
39
28
  end
@@ -49,14 +38,6 @@ module Spree
49
38
  def resource_finder
50
39
  Spree::Api::Dependencies.storefront_completed_order_finder.constantize
51
40
  end
52
-
53
- def collection_sorter
54
- Spree::Api::Dependencies.storefront_order_sorter.constantize
55
- end
56
-
57
- def collection_paginator
58
- Spree::Api::Dependencies.storefront_collection_paginator.constantize
59
- end
60
41
  end
61
42
  end
62
43
  end
@@ -2,13 +2,9 @@ module Spree
2
2
  module Api
3
3
  module V2
4
4
  module Storefront
5
- class AccountController < ::Spree::Api::V2::BaseController
5
+ class AccountController < ::Spree::Api::V2::ResourceController
6
6
  before_action :require_spree_current_user
7
7
 
8
- def show
9
- render_serialized_payload { serialize_resource(resource) }
10
- end
11
-
12
8
  private
13
9
 
14
10
  def resource
@@ -19,7 +19,7 @@ module Spree
19
19
  order = spree_current_order if spree_current_order.present?
20
20
  order ||= create_service.call(order_params).value
21
21
 
22
- render_serialized_payload(201) { serialize_order(order) }
22
+ render_serialized_payload(201) { serialize_resource(order) }
23
23
  end
24
24
 
25
25
  def add_item
@@ -2,17 +2,7 @@ module Spree
2
2
  module Api
3
3
  module V2
4
4
  module Storefront
5
- class CountriesController < ::Spree::Api::V2::BaseController
6
- include Spree::Api::V2::CollectionOptionsHelpers
7
-
8
- def index
9
- render_serialized_payload { serialize_collection(collection) }
10
- end
11
-
12
- def show
13
- render_serialized_payload { serialize_resource(resource) }
14
- end
15
-
5
+ class CountriesController < ::Spree::Api::V2::ResourceController
16
6
  private
17
7
 
18
8
  def serialize_collection(collection)
@@ -24,12 +14,15 @@ module Spree
24
14
  resource,
25
15
  include: resource_includes,
26
16
  fields: sparse_fields,
27
- params: { include_states: true }
17
+ params: resource_serializer_params
28
18
  ).serializable_hash
29
19
  end
30
20
 
31
- def collection
32
- collection_finder.new(scope, params).call
21
+ def resource_serializer_params
22
+ {
23
+ include_states: true,
24
+ current_store: current_store
25
+ }
33
26
  end
34
27
 
35
28
  def resource
@@ -52,8 +45,8 @@ module Spree
52
45
  Spree::Api::Dependencies.storefront_country_finder.constantize
53
46
  end
54
47
 
55
- def scope
56
- Spree::Country.accessible_by(current_ability, :show)
48
+ def model_class
49
+ Spree::Country
57
50
  end
58
51
  end
59
52
  end