spree_api 4.3.0.rc3 → 4.4.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/spree/api/v2/caching.rb +7 -3
  3. data/app/controllers/concerns/spree/api/v2/coupon_codes_helper.rb +29 -0
  4. data/app/controllers/concerns/spree/api/v2/number_resource.rb +11 -0
  5. data/app/controllers/concerns/spree/api/v2/platform/nested_set_reposition_concern.rb +37 -0
  6. data/app/controllers/concerns/spree/api/v2/platform/promotion_calculator_params.rb +17 -0
  7. data/app/controllers/concerns/spree/api/v2/platform/promotion_rule_params.rb +16 -0
  8. data/app/controllers/concerns/spree/api/v2/storefront/metadata_controller_concern.rb +18 -0
  9. data/app/controllers/spree/api/v1/checkouts_controller.rb +1 -1
  10. data/app/controllers/spree/api/v2/base_controller.rb +7 -5
  11. data/app/controllers/spree/api/v2/platform/adjustments_controller.rb +19 -0
  12. data/app/controllers/spree/api/v2/platform/classifications_controller.rb +1 -22
  13. data/app/controllers/spree/api/v2/platform/cms_pages_controller.rb +4 -0
  14. data/app/controllers/spree/api/v2/platform/cms_sections_controller.rb +13 -18
  15. data/app/controllers/spree/api/v2/platform/digital_links_controller.rb +25 -0
  16. data/app/controllers/spree/api/v2/platform/digitals_controller.rb +19 -0
  17. data/app/controllers/spree/api/v2/platform/line_items_controller.rb +59 -0
  18. data/app/controllers/spree/api/v2/platform/menu_items_controller.rb +5 -19
  19. data/app/controllers/spree/api/v2/platform/menus_controller.rb +0 -4
  20. data/app/controllers/spree/api/v2/platform/orders_controller.rb +163 -0
  21. data/app/controllers/spree/api/v2/platform/payment_methods_controller.rb +27 -0
  22. data/app/controllers/spree/api/v2/platform/payments_controller.rb +17 -0
  23. data/app/controllers/spree/api/v2/platform/promotion_actions_controller.rb +30 -0
  24. data/app/controllers/spree/api/v2/platform/promotion_categories_controller.rb +19 -0
  25. data/app/controllers/spree/api/v2/platform/promotion_rules_controller.rb +25 -0
  26. data/app/controllers/spree/api/v2/platform/promotions_controller.rb +31 -0
  27. data/app/controllers/spree/api/v2/platform/resource_controller.rb +47 -16
  28. data/app/controllers/spree/api/v2/platform/roles_controller.rb +15 -0
  29. data/app/controllers/spree/api/v2/platform/shipments_controller.rb +143 -0
  30. data/app/controllers/spree/api/v2/platform/shipping_categories_controller.rb +15 -0
  31. data/app/controllers/spree/api/v2/platform/shipping_methods_controller.rb +24 -0
  32. data/app/controllers/spree/api/v2/platform/states_controller.rb +19 -0
  33. data/app/controllers/spree/api/v2/platform/stock_items_controller.rb +19 -0
  34. data/app/controllers/spree/api/v2/platform/stock_locations_controller.rb +19 -0
  35. data/app/controllers/spree/api/v2/platform/store_credit_categories_controller.rb +15 -0
  36. data/app/controllers/spree/api/v2/platform/store_credit_types_controller.rb +15 -0
  37. data/app/controllers/spree/api/v2/platform/store_credits_controller.rb +19 -0
  38. data/app/controllers/spree/api/v2/platform/tax_categories_controller.rb +19 -0
  39. data/app/controllers/spree/api/v2/platform/tax_rates_controller.rb +23 -0
  40. data/app/controllers/spree/api/v2/platform/taxonomies_controller.rb +19 -0
  41. data/app/controllers/spree/api/v2/platform/taxons_controller.rb +25 -0
  42. data/app/controllers/spree/api/v2/platform/users_controller.rb +4 -0
  43. data/app/controllers/spree/api/v2/platform/variants_controller.rb +19 -0
  44. data/app/controllers/spree/api/v2/platform/webhooks/events_controller.rb +21 -0
  45. data/app/controllers/spree/api/v2/platform/webhooks/subscribers_controller.rb +21 -0
  46. data/app/controllers/spree/api/v2/platform/wished_items_controller.rb +19 -0
  47. data/app/controllers/spree/api/v2/platform/wishlists_controller.rb +19 -0
  48. data/app/controllers/spree/api/v2/platform/zones_controller.rb +19 -0
  49. data/app/controllers/spree/api/v2/resource_controller.rb +3 -3
  50. data/app/controllers/spree/api/v2/storefront/account/addresses_controller.rb +5 -3
  51. data/app/controllers/spree/api/v2/storefront/account/credit_cards_controller.rb +4 -1
  52. data/app/controllers/spree/api/v2/storefront/cart_controller.rb +57 -29
  53. data/app/controllers/spree/api/v2/storefront/checkout_controller.rb +24 -0
  54. data/app/controllers/spree/api/v2/storefront/digitals_controller.rb +54 -0
  55. data/app/controllers/spree/api/v2/storefront/products_controller.rb +8 -0
  56. data/app/controllers/spree/api/v2/storefront/wishlists_controller.rb +171 -0
  57. data/app/helpers/spree/api/v2/collection_options_helpers.rb +1 -1
  58. data/app/jobs/spree/webhooks/subscribers/make_request_job.rb +17 -0
  59. data/app/models/concerns/spree/webhooks/has_webhooks.rb +58 -0
  60. data/app/models/spree/api/webhooks/order_decorator.rb +43 -0
  61. data/app/models/spree/api/webhooks/payment_decorator.rb +26 -0
  62. data/app/models/spree/api/webhooks/product_decorator.rb +27 -0
  63. data/app/models/spree/api/webhooks/shipment_decorator.rb +21 -0
  64. data/app/models/spree/api/webhooks/stock_item_decorator.rb +43 -0
  65. data/app/models/spree/api/webhooks/stock_movement_decorator.rb +52 -0
  66. data/app/models/spree/api/webhooks/variant_decorator.rb +26 -0
  67. data/app/models/spree/oauth_access_grant.rb +7 -0
  68. data/app/models/spree/oauth_access_token.rb +7 -0
  69. data/app/models/spree/oauth_application.rb +15 -0
  70. data/app/models/spree/webhooks/base.rb +11 -0
  71. data/app/models/spree/webhooks/event.rb +12 -0
  72. data/app/models/spree/webhooks/subscriber.rb +57 -0
  73. data/app/presenters/spree/api/products/filters_presenter.rb +39 -0
  74. data/app/serializers/concerns/spree/api/v2/resource_serializer_concern.rb +19 -1
  75. data/app/serializers/spree/api/v2/base_serializer.rb +11 -4
  76. data/app/serializers/spree/api/v2/platform/address_serializer.rb +1 -1
  77. data/app/serializers/spree/api/v2/platform/adjustment_serializer.rb +20 -0
  78. data/app/serializers/spree/api/v2/platform/asset_serializer.rb +13 -0
  79. data/app/serializers/spree/api/v2/platform/calculator_serializer.rb +17 -0
  80. data/app/serializers/spree/api/v2/platform/classification_serializer.rb +1 -1
  81. data/app/serializers/spree/api/v2/platform/cms_page_serializer.rb +1 -1
  82. data/app/serializers/spree/api/v2/platform/cms_section_serializer.rb +8 -1
  83. data/app/serializers/spree/api/v2/platform/country_serializer.rb +1 -1
  84. data/app/serializers/spree/api/v2/platform/credit_card_serializer.rb +14 -0
  85. data/app/serializers/spree/api/v2/platform/customer_return_serializer.rb +17 -0
  86. data/app/serializers/spree/api/v2/platform/digital_link_serializer.rb +16 -0
  87. data/app/serializers/spree/api/v2/platform/digital_serializer.rb +30 -0
  88. data/app/serializers/spree/api/v2/platform/feature_page_serializer.rb +11 -0
  89. data/app/serializers/spree/api/v2/platform/homepage_serializer.rb +11 -0
  90. data/app/serializers/spree/api/v2/platform/inventory_unit_serializer.rb +19 -0
  91. data/app/serializers/spree/api/v2/platform/line_item_serializer.rb +19 -0
  92. data/app/serializers/spree/api/v2/platform/log_entry_serializer.rb +13 -0
  93. data/app/serializers/spree/api/v2/platform/menu_item_serializer.rb +1 -1
  94. data/app/serializers/spree/api/v2/platform/menu_serializer.rb +1 -1
  95. data/app/serializers/spree/api/v2/platform/option_type_serializer.rb +1 -1
  96. data/app/serializers/spree/api/v2/platform/option_value_serializer.rb +1 -1
  97. data/app/serializers/spree/api/v2/platform/order_promotion_serializer.rb +14 -0
  98. data/app/serializers/spree/api/v2/platform/order_serializer.rb +31 -0
  99. data/app/serializers/spree/api/v2/platform/payment_capture_event_serializer.rb +13 -0
  100. data/app/serializers/spree/api/v2/platform/payment_method_serializer.rb +18 -0
  101. data/app/serializers/spree/api/v2/platform/payment_serializer.rb +21 -0
  102. data/app/serializers/spree/api/v2/platform/price_serializer.rb +19 -0
  103. data/app/serializers/spree/api/v2/platform/product_property_serializer.rb +1 -1
  104. data/app/serializers/spree/api/v2/platform/product_serializer.rb +7 -3
  105. data/app/serializers/spree/api/v2/platform/promotion_action_line_item_serializer.rb +14 -0
  106. data/app/serializers/spree/api/v2/platform/promotion_action_serializer.rb +19 -0
  107. data/app/serializers/spree/api/v2/platform/promotion_category_serializer.rb +13 -0
  108. data/app/serializers/spree/api/v2/platform/promotion_rule_serializer.rb +21 -0
  109. data/app/serializers/spree/api/v2/platform/promotion_serializer.rb +17 -0
  110. data/app/serializers/spree/api/v2/platform/property_serializer.rb +11 -0
  111. data/app/serializers/spree/api/v2/platform/prototype_serializer.rb +15 -0
  112. data/app/serializers/spree/api/v2/platform/refund_reason_serializer.rb +11 -0
  113. data/app/serializers/spree/api/v2/platform/refund_serializer.rb +16 -0
  114. data/app/serializers/spree/api/v2/platform/reimbursement_credit_serializer.rb +10 -0
  115. data/app/serializers/spree/api/v2/platform/reimbursement_serializer.rb +18 -0
  116. data/app/serializers/spree/api/v2/platform/reimbursement_type_serializer.rb +11 -0
  117. data/app/serializers/spree/api/v2/platform/return_authorization_reason_serializer.rb +11 -0
  118. data/app/serializers/spree/api/v2/platform/return_authorization_serializer.rb +17 -0
  119. data/app/serializers/spree/api/v2/platform/return_item_serializer.rb +16 -0
  120. data/app/serializers/spree/api/v2/platform/role_serializer.rb +11 -0
  121. data/app/serializers/spree/api/v2/platform/shipment_serializer.rb +22 -0
  122. data/app/serializers/spree/api/v2/platform/shipping_category_serializer.rb +11 -0
  123. data/app/serializers/spree/api/v2/platform/shipping_method_serializer.rb +16 -0
  124. data/app/serializers/spree/api/v2/platform/shipping_rate_serializer.rb +15 -0
  125. data/app/serializers/spree/api/v2/platform/standard_page_serializer.rb +11 -0
  126. data/app/serializers/spree/api/v2/platform/state_change_serializer.rb +13 -0
  127. data/app/serializers/spree/api/v2/platform/state_serializer.rb +1 -1
  128. data/app/serializers/spree/api/v2/platform/stock_item_serializer.rb +1 -3
  129. data/app/serializers/spree/api/v2/platform/stock_location_serializer.rb +2 -4
  130. data/app/serializers/spree/api/v2/platform/stock_movement_serializer.rb +11 -0
  131. data/app/serializers/spree/api/v2/platform/stock_transfer_serializer.rb +15 -0
  132. data/app/serializers/spree/api/v2/platform/store_credit_category_serializer.rb +12 -0
  133. data/app/serializers/spree/api/v2/platform/store_credit_event_serializer.rb +14 -0
  134. data/app/serializers/spree/api/v2/platform/store_credit_serializer.rb +18 -0
  135. data/app/serializers/spree/api/v2/platform/store_credit_type_serializer.rb +12 -0
  136. data/app/serializers/spree/api/v2/platform/store_serializer.rb +1 -1
  137. data/app/serializers/spree/api/v2/platform/tax_category_serializer.rb +2 -2
  138. data/app/serializers/spree/api/v2/platform/tax_rate_serializer.rb +14 -0
  139. data/app/serializers/spree/api/v2/platform/taxon_serializer.rb +1 -1
  140. data/app/serializers/spree/api/v2/platform/taxonomy_serializer.rb +1 -1
  141. data/app/serializers/spree/api/v2/platform/user_serializer.rb +1 -1
  142. data/app/serializers/spree/api/v2/platform/variant_serializer.rb +3 -2
  143. data/app/serializers/spree/api/v2/platform/webhooks/event_serializer.rb +15 -0
  144. data/app/serializers/spree/api/v2/platform/webhooks/subscriber_serializer.rb +13 -0
  145. data/app/serializers/spree/api/v2/platform/wished_item_serializer.rb +29 -0
  146. data/app/serializers/spree/api/v2/platform/wishlist_serializer.rb +19 -0
  147. data/app/serializers/spree/api/v2/platform/zone_member_serializer.rb +13 -0
  148. data/app/serializers/spree/api/v2/platform/zone_serializer.rb +13 -0
  149. data/app/serializers/spree/v2/storefront/address_serializer.rb +1 -1
  150. data/app/serializers/spree/v2/storefront/cart_serializer.rb +1 -1
  151. data/app/serializers/spree/v2/storefront/cms_section_serializer.rb +5 -1
  152. data/app/serializers/spree/v2/storefront/credit_card_serializer.rb +1 -1
  153. data/app/serializers/spree/v2/storefront/digital_link_serializer.rb +11 -0
  154. data/app/serializers/spree/v2/storefront/estimated_shipping_rate_serializer.rb +2 -2
  155. data/app/serializers/spree/v2/storefront/line_item_serializer.rb +2 -1
  156. data/app/serializers/spree/v2/storefront/option_type_serializer.rb +1 -1
  157. data/app/serializers/spree/v2/storefront/option_value_serializer.rb +1 -1
  158. data/app/serializers/spree/v2/storefront/payment_method_serializer.rb +1 -1
  159. data/app/serializers/spree/v2/storefront/payment_serializer.rb +1 -1
  160. data/app/serializers/spree/v2/storefront/product_serializer.rb +2 -2
  161. data/app/serializers/spree/v2/storefront/promotion_serializer.rb +1 -1
  162. data/app/serializers/spree/v2/storefront/shipment_serializer.rb +2 -1
  163. data/app/serializers/spree/v2/storefront/store_credit_serializer.rb +1 -1
  164. data/app/serializers/spree/v2/storefront/store_serializer.rb +1 -1
  165. data/app/serializers/spree/v2/storefront/taxon_serializer.rb +1 -1
  166. data/app/serializers/spree/v2/storefront/taxonomy_serializer.rb +1 -1
  167. data/app/serializers/spree/v2/storefront/user_serializer.rb +1 -1
  168. data/app/serializers/spree/v2/storefront/variant_serializer.rb +1 -1
  169. data/app/serializers/spree/v2/storefront/wished_item_serializer.rb +29 -0
  170. data/app/serializers/spree/v2/storefront/wishlist_serializer.rb +17 -0
  171. data/app/services/spree/webhooks/subscribers/handle_request.rb +73 -0
  172. data/app/services/spree/webhooks/subscribers/make_request.rb +82 -0
  173. data/app/services/spree/webhooks/subscribers/queue_requests.rb +17 -0
  174. data/app/services/spree/webhooks.rb +13 -0
  175. data/config/i18n-tasks.yml +40 -0
  176. data/config/initializers/doorkeeper.rb +12 -12
  177. data/config/initializers/rabl.rb +2 -2
  178. data/config/locales/en.yml +29 -27
  179. data/config/routes.rb +85 -59
  180. data/db/migrate/20210902162826_create_spree_webhooks_tables.rb +16 -0
  181. data/db/migrate/20210919183228_enable_polymorphic_resource_owner.rb +21 -0
  182. data/db/migrate/20211025162826_create_spree_webhooks_events.rb +14 -0
  183. data/docs/oauth/index.yml +126 -33
  184. data/docs/v2/platform/index.yaml +19182 -1717
  185. data/docs/v2/storefront/index.yaml +14823 -14588
  186. data/{app/models/spree → lib/spree/api}/api_dependencies.rb +60 -5
  187. data/lib/spree/api/engine.rb +24 -1
  188. data/lib/spree/api/testing_support/factories/oauth_application_factory.rb +6 -0
  189. data/lib/spree/api/testing_support/factories/webhook_event_factory.rb +27 -0
  190. data/lib/spree/api/testing_support/factories/webhook_subscriber_factory.rb +13 -0
  191. data/lib/spree/api/testing_support/factories.rb +3 -0
  192. data/lib/spree/api/testing_support/helpers.rb +1 -1
  193. data/lib/spree/api/testing_support/jobs.rb +18 -0
  194. data/lib/spree/api/testing_support/matchers/webhooks.rb +67 -0
  195. data/lib/spree/api/testing_support/serializers.rb +25 -0
  196. data/lib/spree/api/testing_support/spree_webhooks.rb +9 -0
  197. data/lib/spree/api/testing_support/v2/base.rb +1 -1
  198. data/lib/spree/api/testing_support/v2/current_order.rb +34 -1
  199. data/lib/spree/api/testing_support/v2/platform_contexts.rb +109 -50
  200. data/lib/spree/api/testing_support/v2/serializers_params.rb +3 -1
  201. data/lib/spree/api.rb +1 -0
  202. data/spec/fixtures/files/icon_256x256.jpg +0 -0
  203. data/spree_api.gemspec +16 -15
  204. metadata +176 -28
  205. data/app/controllers/spree/api/errors_controller.rb +0 -9
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Webhooks
5
+ module Subscribers
6
+ class HandleRequest
7
+ def initialize(event_name:, subscriber:, webhook_payload_body:)
8
+ @event_name = event_name
9
+ @subscriber = subscriber
10
+ @webhook_payload_body = JSON.parse(webhook_payload_body)
11
+ end
12
+
13
+ def call
14
+ Rails.logger.debug(msg("sending to '#{url}'"))
15
+ Rails.logger.debug(msg("webhook_payload_body: #{body_with_event_metadata}"))
16
+
17
+ if request.unprocessable_uri?
18
+ return process(:warn, msg("can not make a request to '#{url}'"))
19
+ end
20
+ return process(:warn, msg("failed for '#{url}'")) if request.failed_request?
21
+
22
+ process(:debug, msg("success for URL '#{url}'"))
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :webhook_payload_body, :event_name, :subscriber
28
+
29
+ delegate :execution_time, :failed_request?, :response_code, :success?, :unprocessable_uri?, to: :request
30
+ delegate :id, :url, to: :subscriber
31
+ delegate :created_at, :id, to: :event, prefix: true
32
+
33
+ def process(log_level, msg)
34
+ Rails.logger.public_send(log_level, msg)
35
+ make_request
36
+ update_event(msg)
37
+ nil
38
+ end
39
+
40
+ def request
41
+ @request ||=
42
+ Spree::Webhooks::Subscribers::MakeRequest.new(webhook_payload_body: body_with_event_metadata, url: url)
43
+ end
44
+ alias make_request request
45
+
46
+ def body_with_event_metadata
47
+ webhook_payload_body.
48
+ merge(event_created_at: event_created_at, event_id: event_id, event_type: event.name).
49
+ to_json
50
+ end
51
+
52
+ def event
53
+ @event ||= Spree::Webhooks::Event.create!(
54
+ name: event_name, subscriber_id: subscriber.id, url: url
55
+ )
56
+ end
57
+
58
+ def update_event(msg)
59
+ event.update(
60
+ execution_time: execution_time,
61
+ request_errors: msg,
62
+ response_code: response_code,
63
+ success: success?
64
+ )
65
+ end
66
+
67
+ def msg(msg)
68
+ "[SPREE WEBHOOKS] '#{event_name}' #{msg}"
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Webhooks
5
+ module Subscribers
6
+ class MakeRequest
7
+ def initialize(url:, webhook_payload_body:)
8
+ @execution_time_in_milliseconds = 0
9
+ @url = url
10
+ @webhook_payload_body = webhook_payload_body
11
+ @webhooks_timeout = ENV['SPREE_WEBHOOKS_TIMEOUT']
12
+ end
13
+
14
+ def execution_time
15
+ request
16
+ @execution_time_in_milliseconds
17
+ end
18
+
19
+ def failed_request?
20
+ (200...300).exclude?(response_code)
21
+ end
22
+
23
+ def response_code
24
+ request.code.to_i
25
+ end
26
+
27
+ def success?
28
+ !unprocessable_uri? && !failed_request?
29
+ end
30
+
31
+ def unprocessable_uri?
32
+ uri_path == '' && uri_host.nil? && uri_port.nil?
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :execution_time_in_milliseconds, :url, :webhook_payload_body, :webhooks_timeout
38
+
39
+ HEADERS = { 'Content-Type' => 'application/json' }.freeze
40
+ private_constant :HEADERS
41
+
42
+ delegate :host, :path, :port, to: :uri, prefix: true
43
+
44
+ def http
45
+ http = Net::HTTP.new(uri_host, uri_port)
46
+ http.read_timeout = webhooks_timeout.to_i if custom_read_timeout?
47
+ http.use_ssl = true if use_ssl?
48
+ http
49
+ end
50
+
51
+ def request
52
+ req = Net::HTTP::Post.new(uri_path, HEADERS)
53
+ req.body = webhook_payload_body
54
+ @request ||= begin
55
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
56
+ request_result = http.request(req)
57
+ @execution_time_in_milliseconds = (Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time).in_milliseconds
58
+ request_result
59
+ end
60
+ rescue Errno::ECONNREFUSED, Net::ReadTimeout, SocketError
61
+ Class.new do
62
+ def self.code
63
+ '0'
64
+ end
65
+ end
66
+ end
67
+
68
+ def custom_read_timeout?
69
+ webhooks_timeout.present?
70
+ end
71
+
72
+ def use_ssl?
73
+ !(Rails.env.development? || Rails.env.test?)
74
+ end
75
+
76
+ def uri
77
+ URI(url)
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,17 @@
1
+ module Spree
2
+ module Webhooks
3
+ module Subscribers
4
+ class QueueRequests
5
+ prepend Spree::ServiceModule::Base
6
+
7
+ def call(event_name:, webhook_payload_body:)
8
+ Spree::Webhooks::Subscriber.active.with_urls_for(event_name).each do |subscriber|
9
+ Spree::Webhooks::Subscribers::MakeRequestJob.perform_later(
10
+ webhook_payload_body, event_name, subscriber
11
+ )
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ module Webhooks
3
+ def self.disable_webhooks
4
+ webhooks_disabled_previously = ENV['DISABLE_SPREE_WEBHOOKS']
5
+ begin
6
+ ENV['DISABLE_SPREE_WEBHOOKS'] = 'true'
7
+ yield
8
+ ensure
9
+ ENV['DISABLE_SPREE_WEBHOOKS'] = webhooks_disabled_previously
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,40 @@
1
+ base_locale: en
2
+ data:
3
+ yaml:
4
+ write:
5
+ # do not wrap lines at 80 characters
6
+ line_width: -1
7
+
8
+ # Find translate calls
9
+ search:
10
+ paths:
11
+ - '../api/app'
12
+ - '../api/lib'
13
+
14
+ #### For API v1 only, START ####
15
+ exclude:
16
+ - '../api/app/controllers/spree/api/v1/*'
17
+ - '../api/app/views/*'
18
+
19
+ ignore_unused:
20
+ - 'spree.api.gateway_error'
21
+ - 'spree.api.invalid_api_key'
22
+ - 'spree.api.invalid_resource'
23
+ - 'spree.api.invalid_taxonomy_id'
24
+ - 'spree.api.must_specify_api_key'
25
+ - 'spree.api.negative_quantity'
26
+ - 'spree.api.order.could_not_transition'
27
+ - 'spree.api.order.insufficient_quantity'
28
+ - 'spree.api.order.invalid_shipping_method'
29
+ - 'spree.api.payment.credit_over_limit'
30
+ - 'spree.api.payment.update_forbidden'
31
+ - 'spree.api.shipment.cannot_ready'
32
+ - 'spree.api.shipment_transfer_errors_occurred'
33
+ - 'spree.api.shipment_transfer_success'
34
+ - 'spree.api.stock_location_required'
35
+ - 'spree.api.unauthorized'
36
+ - 'spree.api.wrong_shipment_target'
37
+ #### For API v1 only, END ####
38
+
39
+ # The PatternMapper for Spree.t
40
+ <% I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper', patterns: [['\bSpree\.t[( ]\s*%{key}', 'spree.%{key}']] %>
@@ -2,11 +2,15 @@ Doorkeeper.configure do
2
2
  orm :active_record
3
3
  use_refresh_token
4
4
  api_only
5
- base_controller 'ActionController::API'
5
+ base_controller 'Spree::Api::V2::BaseController'
6
+ base_metal_controller 'Spree::Api::V2::BaseController'
6
7
 
8
+ # FIXME: we should only skip this for Storefront API until v5
9
+ # we should not skip this for Platform API
7
10
  skip_client_authentication_for_password_grant { true } if defined?(skip_client_authentication_for_password_grant)
8
11
 
9
12
  resource_owner_authenticator { current_spree_user }
13
+ use_polymorphic_resource_owner
10
14
 
11
15
  resource_owner_from_credentials do
12
16
  user = Spree.user_class.find_for_database_authentication(email: params[:username])
@@ -21,7 +25,7 @@ Doorkeeper.configure do
21
25
  end
22
26
 
23
27
  admin_authenticator do |routes|
24
- current_spree_user&.has_spree_role?('admin') || redirect_to(routes.root_url)
28
+ current_spree_user&.spree_admin? || redirect_to(routes.root_url)
25
29
  end
26
30
 
27
31
  grant_flows %w[password client_credentials]
@@ -33,16 +37,12 @@ Doorkeeper.configure do
33
37
  access_token_methods :from_bearer_authorization, :from_access_token_param
34
38
 
35
39
  optional_scopes :admin, :write, :read
36
- end
37
-
38
- Doorkeeper::AccessGrant.class_eval do
39
- self.table_name = 'spree_oauth_access_grants'
40
- end
41
40
 
42
- Doorkeeper::AccessToken.class_eval do
43
- self.table_name = 'spree_oauth_access_tokens'
44
- end
41
+ access_token_class 'Spree::OauthAccessToken'
42
+ access_grant_class 'Spree::OauthAccessGrant'
43
+ application_class 'Spree::OauthApplication'
45
44
 
46
- Doorkeeper::Application.class_eval do
47
- self.table_name = 'spree_oauth_applications'
45
+ # using Bcrupt for token secrets is currently not supported by Doorkeeper
46
+ hash_token_secrets fallback: :plain
47
+ hash_application_secrets fallback: :plain, using: '::Doorkeeper::SecretStoring::BCrypt'
48
48
  end
@@ -3,7 +3,7 @@ Rabl.configure do |config|
3
3
  config.include_child_root = false
4
4
 
5
5
  # Motivation here it make it call as_json when rendering timestamps
6
- # and therefore display miliseconds. Otherwise it would fall to
7
- # JSON.dump which doesn't display the miliseconds
6
+ # and therefore display milliseconds. Otherwise it would fall to
7
+ # JSON.dump which doesn't display the milliseconds
8
8
  config.json_engine = ActiveSupport::JSON
9
9
  end
@@ -1,36 +1,38 @@
1
+ ---
1
2
  en:
2
3
  spree:
3
4
  api:
4
- must_specify_api_key: "You must specify an API key."
5
- invalid_api_key: "Invalid API key (%{key}) specified."
6
- unauthorized: "You are not authorized to perform that action."
7
- invalid_resource: "Invalid resource. Please fix errors and try again."
8
- resource_not_found: "The resource you were looking for could not be found."
9
- gateway_error: "There was a problem with the payment gateway: %{text}"
10
- access: "API Access"
11
- key: "Key"
12
- clear_key: "Clear key"
13
- regenerate_key: "Regenerate Key"
14
- no_key: "No key"
15
- generate_key: "Generate API key"
16
- key_generated: "Key generated"
17
- key_cleared: "Key cleared"
5
+ gateway_error: 'There was a problem with the payment gateway: %{text}'
6
+ invalid_api_key: Invalid API key (%{key}) specified.
7
+ invalid_resource: Invalid resource. Please fix errors and try again.
8
+ invalid_taxonomy_id: Invalid taxonomy id.
9
+ must_specify_api_key: You must specify an API key.
10
+ negative_quantity: quantity is negative
18
11
  order:
19
- could_not_transition: "The order could not be transitioned. Please fix the errors and try again."
20
- invalid_shipping_method: "Invalid shipping method specified."
12
+ could_not_transition: The order could not be transitioned. Please fix the errors and try again.
21
13
  insufficient_quantity: An item in your cart has become unavailable.
14
+ invalid_shipping_method: Invalid shipping method specified.
22
15
  payment:
23
- credit_over_limit: "This payment can only be credited up to %{limit}. Please specify an amount less than or equal to this number."
24
- update_forbidden: "This payment cannot be updated because it is %{state}."
16
+ credit_over_limit: This payment can only be credited up to %{limit}. Please specify an amount less than or equal to this number.
17
+ update_forbidden: This payment cannot be updated because it is %{state}.
18
+ resource_not_found: The resource you were looking for could not be found.
25
19
  shipment:
26
- cannot_ready: "Cannot ready shipment."
27
- stock_location_required: "A stock_location_id parameter must be provided in order to retrieve stock movements."
28
- invalid_taxonomy_id: "Invalid taxonomy id."
29
- shipment_transfer_errors_occurred: "Following errors occurred while attempting this action:"
30
- negative_quantity: "quantity is negative"
31
- wrong_shipment_target: "target shipment is the same as original shipment"
32
-
20
+ cannot_ready: Cannot ready shipment.
21
+ shipment_transfer_errors_occurred: 'Following errors occurred while attempting this action:'
22
+ shipment_transfer_success: Variants successfully transferred
23
+ stock_location_required: A stock_location_id parameter must be provided in order to retrieve stock movements.
24
+ unauthorized: You are not authorized to perform that action.
33
25
  v2:
34
26
  cart:
35
- wrong_quantity: "Quantity has to be greater than 0"
36
- no_coupon_code: "No coupon code provided and the Order doesn't have any coupon code promotions applied"
27
+ no_coupon_code: No coupon code provided and the Order doesn't have any coupon code promotions applied
28
+ wrong_quantity: Quantity has to be greater than 0
29
+ digitals:
30
+ missing_file: 'Missing Digital Item: attachment'
31
+ unauthorized: Error, you are not authorized to access this asset
32
+ metadata:
33
+ invalid_params: Public and private metadata parameters should be objects
34
+ wishlist:
35
+ errors:
36
+ the_wishlist_could_not_be_destroyed: The wishlist could not be destroyed.
37
+ wrong_quantity: Quantity has to be greater than 0
38
+ wrong_shipment_target: target shipment is the same as original shipment
data/config/routes.rb CHANGED
@@ -137,16 +137,20 @@ Spree::Core::Engine.add_routes do
137
137
  delete 'remove_coupon_code/:coupon_code', to: 'cart#remove_coupon_code', as: :cart_remove_coupon_code
138
138
  delete 'remove_coupon_code', to: 'cart#remove_coupon_code', as: :cart_remove_coupon_code_without_code
139
139
  get :estimate_shipping_rates
140
+ patch :associate
141
+ patch :change_currency
140
142
  end
141
143
 
142
144
  resource :checkout, controller: :checkout, only: %i[update] do
143
145
  patch :next
144
146
  patch :advance
145
147
  patch :complete
148
+ post :create_payment
146
149
  post :add_store_credit
147
150
  post :remove_store_credit
148
151
  get :payment_methods
149
152
  get :shipping_rates
153
+ patch :select_shipping_method
150
154
  end
151
155
 
152
156
  resource :account, controller: :account, only: %i[show create update]
@@ -166,32 +170,47 @@ Spree::Core::Engine.add_routes do
166
170
 
167
171
  resources :menus, only: %i[index show]
168
172
  resources :cms_pages, only: %i[index show]
173
+
174
+ resources :wishlists do
175
+ get :default, on: :collection
176
+
177
+ member do
178
+ post :add_item
179
+ patch 'set_item_quantity/:item_id', to: 'wishlists#set_item_quantity', as: :set_item_quantity
180
+ delete 'remove_item/:item_id', to: 'wishlists#remove_item', as: :remove_item
181
+ end
182
+ end
183
+
184
+ get '/digitals/:token', to: 'digitals#download', as: 'digital'
169
185
  end
170
186
 
171
187
  namespace :platform do
172
188
  # Promotions API
173
189
  resources :promotions
190
+ resources :promotion_actions
191
+ resources :promotion_categories
192
+ resources :promotion_rules
174
193
 
175
194
  # Returns API
176
195
  resources :customer_returns
177
196
  resources :reimbursements
178
197
  resources :return_authorizations do
179
198
  member do
180
- put :add
181
- put :cancel
182
- put :receive
199
+ patch :add
200
+ patch :cancel
201
+ patch :receive
183
202
  end
184
203
  end
185
204
 
186
205
  # Product Catalog API
187
206
  resources :products
188
207
  resources :taxonomies
189
- resources :taxons
190
- resources :classifications do
208
+ resources :taxons do
191
209
  member do
192
- put :reposition
210
+ patch :reposition
193
211
  end
194
212
  end
213
+ resources :classifications
195
214
  resources :images
196
215
  resources :variants
197
216
  resources :properties
@@ -202,26 +221,38 @@ Spree::Core::Engine.add_routes do
202
221
  # Order API
203
222
  resources :orders do
204
223
  member do
205
- put :next
206
- put :advance
207
- put :approve
208
- put :cancel
209
- put :empty
210
- put :apply_coupon_code
211
- put :remove_coupon_code
224
+ patch :next
225
+ patch :advance
226
+ patch :approve
227
+ patch :cancel
228
+ patch :empty
229
+ patch :apply_coupon_code
230
+ patch :complete
231
+ patch :use_store_credit
232
+ patch :cancel
233
+ patch :approve
212
234
  end
213
235
  end
214
236
  resources :line_items
237
+ resources :adjustments
238
+
239
+ # Payments API
215
240
  resources :payments do
216
- member do
217
- put :authorize
218
- put :capture
219
- put :purchase
220
- put :void
221
- put :credit
222
- end
241
+ # TODO: support custom actions
242
+ # member do
243
+ # patch :authorize
244
+ # patch :capture
245
+ # patch :purchase
246
+ # patch :void
247
+ # patch :credit
248
+ # end
223
249
  end
224
250
 
251
+ # Store Credit API
252
+ resources :store_credits
253
+ resources :store_credit_categories
254
+ resources :store_credit_types
255
+
225
256
  # Geo API
226
257
  resources :zones
227
258
  resources :countries, only: [:index, :show]
@@ -229,18 +260,21 @@ Spree::Core::Engine.add_routes do
229
260
 
230
261
  # Shipment API
231
262
  resources :shipments do
232
- collection do
233
- post 'transfer_to_location'
234
- post 'transfer_to_shipment'
235
- end
236
263
  member do
237
- put :ready
238
- put :ship
239
- put :add
240
- put :remove
264
+ %w[ready ship cancel resume pend].each do |state|
265
+ patch state.to_sym
266
+ end
267
+ patch :add_item
268
+ patch :remove_item
269
+ patch :transfer_to_location
270
+ patch :transfer_to_shipment
241
271
  end
242
272
  end
243
273
 
274
+ # Tax API
275
+ resources :tax_rates
276
+ resources :tax_categories
277
+
244
278
  # Inventory API
245
279
  resources :inventory_units
246
280
  resources :stock_items
@@ -252,6 +286,8 @@ Spree::Core::Engine.add_routes do
252
286
  resources :credit_cards
253
287
  resources :addresses
254
288
 
289
+ resources :roles
290
+
255
291
  # Menu API
256
292
  resources :menus
257
293
  resources :menu_items do
@@ -260,46 +296,36 @@ Spree::Core::Engine.add_routes do
260
296
  end
261
297
  end
262
298
 
263
- # CMS Pages API
264
- resources :cms_pages do
265
- member do
266
- patch :toggle_visibility
267
- end
268
- end
299
+ # CMS
300
+ resources :cms_pages
301
+ resources :cms_sections
302
+
303
+ # Wishlists API
304
+ resources :wishlists
305
+ resources :wished_items
269
306
 
270
- resource :cms_sections do
307
+ # Digitals API
308
+ resources :digitals
309
+ resources :digital_links do
271
310
  member do
272
- patch :reposition
311
+ patch :reset
273
312
  end
274
313
  end
275
314
 
276
315
  # Store API
277
316
  resources :stores
278
- end
279
- end
280
317
 
281
- get '/404', to: 'errors#render_404'
318
+ # Configurations API
319
+ resources :payment_methods
320
+ resources :shipping_categories
321
+ resources :shipping_methods
282
322
 
283
- match 'v:api/*path', to: redirect { |params, request|
284
- format = ".#{params[:format]}" unless params[:format].blank?
285
- query = "?#{request.query_string}" unless request.query_string.blank?
286
-
287
- if request.path == "#{spree_path}api/v1/#{params[:path]}#{format}#{query}"
288
- "#{spree_path}api/404"
289
- else
290
- "#{spree_path}api/v1/#{params[:path]}#{format}#{query}"
291
- end
292
- }, via: [:get, :post, :put, :patch, :delete]
293
-
294
- match '*path', to: redirect { |params, request|
295
- format = ".#{params[:format]}" unless params[:format].blank?
296
- query = "?#{request.query_string}" unless request.query_string.blank?
297
-
298
- if request.path == "#{spree_path}api/v1/#{params[:path]}#{format}#{query}"
299
- "#{spree_path}api/404"
300
- else
301
- "#{spree_path}api/v1/#{params[:path]}#{format}#{query}"
323
+ # Webhooks API
324
+ namespace :webhooks do
325
+ resources :events, only: :index
326
+ resources :subscribers
327
+ end
302
328
  end
303
- }, via: [:get, :post, :put, :patch, :delete]
329
+ end
304
330
  end
305
331
  end
@@ -0,0 +1,16 @@
1
+ class CreateSpreeWebhooksTables < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :spree_webhooks_subscribers do |t|
4
+ t.string :url, null: false
5
+ t.boolean :active, default: false, index: true
6
+
7
+ if t.respond_to? :jsonb
8
+ t.jsonb :subscriptions
9
+ else
10
+ t.json :subscriptions
11
+ end
12
+
13
+ t.timestamps
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ class EnablePolymorphicResourceOwner < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :spree_oauth_access_tokens, :resource_owner_type, :string
4
+ add_column :spree_oauth_access_grants, :resource_owner_type, :string
5
+ change_column_null :spree_oauth_access_grants, :resource_owner_type, false
6
+
7
+ add_index :spree_oauth_access_tokens,
8
+ [:resource_owner_id, :resource_owner_type],
9
+ name: 'polymorphic_owner_oauth_access_tokens'
10
+
11
+ add_index :spree_oauth_access_grants,
12
+ [:resource_owner_id, :resource_owner_type],
13
+ name: 'polymorphic_owner_oauth_access_grants'
14
+
15
+ Spree::OauthAccessToken.reset_column_information
16
+ Spree::OauthAccessToken.update_all(resource_owner_type: Spree.user_class)
17
+
18
+ Spree::OauthAccessGrant.reset_column_information
19
+ Spree::OauthAccessGrant.update_all(resource_owner_type: Spree.user_class)
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ class CreateSpreeWebhooksEvents < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :spree_webhooks_events do |t|
4
+ t.integer "execution_time"
5
+ t.string "name", null: false
6
+ t.string "request_errors"
7
+ t.string "response_code", index: true
8
+ t.belongs_to "subscriber", null: false, index: true
9
+ t.boolean "success", index: true
10
+ t.string "url", null: false
11
+ t.timestamps
12
+ end
13
+ end
14
+ end