spree_api 4.2.7 → 4.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +14 -1
  3. data/app/controllers/concerns/spree/api/v2/product_list_includes.rb +23 -0
  4. data/app/controllers/spree/api/v1/classifications_controller.rb +4 -3
  5. data/app/controllers/spree/api/v1/orders_controller.rb +5 -1
  6. data/app/controllers/spree/api/v1/products_controller.rb +2 -2
  7. data/app/controllers/spree/api/v1/taxonomies_controller.rb +1 -1
  8. data/app/controllers/spree/api/v2/base_controller.rb +29 -6
  9. data/app/controllers/spree/api/v2/platform/addresses_controller.rb +19 -0
  10. data/app/controllers/spree/api/v2/platform/classifications_controller.rb +43 -0
  11. data/app/controllers/spree/api/v2/platform/cms_pages_controller.rb +15 -0
  12. data/app/controllers/spree/api/v2/platform/cms_sections_controller.rb +34 -0
  13. data/app/controllers/spree/api/v2/platform/countries_controller.rb +19 -0
  14. data/app/controllers/spree/api/v2/platform/menu_items_controller.rb +35 -0
  15. data/app/controllers/spree/api/v2/platform/menus_controller.rb +19 -0
  16. data/app/controllers/spree/api/v2/platform/option_types_controller.rb +15 -0
  17. data/app/controllers/spree/api/v2/platform/option_values_controller.rb +19 -0
  18. data/app/controllers/spree/api/v2/platform/products_controller.rb +21 -0
  19. data/app/controllers/spree/api/v2/platform/resource_controller.rb +112 -0
  20. data/app/controllers/spree/api/v2/platform/taxons_controller.rb +30 -0
  21. data/app/controllers/spree/api/v2/platform/users_controller.rb +28 -0
  22. data/app/controllers/spree/api/v2/resource_controller.rb +18 -6
  23. data/app/controllers/spree/api/v2/storefront/account/addresses_controller.rb +2 -14
  24. data/app/controllers/spree/api/v2/storefront/account/credit_cards_controller.rb +13 -11
  25. data/app/controllers/spree/api/v2/storefront/account/orders_controller.rb +2 -2
  26. data/app/controllers/spree/api/v2/storefront/account_controller.rb +32 -1
  27. data/app/controllers/spree/api/v2/storefront/cart_controller.rb +28 -6
  28. data/app/controllers/spree/api/v2/storefront/checkout_controller.rb +2 -1
  29. data/app/controllers/spree/api/v2/storefront/cms_pages_controller.rb +41 -0
  30. data/app/controllers/spree/api/v2/storefront/countries_controller.rb +9 -14
  31. data/app/controllers/spree/api/v2/storefront/menus_controller.rb +35 -0
  32. data/app/controllers/spree/api/v2/storefront/order_status_controller.rb +1 -1
  33. data/app/controllers/spree/api/v2/storefront/products_controller.rb +6 -12
  34. data/app/controllers/spree/api/v2/storefront/stores_controller.rb +1 -1
  35. data/app/controllers/spree/api/v2/storefront/taxons_controller.rb +7 -8
  36. data/app/helpers/spree/api/v2/display_money_helper.rb +2 -2
  37. data/app/models/spree/api_configuration.rb +1 -0
  38. data/app/models/spree/api_dependencies.rb +19 -5
  39. data/app/serializers/concerns/spree/api/v2/resource_serializer_concern.rb +16 -0
  40. data/app/serializers/spree/api/v2/base_serializer.rb +32 -0
  41. data/app/serializers/spree/api/v2/platform/address_serializer.rb +15 -0
  42. data/app/serializers/spree/api/v2/platform/base_serializer.rb +10 -0
  43. data/app/serializers/spree/api/v2/platform/classification_serializer.rb +14 -0
  44. data/app/serializers/spree/api/v2/platform/cms_page_serializer.rb +13 -0
  45. data/app/serializers/spree/api/v2/platform/cms_section_serializer.rb +11 -0
  46. data/app/serializers/spree/api/v2/platform/country_serializer.rb +13 -0
  47. data/app/serializers/spree/api/v2/platform/image_serializer.rb +15 -0
  48. data/app/serializers/spree/api/v2/platform/menu_item_serializer.rb +22 -0
  49. data/app/serializers/spree/api/v2/platform/menu_serializer.rb +13 -0
  50. data/app/serializers/spree/api/v2/platform/option_type_serializer.rb +13 -0
  51. data/app/serializers/spree/api/v2/platform/option_value_serializer.rb +13 -0
  52. data/app/serializers/spree/api/v2/platform/product_property_serializer.rb +11 -0
  53. data/app/serializers/spree/api/v2/platform/product_serializer.rb +78 -0
  54. data/app/serializers/spree/api/v2/platform/state_serializer.rb +13 -0
  55. data/app/serializers/spree/api/v2/platform/stock_item_serializer.rb +20 -0
  56. data/app/serializers/spree/api/v2/platform/stock_location_serializer.rb +16 -0
  57. data/app/serializers/spree/api/v2/platform/store_serializer.rb +14 -0
  58. data/app/serializers/spree/api/v2/platform/tax_category_serializer.rb +13 -0
  59. data/app/serializers/spree/api/v2/platform/taxon_image_serializer.rb +13 -0
  60. data/app/serializers/spree/api/v2/platform/taxon_serializer.rb +38 -0
  61. data/app/serializers/spree/api/v2/platform/taxonomy_serializer.rb +14 -0
  62. data/app/serializers/spree/api/v2/platform/user_serializer.rb +21 -0
  63. data/app/serializers/spree/api/v2/platform/variant_serializer.rb +57 -0
  64. data/app/serializers/spree/v2/storefront/base_serializer.rb +3 -2
  65. data/app/serializers/spree/v2/storefront/cms_page_serializer.rb +14 -0
  66. data/app/serializers/spree/v2/storefront/cms_section_serializer.rb +28 -0
  67. data/app/serializers/spree/v2/storefront/country_serializer.rb +4 -4
  68. data/app/serializers/spree/v2/storefront/estimated_shipping_rate_serializer.rb +2 -0
  69. data/app/serializers/spree/v2/storefront/menu_item_serializer.rb +37 -0
  70. data/app/serializers/spree/v2/storefront/menu_serializer.rb +13 -0
  71. data/app/serializers/spree/v2/storefront/product_property_serializer.rb +1 -1
  72. data/app/serializers/spree/v2/storefront/product_serializer.rb +4 -1
  73. data/app/serializers/spree/v2/storefront/store_serializer.rb +10 -0
  74. data/app/serializers/spree/v2/storefront/taxon_serializer.rb +6 -5
  75. data/config/initializers/doorkeeper.rb +8 -1
  76. data/config/initializers/rabl.rb +9 -0
  77. data/config/routes.rb +115 -3
  78. data/db/migrate/20210727102516_change_integer_id_columns_type.rb +9 -0
  79. data/docs/oauth/index.yml +2 -2
  80. data/docs/v2/platform/index.yaml +1501 -0
  81. data/docs/v2/storefront/index.yaml +48 -2
  82. data/lib/spree/api/engine.rb +6 -17
  83. data/lib/spree/api/testing_support/v2/base.rb +1 -1
  84. data/lib/spree/api/testing_support/v2/platform_contexts.rb +214 -0
  85. data/lib/spree/api/testing_support/v2/serializers_params.rb +14 -0
  86. data/lib/spree/api.rb +1 -0
  87. data/spree_api.gemspec +3 -0
  88. metadata +101 -11
  89. data/app/assets/javascripts/spree/api/main.js +0 -36
  90. data/app/assets/javascripts/spree/api/storefront/cart.js +0 -49
