spree_api 4.2.0.rc4 → 4.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c7b8ebf1a65cf7fb7063b4811c8d6226298c6435b5fdb9a60fd0c9a0579567d
4
- data.tar.gz: 33ab903daaec69fdcb23340146c6e78be7dc64dbe760d2885353518d977887d3
3
+ metadata.gz: 025ab26b6b25f6644f6acb3662cb7fcea7b215142234f49e06d425d20d0a14a5
4
+ data.tar.gz: b210a889a6e50e7de730a3c5241eeb8442b933394c1c4a7f637536d5771064c8
5
5
  SHA512:
6
- metadata.gz: 4f108ec0840bcfdf1aa5f15a8cf7f1de53fc7420bc0d0fc93072786ce139f60afcf5506470dca75c32cfac4b70221b4a9858e8b0a528b643e3f411c892cd46c9
7
- data.tar.gz: 75d052059dda3df22fd17236878a14b9ca9a07da5bb287b0df03c11ea347a02abadabf75e2f7f7da950cd9e8bfdb56e96294d0a14ec46049797a63a69da58711
6
+ metadata.gz: 360cce541d207d3e27f436b4ebd54cde72f7f0f0e9af96e1bb529763d596496958a596abcf9fced6dd7453278a3e76f3981199deb293a67b16ae649265d65371
7
+ data.tar.gz: 8e0a5c058d275b8409541d3d4e8141b35806ffe8215828e0c511348d71b850fe4d8232562c6b4496579152e1ed3c4dfa82061efb622a04d4cd7b909fb45fb62c
@@ -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
 
@@ -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,20 +5,49 @@ 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
11
-
12
- before_action :set_user_language
13
+ rescue_from ActionController::ParameterMissing, with: :error_during_processing
14
+ if defined?(JSONAPI::Serializer::UnsupportedIncludeError)
15
+ rescue_from JSONAPI::Serializer::UnsupportedIncludeError, with: :error_during_processing
16
+ end
17
+ rescue_from ArgumentError, with: :error_during_processing
13
18
 
14
19
  def content_type
15
20
  Spree::Api::Config[:api_v2_content_type]
16
21
  end
17
22
 
23
+ protected
24
+
25
+ def serialize_collection(collection)
26
+ collection_serializer.new(
27
+ collection,
28
+ collection_options(collection).merge(params: serializer_params)
29
+ ).serializable_hash
30
+ end
31
+
32
+ def serialize_resource(resource)
33
+ resource_serializer.new(
34
+ resource,
35
+ params: serializer_params,
36
+ include: resource_includes,
37
+ fields: sparse_fields
38
+ ).serializable_hash
39
+ end
40
+
41
+ def paginated_collection
42
+ collection_paginator.new(sorted_collection, params).call
43
+ end
44
+
45
+ def collection_paginator
46
+ Spree::Api::Dependencies.storefront_collection_paginator.constantize
47
+ end
48
+
18
49
  def render_serialized_payload(status = 200)
19
50
  render json: yield, status: status, content_type: content_type
20
- rescue ArgumentError => exception
21
- render_error_payload(exception.message, 400)
22
51
  end
23
52
 
24
53
  def render_error_payload(error, status = 422)
@@ -84,6 +113,10 @@ module Spree
84
113
  fields.presence
85
114
  end
86
115
 
116
+ def serializer_params
117
+ { currency: current_currency, store: current_store, user: spree_current_user }
118
+ end
119
+
87
120
  def record_not_found
88
121
  render_error_payload(I18n.t(:resource_not_found, scope: 'spree.api'), 404)
89
122
  end
@@ -96,8 +129,14 @@ module Spree
96
129
  render_error_payload(exception.message)
97
130
  end
98
131
 
99
- def set_user_language
100
- I18n.locale = current_store.default_locale
132
+ def error_during_processing(exception)
133
+ result = error_handler.call(exception: exception, opts: { user: spree_current_user })
134
+
135
+ render_error_payload(result.value[:message], 400)
136
+ end
137
+
138
+ def error_handler
139
+ Spree::Api::Dependencies.error_handler.constantize
101
140
  end
102
141
  end
103
142
  end
@@ -14,29 +14,6 @@ module Spree
14
14
 
15
15
  protected
16
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
17
  def sorted_collection
41
18
  collection_sorter.new(collection, params, allowed_sort_attributes).call
42
19
  end
@@ -7,21 +7,39 @@ module Spree
7
7
  before_action :require_spree_current_user
8
8
 
9
9
  def create
10
+ spree_authorize! :create, model_class
11
+
10
12
  result = create_service.call(user: spree_current_user, address_params: address_params)
11
13
  render_result(result)
12
14
  end
13
15
 
14
16
  def update
17
+ spree_authorize! :update, resource
18
+
15
19
  result = update_service.call(address: resource, address_params: address_params)
