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
data/config/routes.rb CHANGED
@@ -1,220 +1,87 @@
1
- spree_path = Rails.application.routes.url_helpers.try(:spree_path, trailing_slash: true) || '/'
2
-
3
- Rails.application.routes.draw do
4
- use_doorkeeper scope: "#{spree_path}/spree_oauth"
5
- end
6
-
7
1
  Spree::Core::Engine.add_routes do
8
2
  namespace :api, defaults: { format: 'json' } do
9
- namespace :v2 do
10
- namespace :storefront do
11
- resource :cart, controller: :cart, only: %i[show create destroy] do
12
- post :add_item
13
- patch :empty
14
- delete 'remove_line_item/:line_item_id', to: 'cart#remove_line_item', as: :cart_remove_line_item
15
- patch :set_quantity
16
- patch :apply_coupon_code
17
- delete 'remove_coupon_code/:coupon_code', to: 'cart#remove_coupon_code', as: :cart_remove_coupon_code, constraints: { coupon_code: /[^\/]+/ }
18
- delete 'remove_coupon_code', to: 'cart#remove_coupon_code', as: :cart_remove_coupon_code_without_code
19
- get :estimate_shipping_rates
20
- patch :associate
21
- patch :change_currency
22
- end
23
-
24
- resource :checkout, controller: :checkout, only: %i[update] do
25
- patch :next
26
- patch :advance
27
- patch :complete
28
- post :create_payment
29
- post :add_store_credit
30
- post :remove_store_credit
31
- get :payment_methods
32
- get :shipping_rates
33
- patch :select_shipping_method
34
- post :validate_order_for_payment
35
- end
36
-
37
- resource :account, controller: :account, only: %i[show create update]
38
-
39
- namespace :account do
40
- resources :addresses, controller: :addresses
41
- resources :credit_cards, controller: :credit_cards, only: %i[index show destroy]
42
- resources :orders, controller: :orders, only: %i[index show]
43
- end
44
-
45
- resources :countries, only: %i[index]
46
- get '/countries/:iso', to: 'countries#show', as: :country
47
- get '/order_status/:number', to: 'order_status#show', as: :order_status
48
- resources :products, only: %i[index show]
49
- get '/products/:id/variants', to: 'variants#index', as: :product_variants
50
- resources :taxons, only: %i[index show], id: /.+/
51
- get '/stores/:code', to: 'stores#show', as: :store
52
- get '/store', to: 'stores#current', as: :current_store
53
-
54
- resources :menus, only: %i[index show]
55
- resources :cms_pages, only: %i[index show]
56
- resources :policies, only: %i[index show]
57
-
58
- resources :wishlists do
59
- get :default, on: :collection
3
+ namespace :v3 do
4
+ namespace :store do
5
+ # Authentication
6
+ post 'auth/login', to: 'auth#create'
7
+ post 'auth/register', to: 'auth#register'
8
+ post 'auth/refresh', to: 'auth#refresh'
9
+ post 'auth/oauth/callback', to: 'auth#oauth_callback'
10
+
11
+ # Store
12
+ resource :store, only: [:show]
13
+
14
+ # Countries, Currencies, Locales (flat, market-aware)
15
+ resources :countries, only: [:index, :show]
16
+ resources :currencies, only: [:index]
17
+ resources :locales, only: [:index]
60
18
 
61
- member do
62
- post :add_item
63
- patch 'set_item_quantity/:item_id', to: 'wishlists#set_item_quantity', as: :set_item_quantity
64
- delete 'remove_item/:item_id', to: 'wishlists#remove_item', as: :remove_item
65
- post :add_items
66
- delete :remove_items
19
+ # Catalog
20
+ resources :products, only: [:index, :show] do
21
+ collection do
22
+ get :filters, to: 'products/filters#index'
67
23
  end
68
24
  end
69
-
70
- resources :posts, only: %i[index show]
71
- resources :post_categories, only: %i[index show]
72
-
73
- get '/digitals/:token', to: 'digitals#download', as: 'digital'
74
- end
75
-
76
- namespace :platform do
77
- # Promotions API
78
- resources :promotions
79
- resources :promotion_actions
80
- resources :promotion_categories
81
- resources :promotion_rules
82
-
83
- # Returns API
84
- resources :customer_returns
85
- resources :reimbursements
86
- resources :return_authorizations do
87
- member do
88
- patch :add
89
- patch :cancel
90
- patch :receive
91
- end
25
+ resources :taxonomies, only: [:index, :show]
26
+ resources :taxons, only: [:index, :show], id: /.+/ do
27
+ resources :products, only: [:index], controller: 'taxons/products'
92
28
  end