@@ -33,11 +33,11 @@ module Spree
33
33
  private
34
34
 
35
35
  def collection
36
- collection_finder.new(scope: scope, params: params).execute
36
+ collection_finder.new(scope: scope, params: finder_params).execute
37
37
  end
38
38
 
39
39
  def scope
40
- super.not_deleted
40
+ super.where(user: spree_current_user).not_deleted
41
41
  end
42
42
 
43
43
  def model_class
@@ -56,10 +56,6 @@ module Spree
56
56
  Spree::Api::Dependencies.storefront_address_serializer.constantize
57
57
  end
58
58
 
59
- def serialize_collection(collection)
60
- collection_serializer.new(collection).serializable_hash
61
- end
62
-
63
59
  def create_service
64
60
  Spree::Api::Dependencies.storefront_account_create_address_service.constantize
65
61
  end
@@ -71,14 +67,6 @@ module Spree
71
67
  def address_params
72
68
  params.require(:address).permit(permitted_address_attributes)
73
69
  end
74
-
75
- def render_result(result)
76
- if result.success?
77
- render_serialized_payload { serialize_resource(result.value) }
78
- else
79
- render_error_payload(result.error)
80
- end
81
- end
82
70
  end
83
71
  end
84
72
  end
@@ -6,14 +6,24 @@ module Spree
6
6
  class CreditCardsController < ::Spree::Api::V2::ResourceController
