spree_api 4.2.0.rc1 → 4.2.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 (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 +7 -26
  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 +2 -6
  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 +8 -3
  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 +3 -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 +15 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ca201da4875f262850ded05d71868a5161f3e8055c6047b544bef63f536e5d3
4
- data.tar.gz: cfc2c37c3bdd2041b91cfa4cffad2643f4131a69fb8793b6eb6c793e5ae17ee6
3
+ metadata.gz: aa0ba5ffcc873cf68159260e0b7f52879f39f54f7140887a438c73f1257293d2
4
+ data.tar.gz: 1f05304db222d36a1f31d563ea5a071a01cfe7eb80fa4c13a002b6a4dd6775f8
5
5
  SHA512:
6
- metadata.gz: dfd25ddcca9e0fb04dd7141cfa5fb153ff43de9f0137fa3d78618300a71372c5057de303ab0728da69aa08c3e0a0eba0675493bf0bf42caa8f325207fb94603c
7
- data.tar.gz: 4798f5ddbfc85d778adcfd0509ea7d2361f1464a61ae6a194d4d8f7d1014738e570a89c17b95c735317f25394ca8ad75c148e1fc81d4a2f195a986a8ac63f55a
6
+ metadata.gz: 0d83abd3762d05c58b37e8290d0fddc8ead28edc15ad3dd1267915ed2abb234399a36071a8250d4d7a3e08a0871e5e438acff6a28a67d2512460ec718c1785dd
7
+ data.tar.gz: 41eee02e45c3491b25333eecda173b23a520e0595ba39ef4c38ad1eb7d356d4c206ee7f16d19fd927f5e291475e3a40f6a785a634f0c1055f29cf60ad1e82ea8
@@ -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,12 +19,16 @@ 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
- Spree::Api::Dependencies.storefront_cart_serializer.constantize
27
+ Spree::Api::Dependencies.storefront_order_serializer.constantize
39
28
  end
40
29
 
41
30
  def resource_serializer
42
- Spree::Api::Dependencies.storefront_cart_serializer.constantize
31
+ Spree::Api::Dependencies.storefront_order_serializer.constantize
43
32
  end
44
33
 
45
34
  def collection_finder
@@ -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