16
20
  render_result(result)
17
21
  end
18
22
 
23
+ def destroy
24
+ spree_authorize! :destroy, resource
25
+
26
+ if resource.destroy
27
+ head 204
28
+ else
29
+ render_error_payload(resource.errors)
30
+ end
31
+ end
32
+
19
33
  private
20
34
 
21
35
  def collection
22
36
  collection_finder.new(scope: scope, params: params).execute
23
37
  end
24
38
 
39
+ def scope
40
+ super.not_deleted
41
+ end
42
+
25
43
  def model_class
26
44
  Spree::Address
27
45
  end
@@ -12,6 +12,10 @@ module Spree
12
12
  Spree::CreditCard
13
13
  end
14
14
 
15
+ def scope
16
+ super.where(user: spree_current_user)
17
+ end
18
+
15
19
  def collection_serializer
16
20
  Spree::Api::Dependencies.storefront_credit_card_serializer.constantize
17
21
  end
@@ -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
@@ -163,7 +163,7 @@ module Spree
163
163
  :id, :name, :url, :meta_description, :meta_keywords, :seo_title,
164
164
  :mail_from_address, :customer_support_email, :default_currency,
165
165
  :code, :default, :facebook, :twitter, :instagram,
166
- :supported_currencies
166
+ :supported_currencies, :default_locale, :supported_locales
167
167
  ]
168
168
 
169
169
  @@tag_attributes = [:id, :name]
@@ -0,0 +1,43 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module DisplayMoneyHelper
5
+ extend ActiveSupport::Concern
6
+
7
+ class_methods do
8
+ def find_price(product_or_variant, currency)
9
+ product_or_variant.price_in(currency)
10
+ end
11
+
12
+ def price(product_or_variant, currency)
13
+ price = find_price(product_or_variant, currency)
14
+ return nil if price.new_record?
15
+
16
+ format('%.2f', price.amount)
17
+ end
18
+
19
+ def display_price(product_or_variant, currency)
20
+ price = find_price(product_or_variant, currency)
21
+ return nil if price.new_record?
22
+
23
+ Spree::Money.new(price.amount, currency: currency).to_s
24
+ end
25
+
26
+ def compare_at_price(product_or_variant, currency)
27
+ price = find_price(product_or_variant, currency)
28
+ return nil if price.new_record? || price.compare_at_amount.blank?
29
+
30
+ format('%.2f', price.compare_at_amount)
31
+ end
32
+
33
+ def display_compare_at_price(product_or_variant, currency)
34
+ price = find_price(product_or_variant, currency)
35
+ return nil if price.new_record? || price.compare_at_amount.blank?
36
+
37
+ Spree::Money.new(price.compare_at_amount, currency: currency).to_s
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -2,5 +2,6 @@ module Spree
2
2
  class ApiConfiguration < Preferences::Configuration
3
3
  preference :requires_authentication, :boolean, default: true
4
4
  preference :api_v2_content_type, :string, default: 'application/vnd.api+json'
5
+ preference :api_v2_per_page_limit, :integer, default: 100
5
6
  end
6
7
  end
@@ -16,7 +16,7 @@ module Spree
16
16
  :storefront_cart_update_service, :storefront_cart_estimate_shipping_rates_service, :storefront_estimated_shipment_serializer,
17
17
  :storefront_store_serializer, :storefront_address_serializer, :storefront_order_serializer,
18
18
  :storefront_account_create_address_service, :storefront_account_update_address_service, :storefront_address_finder,
19
- :storefront_collection_sorter
19
+ :storefront_collection_sorter, :error_handler
20
20
  ].freeze
21
21
 
22
22
  attr_accessor *INJECTION_POINTS
@@ -86,6 +86,8 @@ module Spree
86
86
  @storefront_find_by_variant_finder = Spree::Dependencies.line_item_by_variant_finder
87
87
  @storefront_products_finder = Spree::Dependencies.products_finder
88
88
  @storefront_taxon_finder = Spree::Dependencies.taxon_finder
89
+
90
+ @error_handler = 'Spree::Api::ErrorHandler'
89
91
  end
90
92
  end
91
93
  end
@@ -2,11 +2,11 @@ module Spree
2
2
  module V2
3
3
  module Storefront
4
4
  class ProductSerializer < BaseSerializer
5
+ include ::Spree::Api::V2::DisplayMoneyHelper
6
+
5
7
  set_type :product
6
8
 
7
- attributes :name, :description, :price, :currency, :display_price,
8
- :compare_at_price, :display_compare_at_price, :available_on,
9
- :slug, :meta_description, :meta_keywords, :updated_at
9
+ attributes :name, :description, :available_on, :slug, :meta_description, :meta_keywords, :updated_at
10
10
 
11
11
  attribute :purchasable do |product|
12
12
  product.purchasable?
