spree_api 4.2.0.rc4 → 4.2.3

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.
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