7
7
  before_action :require_spree_current_user
8
8
 
9
+ def destroy
10
+ spree_authorize! :destroy, resource, resource
11
+
12
+ destroy_service.call(card: resource)
13
+ end
14
+
9
15
  private
10
16
 
17
+ def resource
18
+ params[:id].eql?('default') ? scope.default.first! : scope.find(params[:id])
19
+ end
20
+
11
21
  def model_class
12
22
  Spree::CreditCard
13
23
  end
14
24
 
15
25
  def scope
16
- super.where(user: spree_current_user)
26
+ super.where(user: spree_current_user, payment_method: current_store.payment_methods.available_on_front_end)
17
27
  end
18
28
 
19
29
  def collection_serializer
@@ -28,16 +38,8 @@ module Spree
28
38
  Spree::Api::Dependencies.storefront_credit_card_serializer.constantize
29
39
  end
30
40
 
31
- def resource_finder
32
- Spree::Api::Dependencies.storefront_credit_card_finder.constantize
33
- end
34
-
35
- def serialize_collection(collection)
36
- collection_serializer.new(
37
- collection,
38
- include: resource_includes,
39
- fields: sparse_fields
40
- ).serializable_hash
41
+ def destroy_service
42
+ Spree::Api::Dependencies.storefront_credit_cards_destroy_service.constantize
41
43
  end
42
44
  end
43
45
  end
@@ -9,11 +9,11 @@ module Spree
9
9
  private
10
10
 
11
11
  def collection
12
- collection_finder.new(user: spree_current_user).execute
12
+ collection_finder.new(user: spree_current_user, store: current_store).execute
13
13
  end
14
14
 
15
15
  def resource
16
- resource = resource_finder.new(user: spree_current_user, number: params[:id]).execute.take
16
+ resource = resource_finder.new(user: spree_current_user, number: params[:id], store: current_store).execute.take
17
17
  raise ActiveRecord::RecordNotFound if resource.nil?
18
18
 
19
19
  resource
@@ -3,7 +3,18 @@ module Spree
3
3
  module V2
4
4
  module Storefront
5
5
  class AccountController < ::Spree::Api::V2::ResourceController
6
- before_action :require_spree_current_user
6
+ before_action :require_spree_current_user, except: :create
7
+
8
+ def create
9
+ result = create_service.call(user_params: user_create_params)
10
+ render_result(result)
11
+ end
12
+
13
+ def update
14
+ spree_authorize! :update, spree_current_user
15
+ result = update_service.call(user: spree_current_user, user_params: user_update_params)
16
+ render_result(result)
17
+ end
7
18
 