@@ -24,6 +24,26 @@ module Spree
24
24
  product.available?
25
25
  end
26
26
 
27
+ attribute :currency do |_product, params|
28
+ params[:currency]
29
+ end
30
+
31
+ attribute :price do |product, params|
32
+ price(product, params[:currency])
33
+ end
34
+
35
+ attribute :display_price do |product, params|
36
+ display_price(product, params[:currency])
37
+ end
38
+
39
+ attribute :compare_at_price do |product, params|
40
+ compare_at_price(product, params[:currency])
41
+ end
42
+
43
+ attribute :display_compare_at_price do |product, params|
44
+ display_compare_at_price(product, params[:currency])
45
+ end
46
+
27
47
  has_many :variants
28
48
  has_many :option_types
29
49
  has_many :product_properties
@@ -6,7 +6,7 @@ module Spree
6
6
 
7
7
  attributes :name, :url, :meta_description, :meta_keywords, :seo_title, :default_currency, :default, :supported_currencies, :facebook,
8
8
  :twitter, :instagram, :default_locale, :customer_support_email, :default_country_id, :description,
9
- :address, :contact_phone
9
+ :address, :contact_phone, :supported_locales
10
10
 
11
11
  has_one :default_country, serializer: :country, record_type: :country, id_method_name: :default_country_id
12
12
  end
@@ -2,10 +2,11 @@ module Spree
2
2
  module V2
3
3
  module Storefront
4
4
  class VariantSerializer < BaseSerializer
5
+ include ::Spree::Api::V2::DisplayMoneyHelper
6
+
5
7
  set_type :variant
6
8
 
7
- attributes :sku, :price, :currency, :display_price, :weight, :height,
8
- :width, :depth, :is_master, :options_text
9
+ attributes :sku, :weight, :height, :width, :depth, :is_master, :options_text
9
10
 
10
11
  attribute :purchasable do |variant|
11
12
  variant.purchasable?
@@ -19,6 +20,26 @@ module Spree
19
20
  variant.backorderable?
20
21
  end
21
22
 
23
+ attribute :currency do |_product, params|
24
+ params[:currency]
25
+ end
26
+
27
+ attribute :price do |product, params|
28
+ price(product, params[:currency])
29
+ end
30
+
31
+ attribute :display_price do |product, params|
32
+ display_price(product, params[:currency])
33
+ end
34
+
35
+ attribute :compare_at_price do |product, params|
36
+ compare_at_price(product, params[:currency])
37
+ end
38
+
39
+ attribute :display_compare_at_price do |product, params|
40
+ display_compare_at_price(product, params[:currency])
41
+ end
42
+
22
43
  belongs_to :product
23
44
  has_many :images
24
45
  has_many :option_values
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module Api
3
+ class ErrorHandler
4
+ prepend ::Spree::ServiceModule::Base
5
+
6
+ def call(exception:, opts: {})
7
+ run :format_message
8
+ run :log_error
9
+ run :report_error
10
+ end
11
+
12
+ protected
13
+
14
+ def format_message(exception:, opts:)
15
+ message = if exception.respond_to?(:original_message)
16
+ exception.original_message
17
+ else
18
+ exception.message
19
+ end
20
+
21
+ success(exception: exception, message: message, opts: opts)
22
+ end
23
+
24
+ def log_error(exception:, message:, opts:)
25
+ Rails.logger.error message
26
+ Rails.logger.error "User ID: #{opts[:user]&.id}" if opts[:user]
27
+ Rails.logger.error exception.backtrace.join("\n")
28
+
29
+ success(exception: exception, message: message, opts: opts)
30
+ end
31
+
32
+ def report_error(exception:, message:, opts:)
33
+ # overwrite this method in your application to support different error handlers
34
+ # eg. Sentry, Rollbar, etc
35
+
36
+ success(exception: exception, message: message)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -3,11 +3,20 @@ Doorkeeper.configure do
3
3
  use_refresh_token
4
4
  api_only
5
5
 
6
+ skip_client_authentication_for_password_grant { true } if defined?(skip_client_authentication_for_password_grant)
7
+
6
8
  resource_owner_authenticator { current_spree_user }
7
9
 
8
10
  resource_owner_from_credentials do
9
11
  user = Spree.user_class.find_for_database_authentication(email: params[:username])
10
- user if user&.valid_for_authentication? { user.valid_password?(params[:password]) }
12
+
13
+ next if user.nil?
14
+
15
+ if defined?(Spree::Auth::Config) && Spree::Auth::Config[:confirmable] == true
16
+ user if user.active_for_authentication? && user.valid_for_authentication? { user.valid_password?(params[:password]) }
17
+ elsif user&.valid_for_authentication? { user.valid_password?(params[:password]) }
18
+ user
19
+ end
11
20
  end
12
21
 
13
22
  admin_authenticator do |routes|