93
29
 
94
- # Product Catalog API
95
- resources :products
96
- resources :taxonomies
97
- resources :taxons do
98
- member do
99
- patch :reposition
100
- end
30
+ # Cart
31
+ resource :cart, only: [:show, :create], controller: 'cart' do
32
+ patch :associate
101
33
  end
102
- resources :classifications
103
- resources :images
104
- resources :variants
105
- resources :properties
106
- resources :product_properties
107
- resources :option_types
108
- resources :option_values
109
34
 
110
- # Order API
111
- resources :orders do
35
+ # Orders - individual order management and checkout
36
+ resources :orders, only: [:show, :update] do
112
37
  member do
113
- patch :next
114
- patch :advance
115
- patch :approve
116
- patch :cancel
117
- patch :empty
118
- patch :apply_coupon_code
119
- patch :complete
120
- patch :use_store_credit
121
- patch :cancel
122
- patch :approve
38
+ # State transitions
39
+ patch :next # Move to next checkout step
40
+ patch :advance # Advance through all steps
41
+ patch :complete # Complete the order
123
42
  end
124
- end
125
- resources :line_items
126
- resources :adjustments
127
-
128
- # Payments API
129
- resources :payments do
130
- # TODO: support custom actions
131
- # member do
132
- # patch :authorize
133
- # patch :capture
134
- # patch :purchase
135
- # patch :void
136
- # patch :credit
137
- # end
138
- end
139
-
140
- # Store Credit API
141
- resources :store_credits
142
- resources :store_credit_categories
143
- resources :store_credit_types
144
-
145
- # Geo API
146
- resources :zones
147
- resources :countries, only: [:index, :show]
148
- resources :states, only: [:index, :show]
149
43
 
150
- # Shipment API
151
- resources :shipments do
152
- member do
153
- %w[ready ship cancel resume pend].each do |state|
154
- patch state.to_sym
44
+ # Nested resources - all require order access
45
+ resource :store_credits, only: [:create, :destroy], controller: 'orders/store_credits'
46
+ resources :line_items, only: [:create, :update, :destroy], controller: 'orders/line_items'
47
+ resources :coupon_codes, only: [:create, :destroy], controller: 'orders/coupon_codes'
48
+ resources :payments, only: [:index, :show], controller: 'orders/payments'
49
+ resources :payment_methods, only: [:index], controller: 'orders/payment_methods'
50
+ resources :payment_sessions, only: [:create, :show, :update], controller: 'orders/payment_sessions' do
51
+ member do
52
+ patch :complete
155
53
  end
156
- patch :add_item
157
- patch :remove_item
158
- patch :transfer_to_location
159
- patch :transfer_to_shipment
160
54
  end
55
+ resources :shipments, only: [:index, :show, :update], controller: 'orders/shipments'
161
56
  end
162
57
 
163
- # Tax API
164
- resources :tax_rates
165
- resources :tax_categories
166
-
167
- # Inventory API
168
- resources :inventory_units
169
- resources :stock_items
170
- resources :stock_locations
171
- resources :stock_movements
172
-
173
- # User API
174
- resources :users
175
- resources :credit_cards
176
- resources :addresses
177
-
178
- resources :roles
179
-
180
- # CMS
181
- resources :cms_pages
182
- resources :cms_sections
183
-
184
- # Wishlists API
185
- resources :wishlists
186
- resources :wished_items
187
-
188
- # Digitals API
189
- resources :digitals
190
- resources :digital_links do
191
- member do
192
- patch :reset
58
+ # Customer
59
+ namespace :customer, path: 'customer' do
60
+ get '/', to: 'account#show'
61
+ patch '/', to: 'account#update'
62
+ resources :addresses, only: [:index, :show, :create, :update, :destroy] do
63
+ member do
64
+ patch :mark_as_default
65
+ end
66
+ end
67
+ resources :orders, only: [:index]
68
+ resources :credit_cards, only: [:index, :show, :destroy]
69
+ resources :gift_cards, only: [:index, :show]
70
+ resources :payment_setup_sessions, only: [:create, :show] do
71
+ member do
72
+ patch :complete
73
+ end
193
74
  end
194
75
  end
195
76
 