8
19
  private
9
20
 
@@ -14,6 +25,26 @@ module Spree
14
25
  def resource_serializer
15
26
  Spree::Api::Dependencies.storefront_user_serializer.constantize
16
27
  end
28
+
29
+ def model_class
30
+ Spree.user_class
31
+ end
32
+
33
+ def create_service
34
+ Spree::Api::Dependencies.storefront_account_create_service.constantize
35
+ end
36
+
37
+ def update_service
38
+ Spree::Api::Dependencies.storefront_account_update_service.constantize
39
+ end
40
+
41
+ def user_create_params
42
+ user_update_params.except(:bill_address_id, :ship_address_id)
43
+ end
44
+
45
+ def user_update_params
46
+ params.require(:user).permit(permitted_user_attributes)
47
+ end
17
48
  end
18
49
  end
19
50
  end
@@ -50,11 +50,25 @@ module Spree
50
50
  def empty
51
51
  spree_authorize! :update, spree_current_order, order_token
52
52
 
53
- # TODO: we should extract this logic into service and let
54
- # developers overwrite it
55
- spree_current_order.empty!
53
+ result = empty_cart_service.call(order: spree_current_order)
56
54
 
57
- render_serialized_payload { serialized_current_order }
55
+ if result.success?
56
+ render_serialized_payload { serialized_current_order }
57
+ else
58
+ render_error_payload(result.error)
59
+ end
60
+ end
61
+
62
+ def destroy
63
+ spree_authorize! :update, spree_current_order, order_token
64
+
65
+ result = destroy_cart_service.call(order: spree_current_order)
66
+
67
+ if result.success?
68
+ head 204
69
+ else
70
+ render_error_payload(result.error)
71
+ end
58
72
  end
59
73
 
60
74
  def set_quantity
@@ -128,6 +142,14 @@ module Spree
128
142
  Spree::Api::Dependencies.storefront_cart_add_item_service.constantize
129
143
  end
130
144
 
145
+ def empty_cart_service
146
+ Spree::Api::Dependencies.storefront_cart_empty_service.constantize
147
+ end
148
+
149
+ def destroy_cart_service
150
+ Spree::Api::Dependencies.storefront_cart_destroy_service.constantize
151
+ end
152
+
131
153
  def set_item_quantity_service
132
154
  Spree::Api::Dependencies.storefront_cart_set_item_quantity_service.constantize
133
155
  end
@@ -149,7 +171,7 @@ module Spree
149
171
  end
150
172
 
151
173
  def load_variant
152
- @variant = Spree::Variant.find(params[:variant_id])
174
+ @variant = current_store.variants.find(params[:variant_id])
153
175
  end
154
176
 
155
177
  def render_error_item_quantity
@@ -163,7 +185,7 @@ module Spree
163
185
  def serialize_estimated_shipping_rates(shipping_rates)
164
186
  estimate_shipping_rates_serializer.new(
165
187
  shipping_rates,
166
- params: { currency: spree_current_order.currency }
188
+ params: serializer_params
167
189
  ).serializable_hash
168
190
  end
169
191
 
@@ -119,12 +119,13 @@ module Spree
119
119
  end
120
120
 
121
121
  def serialize_payment_methods(payment_methods)
122
- payment_methods_serializer.new(payment_methods).serializable_hash
122
+ payment_methods_serializer.new(payment_methods, params: serializer_params).serializable_hash
123
123
  end
124
124
 
125
125
  def serialize_shipping_rates(shipments)
126
126
  shipping_rates_serializer.new(
127
127
  shipments,
128
+ params: serializer_params,
128
129
  include: [:shipping_rates, :stock_location]
129
130
  ).serializable_hash
130
131
  end
