spree_api 5.3.4 → 5.4.0.beta

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.
Files changed (332) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +71 -33
  3. data/Rakefile +25 -0
  4. data/app/controllers/concerns/spree/api/v3/api_key_authentication.rb +51 -0
  5. data/app/controllers/concerns/spree/api/v3/error_handler.rb +255 -0
  6. data/app/controllers/concerns/spree/api/v3/http_caching.rb +90 -0
  7. data/app/controllers/concerns/spree/api/v3/jwt_authentication.rb +95 -0
  8. data/app/controllers/concerns/spree/api/v3/locale_and_currency.rb +73 -0
  9. data/app/controllers/concerns/spree/api/v3/order_concern.rb +51 -0
  10. data/app/controllers/concerns/spree/api/v3/resource_serializer.rb +41 -0
  11. data/app/controllers/spree/api/v3/base_controller.rb +42 -0
  12. data/app/controllers/spree/api/v3/resource_controller.rb +210 -0
  13. data/app/controllers/spree/api/v3/store/auth_controller.rb +140 -0
  14. data/app/controllers/spree/api/v3/store/base_controller.rb +12 -0
  15. data/app/controllers/spree/api/v3/store/cart_controller.rb +82 -0
  16. data/app/controllers/spree/api/v3/store/countries_controller.rb +31 -0
  17. data/app/controllers/spree/api/v3/store/currencies_controller.rb +18 -0
  18. data/app/controllers/spree/api/v3/store/customer/account_controller.rb +38 -0
  19. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +85 -0
  20. data/app/controllers/spree/api/v3/store/customer/credit_cards_controller.rb +31 -0
  21. data/app/controllers/spree/api/v3/store/customer/gift_cards_controller.rb +36 -0
  22. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +35 -0
  23. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +83 -0
  24. data/app/controllers/spree/api/v3/store/digitals_controller.rb +37 -0
  25. data/app/controllers/spree/api/v3/store/locales_controller.rb +24 -0
  26. data/app/controllers/spree/api/v3/store/orders/coupon_codes_controller.rb +68 -0
  27. data/app/controllers/spree/api/v3/store/orders/line_items_controller.rb +87 -0
  28. data/app/controllers/spree/api/v3/store/orders/payment_methods_controller.rb +43 -0
  29. data/app/controllers/spree/api/v3/store/orders/payment_sessions_controller.rb +96 -0
  30. data/app/controllers/spree/api/v3/store/orders/payments_controller.rb +45 -0
  31. data/app/controllers/spree/api/v3/store/orders/shipments_controller.rb +53 -0
  32. data/app/controllers/spree/api/v3/store/orders/store_credits_controller.rb +42 -0
  33. data/app/controllers/spree/api/v3/store/orders_controller.rb +125 -0
  34. data/app/controllers/spree/api/v3/store/products/filters_controller.rb +38 -0
  35. data/app/controllers/spree/api/v3/store/products_controller.rb +74 -0
  36. data/app/controllers/spree/api/v3/store/resource_controller.rb +12 -0
  37. data/app/controllers/spree/api/v3/store/stores_controller.rb +26 -0
  38. data/app/controllers/spree/api/v3/store/taxonomies_controller.rb +19 -0
  39. data/app/controllers/spree/api/v3/store/taxons/products_controller.rb +37 -0
  40. data/app/controllers/spree/api/v3/store/taxons_controller.rb +34 -0
  41. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +33 -0
  42. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +41 -0
  43. data/app/serializers/spree/api/v3/address_serializer.rb +22 -0
  44. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +43 -0
  45. data/app/serializers/spree/api/v3/admin/metafield_serializer.rb +15 -0
  46. data/app/serializers/spree/api/v3/admin/order_serializer.rb +39 -0
  47. data/app/serializers/spree/api/v3/admin/price_serializer.rb +21 -0
  48. data/app/serializers/spree/api/v3/admin/product_serializer.rb +47 -0
  49. data/app/serializers/spree/api/v3/admin/taxon_serializer.rb +20 -0
  50. data/app/serializers/spree/api/v3/admin/taxonomy_serializer.rb +15 -0
  51. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +44 -0
  52. data/app/serializers/spree/api/v3/asset_serializer.rb +20 -0
  53. data/app/serializers/spree/api/v3/base_serializer.rb +98 -0
  54. data/app/serializers/spree/api/v3/country_serializer.rb +35 -0
  55. data/app/serializers/spree/api/v3/credit_card_serializer.rb +12 -0
  56. data/app/serializers/spree/api/v3/currency_serializer.rb +14 -0
  57. data/app/serializers/spree/api/v3/customer_return_serializer.rb +17 -0
  58. data/app/serializers/spree/api/v3/customer_serializer.rb +19 -0
  59. data/app/serializers/spree/api/v3/digital_link_serializer.rb +30 -0
  60. data/app/serializers/spree/api/v3/digital_serializer.rb +17 -0
  61. data/app/serializers/spree/api/v3/export_serializer.rb +19 -0
  62. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +28 -0
  63. data/app/serializers/spree/api/v3/gift_card_serializer.rb +78 -0
  64. data/app/serializers/spree/api/v3/image_serializer.rb +43 -0
  65. data/app/serializers/spree/api/v3/import_row_serializer.rb +24 -0
  66. data/app/serializers/spree/api/v3/import_serializer.rb +32 -0
  67. data/app/serializers/spree/api/v3/invitation_serializer.rb +47 -0
  68. data/app/serializers/spree/api/v3/line_item_serializer.rb +48 -0
  69. data/app/serializers/spree/api/v3/locale_serializer.rb +14 -0
  70. data/app/serializers/spree/{v2/storefront → api/v3}/metafield_serializer.rb +5 -3
  71. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +27 -0
  72. data/app/serializers/spree/api/v3/option_type_serializer.rb +11 -0
  73. data/app/serializers/spree/api/v3/option_value_serializer.rb +24 -0
  74. data/app/serializers/spree/api/v3/order_promotion_serializer.rb +16 -0
  75. data/app/serializers/spree/api/v3/order_serializer.rb +39 -0
  76. data/app/serializers/spree/api/v3/payment_method_serializer.rb +15 -0
  77. data/app/serializers/spree/api/v3/payment_serializer.rb +54 -0
  78. data/app/serializers/spree/api/v3/payment_session_serializer.rb +32 -0
  79. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +33 -0
  80. data/app/serializers/spree/api/v3/payment_source_serializer.rb +18 -0
  81. data/app/serializers/spree/api/v3/post_category_serializer.rb +13 -0
  82. data/app/serializers/spree/api/v3/post_serializer.rb +25 -0
  83. data/app/serializers/spree/api/v3/price_serializer.rb +34 -0
  84. data/app/serializers/spree/api/v3/product_serializer.rb +108 -0
  85. data/app/serializers/spree/api/v3/promotion_serializer.rb +28 -0
  86. data/app/serializers/spree/api/v3/refund_serializer.rb +31 -0
  87. data/app/serializers/spree/api/v3/reimbursement_serializer.rb +28 -0
  88. data/app/serializers/spree/api/v3/report_serializer.rb +29 -0
  89. data/app/serializers/spree/api/v3/return_authorization_serializer.rb +31 -0
  90. data/app/serializers/spree/api/v3/return_item_serializer.rb +53 -0
  91. data/app/serializers/spree/api/v3/shipment_serializer.rb +19 -0
  92. data/app/serializers/spree/api/v3/shipping_method_serializer.rb +11 -0
  93. data/app/serializers/spree/api/v3/shipping_rate_serializer.rb +26 -0
  94. data/app/serializers/spree/api/v3/state_serializer.rb +14 -0
  95. data/app/serializers/spree/api/v3/stock_item_serializer.rb +23 -0
  96. data/app/serializers/spree/api/v3/stock_location_serializer.rb +18 -0
  97. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +24 -0
  98. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +25 -0
  99. data/app/serializers/spree/api/v3/store_credit_serializer.rb +37 -0
  100. data/app/serializers/spree/api/v3/store_serializer.rb +38 -0
  101. data/app/serializers/spree/api/v3/taxon_serializer.rb +78 -0
  102. data/app/serializers/spree/api/v3/taxonomy_serializer.rb +33 -0
  103. data/app/serializers/spree/api/v3/variant_serializer.rb +86 -0
  104. data/app/serializers/spree/api/v3/wished_item_serializer.rb +22 -0
  105. data/app/serializers/spree/api/v3/wishlist_serializer.rb +25 -0
  106. data/app/services/spree/api/v3/filters_aggregator.rb +156 -0
  107. data/app/services/spree/api/v3/orders/update.rb +103 -0
  108. data/config/initializers/alba.rb +5 -0
  109. data/config/initializers/pagy.rb +10 -0
  110. data/config/initializers/typelizer.rb +25 -0
  111. data/config/locales/en.yml +1 -0
  112. data/config/routes.rb +63 -196
  113. data/lib/spree/api/dependencies.rb +68 -0
  114. data/lib/spree/api/engine.rb +0 -5
  115. data/lib/spree/api/openapi/schema_helper.rb +177 -0
  116. data/lib/spree/api/testing_support/factories.rb +1 -3
  117. data/lib/spree/api/testing_support/v3/base.rb +118 -0
  118. data/lib/spree/api.rb +7 -4
  119. metadata +131 -264
  120. data/LICENSE.md +0 -57
  121. data/app/controllers/concerns/spree/api/v2/caching.rb +0 -40
  122. data/app/controllers/concerns/spree/api/v2/coupon_codes_helper.rb +0 -29
  123. data/app/controllers/concerns/spree/api/v2/number_resource.rb +0 -11
  124. data/app/controllers/concerns/spree/api/v2/platform/nested_set_reposition_concern.rb +0 -37
  125. data/app/controllers/concerns/spree/api/v2/platform/promotion_calculator_params.rb +0 -17
  126. data/app/controllers/concerns/spree/api/v2/platform/promotion_rule_params.rb +0 -16
  127. data/app/controllers/concerns/spree/api/v2/product_list_includes.rb +0 -21
  128. data/app/controllers/concerns/spree/api/v2/storefront/metadata_controller_concern.rb +0 -18
  129. data/app/controllers/concerns/spree/api/v2/storefront/order_concern.rb +0 -49
  130. data/app/controllers/spree/api/v2/base_controller.rb +0 -233
  131. data/app/controllers/spree/api/v2/data_feeds/google_controller.rb +0 -24
  132. data/app/controllers/spree/api/v2/platform/addresses_controller.rb +0 -23
  133. data/app/controllers/spree/api/v2/platform/adjustments_controller.rb +0 -23
  134. data/app/controllers/spree/api/v2/platform/classifications_controller.rb +0 -26
  135. data/app/controllers/spree/api/v2/platform/countries_controller.rb +0 -23
  136. data/app/controllers/spree/api/v2/platform/data_feeds_controller.rb +0 -19
  137. data/app/controllers/spree/api/v2/platform/digital_links_controller.rb +0 -29
  138. data/app/controllers/spree/api/v2/platform/digitals_controller.rb +0 -23
  139. data/app/controllers/spree/api/v2/platform/gift_cards_controller.rb +0 -23
  140. data/app/controllers/spree/api/v2/platform/line_items_controller.rb +0 -63
  141. data/app/controllers/spree/api/v2/platform/option_types_controller.rb +0 -19
  142. data/app/controllers/spree/api/v2/platform/option_values_controller.rb +0 -23
  143. data/app/controllers/spree/api/v2/platform/orders_controller.rb +0 -167
  144. data/app/controllers/spree/api/v2/platform/payment_methods_controller.rb +0 -31
  145. data/app/controllers/spree/api/v2/platform/payments_controller.rb +0 -21
  146. data/app/controllers/spree/api/v2/platform/products_controller.rb +0 -41
  147. data/app/controllers/spree/api/v2/platform/promotion_actions_controller.rb +0 -34
  148. data/app/controllers/spree/api/v2/platform/promotion_categories_controller.rb +0 -23
  149. data/app/controllers/spree/api/v2/platform/promotion_rules_controller.rb +0 -29
  150. data/app/controllers/spree/api/v2/platform/promotions_controller.rb +0 -35
  151. data/app/controllers/spree/api/v2/platform/resource_controller.rb +0 -154
  152. data/app/controllers/spree/api/v2/platform/roles_controller.rb +0 -19
  153. data/app/controllers/spree/api/v2/platform/shipments_controller.rb +0 -147
  154. data/app/controllers/spree/api/v2/platform/shipping_categories_controller.rb +0 -19
  155. data/app/controllers/spree/api/v2/platform/shipping_methods_controller.rb +0 -28
  156. data/app/controllers/spree/api/v2/platform/states_controller.rb +0 -23
  157. data/app/controllers/spree/api/v2/platform/stock_items_controller.rb +0 -23
  158. data/app/controllers/spree/api/v2/platform/stock_locations_controller.rb +0 -23
  159. data/app/controllers/spree/api/v2/platform/store_credit_categories_controller.rb +0 -19
  160. data/app/controllers/spree/api/v2/platform/store_credit_types_controller.rb +0 -19
  161. data/app/controllers/spree/api/v2/platform/store_credits_controller.rb +0 -23
  162. data/app/controllers/spree/api/v2/platform/tax_categories_controller.rb +0 -23
  163. data/app/controllers/spree/api/v2/platform/tax_rates_controller.rb +0 -27
  164. data/app/controllers/spree/api/v2/platform/taxonomies_controller.rb +0 -23
  165. data/app/controllers/spree/api/v2/platform/taxons_controller.rb +0 -59
  166. data/app/controllers/spree/api/v2/platform/users_controller.rb +0 -37
  167. data/app/controllers/spree/api/v2/platform/variants_controller.rb +0 -23
  168. data/app/controllers/spree/api/v2/platform/wished_items_controller.rb +0 -23
  169. data/app/controllers/spree/api/v2/platform/wishlists_controller.rb +0 -23
  170. data/app/controllers/spree/api/v2/platform/zones_controller.rb +0 -23
  171. data/app/controllers/spree/api/v2/resource_controller.rb +0 -79
  172. data/app/controllers/spree/api/v2/storefront/account/addresses_controller.rb +0 -77
  173. data/app/controllers/spree/api/v2/storefront/account/credit_cards_controller.rb +0 -52
  174. data/app/controllers/spree/api/v2/storefront/account/orders_controller.rb +0 -50
  175. data/app/controllers/spree/api/v2/storefront/account_controller.rb +0 -52
  176. data/app/controllers/spree/api/v2/storefront/cart_controller.rb +0 -246
  177. data/app/controllers/spree/api/v2/storefront/checkout_controller.rb +0 -183
  178. data/app/controllers/spree/api/v2/storefront/countries_controller.rb +0 -57
  179. data/app/controllers/spree/api/v2/storefront/digitals_controller.rb +0 -58
  180. data/app/controllers/spree/api/v2/storefront/order_status_controller.rb +0 -34
  181. data/app/controllers/spree/api/v2/storefront/policies_controller.rb +0 -31
  182. data/app/controllers/spree/api/v2/storefront/post_categories_controller.rb +0 -35
  183. data/app/controllers/spree/api/v2/storefront/posts_controller.rb +0 -51
  184. data/app/controllers/spree/api/v2/storefront/products_controller.rb +0 -66
  185. data/app/controllers/spree/api/v2/storefront/stores_controller.rb +0 -27
  186. data/app/controllers/spree/api/v2/storefront/taxons_controller.rb +0 -51
  187. data/app/controllers/spree/api/v2/storefront/variants_controller.rb +0 -41
  188. data/app/controllers/spree/api/v2/storefront/wishlists_controller.rb +0 -214
  189. data/app/helpers/spree/api/v2/collection_options_helpers.rb +0 -46
  190. data/app/helpers/spree/api/v2/display_money_helper.rb +0 -63
  191. data/app/helpers/spree/api/v2/store_media_serializer_images_concern.rb +0 -30
  192. data/app/models/concerns/spree/user_api_authentication.rb +0 -19
  193. data/app/models/concerns/spree/user_api_methods.rb +0 -7
  194. data/app/models/spree/oauth_access_grant.rb +0 -7
  195. data/app/models/spree/oauth_access_token.rb +0 -7
  196. data/app/models/spree/oauth_application.rb +0 -22
  197. data/app/paginators/spree/api/paginate.rb +0 -68
  198. data/app/presenters/spree/api/products/filters_presenter.rb +0 -39
  199. data/app/serializers/concerns/spree/api/v2/image_transformation_concern.rb +0 -15
  200. data/app/serializers/concerns/spree/api/v2/public_metafields_concern.rb +0 -15
  201. data/app/serializers/concerns/spree/api/v2/resource_serializer_concern.rb +0 -42
  202. data/app/serializers/concerns/spree/api/v2/taxon_image_transformation_concern.rb +0 -15
  203. data/app/serializers/spree/api/v2/base_serializer.rb +0 -43
  204. data/app/serializers/spree/api/v2/platform/address_serializer.rb +0 -15
  205. data/app/serializers/spree/api/v2/platform/adjustment_serializer.rb +0 -20
  206. data/app/serializers/spree/api/v2/platform/admin_user_serializer.rb +0 -11
  207. data/app/serializers/spree/api/v2/platform/asset_serializer.rb +0 -13
  208. data/app/serializers/spree/api/v2/platform/base_serializer.rb +0 -10
  209. data/app/serializers/spree/api/v2/platform/calculator_serializer.rb +0 -17
  210. data/app/serializers/spree/api/v2/platform/classification_serializer.rb +0 -14
  211. data/app/serializers/spree/api/v2/platform/country_serializer.rb +0 -13
  212. data/app/serializers/spree/api/v2/platform/credit_card_serializer.rb +0 -14
  213. data/app/serializers/spree/api/v2/platform/customer_return_serializer.rb +0 -17
  214. data/app/serializers/spree/api/v2/platform/data_feed_serializer.rb +0 -13
  215. data/app/serializers/spree/api/v2/platform/digital_link_serializer.rb +0 -16
  216. data/app/serializers/spree/api/v2/platform/digital_serializer.rb +0 -29
  217. data/app/serializers/spree/api/v2/platform/gift_card_serializer.rb +0 -17
  218. data/app/serializers/spree/api/v2/platform/image_serializer.rb +0 -17
  219. data/app/serializers/spree/api/v2/platform/inventory_unit_serializer.rb +0 -19
  220. data/app/serializers/spree/api/v2/platform/line_item_serializer.rb +0 -19
  221. data/app/serializers/spree/api/v2/platform/log_entry_serializer.rb +0 -13
  222. data/app/serializers/spree/api/v2/platform/metafield_serializer.rb +0 -21
  223. data/app/serializers/spree/api/v2/platform/option_type_serializer.rb +0 -13
  224. data/app/serializers/spree/api/v2/platform/option_value_serializer.rb +0 -13
  225. data/app/serializers/spree/api/v2/platform/order_promotion_serializer.rb +0 -14
  226. data/app/serializers/spree/api/v2/platform/order_serializer.rb +0 -31
  227. data/app/serializers/spree/api/v2/platform/payment_capture_event_serializer.rb +0 -13
  228. data/app/serializers/spree/api/v2/platform/payment_method_serializer.rb +0 -18
  229. data/app/serializers/spree/api/v2/platform/payment_serializer.rb +0 -22
  230. data/app/serializers/spree/api/v2/platform/payment_source_serializer.rb +0 -12
  231. data/app/serializers/spree/api/v2/platform/price_serializer.rb +0 -19
  232. data/app/serializers/spree/api/v2/platform/product_property_serializer.rb +0 -11
  233. data/app/serializers/spree/api/v2/platform/product_serializer.rb +0 -90
  234. data/app/serializers/spree/api/v2/platform/promotion_action_line_item_serializer.rb +0 -14
  235. data/app/serializers/spree/api/v2/platform/promotion_action_serializer.rb +0 -19
  236. data/app/serializers/spree/api/v2/platform/promotion_category_serializer.rb +0 -13
  237. data/app/serializers/spree/api/v2/platform/promotion_rule_serializer.rb +0 -21
  238. data/app/serializers/spree/api/v2/platform/promotion_serializer.rb +0 -17
  239. data/app/serializers/spree/api/v2/platform/property_serializer.rb +0 -11
  240. data/app/serializers/spree/api/v2/platform/prototype_serializer.rb +0 -15
  241. data/app/serializers/spree/api/v2/platform/refund_reason_serializer.rb +0 -11
  242. data/app/serializers/spree/api/v2/platform/refund_serializer.rb +0 -17
  243. data/app/serializers/spree/api/v2/platform/reimbursement_credit_serializer.rb +0 -10
  244. data/app/serializers/spree/api/v2/platform/reimbursement_serializer.rb +0 -19
  245. data/app/serializers/spree/api/v2/platform/reimbursement_type_serializer.rb +0 -11
  246. data/app/serializers/spree/api/v2/platform/return_authorization_reason_serializer.rb +0 -11
  247. data/app/serializers/spree/api/v2/platform/return_authorization_serializer.rb +0 -17
  248. data/app/serializers/spree/api/v2/platform/return_item_serializer.rb +0 -16
  249. data/app/serializers/spree/api/v2/platform/role_serializer.rb +0 -11
  250. data/app/serializers/spree/api/v2/platform/shipment_serializer.rb +0 -22
  251. data/app/serializers/spree/api/v2/platform/shipping_category_serializer.rb +0 -11
  252. data/app/serializers/spree/api/v2/platform/shipping_method_serializer.rb +0 -16
  253. data/app/serializers/spree/api/v2/platform/shipping_rate_serializer.rb +0 -15
  254. data/app/serializers/spree/api/v2/platform/state_change_serializer.rb +0 -13
  255. data/app/serializers/spree/api/v2/platform/state_serializer.rb +0 -13
  256. data/app/serializers/spree/api/v2/platform/stock_item_serializer.rb +0 -18
  257. data/app/serializers/spree/api/v2/platform/stock_location_serializer.rb +0 -14
  258. data/app/serializers/spree/api/v2/platform/stock_movement_serializer.rb +0 -11
  259. data/app/serializers/spree/api/v2/platform/stock_transfer_serializer.rb +0 -15
  260. data/app/serializers/spree/api/v2/platform/store_credit_category_serializer.rb +0 -12
  261. data/app/serializers/spree/api/v2/platform/store_credit_event_serializer.rb +0 -14
  262. data/app/serializers/spree/api/v2/platform/store_credit_serializer.rb +0 -18
  263. data/app/serializers/spree/api/v2/platform/store_credit_type_serializer.rb +0 -12
  264. data/app/serializers/spree/api/v2/platform/store_serializer.rb +0 -14
  265. data/app/serializers/spree/api/v2/platform/tax_category_serializer.rb +0 -13
  266. data/app/serializers/spree/api/v2/platform/tax_rate_serializer.rb +0 -14
  267. data/app/serializers/spree/api/v2/platform/taxon_image_serializer.rb +0 -15
  268. data/app/serializers/spree/api/v2/platform/taxon_serializer.rb +0 -47
  269. data/app/serializers/spree/api/v2/platform/taxonomy_serializer.rb +0 -14
  270. data/app/serializers/spree/api/v2/platform/user_serializer.rb +0 -37
  271. data/app/serializers/spree/api/v2/platform/variant_serializer.rb +0 -66
  272. data/app/serializers/spree/api/v2/platform/wished_item_serializer.rb +0 -29
  273. data/app/serializers/spree/api/v2/platform/wishlist_serializer.rb +0 -19
  274. data/app/serializers/spree/api/v2/platform/zone_member_serializer.rb +0 -13
  275. data/app/serializers/spree/api/v2/platform/zone_serializer.rb +0 -13
  276. data/app/serializers/spree/v2/storefront/address_serializer.rb +0 -22
  277. data/app/serializers/spree/v2/storefront/base_serializer.rb +0 -10
  278. data/app/serializers/spree/v2/storefront/cart_serializer.rb +0 -67
  279. data/app/serializers/spree/v2/storefront/country_serializer.rb +0 -24
  280. data/app/serializers/spree/v2/storefront/credit_card_serializer.rb +0 -15
  281. data/app/serializers/spree/v2/storefront/digital_link_serializer.rb +0 -11
  282. data/app/serializers/spree/v2/storefront/estimated_shipping_rate_serializer.rb +0 -35
  283. data/app/serializers/spree/v2/storefront/gift_card_serializer.rb +0 -16
  284. data/app/serializers/spree/v2/storefront/image_serializer.rb +0 -13
  285. data/app/serializers/spree/v2/storefront/line_item_serializer.rb +0 -23
  286. data/app/serializers/spree/v2/storefront/option_type_serializer.rb +0 -15
  287. data/app/serializers/spree/v2/storefront/option_value_serializer.rb +0 -13
  288. data/app/serializers/spree/v2/storefront/order_promotion_serializer.rb +0 -14
  289. data/app/serializers/spree/v2/storefront/order_serializer.rb +0 -11
  290. data/app/serializers/spree/v2/storefront/payment_method_serializer.rb +0 -17
  291. data/app/serializers/spree/v2/storefront/payment_serializer.rb +0 -20
  292. data/app/serializers/spree/v2/storefront/payment_source_serializer.rb +0 -12
  293. data/app/serializers/spree/v2/storefront/policy_serializer.rb +0 -19
  294. data/app/serializers/spree/v2/storefront/post_category_serializer.rb +0 -23
  295. data/app/serializers/spree/v2/storefront/post_serializer.rb +0 -51
  296. data/app/serializers/spree/v2/storefront/product_property_serializer.rb +0 -19
  297. data/app/serializers/spree/v2/storefront/product_serializer.rb +0 -92
  298. data/app/serializers/spree/v2/storefront/shipment_serializer.rb +0 -26
  299. data/app/serializers/spree/v2/storefront/shipping_category_serializer.rb +0 -10
  300. data/app/serializers/spree/v2/storefront/shipping_method_serializer.rb +0 -12
  301. data/app/serializers/spree/v2/storefront/shipping_rate_serializer.rb +0 -26
  302. data/app/serializers/spree/v2/storefront/state_serializer.rb +0 -11
  303. data/app/serializers/spree/v2/storefront/stock_location_serializer.rb +0 -11
  304. data/app/serializers/spree/v2/storefront/store_credit_category_serializer.rb +0 -11
  305. data/app/serializers/spree/v2/storefront/store_credit_event_serializer.rb +0 -15
  306. data/app/serializers/spree/v2/storefront/store_credit_serializer.rb +0 -19
  307. data/app/serializers/spree/v2/storefront/store_credit_type_serializer.rb +0 -11
  308. data/app/serializers/spree/v2/storefront/store_serializer.rb +0 -18
  309. data/app/serializers/spree/v2/storefront/taxon_image_serializer.rb +0 -13
  310. data/app/serializers/spree/v2/storefront/taxon_serializer.rb +0 -55
  311. data/app/serializers/spree/v2/storefront/taxonomy_serializer.rb +0 -13
  312. data/app/serializers/spree/v2/storefront/user_serializer.rb +0 -33
  313. data/app/serializers/spree/v2/storefront/variant_serializer.rb +0 -58
  314. data/app/serializers/spree/v2/storefront/wished_item_serializer.rb +0 -29
  315. data/app/serializers/spree/v2/storefront/wishlist_serializer.rb +0 -17
  316. data/config/initializers/doorkeeper.rb +0 -50
  317. data/config/initializers/json_api_mime_types.rb +0 -8
  318. data/config/initializers/user_class_extensions.rb +0 -7
  319. data/db/migrate/20100107141738_add_api_key_to_spree_users.rb +0 -7
  320. data/db/migrate/20120411123334_resize_api_key_field.rb +0 -7
  321. data/db/migrate/20120530054546_rename_api_key_to_spree_api_key.rb +0 -7
  322. data/db/migrate/20131017162334_add_index_to_user_spree_api_key.rb +0 -7
  323. data/db/migrate/20180320110726_create_doorkeeper_tables.rb +0 -69
  324. data/db/migrate/20210727102516_change_integer_id_columns_type.rb +0 -9
  325. data/db/migrate/20210919183228_enable_polymorphic_resource_owner.rb +0 -21
  326. data/lib/generators/spree/api/install/install_generator.rb +0 -24
  327. data/lib/spree/api/testing_support/factories/oauth_application_factory.rb +0 -6
  328. data/lib/spree/api/testing_support/serializers.rb +0 -15
  329. data/lib/spree/api/testing_support/v2/base.rb +0 -13
  330. data/lib/spree/api/testing_support/v2/current_order.rb +0 -116
  331. data/lib/spree/api/testing_support/v2/platform_contexts.rb +0 -272
  332. data/lib/spree/api/testing_support/v2/serializers_params.rb +0 -16