196
- # Store API
197
- resources :stores
198
-
199
- # Data Feeds API
200
- resources :data_feeds
201
-
202
- # Configurations API
203
- resources :payment_methods
204
- resources :shipping_categories
205
- resources :shipping_methods
206
-
207
- # Webhooks API
208
- namespace :webhooks do
77
+ # Wishlists
78
+ resources :wishlists do
79
+ resources :items, only: [:create, :update, :destroy], controller: 'wishlist_items'
209
80
  end
210
81
 
211
- # Gift Cards API
212
- resources :gift_cards
213
- end
214
-
215
- namespace :data_feeds do
216
- # google data feed API
217
- get '/google/:slug', to: 'google#rss_feed'
82
+ # Digital Downloads
83
+ # Access via token in URL
84
+ get 'digitals/:token', to: 'digitals#show', as: :digital_download
218
85
  end
219
86
  end
220
87
  end
@@ -90,6 +90,74 @@ module Spree
90
90
  storefront_wished_item_serializer: 'Spree::V2::Storefront::WishedItemSerializer',
91
91
  storefront_metafield_serializer: 'Spree::V2::Storefront::MetafieldSerializer',
92
92
 
93
+ # v3 serializers (API v3)
94
+ credit_card_serializer: 'Spree::Api::V3::CreditCardSerializer',
95
+ price_serializer: 'Spree::Api::V3::PriceSerializer',
96
+ product_serializer: 'Spree::Api::V3::ProductSerializer',
97
+ variant_serializer: 'Spree::Api::V3::VariantSerializer',
98
+ image_serializer: 'Spree::Api::V3::ImageSerializer',
99
+ option_type_serializer: 'Spree::Api::V3::OptionTypeSerializer',
100
+ option_value_serializer: 'Spree::Api::V3::OptionValueSerializer',
101
+ order_serializer: 'Spree::Api::V3::OrderSerializer',
102
+ line_item_serializer: 'Spree::Api::V3::LineItemSerializer',
103
+ payment_serializer: 'Spree::Api::V3::PaymentSerializer',
104
+ payment_session_serializer: 'Spree::Api::V3::PaymentSessionSerializer',
105
+ payment_setup_session_serializer: 'Spree::Api::V3::PaymentSetupSessionSerializer',
106
+ payment_source_serializer: 'Spree::Api::V3::PaymentSourceSerializer',
107
+ store_credit_serializer: 'Spree::Api::V3::StoreCreditSerializer',
108
+ shipment_serializer: 'Spree::Api::V3::ShipmentSerializer',
109
+ address_serializer: 'Spree::Api::V3::AddressSerializer',
110
+ customer_serializer: 'Spree::Api::V3::CustomerSerializer',
111
+ country_serializer: 'Spree::Api::V3::CountrySerializer',
112
+ state_serializer: 'Spree::Api::V3::StateSerializer',
113
+ store_serializer: 'Spree::Api::V3::StoreSerializer',
114
+ wishlist_serializer: 'Spree::Api::V3::WishlistSerializer',
115
+ wished_item_serializer: 'Spree::Api::V3::WishedItemSerializer',
116
+ payment_method_serializer: 'Spree::Api::V3::PaymentMethodSerializer',
117
+ shipping_method_serializer: 'Spree::Api::V3::ShippingMethodSerializer',
118
+ shipping_rate_serializer: 'Spree::Api::V3::ShippingRateSerializer',
119
+ stock_location_serializer: 'Spree::Api::V3::StockLocationSerializer',
120
+ taxonomy_serializer: 'Spree::Api::V3::TaxonomySerializer',
121
+ taxon_serializer: 'Spree::Api::V3::TaxonSerializer',
122
+ order_promotion_serializer: 'Spree::Api::V3::OrderPromotionSerializer',
123
+ digital_link_serializer: 'Spree::Api::V3::DigitalLinkSerializer',
124
+ gift_card_serializer: 'Spree::Api::V3::GiftCardSerializer',
125
+ currency_serializer: 'Spree::Api::V3::CurrencySerializer',
126
+ locale_serializer: 'Spree::Api::V3::LocaleSerializer',
127
+ metafield_serializer: 'Spree::Api::V3::MetafieldSerializer',
128
+
129
+ # v3 event serializers (for models without Store API endpoints yet)
130
+ asset_serializer: 'Spree::Api::V3::AssetSerializer',
131
+ customer_return_serializer: 'Spree::Api::V3::CustomerReturnSerializer',
132
+ digital_serializer: 'Spree::Api::V3::DigitalSerializer',
133
+ export_serializer: 'Spree::Api::V3::ExportSerializer',
134
+ gift_card_batch_serializer: 'Spree::Api::V3::GiftCardBatchSerializer',
135
+ import_serializer: 'Spree::Api::V3::ImportSerializer',
136
+ import_row_serializer: 'Spree::Api::V3::ImportRowSerializer',
137
+ invitation_serializer: 'Spree::Api::V3::InvitationSerializer',
138
+ newsletter_subscriber_serializer: 'Spree::Api::V3::NewsletterSubscriberSerializer',
139
+ post_serializer: 'Spree::Api::V3::PostSerializer',
140
+ post_category_serializer: 'Spree::Api::V3::PostCategorySerializer',
141
+ promotion_serializer: 'Spree::Api::V3::PromotionSerializer',
142
+ refund_serializer: 'Spree::Api::V3::RefundSerializer',
143
+ reimbursement_serializer: 'Spree::Api::V3::ReimbursementSerializer',
144
+ report_serializer: 'Spree::Api::V3::ReportSerializer',
145
+ return_authorization_serializer: 'Spree::Api::V3::ReturnAuthorizationSerializer',
146
+ return_item_serializer: 'Spree::Api::V3::ReturnItemSerializer',
147
+ stock_item_serializer: 'Spree::Api::V3::StockItemSerializer',
148
+ stock_movement_serializer: 'Spree::Api::V3::StockMovementSerializer',
149
+ stock_transfer_serializer: 'Spree::Api::V3::StockTransferSerializer',
150
+
151
+ # v3 admin serializers (API v3 Admin)
152
+ admin_customer_serializer: 'Spree::Api::V3::Admin::CustomerSerializer',
153
+ admin_order_serializer: 'Spree::Api::V3::Admin::OrderSerializer',
154
+ admin_product_serializer: 'Spree::Api::V3::Admin::ProductSerializer',
155
+ admin_variant_serializer: 'Spree::Api::V3::Admin::VariantSerializer',
156
+ admin_price_serializer: 'Spree::Api::V3::Admin::PriceSerializer',
157
+ admin_metafield_serializer: 'Spree::Api::V3::Admin::MetafieldSerializer',
158
+ admin_taxon_serializer: 'Spree::Api::V3::Admin::TaxonSerializer',
159
+ admin_taxonomy_serializer: 'Spree::Api::V3::Admin::TaxonomySerializer',
160
+
93
161
  # platform serializers