data/config/routes.rb CHANGED
@@ -152,7 +152,7 @@ Spree::Core::Engine.add_routes do
152
152
  resource :account, controller: :account, only: %i[show]
153
153
 
154
154
  namespace :account do
155
- resources :addresses, controller: :addresses, only: %i[index create update]
155
+ resources :addresses, controller: :addresses
156
156
  resources :credit_cards, controller: :credit_cards, only: %i[index show]
157
157
  resources :orders, controller: :orders, only: %i[index show]
158
158
  end
@@ -239,6 +239,21 @@ paths:
239
239
  security:
240
240
  - bearerAuth: []
241
241
  '/api/v2/storefront/account/addresses/{id}':
242
+ delete:
243
+ description: 'Removes selected Address for the signed in User. It uses soft-delete for addresses with shipments and orders.'
244
+ tags:
245
+ - Account
246
+ operationId: Remove Address
247
+ parameters:
248
+ - $ref: '#/components/parameters/AddressId'
249
+ responses:
250
+ '204':
251
+ description: Requested Address has been removed from the User Account
252
+ '404':
253
+ $ref: '#/components/responses/404NotFound'
254
+ security:
255
+ - bearerAuth: []
256
+ summary: Remove Address
242
257
  patch:
243
258
  description: >-
244
259
  Update selected Address for the signed in User
@@ -247,13 +262,7 @@ paths:
247
262
  - Account
248
263
  operationId: 'Update Address'
249
264
  parameters:
250
- - name: id
251
- in: path
252
- required: true
253
- description: Selected Address for update
254
- schema:
255
- type: string
256
- example: '1'
265
+ - $ref: '#/components/parameters/AddressId'
257
266
  requestBody:
258
267
  required: true
259
268
  content:
@@ -5246,6 +5255,14 @@ components:
5246
5255
  - state_name
5247
5256
  - country_iso
5248
5257
  parameters:
5258
+ AddressId:
5259
+ name: address_id
5260
+ in: path
5261
+ required: true
5262
+ description: Address ID
5263
+ schema:
5264
+ type: string
5265
+ example: '1'
5249
5266
  CreditCardIncludeParam:
5250
5267
  name: include
5251
5268
  in: query
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0.rc4
4
+ version: 4.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Bigg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-20 00:00:00.000000000 Z
11
+ date: 2021-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jsonapi-rspec
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 4.2.0.rc4
33
+ version: 4.2.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 4.2.0.rc4
40
+ version: 4.2.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rabl
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -147,6 +147,7 @@ files:
147
147
  - app/controllers/spree/api/v2/storefront/taxons_controller.rb
148
148
  - app/helpers/spree/api/api_helpers.rb
149
149
  - app/helpers/spree/api/v2/collection_options_helpers.rb
150
+ - app/helpers/spree/api/v2/display_money_helper.rb
150
151
  - app/models/concerns/spree/user_api_authentication.rb
151
152
  - app/models/concerns/spree/user_api_methods.rb
152
153
  - app/models/spree/api_configuration.rb
@@ -180,6 +181,7 @@ files:
180
181
  - app/serializers/spree/v2/storefront/taxonomy_serializer.rb
181
182
  - app/serializers/spree/v2/storefront/user_serializer.rb
182
183
  - app/serializers/spree/v2/storefront/variant_serializer.rb
184
+ - app/services/spree/api/error_handler.rb
183
185
  - app/views/spree/api/errors/gateway_error.rabl
184
186
  - app/views/spree/api/errors/invalid_api_key.rabl
185
187
  - app/views/spree/api/errors/invalid_resource.rabl
@@ -308,9 +310,9 @@ licenses:
308
310
  - BSD-3-Clause
309
311
  metadata:
310
312
  bug_tracker_uri: https://github.com/spree/spree/issues
311
- changelog_uri: https://github.com/spree/spree/releases/tag/v4.2.0.rc4
313
+ changelog_uri: https://github.com/spree/spree/releases/tag/v4.2.3
312
314
  documentation_uri: https://guides.spreecommerce.org/
313
- source_code_uri: https://github.com/spree/spree/tree/v4.2.0.rc4
315
+ source_code_uri: https://github.com/spree/spree/tree/v4.2.3
314
316
  post_install_message:
315
317
  rdoc_options: []
316
318
  require_paths:
@@ -322,11 +324,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
322
324
  version: 2.5.0
323
325
  required_rubygems_version: !ruby/object:Gem::Requirement
324
326
  requirements:
325
- - - ">"
327
+ - - ">="
326
328
  - !ruby/object:Gem::Version
327
- version: 1.3.1
329
+ version: '0'
328
330
  requirements: []
329
- rubygems_version: 3.1.4
331
+ rubygems_version: 3.2.3
330
332
  signing_key:
331
333
  specification_version: 4
332
334
  summary: Spree's API