spree_api 4.1.13 → 4.2.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/spree/api/v2/storefront/order_concern.rb +4 -0
  3. data/app/controllers/spree/api/base_controller.rb +9 -5
  4. data/app/controllers/spree/api/errors_controller.rb +1 -1
  5. data/app/controllers/spree/api/v1/shipments_controller.rb +16 -6
  6. data/app/controllers/spree/api/v1/taxons_controller.rb +6 -1
  7. data/app/controllers/spree/api/v1/users_controller.rb +35 -9
  8. data/app/controllers/spree/api/v2/base_controller.rb +6 -25
  9. data/app/controllers/spree/api/v2/resource_controller.rb +82 -0
  10. data/app/controllers/spree/api/v2/storefront/account/addresses_controller.rb +3 -11
  11. data/app/controllers/spree/api/v2/storefront/account/credit_cards_controller.rb +7 -15
  12. data/app/controllers/spree/api/v2/storefront/account/orders_controller.rb +5 -24
  13. data/app/controllers/spree/api/v2/storefront/account_controller.rb +1 -5
  14. data/app/controllers/spree/api/v2/storefront/countries_controller.rb +9 -16
  15. data/app/controllers/spree/api/v2/storefront/order_status_controller.rb +1 -5
  16. data/app/controllers/spree/api/v2/storefront/products_controller.rb +4 -14
  17. data/app/controllers/spree/api/v2/storefront/stores_controller.rb +2 -6
  18. data/app/controllers/spree/api/v2/storefront/taxons_controller.rb +4 -14
  19. data/app/helpers/spree/api/api_helpers.rb +4 -3
  20. data/app/models/spree/api_dependencies.rb +4 -2
  21. data/app/serializers/spree/v2/storefront/address_serializer.rb +8 -3
  22. data/app/serializers/spree/v2/storefront/base_serializer.rb +1 -1
  23. data/app/serializers/spree/v2/storefront/country_serializer.rb +6 -0
  24. data/app/serializers/spree/v2/storefront/estimated_shipping_rate_serializer.rb +3 -1
  25. data/app/serializers/spree/v2/storefront/product_property_serializer.rb +7 -2
  26. data/app/serializers/spree/v2/storefront/product_serializer.rb +17 -6
  27. data/app/serializers/spree/v2/storefront/shipment_serializer.rb +3 -1
  28. data/app/serializers/spree/v2/storefront/shipping_rate_serializer.rb +3 -1
  29. data/app/serializers/spree/v2/storefront/store_serializer.rb +3 -1
  30. data/app/serializers/spree/v2/storefront/taxon_serializer.rb +11 -3
  31. data/app/serializers/spree/v2/storefront/user_serializer.rb +3 -1
  32. data/app/serializers/spree/v2/storefront/variant_serializer.rb +13 -5
  33. data/app/views/spree/api/v1/products/show.rabl +4 -0
  34. data/config/locales/en.yml +1 -1
  35. data/docs/oauth/index.yml +78 -15
  36. data/docs/v2/storefront/index.yaml +3409 -672
  37. data/lib/spree/api/controller_setup.rb +0 -1
  38. data/lib/spree_api.rb +1 -1
  39. data/spree_api.gemspec +2 -2
  40. metadata +14 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e97b8e826fb8c422cac7fd8f2c48ed976bd801d2cd6b6a83d2bc63e7502680f
4
- data.tar.gz: 590a06b109db49907897f093deefddeba7a1c9179a899507a4afb6634ce1351d
3
+ metadata.gz: 7c7b8ebf1a65cf7fb7063b4811c8d6226298c6435b5fdb9a60fd0c9a0579567d
4
+ data.tar.gz: 33ab903daaec69fdcb23340146c6e78be7dc64dbe760d2885353518d977887d3
5
5
  SHA512:
6
- metadata.gz: e38f559497fd36c7bd4660352ad2761002a07d441eaacce603eb4c9ae11a27ae5241715ff071dee71acd487f8c8368ca61ce301660b0b052bdd0d1379400d56e
7
- data.tar.gz: c441f94c2e98c93b06dd0afefbf1fb9cd0aa5b27fa1057182bd135f8bd3c6dfe5325c54e0504aa44c75ee39015fb67261f43b74b4acdeea5bf765adcacf1dd68
6
+ metadata.gz: 4f108ec0840bcfdf1aa5f15a8cf7f1de53fc7420bc0d0fc93072786ce139f60afcf5506470dca75c32cfac4b70221b4a9858e8b0a528b643e3f411c892cd46c9
7
+ data.tar.gz: 75d052059dda3df22fd17236878a14b9ca9a07da5bb287b0df03c11ea347a02abadabf75e2f7f7da950cd9e8bfdb56e96294d0a14ec46049797a63a69da58711
@@ -34,6 +34,10 @@ module Spree
34
34
  )
35
35
  end
36
36
 
37
+ def supported_currencies
38
+ current_store.supported_currencies_list
39
+ end
40
+
37
41
  def serialize_order(order)
38
42
  resource_serializer.new(order.reload, include: resource_includes, fields: sparse_fields).serializable_hash
39
43
  end
@@ -2,9 +2,7 @@ require_dependency 'spree/api/controller_setup'
2
2
 
3
3
  module Spree
4
4
  module Api
5
- class BaseController < ActionController::Base
6
- protect_from_forgery unless: -> { request.format.json? || request.format.xml? }
7
-
5
+ class BaseController < ActionController::API
8
6
  include Spree::Api::ControllerSetup
9
7
  include Spree::Core::ControllerHelpers::Store
10
8
  include Spree::Core::ControllerHelpers::StrongParameters
@@ -83,10 +81,16 @@ module Spree
83
81
  end
84
82
 
85
83
  def error_during_processing(exception)
86
- Rails.logger.error exception.message
84
+ message = if exception.respond_to?(:original_message)
85
+ exception.original_message
86
+ else
87
+ exception.message
88
+ end
89
+
90
+ Rails.logger.error message
87
91
  Rails.logger.error exception.backtrace.join("\n")
88
92
 
89
- unprocessable_entity(exception.message)
93
+ unprocessable_entity(message)
90
94
  end
91
95
 
92
96
  def unprocessable_entity(message)
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  module Api
3
- class ErrorsController < ActionController::Base
3
+ class ErrorsController < ActionController::API
4
4
  def render_404
5
5
  render 'spree/api/errors/not_found', status: 404
6
6
  end
@@ -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
 
@@ -74,7 +74,12 @@ module Spree
74
74
 
75
75
  def taxonomy
76
76
  if params[:taxonomy_id].present?
77
- @taxonomy ||= Spree::Taxonomy.accessible_by(current_ability, :show).find(params[:taxonomy_id])
77
+ @taxonomy ||=
78
+ if defined?(SpreeGlobalize)
79
+ Spree::Taxonomy.includes(:translations, taxons: [:translations]).accessible_by(current_ability, :show).find(params[:taxonomy_id])
80
+ else
81
+ Spree::Taxonomy.accessible_by(current_ability, :show).find(params[:taxonomy_id])
82
+ end
78
83
  end
79
84
  end
80
85
 
@@ -5,22 +5,48 @@ module Spree
5
5
  rescue_from Spree::Core::DestroyWithOrdersError, with: :error_during_processing
6
6
 
7
7
  def index
8
- @users = Spree.user_class.accessible_by(current_ability, :show)
8
+ users
9
9
 
10
10
  if params[:ids]
11
- @users = @users.where(id: params[:ids])
12
- elsif params[:q]
13
- users_with_ship_address = @users.with_address(params[:q][:ship_address_firstname_start])
14
- users_with_bill_address = @users.with_address(params[:q][:ship_address_firstname_start], :bill_address)
15
-
16
- users_with_addresses_ids = (users_with_ship_address.ids + users_with_bill_address.ids).compact.uniq
17
- @users = @users.with_email_or_addresses_ids(params[:q][:email_start], users_with_addresses_ids)
11
+ load_users_by_ids
12
+ elsif params.dig(:q, :ship_address_firstname_start)
13
+ load_users_by_address
14
+ elsif params.dig(:q, :email_start)
15
+ load_users_by_email
18
16
  end
19
17
 