94
162
  platform_metafield_serializer: 'Spree::Api::V2::Platform::MetafieldSerializer',
95
163
 
@@ -1,5 +1,4 @@
1
1
  require 'rails/engine'
2
- require 'pagy'
3
2
 
4
3
  require_relative 'dependencies'
5
4
  require_relative 'configuration'
@@ -15,10 +14,6 @@ module Spree
15
14
  Spree::Api::Dependencies = Spree::Api::ApiDependencies.new
16
15
  end
17
16
 
18
- initializer 'spree.api.checking_migrations' do
19
- Migrations.new(config, engine_name).check unless Rails.env.test?
20
- end
21
-
22
17
  # Add API event subscribers
23
18
  config.after_initialize do
24
19
  Spree.subscribers << Spree::WebhookEventSubscriber
@@ -0,0 +1,177 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Api
5
+ module OpenAPI
6
+ # Helper module to reference Typelizer-generated schemas in rswag specs
7
+ module SchemaHelper
8
+ extend self
9
+
10
+ # Reference a schema by name (e.g., 'StoreProduct', 'StoreOrder')
11
+ def ref(schema_name)
12
+ { '$ref' => "#/components/schemas/#{schema_name}" }
13
+ end
14
+
15
+ # Paginated response wrapper
16
+ def paginated(schema_name)
17
+ {
18
+ type: :object,
19
+ properties: {
20
+ data: {
21
+ type: :array,
22
+ items: ref(schema_name)
23
+ },
24
+ meta: ref('PaginationMeta')
25
+ },
26
+ required: %w[data meta]
27
+ }
28
+ end
29
+
30
+ # Error response schema
31
+ def error_response
32
+ ref('ErrorResponse')
33
+ end
34
+
35
+ # Common schemas that are not from serializers
36
+ def common_schemas
37
+ {
38
+ PaginationMeta: {
39
+ type: :object,
40
+ properties: {
41
+ page: { type: :integer, example: 1 },
42
+ limit: { type: :integer, example: 25 },
43
+ count: { type: :integer, example: 100 },
44
+ pages: { type: :integer, example: 4 }
45
+ },
46
+ required: %w[page limit count pages]
47
+ },
48
+ ErrorResponse: {
49
+ type: :object,
50
+ properties: {
51
+ error: {
52
+ type: :object,
53
+ properties: {
54
+ code: { type: :string, example: 'record_not_found' },
55
+ message: { type: :string, example: 'Record not found' },
56
+ details: {
57
+ type: :object,
58
+ description: 'Field-specific validation errors',
59
+ nullable: true,
60
+ example: { name: ['is too short', 'is required'], email: ['is invalid'] }
61
+ }
62
+ },
63
+ required: %w[code message]
64
+ }
65
+ },
66
+ required: %w[error],
67
+ example: {
68
+ error: {
69
+ code: 'validation_error',
70
+ message: 'Validation failed',
71
+ details: { name: ['is too short'], email: ['is invalid'] }
72
+ }
73
+ }
74
+ },
75
+ AuthResponse: {
76
+ type: :object,
77
+ properties: {
78
+ token: { type: :string, description: 'JWT access token' },
79
+ user: { '$ref' => '#/components/schemas/StoreCustomer' }
80
+ },
81
+ required: %w[token user]
82
+ }
83
+ }
84
+ end
85
+
86
+ # Get all schemas (Typelizer + common)
87
+ def all_schemas
88
+ schemas = common_schemas
89
+
90
+ begin
91
+ schemas.merge!(typelizer_schemas)
92
+ rescue StandardError => e
93
+ Rails.logger.warn "Failed to load Typelizer schemas: #{e.message}"
94
+ end
95
+
96
+ schemas
97
+ end
98
+
99
+ private
100
+
101
+ def typelizer_schemas
102
+ with_typelizer_enabled do
103
+ schemas = Typelizer.openapi_schemas
104
+ schemas.each_value { |s| s[:'x-typelizer'] = true }
105
+ fix_refs(schemas)
106
+ schemas
107
+ end
108
+ end
109
+
110
+ # Typelizer's native OpenAPI generator treats unrecognized type strings
111
+ # as $ref to other schemas. This fixes three cases:
112
+ # 1. any → {type: :object}
113
+ # 2. Record<string, unknown> → {type: :object}
114
+ # 3. Union types (e.g., 'TypeA | TypeB | null') → proper anyOf schemas
115
+ def fix_refs(schemas)
116
+ schemas.each_value do |schema|
117
+ next unless schema[:properties]
118
+
119
+ schema[:properties].each do |key, prop|
120
+ schema[:properties][key] = fix_ref(prop)
121
+ end
122
+ end
123
+ end
124
+
125
+ def fix_ref(prop)
126
+ # Direct $ref
127
+ if (ref_value = prop['$ref'])
128
+ return resolve_ref(ref_value, prop)
129
+ end
130
+
131
+ # allOf wrapper (used for nullable refs)
132
+ if prop[:allOf]&.length == 1 && (ref_value = prop[:allOf][0]['$ref'])
133
+ resolved = resolve_ref(ref_value, {})
134
+ resolved[:nullable] = true if prop[:nullable]
135
+ return resolved
136
+ end
137
+
138
+ prop
139
+ end
140
+
141
+ def resolve_ref(ref_value, base)
142
+ ref_name = ref_value.sub('#/components/schemas/', '')
143
+
144
+ # any → {type: :object} (closest OpenAPI equivalent)
145
+ return base.except('$ref').merge(type: :object) if ref_name == 'any'
146
+
147
+ # Record<string, unknown> → {type: :object}
148
+ if ref_name.start_with?('Record<')
149
+ return base.except('$ref').merge(type: :object)
150
+ end
151
+
152
+ # Union types (e.g., 'TypeA | TypeB | null') → anyOf
153
+ if ref_name.include?(' | ')
154
+ types = ref_name.split(' | ').map(&:strip)
155
+ nullable = types.delete('null')
156
+ refs = types.map { |t| { '$ref' => "#/components/schemas/#{t}" } }
157
+ result = { anyOf: refs }
158
+ result[:nullable] = true if nullable
159
+ return result
160
+ end
161
+
162
+ base
163
+ end
164
+
165
+ # Typelizer is normally disabled in test/production, but we need it
166
+ # enabled to generate OpenAPI schemas from serializer type hints
167
+ def with_typelizer_enabled
168
+ original = ENV['DISABLE_TYPELIZER']
169
+ ENV['DISABLE_TYPELIZER'] = 'false'
170
+ yield
171
+ ensure
172
+ ENV['DISABLE_TYPELIZER'] = original
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
@@ -1,3 +1 @@
1
- Dir["#{File.dirname(__FILE__)}/factories/**"].each do |f|
2
- load File.expand_path(f)
3
- end
1
+ # No factories in api, gem, keeping for backwards compatibility
@@ -0,0 +1,118 @@
1
+ # Helper module for generating JWT tokens in tests
2
+ module Spree
3
+ module Api
4
+ module V3
5
+ module TestingSupport
6
+ def self.generate_jwt(user, expiration: 24.hours.to_i)
7
+ user_type = user.is_a?(Spree.admin_user_class) ? 'admin' : 'customer'
8
+ payload = {
9
+ user_id: user.id,
10
+ user_type: user_type,
11
+ exp: Time.current.to_i + expiration
12
+ }
13
+ secret = Rails.application.credentials.jwt_secret_key || ENV['JWT_SECRET_KEY'] || Rails.application.secret_key_base
14
+ JWT.encode(payload, secret, 'HS256')
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ shared_context 'API v3 Store' do
22
+ let(:store) { @default_store || create(:store, default: true) }
23
+ let(:api_key) { create(:api_key, :publishable, store: store) }
24
+ let(:api_key_headers) { { 'x-spree-api-key' => api_key.token } }
25
+
26
+ let(:user) { create(:user_with_addresses) }
27
+ let(:jwt_token) { Spree::Api::V3::TestingSupport.generate_jwt(user) }
28
+ let(:bearer_headers) { api_key_headers.merge('Authorization' => "Bearer #{jwt_token}") }
29
+
30
+ before do
31
+ allow_any_instance_of(Spree::Api::V3::BaseController).to receive(:current_store).and_return(store)
32
+ end
33
+ end
34
+
35
+ shared_context 'API v3 Store authenticated' do
36
+ include_context 'API v3 Store'
37
+
38
+ let(:headers) { bearer_headers }
39
+ end
40
+
41
+ shared_context 'API v3 Store guest' do
42
+ include_context 'API v3 Store'
43
+
44
+ let(:headers) { api_key_headers }
45
+ end
46
+
47
+ # Shared examples for common response patterns
48
+ shared_examples 'returns 200 OK' do
49
+ it 'returns 200 status' do
50
+ subject
51
+ expect(response).to have_http_status(:ok)
52
+ end
53
+ end
54
+
55
+ shared_examples 'returns 201 Created' do
56
+ it 'returns 201 status' do
57
+ subject
58
+ expect(response).to have_http_status(:created)
59
+ end
60
+ end
61
+
62
+ shared_examples 'returns 204 No Content' do
63
+ it 'returns 204 status' do
64
+ subject
65
+ expect(response).to have_http_status(:no_content)
66
+ end
67
+ end
68
+
69
+ shared_examples 'returns 401 Unauthorized' do
70
+ it 'returns 401 status' do
71
+ subject
72
+ expect(response).to have_http_status(:unauthorized)
73
+ end
74
+ end
75
+
76
+ shared_examples 'returns 403 Forbidden' do
77
+ it 'returns 403 status' do
78
+ subject
79
+ expect(response).to have_http_status(:forbidden)
80
+ end
81
+ end
82
+
83
+ shared_examples 'returns 404 Not Found' do
84
+ it 'returns 404 status' do
85
+ subject
86
+ expect(response).to have_http_status(:not_found)
87
+ end
88
+ end
89
+
90
+ shared_examples 'returns 422 Unprocessable Entity' do
91
+ it 'returns 422 status' do
92
+ subject
93
+ expect(response).to have_http_status(:unprocessable_content)
94
+ end
95
+ end
96
+
97
+ shared_examples 'requires API key' do
98
+ context 'without API key' do
99
+ let(:headers) { {} }
100
+
101
+ it 'returns 401 unauthorized' do
102
+ subject
103
+ expect(response).to have_http_status(:unauthorized)
104
+ expect(json_response[:error]).to include('API key')
105
+ end
106
+ end
107
+ end
108
+
109
+ shared_examples 'requires authentication' do
110
+ context 'without JWT token' do
111
+ let(:headers) { api_key_headers }
112
+
113
+ it 'returns 401 unauthorized' do
114
+ subject
115
+ expect(response).to have_http_status(:unauthorized)
116
+ end
117
+ end
118
+ end