@@ -0,0 +1,41 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class CmsPagesController < ::Spree::Api::V2::ResourceController
6
+ private
7
+
8
+ def model_class
9
+ Spree::CmsPage
10
+ end
11
+
12
+ def resource
13
+ @resource ||= scope.find_by(slug: params[:id]) || scope.find(params[:id])
14
+ end
15
+
16
+ def resource_serializer
17
+ Spree::Api::Dependencies.storefront_cms_page_serializer.constantize
18
+ end
19
+
20
+ def collection_serializer
21
+ Spree::Api::Dependencies.storefront_cms_page_serializer.constantize
22
+ end
23
+
24
+ def collection_finder
25
+ Spree::Api::Dependencies.storefront_cms_page_finder.constantize
26
+ end
27
+
28
+ def scope
29
+ super.by_locale(I18n.locale)
30
+ end
31
+
32
+ def scope_includes
33
+ {
34
+ cms_sections: :linked_resource
35
+ }
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -6,27 +6,22 @@ module Spree
6
6
  private
7
7
 
8
8
  def serialize_collection(collection)
9
- collection_serializer.new(collection).serializable_hash
9
+ collection_serializer.new(
10
+ collection,
11
+ collection_options(collection).merge(params: collection_serializer_params)
12
+ ).serializable_hash
10
13
  end
11
14
 
12
- def serialize_resource(resource)
13
- resource_serializer.new(
14
- resource,
15
- include: resource_includes,
16
- fields: sparse_fields,
17
- params: resource_serializer_params
18
- ).serializable_hash
15
+ def serializer_params
16
+ super.merge(include_states: true)
19
17
  end
20
18
 
21
- def resource_serializer_params
22
- {
23
- include_states: true,
24
- current_store: current_store
25
- }
19
+ def collection_serializer_params
20
+ serializer_params.merge(include_states: false)
26
21
  end
27
22
 
28
23
  def resource
29
- return scope.default if params[:iso] == 'default'
24
+ return current_store.default_country if params[:iso] == 'default'
30
25
 
31
26
  scope.find_by(iso: params[:iso]&.upcase) ||
32
27
  scope.find_by(id: params[:iso]&.upcase) ||
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ class MenusController < ::Spree::Api::V2::ResourceController
6
+ private
7
+
8
+ def resource_serializer
9
+ Spree::Api::Dependencies.storefront_menu_serializer.constantize
10
+ end
11
+
12
+ def collection_serializer
13
+ Spree::Api::Dependencies.storefront_menu_serializer.constantize
14
+ end
15
+
16
+ def collection_finder
17
+ Spree::Api::Dependencies.storefront_menu_finder.constantize
18
+ end
19
+
20
+ def model_class
21
+ Spree::Menu
22
+ end
23
+
24
+ def scope
25
+ super.by_locale(I18n.locale)
26
+ end
27
+
28
+ def scope_includes
29
+ { menu_items: [:children, :parent, :icon] }
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -10,7 +10,7 @@ module Spree
10
10
  private
11
11
 
12
12
  def resource
13
- resource = resource_finder.new(number: params[:number], token: order_token).execute.take
13
+ resource = resource_finder.new(number: params[:number], token: order_token, store: current_store).execute.take
14
14
  raise ActiveRecord::RecordNotFound if resource.nil?
15
15
 
16
16
  resource
@@ -3,18 +3,20 @@ module Spree
3
3
  module V2
4
4
  module Storefront
5
5
  class ProductsController < ::Spree::Api::V2::ResourceController
6
- private
6
+ include ::Spree::Api::V2::ProductListIncludes
7
+
8
+ protected
7
9
 
8
10
  def sorted_collection
9
11
  collection_sorter.new(collection, current_currency, params, allowed_sort_attributes).call
10
12
  end
11
13
 
12
14
  def collection
13
- collection_finder.new(scope: scope, params: params, current_currency: current_currency).execute
15
+ @collection ||= collection_finder.new(scope: scope, params: finder_params).execute
14
16
  end
15
17
 
16
18
  def resource