@@ -0,0 +1,86 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # Store API Variant Serializer
5
+ # Customer-facing variant data with limited fields
6
+ class VariantSerializer < BaseSerializer
7
+ typelize product_id: :string, sku: [:string, nullable: true],
8
+ is_master: :boolean, options_text: :string, track_inventory: :boolean, image_count: :number,
9
+ thumbnail: [:string, nullable: true],
10
+ purchasable: :boolean, in_stock: :boolean, backorderable: :boolean,
11
+ weight: [:number, nullable: true], height: [:number, nullable: true], width: [:number, nullable: true], depth: [:number, nullable: true],
12
+ price: 'StorePrice',
13
+ original_price: ['StorePrice', nullable: true]
14
+
15
+ attribute :product_id do |variant|
16
+ variant.product&.prefixed_id
17
+ end
18
+
19
+ attributes :sku, :is_master, :options_text, :track_inventory, :image_count,
20
+ created_at: :iso8601, updated_at: :iso8601
21
+
22
+ # Main variant image URL for listings (cached thumbnail)
23
+ attribute :thumbnail do |variant|
24
+ image_url_for(variant.thumbnail)
25
+ end
26
+
27
+ attribute :purchasable do |variant|
28
+ variant.purchasable?
29
+ end
30
+
31
+ attribute :in_stock do |variant|
32
+ variant.in_stock?
33
+ end
34
+
35
+ attribute :backorderable do |variant|
36
+ variant.backorderable?
37
+ end
38
+
39
+ attribute :weight do |variant|
40
+ variant.weight&.to_f
41
+ end
42
+
43
+ attribute :height do |variant|
44
+ variant.height&.to_f
45
+ end
46
+
47
+ attribute :width do |variant|
48
+ variant.width&.to_f
49
+ end
50
+
51
+ attribute :depth do |variant|
52
+ variant.depth&.to_f
53
+ end
54
+
55
+ # Price object - calculated price with price list resolution
56
+ attribute :price do |variant|
57
+ price = price_for(variant)
58
+ Spree.api.price_serializer.new(price, params: params).to_h if price.present?
59
+ end
60
+
61
+ # Original price - base price without price list resolution (for showing strikethrough)
62
+ # Returns null when same as calculated price, only populated when a price list discount is applied
63
+ attribute :original_price do |variant|
64
+ calculated = price_for(variant)
65
+ base = price_in(variant)
66
+
67
+ if calculated.present? && base.present? && calculated.id != base.id
68
+ Spree.api.price_serializer.new(base, params: params).to_h
69
+ end
70
+ end
71
+
72
+ # Conditional associations
73
+ many :images,
74
+ resource: Spree.api.image_serializer,
75
+ if: proc { params[:includes]&.include?('images') }
76
+
77
+ many :option_values, resource: Spree.api.option_value_serializer
78
+
79
+ many :public_metafields,
80
+ key: :metafields,
81
+ resource: Spree.api.metafield_serializer,
82
+ if: proc { params[:includes]&.include?('metafields') }
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,22 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ class WishedItemSerializer < BaseSerializer
5
+ typelize variant_id: :string, wishlist_id: :string, quantity: :number
6
+
7
+ attribute :variant_id do |wished_item|
8
+ wished_item.variant&.prefixed_id
9
+ end
10
+
11
+ attribute :wishlist_id do |wished_item|
12
+ wished_item.wishlist&.prefixed_id
13
+ end
14
+
15
+ attributes :quantity,
16
+ created_at: :iso8601, updated_at: :iso8601
17
+
18
+ one :variant, resource: Spree.api.variant_serializer
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ class WishlistSerializer < BaseSerializer
5
+ typelize name: :string, token: :string, is_default: :boolean, is_private: :boolean
6
+
7
+ attributes :name, :token,
8
+ created_at: :iso8601, updated_at: :iso8601
9
+
10
+ attribute :is_default do |wishlist|
11
+ wishlist.is_default?
12
+ end
13
+
14
+ attribute :is_private do |wishlist|
15
+ wishlist.is_private?
16
+ end
17
+
18
+ many :wished_items,
19
+ key: :items,
20
+ resource: Spree.api.wished_item_serializer,
21
+ if: proc { params[:includes]&.include?('items') }
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,156 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ class FiltersAggregator
5
+ SORT_OPTION_IDS = %w[
6
+ manual
7
+ best-selling
8
+ price-low-to-high
9
+ price-high-to-low
10
+ newest-first
11
+ oldest-first
12
+ name-a-z
13
+ name-z-a
14
+ ].freeze
15
+
16
+ # @param scope [ActiveRecord::Relation] Base product scope (already filtered by store, availability, taxon, etc.)
17
+ # @param currency [String] Currency for price range
18
+ # @param taxon [Spree::Taxon, nil] Optional taxon for default_sort and taxon filtering context
19
+ def initialize(scope:, currency:, taxon: nil)
20
+ @scope = scope
21
+ @currency = currency
22
+ @taxon = taxon
23
+ end
24
+
25
+ def call
26
+ {
27
+ filters: build_filters,
28
+ sort_options: sort_options,
29
+ default_sort: @taxon&.sort_order || 'manual',
30
+ total_count: @scope.distinct.count
31
+ }
32
+ end
33
+
34
+ private
35
+
36
+ def build_filters
37
+ [
38
+ price_filter,
39
+ availability_filter,
40
+ *option_type_filters,
41
+ taxon_filter
42
+ ].compact
43
+ end
44
+
45
+ def sort_options
46
+ SORT_OPTION_IDS.map do |id|
47
+ { id: id, label: Spree.t("products_sort_options.#{id.underscore}") }
48
+ end
49
+ end
50
+
51
+ def price_filter
52
+ # Remove ordering to avoid PostgreSQL DISTINCT + ORDER BY conflicts
53
+ prices = Spree::Price.for_products(@scope.reorder(''), @currency)
54
+ min = prices.minimum(:amount)
55
+ max = prices.maximum(:amount)
56
+ return nil if min.nil? || max.nil?
57
+
58
+ {
59
+ id: 'price',
60
+ type: 'price_range',
61
+ label: Spree.t(:price),
62
+ min: min.to_f,
63
+ max: max.to_f,
64
+ currency: @currency
65
+ }
66
+ end
67
+
68
+ def availability_filter
69
+ in_stock_count = @scope.in_stock.distinct.count
70
+ out_of_stock_count = @scope.out_of_stock.distinct.count
71
+
72
+ return nil if in_stock_count.zero? && out_of_stock_count.zero?
73
+
74
+ {
75
+ id: 'availability',
76
+ type: 'availability',
77
+ label: Spree.t(:availability),
78
+ options: [
79
+ { id: 'in_stock', label: Spree.t(:in_stock), count: in_stock_count },
80
+ { id: 'out_of_stock', label: Spree.t(:out_of_stock), count: out_of_stock_count }
81
+ ]
82
+ }
83
+ end
84
+
85
+ def option_type_filters
86
+ Spree::OptionType.filterable.includes(:option_values).order(:position).filter_map do |option_type|
87
+ values = option_type.option_values.for_products(@scope).distinct.order(:position)
88
+ next if values.empty?
89
+
90
+ {
91
+ id: option_type.prefixed_id,
92
+ type: 'option',
93
+ label: option_type.presentation,
94
+ name: option_type.name,
95
+ options: values.map { |ov| option_value_data(option_type, ov) }
96
+ }
97
+ end
98
+ end
99
+
100
+ def option_value_data(option_type, option_value)
101
+ # Count products in scope that have this option value
102
+ # We use a subquery approach to avoid GROUP BY conflicts when scope includes joins (like in_taxon)
103
+ # Join directly to option_value_variants for efficiency (skips joining through option_values table)
104
+ count = Spree::Product
105
+ .where(id: base_scope_product_ids)
106
+ .joins(:option_value_variants)
107
+ .where(Spree::OptionValueVariant.table_name => { option_value_id: option_value.id })
108
+ .distinct
109
+ .count
110
+
111
+ {
112
+ id: option_value.prefixed_id,
113
+ label: option_value.presentation,
114
+ name: option_value.name,
115
+ position: option_value.position,
116
+ count: count
117
+ }
118
+ end
119
+
120
+ def base_scope_product_ids
121
+ @base_scope_product_ids ||= @scope.reorder('').distinct.pluck(:id)
122
+ end
123
+
124
+ def taxon_filter
125
+ return nil if @taxon.nil?
126
+
127
+ # Get child taxons at the next depth level
128
+ child_taxons = @taxon.children.order(:lft).select do |child|
129
+ # Only include taxons that have products in the current scope
130
+ @scope.in_taxon(child).exists?
131
+ end
132
+
133
+ return nil if child_taxons.empty?
134
+
135
+ {
136
+ id: 'taxons',
137
+ type: 'taxon',
138
+ label: Spree.t(:category),
139
+ options: child_taxons.map { |t| taxon_option_data(t) }
140
+ }
141
+ end
142
+
143
+ def taxon_option_data(taxon)
144
+ count = @scope.in_taxon(taxon).distinct.count
145
+
146
+ {
147
+ id: taxon.prefixed_id,
148
+ label: taxon.name,
149
+ permalink: taxon.permalink,
150
+ count: count
151
+ }
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,103 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Orders
5
+ # Clean API v3 order update service with modern conventions:
6
+ # - Flat parameter structure (no wrapping in "order" key)
7
+ # - snake_case field names without "_attributes" suffix
8
+ # - Automatic state management based on what's being updated
9
+ #
10
+ # @example Update shipping address
11
+ # Spree::Api::V3::Orders::Update.call(
12
+ # order: order,
13
+ # params: {
14
+ # email: "customer@example.com",
15
+ # ship_address: {
16
+ # firstname: "John",
17
+ # lastname: "Doe",
18
+ # address1: "123 Main St",
19
+ # city: "New York",
20
+ # zipcode: "10001",
21
+ # country_iso: "US",
22
+ # state_abbr: "NY"
23
+ # }
24
+ # }
25
+ # )
26
+ #
27
+ class Update
28
+ prepend Spree::ServiceModule::Base
29
+
30
+ def call(order:, params:)
31
+ @order = order
32
+ @params = params.to_h.deep_symbolize_keys
33
+
34
+ ApplicationRecord.transaction do
35
+ assign_order_attributes
36
+ assign_address(:ship_address)
37
+ assign_address(:bill_address)
38
+
39
+ order.save!
40
+ end
41
+
42
+ success(order.reload)
43
+ rescue ActiveRecord::RecordInvalid => e
44
+ failure(order, e.record.errors.full_messages.to_sentence)
45
+ rescue StandardError => e
46
+ failure(order, e.message)
47
+ end
48
+
49
+ private
50
+
51
+ attr_reader :order, :params
52
+
53
+ def assign_order_attributes
54
+ order.email = params[:email] if params[:email].present?
55
+ order.special_instructions = params[:special_instructions] if params.key?(:special_instructions)
56
+ order.currency = params[:currency].upcase if params[:currency].present?
57
+ end
58
+
59
+ def assign_address(address_type)
60
+ address_id_param = params[:"#{address_type}_id"]
61
+ address_params = params[address_type]
62
+
63
+ # Priority 1: Direct address ID reference (ship_address_id / bill_address_id)
64
+ if address_id_param.present?
65
+ address_id = resolve_address_id(address_id_param)
66
+ order.public_send(:"#{address_type}_id=", address_id) if address_id
67
+ return
68
+ end
69
+
70
+ # Priority 2: Nested address params (ship_address / bill_address)
71
+ return unless address_params.is_a?(Hash)
72
+
73
+ if address_params[:id].present?
74
+ # Using existing address by ID within nested params
75
+ address_id = resolve_address_id(address_params[:id])
76
+ order.public_send(:"#{address_type}_id=", address_id) if address_id
77
+ else
78
+ # Creating/updating address with provided attributes
79
+ revert_to_address_state if order.has_checkout_step?('address')
80
+ order.public_send(:"#{address_type}_attributes=", address_params)
81
+ end
82
+ end
83
+
84
+ # Translate prefixed ID to internal id
85
+ def resolve_address_id(prefixed_id)
86
+ return unless order.user
87
+
88
+ decoded = Spree::Address.decode_prefixed_id(prefixed_id)
89
+ decoded ? order.user.addresses.find_by(id: decoded)&.id : nil
90
+ end
91
+
92
+ # Revert order state to 'address' when address changes
93
+ # This ensures shipments are recreated when transitioning back to delivery
94
+ def revert_to_address_state
95
+ return if ['cart', 'address'].include?(order.state)
96
+
97
+ order.state = 'address'
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,5 @@
1
+ Alba.backend = :oj
2
+ Alba.inflector = :active_support
3
+
4
+ # Custom types
5
+ Alba.register_type :iso8601, converter: ->(time) { time&.iso8601(3) }, auto_convert: true
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Pagy initializer for API v3
4
+ # https://ddnexus.github.io/pagy/docs/api/pagy/
5
+
6
+ # Default page size for API responses
7
+ Pagy.options[:limit] = 25
8
+
9
+ # Maximum number of items per page
10
+ Pagy.options[:limit_max] = 100
@@ -0,0 +1,25 @@
1
+ # Disable automatic type generation on boot — types are generated manually
2
+ # via `bundle exec rake typelizer:generate`. Set ENABLE_TYPELIZER=1 to enable.
3
+ ENV["DISABLE_TYPELIZER"] ||= "true" unless ENV["ENABLE_TYPELIZER"]
4
+
5
+ Typelizer.configure do |config|
6
+ api_root = Spree::Api::Engine.root
7
+
8
+ config.dirs = [
9
+ api_root.join('app/serializers/spree/api/v3'),
10
+ api_root.join('app/serializers/spree/api/v3/admin')
11
+ ]
12
+ config.output_dir = api_root.join('../../packages/sdk/src/types/generated')
13
+ config.comments = true
14
+
15
+ # Type names: StoreProduct, AdminProduct, etc.
16
+ config.serializer_name_mapper = ->(serializer) {
17
+ name = serializer.name.to_s
18
+ .sub(/\ASpree::Api::V3::Admin::/, 'Admin')
19
+ .sub(/\ASpree::Api::V3::/, 'Store')
20
+ .sub(/Serializer\z/, '')
21
+ name
22
+ }
23
+
24
+ config.listen = false # https://github.com/skryukov/typelizer?tab=readme-ov-file#automatic-generation-in-development
25
+ end
@@ -15,6 +15,7 @@ en:
15
15
  payment:
16
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
17
  update_forbidden: This payment cannot be updated because it is %{state}.
18
+ record_not_found: '%{model} not found'
18
19
  resource_not_found: The resource you were looking for could not be found.
19
20
  shipment:
20
21
  cannot_ready: Cannot ready shipment.