18
+ prepare_index_response
19
+ respond_with(@users)
20
+ end
21
+
22
+ def users
23
+ @users ||= Spree.user_class.accessible_by(current_ability, :show)
24
+ end
25
+
26
+ def load_users_by_ids
27
+ @users = @users.where(id: params[:ids])
28
+ end
29
+
30
+ def load_users_by_address
31
+ address_params = params[:q][:ship_address_firstname_start] ||
32
+ params[:q][:ship_address_lastname_start] ||
33
+ params[:q][:bill_address_firstname_start] ||
34
+ params[:q][:bill_address_lastname_start]
35
+ @users = @users.with_email_or_address(params[:q][:email_start], address_params)
36
+ end
37
+
38
+ def load_users_by_email
39
+ @users = @users.with_email(params[:q][:email_start])
40
+ end
41
+
42
+ def paginate_users
20
43
  @users = @users.page(params[:page]).per(params[:per_page])
44
+ end
45
+
46
+ def prepare_index_response
47
+ paginate_users
21
48
  expires_in 15.minutes, public: true
22
49
  headers['Surrogate-Control'] = "max-age=#{15.minutes}"
23
- respond_with(@users)
24
50
  end
25
51
 
26
52
  def show
@@ -9,35 +9,12 @@ module Spree
9
9
  rescue_from CanCan::AccessDenied, with: :access_denied
10
10
  rescue_from Spree::Core::GatewayError, with: :gateway_error
11
11
 
12
+ before_action :set_user_language
13
+
12
14
  def content_type
13
15
  Spree::Api::Config[:api_v2_content_type]
14
16
  end
15
17
 
16
- private
17
-
18
- def serialize_collection(collection)
19
- collection_serializer.new(
20
- collection,
21
- collection_options(collection)
22
- ).serializable_hash
23
- end
24
-
25
- def serialize_resource(resource)
26
- resource_serializer.new(
27
- resource,
28
- include: resource_includes,
29
- fields: sparse_fields
30
- ).serializable_hash
31
- end
32
-
33
- def paginated_collection
34
- collection_paginator.new(sorted_collection, params).call
35
- end
36
-
37
- def collection_paginator
38
- Spree::Api::Dependencies.storefront_collection_paginator.constantize
39
- end
40
-
41
18
  def render_serialized_payload(status = 200)
42
19
  render json: yield, status: status, content_type: content_type
43
20
  rescue ArgumentError => exception
@@ -118,6 +95,10 @@ module Spree
118
95
  def gateway_error(exception)
119
96
  render_error_payload(exception.message)
120
97
  end
98
+
99
+ def set_user_language
100
+ I18n.locale = current_store.default_locale
101
+ end
121
102
  end
122
103
  end
123
104
  end
@@ -0,0 +1,82 @@
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 serialize_collection(collection)
18
+ collection_serializer.new(
19
+ collection,
20
+ collection_options(collection)
21
+ ).serializable_hash
22
+ end
23
+
24
+ def serialize_resource(resource)
25
+ resource_serializer.new(
26
+ resource,
27
+ include: resource_includes,
28
+ fields: sparse_fields
29
+ ).serializable_hash
30
+ end
31
+
32
+ def paginated_collection
33
+ collection_paginator.new(sorted_collection, params).call
34
+ end
35
+
36
+ def collection_paginator
37
+ Spree::Api::Dependencies.storefront_collection_paginator.constantize
38
+ end
39
+
40
+ def sorted_collection
41
+ collection_sorter.new(collection, params, allowed_sort_attributes).call
42
+ end
43
+
44
+ def allowed_sort_attributes
45
+ default_sort_atributes
46
+ end
47
+
48
+ def default_sort_atributes
49
+ [:id, :updated_at, :created_at]
50
+ end
51
+
52
+ def scope
53
+ model_class.accessible_by(current_ability, :show).includes(scope_includes)
54
+ end
55
+
56
+ def scope_includes
57
+ []
58
+ end
59
+
60
+ def resource
61
+ @resource ||= if defined?(resource_finder)
62
+ resource_finder.new(scope: scope, params: params).execute
63
+ else
64
+ scope.find(params[:id])
65
+ end
66
+ end
67
+
68
+ def collection
69
+ @collection ||= if defined?(collection_finder)
70
+ collection_finder.new(scope: scope, params: params).execute
71
+ else
72
+ scope
73
+ end
74
+ end
75
+
76
+ def collection_sorter
77
+ Spree::Api::Dependencies.storefront_collection_sorter.constantize
78
+ end
79
+ end
80
+ end
81
+ end
82
+ 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