17
- scope.find_by(slug: params[:id]) || scope.find(params[:id])
19
+ @resource ||= scope.find_by(slug: params[:id]) || scope.find(params[:id])
18
20
  end
19
21
 
20
22
  def collection_sorter
@@ -38,15 +40,7 @@ module Spree
38
40
  end
39
41
 
40
42
  def scope_includes
41
- {
42
- master: :default_price,
43
- variants: [],
44
- variant_images: [],
45
- taxons: [],
46
- product_properties: :property,
47
- option_types: :option_values,
48
- variants_including_master: %i[default_price option_values]
49
- }
43
+ product_list_includes
50
44
  end
51
45
  end
52
46
  end
@@ -10,7 +10,7 @@ module Spree
10
10
  end
11
11
 
12
12
  def resource
13
- scope.find_by!(code: params[:code])
13
+ @resource ||= scope.find_by!(code: params[:code])
14
14
  end
15
15
 
16
16
  def resource_serializer
@@ -18,15 +18,11 @@ module Spree
18
18
  end
19
19
 
20
20
  def paginated_collection
21
- collection_paginator.new(collection, params).call
22
- end
23
-
24
- def collection
25
- collection_finder.new(scope: scope, params: params).execute
21
+ @paginated_collection ||= collection_paginator.new(collection, params).call
26
22
  end
27
23
 
28
24
  def resource
29
- scope.find_by(permalink: params[:id]) || scope.find(params[:id])
25
+ @resource ||= scope.find_by(permalink: params[:id]) || scope.find(params[:id])
30
26
  end
31
27
 
32
28
  def model_class
@@ -34,16 +30,19 @@ module Spree
34
30
  end
35
31
 
36
32
  def scope_includes
37
- node_includes = %i[icon products parent taxonomy]
33
+ node_includes = %i[icon parent taxonomy]
38
34
 
39
35
  {
40
36
  parent: node_includes,
41
37
  children: node_includes,
42
38
  taxonomy: [root: node_includes],
43
- products: [],
44
39
  icon: [attachment_attachment: :blob]
45
40
  }
46
41
  end
42
+
43
+ def serializer_params
44
+ super.merge(include_products: action_name == 'show')
45
+ end
47
46
  end
48
47
  end
49
48
  end
@@ -13,7 +13,7 @@ module Spree
13
13
  price = find_price(product_or_variant, currency)
14
14
  return nil if price.new_record?
15
15
 
16
- format('%.2f', price.amount)
16
+ price.amount
17
17
  end
18
18
 
19
19
  def display_price(product_or_variant, currency)
@@ -27,7 +27,7 @@ module Spree
27
27
  price = find_price(product_or_variant, currency)
28
28
  return nil if price.new_record? || price.compare_at_amount.blank?
29
29
 
30
- format('%.2f', price.compare_at_amount)
30
+ price.compare_at_amount
31
31
  end
32
32
 
33
33
  def display_compare_at_price(product_or_variant, currency)
@@ -1,6 +1,7 @@
1
1
  module Spree
2
2
  class ApiConfiguration < Preferences::Configuration
3
3
  preference :requires_authentication, :boolean, default: true
4
+ preference :api_v2_cache_ttl, :integer, default: 3600 # 1 hour in seconds
4
5
  preference :api_v2_content_type, :string, default: 'application/vnd.api+json'
5
6
  preference :api_v2_per_page_limit, :integer, default: 100
6
7
  end
@@ -5,18 +5,21 @@ module Spree
5
5
  INJECTION_POINTS = [
6
6
  :storefront_cart_create_service, :storefront_cart_add_item_service, :storefront_cart_remove_line_item_service,
7
7
  :storefront_cart_remove_item_service, :storefront_cart_set_item_quantity_service, :storefront_cart_recalculate_service,
8
+ :storefront_cms_page_serializer, :storefront_cms_page_finder,
8
9
  :storefront_cart_update, :storefront_coupon_handler, :storefront_checkout_next_service, :storefront_checkout_advance_service,
9
10
  :storefront_checkout_update_service, :storefront_checkout_complete_service, :storefront_checkout_add_store_credit_service,
10
11
  :storefront_checkout_remove_store_credit_service, :storefront_checkout_get_shipping_rates_service,
11
12
  :storefront_cart_compare_line_items_service, :storefront_cart_serializer, :storefront_credit_card_serializer,
12
13
  :storefront_credit_card_finder, :storefront_shipment_serializer, :storefront_payment_method_serializer, :storefront_country_finder,
13
- :storefront_country_serializer, :storefront_current_order_finder, :storefront_completed_order_finder, :storefront_order_sorter,
14
- :storefront_collection_paginator, :storefront_user_serializer, :storefront_products_sorter, :storefront_products_finder,
15
- :storefront_product_serializer, :storefront_taxon_serializer, :storefront_taxon_finder, :storefront_find_by_variant_finder,
16
- :storefront_cart_update_service, :storefront_cart_estimate_shipping_rates_service, :storefront_estimated_shipment_serializer,
14
+ :storefront_country_serializer, :storefront_menu_serializer, :storefront_menu_finder, :storefront_current_order_finder,
15
+ :storefront_completed_order_finder, :storefront_order_sorter, :storefront_collection_paginator, :storefront_user_serializer,
16
+ :storefront_products_sorter, :storefront_products_finder, :storefront_product_serializer, :storefront_taxon_serializer,
17
+ :storefront_taxon_finder, :storefront_find_by_variant_finder, :storefront_cart_update_service,
18
+ :storefront_cart_estimate_shipping_rates_service, :storefront_estimated_shipment_serializer,
17
19
  :storefront_store_serializer, :storefront_address_serializer, :storefront_order_serializer,
18
20
  :storefront_account_create_address_service, :storefront_account_update_address_service, :storefront_address_finder,
19
- :storefront_collection_sorter, :error_handler
21
+ :storefront_account_create_service, :storefront_account_update_service, :storefront_collection_sorter, :error_handler,
22
+ :storefront_cart_empty_service, :storefront_cart_destroy_service, :storefront_credit_cards_destroy_service
20
23
  ].freeze
21
24
 
22
25
  attr_accessor *INJECTION_POINTS
@@ -38,6 +41,8 @@ module Spree
38
41
  @storefront_cart_set_item_quantity_service = Spree::Dependencies.cart_set_item_quantity_service
39
42
  @storefront_cart_recalculate_service = Spree::Dependencies.cart_recalculate_service
40
43
  @storefront_cart_estimate_shipping_rates_service = Spree::Dependencies.cart_estimate_shipping_rates_service
44
+ @storefront_cart_empty_service = Spree::Dependencies.cart_empty_service
45
+ @storefront_cart_destroy_service = Spree::Dependencies.cart_destroy_service
41
46
 
42
47
  # coupon code handler
43
48
  @storefront_coupon_handler = Spree::Dependencies.coupon_handler
@@ -52,14 +57,21 @@ module Spree
52
57
  @storefront_checkout_get_shipping_rates_service = Spree::Dependencies.checkout_get_shipping_rates_service
53
58
 
54
59
  # account services
60
+ @storefront_account_create_service = Spree::Dependencies.account_create_service
61
+ @storefront_account_update_service = Spree::Dependencies.account_update_service
55
62
  @storefront_account_create_address_service = Spree::Dependencies.account_create_address_service
56
63
  @storefront_account_update_address_service = Spree::Dependencies.account_update_address_service
57
64
 
65
+ # credit cards
66
+ @storefront_credit_cards_destroy_service = Spree::Dependencies.credit_cards_destroy_service
67
+
58
68
  # serializers
59
69
  @storefront_address_serializer = 'Spree::V2::Storefront::AddressSerializer'
60
70
  @storefront_cart_serializer = 'Spree::V2::Storefront::CartSerializer'
71
+ @storefront_cms_page_serializer = 'Spree::V2::Storefront::CmsPageSerializer'
61
72
  @storefront_credit_card_serializer = 'Spree::V2::Storefront::CreditCardSerializer'
62
73
  @storefront_country_serializer = 'Spree::V2::Storefront::CountrySerializer'
74
+ @storefront_menu_serializer = 'Spree::V2::Storefront::MenuSerializer'
63
75
  @storefront_user_serializer = 'Spree::V2::Storefront::UserSerializer'
64
76
  @storefront_shipment_serializer = 'Spree::V2::Storefront::ShipmentSerializer'
65
77
  @storefront_taxon_serializer = 'Spree::V2::Storefront::TaxonSerializer'
@@ -80,6 +92,8 @@ module Spree
80
92
  # finders
81
93
  @storefront_address_finder = Spree::Dependencies.address_finder
82
94
  @storefront_country_finder = Spree::Dependencies.country_finder
95
+ @storefront_cms_page_finder = Spree::Dependencies.cms_page_finder
96
+ @storefront_menu_finder = Spree::Dependencies.menu_finder
83
97
  @storefront_current_order_finder = Spree::Dependencies.current_order_finder
84
98
  @storefront_completed_order_finder = Spree::Dependencies.completed_order_finder
85
99
  @storefront_credit_card_finder = Spree::Dependencies.credit_card_finder
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module ResourceSerializerConcern
5
+ extend ActiveSupport::Concern
6
+
7
+ def self.included(base)
8
+ model_klazz = "Spree::#{base.to_s.demodulize.gsub(/Serializer/, '')}".constantize
9
+
10
+ base.set_type model_klazz.json_api_type
11
+ base.attributes(*model_klazz.json_api_columns)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,32 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ class BaseSerializer
5
+ include JSONAPI::Serializer
6
+
7
+ # to learn more about caching, please refer to:
8
+ # https://github.com/jsonapi-serializer/jsonapi-serializer#caching
9
+ # https://guides.rubyonrails.org/caching_with_rails.html#low-level-caching
10
+ cache_options(store: Rails.cache, namespace: 'jsonapi-serializer', expires_in: Spree::Api::Config[:api_v2_cache_ttl])
11
+
12
+ def self.record_cache_options(options, fieldset, include_list, params)
13
+ opts = options.dup
14
+
15
+ params_cache_key = params.map do |param|
16
+ next if param.nil? || param.last.nil?
17
+
18
+ if param.last.respond_to?(:cache_key_with_version)
19
+ param.last.cache_key_with_version
20
+ else
21
+ param.last.to_s.downcase
22
+ end
23
+ end.compact.reject(&:blank?).join('-')
24
+
25
+ opts[:namespace] += "-#{params_cache_key}"
26
+
27
+ super(opts, fieldset, include_list, params)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Platform
5
+ class AddressSerializer < BaseSerializer
6
+ include ::Spree::Api::V2::ResourceSerializerConcern
7
+
8
+ belongs_to :country
9
+ belongs_to :state
10
+ belongs_to :user
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Platform
5
+ class BaseSerializer < ::Spree::Api::V2::BaseSerializer
6
+ end
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Platform
5
+ class ClassificationSerializer < BaseSerializer
6
+ include ::Spree::Api::V2::ResourceSerializerConcern
7
+
8
+ belongs_to :product
9
+ belongs_to :taxon
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Platform
5
+ class CmsPageSerializer < BaseSerializer
6
+ include ::Spree::Api::V2::ResourceSerializerConcern
7
+
8
+ has_many :cms_sections, serializer: :cms_section
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Platform
5
+ class CmsSectionSerializer < BaseSerializer
6
+ include ::Spree::Api::V2::ResourceSerializerConcern
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Platform
5
+ class CountrySerializer < BaseSerializer
6
+ include ::Spree::Api::V2::ResourceSerializerConcern
7
+
8
+ has_many :states
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end