spree_api 6.0.0.beta4 → 6.0.0.rc2

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 (531) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -48
  3. data/app/controllers/concerns/spree/api/v3/admin/email_template_lookup.rb +139 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
  5. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
  6. data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +1 -1
  7. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +15 -29
  8. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +10 -2
  10. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +3 -3
  11. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
  12. data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +1 -1
  13. data/app/controllers/concerns/spree/api/v3/error_handler.rb +55 -4
  14. data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
  15. data/app/controllers/concerns/spree/api/v3/http_caching.rb +44 -11
  16. data/app/controllers/concerns/spree/api/v3/idempotent.rb +20 -5
  17. data/app/controllers/concerns/spree/api/v3/items_payload.rb +1 -1
  18. data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
  19. data/app/controllers/concerns/spree/api/v3/order_lock.rb +2 -2
  20. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
  21. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +7 -11
  22. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
  23. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +3 -15
  24. data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +2 -10
  25. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
  26. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +8 -28
  27. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
  28. data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +9 -1
  29. data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
  30. data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
  31. data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +1 -1
  32. data/app/controllers/concerns/spree/api/v3/store/storefront_products.rb +5 -4
  33. data/app/controllers/concerns/spree/api/v3/storefront_gating.rb +11 -5
  34. data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
  35. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +8 -4
  36. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  37. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +16 -8
  38. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  39. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +2 -6
  40. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -9
  41. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +61 -34
  42. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  43. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  44. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -10
  45. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  46. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +5 -3
  47. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  48. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +62 -14
  49. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -4
  50. data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +1 -5
  51. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -5
  52. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +20 -27
  53. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -5
  54. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -7
  55. data/app/controllers/spree/api/v3/admin/countries_controller.rb +6 -2
  56. data/app/controllers/spree/api/v3/admin/coupon_codes_controller.rb +0 -4
  57. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +22 -4
  58. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -9
  59. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -5
  60. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -11
  61. data/app/controllers/spree/api/v3/admin/customers/credit_cards_controller.rb +0 -4
  62. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -13
  63. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  64. data/app/controllers/spree/api/v3/admin/customers_controller.rb +37 -9
  65. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  66. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  67. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +16 -8
  68. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +95 -62
  69. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  70. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +14 -7
  71. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  72. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +53 -0
  73. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +34 -0
  74. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +37 -0
  75. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +42 -0
  76. data/app/controllers/spree/api/v3/admin/email_templates/revisions_controller.rb +35 -0
  77. data/app/controllers/spree/api/v3/admin/email_templates/sample_records_controller.rb +33 -0
  78. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +44 -0
  79. data/app/controllers/spree/api/v3/admin/email_templates_controller.rb +46 -0
  80. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  81. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  82. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  83. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  84. data/app/controllers/spree/api/v3/admin/imports_controller.rb +37 -11
  85. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  86. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  87. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -8
  88. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  89. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  90. data/app/controllers/spree/api/v3/admin/me_controller.rb +13 -4
  91. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  92. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +9 -5
  93. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  94. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  95. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -5
  96. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  97. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +20 -6
  98. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +6 -2
  99. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +30 -6
  100. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  101. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  102. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +83 -22
  103. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +9 -5
  104. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  105. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +37 -12
  106. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +18 -19
  107. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +7 -5
  108. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  109. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  110. data/app/controllers/spree/api/v3/admin/orders_controller.rb +76 -62
  111. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  112. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +26 -7
  113. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  114. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  115. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +32 -67
  116. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -8
  117. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  118. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +29 -16
  119. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -18
  120. data/app/controllers/spree/api/v3/admin/products_controller.rb +122 -71
  121. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -6
  122. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -5
  123. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  124. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +55 -8
  125. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  126. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  127. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  128. data/app/controllers/spree/api/v3/admin/resource_controller.rb +2 -1
  129. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  130. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  131. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +7 -9
  132. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +17 -10
  133. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  134. data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +0 -4
  135. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +1 -1
  136. data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +1 -1
  137. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +77 -32
  138. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -23
  139. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  140. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  141. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +49 -8
  142. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -48
  143. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  144. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  145. data/app/controllers/spree/api/v3/admin/tags_controller.rb +8 -5
  146. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  147. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  148. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  149. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  150. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  151. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  152. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  153. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +40 -13
  154. data/app/controllers/spree/api/v3/admin/webhook_events_controller.rb +25 -0
  155. data/app/controllers/spree/api/v3/base_controller.rb +12 -0
  156. data/app/controllers/spree/api/v3/resource_controller.rb +99 -3
  157. data/app/controllers/spree/api/v3/seller/auth_controller.rb +10 -2
  158. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  159. data/app/controllers/spree/api/v3/seller/countries_controller.rb +3 -3
  160. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  161. data/app/controllers/spree/api/v3/seller/exports_controller.rb +21 -4
  162. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  163. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  164. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +12 -4
  165. data/app/controllers/spree/api/v3/seller/invitations_controller.rb +1 -1
  166. data/app/controllers/spree/api/v3/seller/me_controller.rb +15 -4
  167. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  168. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  169. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  170. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  171. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  172. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +23 -2
  173. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  174. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  175. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  176. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  177. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +20 -11
  178. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  179. data/app/controllers/spree/api/v3/seller/products_controller.rb +115 -28
  180. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  181. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +13 -6
  182. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  183. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  184. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  185. data/app/controllers/spree/api/v3/seller/team_controller.rb +5 -1
  186. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  187. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +9 -2
  188. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +11 -11
  189. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +13 -4
  190. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +23 -7
  191. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +21 -7
  192. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +16 -3
  193. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +26 -28
  194. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +9 -1
  195. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  196. data/app/controllers/spree/api/v3/store/carts_controller.rb +64 -52
  197. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -8
  198. data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +1 -5
  199. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  200. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  201. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +10 -2
  202. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -11
  203. data/app/controllers/spree/api/v3/store/customer/credit_cards_controller.rb +0 -4
  204. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -5
  205. data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +0 -4
  206. data/app/controllers/spree/api/v3/store/customer/gift_cards_controller.rb +0 -4
  207. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +0 -4
  208. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +25 -6
  209. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -9
  210. data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -5
  211. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  212. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  213. data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +1 -1
  214. data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +1 -1
  215. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +27 -14
  216. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +12 -7
  217. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +11 -6
  218. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  219. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  220. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -8
  221. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  222. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  223. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  224. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  225. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  226. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  227. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  228. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  229. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  230. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  231. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  232. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  233. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  234. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  235. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  236. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  237. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  238. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  239. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  240. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  241. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  242. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  243. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +29 -0
  244. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  245. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  246. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  247. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  248. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  249. data/app/serializers/spree/api/v3/admin/address_serializer.rb +8 -7
  250. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +2 -6
  251. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  252. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  253. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +1 -3
  254. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -8
  255. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  256. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  257. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +1 -3
  258. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +1 -3
  259. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +7 -10
  260. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  261. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +1 -3
  262. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  263. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  264. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  265. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +1 -5
  266. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  267. data/app/serializers/spree/api/v3/admin/coupon_code_serializer.rb +1 -7
  268. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -7
  269. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +6 -2
  270. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +5 -17
  271. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +2 -6
  272. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  273. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +20 -30
  274. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  275. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +1 -3
  276. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  277. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +1 -3
  278. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +1 -7
  279. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +4 -2
  280. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  281. data/app/serializers/spree/api/v3/admin/email_template_draft_serializer.rb +19 -0
  282. data/app/serializers/spree/api/v3/admin/email_template_preview_serializer.rb +38 -0
  283. data/app/serializers/spree/api/v3/admin/email_template_revision_serializer.rb +18 -0
  284. data/app/serializers/spree/api/v3/admin/email_template_sample_record_serializer.rb +13 -0
  285. data/app/serializers/spree/api/v3/admin/email_template_serializer.rb +61 -0
  286. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  287. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +6 -3
  288. data/app/serializers/spree/api/v3/admin/export_serializer.rb +1 -7
  289. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  290. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  291. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  292. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +1 -7
  293. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -17
  294. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +4 -10
  295. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  296. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  297. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +14 -18
  298. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  299. data/app/serializers/spree/api/v3/admin/market_serializer.rb +7 -2
  300. data/app/serializers/spree/api/v3/admin/media_serializer.rb +4 -5
  301. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +1 -3
  302. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +5 -9
  303. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
  304. data/app/serializers/spree/api/v3/admin/order_serializer.rb +38 -48
  305. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +1 -3
  306. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +7 -4
  307. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -8
  308. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  309. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +4 -4
  310. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  311. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +5 -2
  312. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  313. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -6
  314. data/app/serializers/spree/api/v3/admin/price_serializer.rb +2 -0
  315. data/app/serializers/spree/api/v3/admin/product_serializer.rb +4 -10
  316. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +2 -10
  317. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +1 -3
  318. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +5 -9
  319. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +1 -5
  320. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +6 -25
  321. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -17
  322. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +1 -3
  323. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -0
  324. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  325. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +9 -0
  326. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +1 -3
  327. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -12
  328. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +1 -3
  329. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  330. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +7 -7
  331. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +2 -6
  332. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +1 -7
  333. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +8 -16
  334. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +11 -10
  335. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +8 -21
  336. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +1 -3
  337. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +4 -3
  338. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +3 -9
  339. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +1 -7
  340. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +1 -3
  341. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +1 -3
  342. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +1 -3
  343. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +6 -3
  344. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +11 -20
  345. data/app/serializers/spree/api/v3/admin/store_serializer.rb +21 -84
  346. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +2 -4
  347. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +6 -10
  348. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +1 -3
  349. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +9 -3
  350. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +3 -19
  351. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  352. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +13 -10
  353. data/app/serializers/spree/api/v3/admin/webhook_delivery_serializer.rb +1 -3
  354. data/app/serializers/spree/api/v3/admin/webhook_event_serializer.rb +23 -0
  355. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +2 -4
  356. data/app/serializers/spree/api/v3/base_serializer.rb +132 -7
  357. data/app/serializers/spree/api/v3/cart_serializer.rb +20 -66
  358. data/app/serializers/spree/api/v3/category_serializer.rb +5 -15
  359. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +6 -29
  360. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -16
  361. data/app/serializers/spree/api/v3/collection_serializer.rb +1 -3
  362. data/app/serializers/spree/api/v3/company_serializer.rb +1 -3
  363. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  364. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  365. data/app/serializers/spree/api/v3/custom_field_serializer.rb +1 -2
  366. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  367. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -32
  368. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  369. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +1 -3
  370. data/app/serializers/spree/api/v3/digital_link_serializer.rb +3 -9
  371. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -12
  372. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +6 -30
  373. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -16
  374. data/app/serializers/spree/api/v3/export_serializer.rb +1 -3
  375. data/app/serializers/spree/api/v3/fee_serializer.rb +2 -10
  376. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  377. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  378. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +4 -11
  379. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +3 -7
  380. data/app/serializers/spree/api/v3/gift_card_serializer.rb +7 -17
  381. data/app/serializers/spree/api/v3/import_row_serializer.rb +2 -6
  382. data/app/serializers/spree/api/v3/import_serializer.rb +3 -26
  383. data/app/serializers/spree/api/v3/invitation_serializer.rb +2 -19
  384. data/app/serializers/spree/api/v3/line_item_serializer.rb +19 -23
  385. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  386. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  387. data/app/serializers/spree/api/v3/media_event_serializer.rb +1 -3
  388. data/app/serializers/spree/api/v3/media_serializer.rb +8 -5
  389. data/app/serializers/spree/api/v3/newsletter_subscriber_request_event_serializer.rb +35 -0
  390. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +2 -6
  391. data/app/serializers/spree/api/v3/option_value_serializer.rb +1 -3
  392. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -25
  393. data/app/serializers/spree/api/v3/order_serializer.rb +14 -58
  394. data/app/serializers/spree/api/v3/password_reset_requested_event_serializer.rb +29 -0
  395. data/app/serializers/spree/api/v3/payment_method_serializer.rb +2 -6
  396. data/app/serializers/spree/api/v3/payment_serializer.rb +5 -10
  397. data/app/serializers/spree/api/v3/payment_session_serializer.rb +5 -13
  398. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +3 -11
  399. data/app/serializers/spree/api/v3/policy_serializer.rb +1 -3
  400. data/app/serializers/spree/api/v3/price_history_serializer.rb +6 -8
  401. data/app/serializers/spree/api/v3/price_serializer.rb +7 -12
  402. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  403. data/app/serializers/spree/api/v3/product_publication_serializer.rb +1 -7
  404. data/app/serializers/spree/api/v3/product_serializer.rb +10 -24
  405. data/app/serializers/spree/api/v3/product_submission_serializer.rb +26 -0
  406. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +23 -4
  407. data/app/serializers/spree/api/v3/refund_serializer.rb +11 -16
  408. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +6 -21
  409. data/app/serializers/spree/api/v3/return_serializer.rb +4 -16
  410. data/app/serializers/spree/api/v3/saved_report_event_serializer.rb +23 -0
  411. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  412. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  413. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  414. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  415. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  416. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  417. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +5 -15
  418. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +8 -13
  419. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +1 -3
  420. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +1 -3
  421. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  422. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +6 -3
  423. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  424. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  425. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +1 -7
  426. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +2 -6
  427. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  428. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +1 -3
  429. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  430. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +8 -13
  431. data/app/serializers/spree/api/v3/seller/order_serializer.rb +19 -40
  432. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  433. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +6 -6
  434. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +11 -0
  435. data/app/serializers/spree/api/v3/seller/price_serializer.rb +11 -0
  436. data/app/serializers/spree/api/v3/seller/product_serializer.rb +3 -7
  437. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +1 -21
  438. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +9 -13
  439. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +3 -9
  440. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  441. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -17
  442. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  443. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  444. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +10 -9
  445. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  446. data/app/serializers/spree/api/v3/seller_serializer.rb +1 -3
  447. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +22 -4
  448. data/app/serializers/spree/api/v3/stock_level_serializer.rb +1 -7
  449. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  450. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +1 -3
  451. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +20 -4
  452. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +1 -7
  453. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +2 -13
  454. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -27
  455. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +6 -4
  456. data/app/serializers/spree/api/v3/tax_line_serializer.rb +11 -23
  457. data/app/serializers/spree/api/v3/variant_serializer.rb +10 -24
  458. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +1 -11
  459. data/app/serializers/spree/api/v3/wishlist_serializer.rb +2 -6
  460. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  461. data/app/services/spree/api/v3/filter_table.rb +337 -0
  462. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  463. data/app/services/spree/api/v3/request_schema.rb +430 -0
  464. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  465. data/app/subscribers/spree/webhook_event_subscriber.rb +3 -10
  466. data/config/initializers/pagy.rb +1 -1
  467. data/config/initializers/typelizer.rb +7 -9
  468. data/config/locales/ar.yml +15 -0
  469. data/config/locales/be.yml +15 -0
  470. data/config/locales/bg.yml +15 -0
  471. data/config/locales/ca.yml +15 -0
  472. data/config/locales/cs.yml +15 -0
  473. data/config/locales/da.yml +15 -0
  474. data/config/locales/de-CH.yml +11 -0
  475. data/config/locales/de.yml +15 -0
  476. data/config/locales/el.yml +15 -0
  477. data/config/locales/en.yml +5 -40
  478. data/config/locales/es-CL.yml +10 -0
  479. data/config/locales/es-EC.yml +11 -0
  480. data/config/locales/es-MX.yml +12 -0
  481. data/config/locales/es.yml +15 -0
  482. data/config/locales/et.yml +15 -0
  483. data/config/locales/fa.yml +15 -0
  484. data/config/locales/fi.yml +15 -0
  485. data/config/locales/fr.yml +15 -0
  486. data/config/locales/hu.yml +15 -0
  487. data/config/locales/id.yml +15 -0
  488. data/config/locales/it.yml +15 -0
  489. data/config/locales/ja.yml +15 -0
  490. data/config/locales/km.yml +15 -0
  491. data/config/locales/ko.yml +15 -0
  492. data/config/locales/ku.yml +15 -0
  493. data/config/locales/lt.yml +15 -0
  494. data/config/locales/lv.yml +15 -0
  495. data/config/locales/nb.yml +15 -0
  496. data/config/locales/ne.yml +15 -0
  497. data/config/locales/nl.yml +15 -0
  498. data/config/locales/pl.yml +15 -0
  499. data/config/locales/pt-BR.yml +13 -0
  500. data/config/locales/pt.yml +15 -0
  501. data/config/locales/ro.yml +15 -0
  502. data/config/locales/ru.yml +15 -0
  503. data/config/locales/sk.yml +15 -0
  504. data/config/locales/sl-SI.yml +15 -0
  505. data/config/locales/sv.yml +15 -0
  506. data/config/locales/th.yml +15 -0
  507. data/config/locales/tr.yml +15 -0
  508. data/config/locales/uk.yml +15 -0
  509. data/config/locales/vi.yml +15 -0
  510. data/config/locales/zh-CN.yml +15 -0
  511. data/config/locales/zh-TW.yml +15 -0
  512. data/config/routes.rb +54 -102
  513. data/lib/spree/api/configuration.rb +5 -0
  514. data/lib/spree/api/dependencies.rb +54 -274
  515. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  516. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  517. data/lib/spree/api/openapi/schema_helper.rb +127 -81
  518. data/lib/spree/api/preference_families.rb +46 -0
  519. data/lib/spree/api/preference_types.rb +138 -0
  520. data/lib/spree/api/typelizer_generation.rb +39 -0
  521. data/lib/spree/api/webhook_event_types.rb +140 -0
  522. data/lib/spree/api.rb +0 -2
  523. data/lib/tasks/filters.rake +12 -0
  524. data/lib/typelizer/open_enums.rb +10 -0
  525. metadata +125 -40
  526. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  527. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  528. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  529. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
  530. data/config/i18n-tasks.yml +0 -40
  531. data/config/initializers/alba.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cbd216e65a6f6ce291a04b750595491f827262d4de353562ac43fa51d69c376e
4
- data.tar.gz: ed6181390f17841dc63104e068e6812d936dc29d3896c8366ea27cebc6817274
3
+ metadata.gz: 06aac9de6a57402c698fb881a27df504047b5a488e9bdc87b472af681115d5f8
4
+ data.tar.gz: fa3c078090e803d00a5fa1b947b594175d8c5657d90e9490f074a57b814f7dd3
5
5
  SHA512:
6
- metadata.gz: 50b7fd005e9f4c80d83c1be99a3e4abf9c84a947e5b801fae461a4596b3e5005a376c2fbb1a6e9aeea063492cdc3548116cfdca5621b551598fbcbac1635fb4c
7
- data.tar.gz: '00699269b7d5c5c53d2154a32784c48a8e42a9a2759c05e387fb2218a5725249ab52179861f69b0afa217c5fe429a855fcc3077b9d21dce2efcfea6317cad20e'
6
+ metadata.gz: c3d0ab4516f51aaa3e3c062e35fc1267c2c90191948e5b0d0dc5a7d6fba6b7ce5020cc66ac563ea9ae49c3948d13cf8a2245b655678fb14806612409d3f7cae3
7
+ data.tar.gz: ac4aae51601b99ab1e4985c521a6edd4dae0613ec68f7950f837cf6fa4181a3c258fd9765206443e1a1b590e2584ce64fb2a93174dd9276a73bc526446a02111
data/Rakefile CHANGED
@@ -45,61 +45,17 @@ namespace :rswag do
45
45
  puts "Reordered paths by tag → #{path}"
46
46
  end
47
47
  end
48
-
49
- # Keep the CLI's bundled offline spec (@spree/cli's `admin-spec.json` /
50
- # `resource-paths.json`) in sync with the freshly generated admin.yaml,
51
- # so `spree api endpoints`/`schema` never drift from the published docs.
52
- # Best-effort: skipped with a notice when the JS toolchain isn't present
53
- # (this is a Ruby/doc task and shouldn't hard-fail on a missing runtime).
54
- bundler = File.expand_path('../../packages/cli/scripts/bundle-spec.mjs', __dir__)
55
- if File.exist?(bundler) && system('node', '--version', out: File::NULL, err: File::NULL)
56
- cli_dir = File.expand_path('../../packages/cli', __dir__)
57
- if system('node', bundler, chdir: cli_dir)
58
- puts 'Regenerated CLI offline spec → packages/cli/src/generated/'
59
- else
60
- warn 'WARNING: failed to regenerate CLI offline spec (bundle-spec.mjs); run `pnpm --filter @spree/cli build` to resync.'
61
- end
62
- else
63
- puts 'Skipping CLI offline spec regeneration (node/bundle-spec.mjs unavailable).'
64
- end
65
48
  end
66
49
  end
67
50
  end
68
51
 
69
52
  namespace :typelizer do
70
- desc 'Generate TypeScript types for both Store and Admin SDKs'
53
+ desc 'Generate TypeScript types for every SDK (runs in spree_emails, where all serializers load)'
71
54
  task :generate do
72
- ENV['RAILS_ENV'] ||= 'test'
73
- ENV['DISABLE_TYPELIZER'] = 'false'
74
-
75
- require File.expand_path('spec/dummy/config/environment', __dir__)
76
-
77
- # Eager load serializers so typelizer can find them
78
- serializers_path = File.expand_path('app/serializers/spree/api/v3', __dir__)
79
- Rails.autoloaders.main.eager_load_dir(serializers_path)
80
-
81
- require 'typelizer/generator'
82
-
83
- # Writer config is in config/initializers/typelizer.rb
84
- Typelizer::Generator.call(force: true)
85
-
86
- # Post-process: convert `type Foo = {` to `interface Foo {` for declaration merging support.
87
- # This lets SDK consumers extend generated types via `declare module '@spree/sdk' { interface Product { ... } }`.
88
- api_root = Spree::Api::Engine.root
89
- [
90
- api_root.join('../../packages/sdk/src/types/generated'),
91
- api_root.join('../../packages/admin-sdk/src/types/generated')
92
- ].each do |dir|
93
- Dir[File.join(dir, '*.ts')].each do |file|
94
- next if File.basename(file) == 'index.ts'
95
-
96
- content = File.read(file)
97
- updated = content.gsub(/^type (\w+) = \{/, 'interface \1 {')
98
- File.write(file, updated) if updated != content
99
- end
55
+ emails_dir = File.expand_path('../emails', __dir__)
56
+ Bundler.with_unbundled_env do
57
+ sh "cd #{emails_dir} && bundle exec rake typelizer:generate"
100
58
  end
101
-
102
- puts "Generated types → packages/sdk/src/types/generated/ & packages/admin-sdk/src/types/generated/"
103
59
  end
104
60
 
105
61
  desc 'Clean and regenerate TypeScript types'
@@ -0,0 +1,139 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # Finds the editable email template a request is about, from its
6
+ # dotted key, for the language the request names.
7
+ module EmailTemplateLookup
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ scoped_resource :email_templates
12
+
13
+ before_action :load_email_template
14
+
15
+ rescue_from Spree::EmailTemplates::NoSampleRecord, with: :render_no_sample
16
+ rescue_from Liquid::Error, MRML::Error, with: :render_render_error
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :email_template
22
+
23
+ def load_email_template
24
+ @email_template = Spree::EmailTemplates::Entry.for_id(
25
+ current_store, params[:email_template_id] || params[:id], locale: language
26
+ )
27
+ end
28
+
29
+ # A language code, or "any" for the version every language uses. Named
30
+ # `language` rather than `locale`, which picks the response's language.
31
+ def language
32
+ @language ||= params[:language].to_s.strip.presence || Spree::EmailTemplate::ANY_LOCALE
33
+ end
34
+
35
+ def serialize_email_template(reload: false)
36
+ load_email_template if reload
37
+ Spree.api.admin_email_template_serializer.new(email_template, params: serializer_params).to_h
38
+ end
39
+
40
+ def serializer_class
41
+ Spree.api.admin_email_template_serializer
42
+ end
43
+
44
+ # Renders the template as it stands after a workflow ran, or why the
45
+ # workflow refused.
46
+ def render_email_template_result(result, status: :ok)
47
+ return render_stale_draft if result.error&.value == :stale
48
+ return render_template_problems(result.value) if result.error&.value == :invalid_template
49
+ return render_result_error(result) unless result.success?
50
+
51
+ render json: serialize_email_template(reload: true), status: status
52
+ end
53
+
54
+ # Every published version of the template in the requested language.
55
+ def email_template_revisions
56
+ Spree::EmailTemplateRevision.where(
57
+ email_template: current_store.email_templates.for_key(email_template.key, language)
58
+ )
59
+ end
60
+
61
+ # An unsaved subject and body are previewed only when sent, so an
62
+ # empty body still previews as empty. `branding` previews unsaved
63
+ # colors and font.
64
+ def preview_arguments
65
+ arguments = params.permit(:record_id, :subject, :body).to_h.symbolize_keys
66
+ arguments[:locale] = language
67
+ arguments[:email_key] = params[:email_key].to_s.tr('.', '/').presence
68
+ arguments[:branding] = params.fetch(:branding, {}).permit(*Spree::Emails::Branding.attribute_names).to_h
69
+ arguments
70
+ end
71
+
72
+ # Samples show a real record of the store (the latest order, a
73
+ # company), so previewing one needs permission to read it.
74
+ def authorize_sample_data!
75
+ missing = sample_classes.flat_map { |sample| Array(sample.try(:required_permissions)) }.uniq.
76
+ reject { |key| holds_permission?(key) }
77
+ return if missing.empty?
78
+
79
+ render_error(
80
+ code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:access_denied],
81
+ message: I18n.t('spree.email_templates.sample_needs_permission', permissions: missing.to_sentence),
82
+ status: :forbidden,
83
+ details: { required_scope: missing.first }
84
+ )
85
+ end
86
+
87
+ # A preview shows one email; publishing the layout or a partial
88
+ # renders every email, so it needs what all of their samples need.
89
+ def sample_classes
90
+ if action_name == 'create' && controller_name == 'publications' && !email_template.definition.email?
91
+ Spree.editable_email_templates.emails.map(&:sample_class)
92
+ else
93
+ [build_preview.email.sample_class]
94
+ end
95
+ end
96
+
97
+ def build_preview
98
+ Spree::EmailTemplates::Preview.new(store: current_store, key: email_template.key, strict: true, **preview_arguments)
99
+ end
100
+
101
+ def render_template_problems(problems)
102
+ problems = problems.map { |problem| problem.merge(email: problem[:email].tr('/', '.')) }
103
+
104
+ render_error(
105
+ code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:email_template_invalid],
106
+ message: problems.map { |problem| problem[:message] }.uniq.to_sentence,
107
+ status: :unprocessable_content,
108
+ details: { problems: problems }
109
+ )
110
+ end
111
+
112
+ # Attributed to the template being edited, whose lines the editor marks.
113
+ def render_render_error(error)
114
+ render_template_problems([{ email: email_template.id, message: error.message, line: error.try(:line_number) }])
115
+ end
116
+
117
+ def render_no_sample(error)
118
+ render_error(
119
+ code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:email_template_no_sample],
120
+ message: error.message,
121
+ status: :unprocessable_content
122
+ )
123
+ end
124
+
125
+ def render_stale_draft
126
+ saved_by = email_template.draft&.updated_by&.actor_label
127
+
128
+ render_error(
129
+ code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:email_template_stale],
130
+ message: I18n.t('spree.email_templates.stale_draft', name: saved_by || I18n.t('spree.email_templates.another_admin')),
131
+ status: :conflict,
132
+ details: { updated_by: saved_by }
133
+ )
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
@@ -32,6 +32,16 @@ module Spree
32
32
  # Membership actions resolve products themselves; the base
33
33
  # single-resource load has nothing to look up.
34
34
  skip_before_action :set_resource
35
+
36
+ # Adding (create) and removing (destroy) take the same body.
37
+ [nil, :destroy].each do |action|
38
+ request_params 'ProductMembershipParams', action: action do |body|
39
+ body.attribute :product_ids, :array, of: :id,
40
+ required: true,
41
+ example: %w[prod_abc123],
42
+ description: 'Products from other stores, or ones the caller cannot see, are ignored.'
43
+ end
44
+ end
35
45
  end
36
46
 
37
47
  # POST /{parents}/:parent_id/products
@@ -15,6 +15,32 @@ module Spree
15
15
 
16
16
  included do
17
17
  before_action :authorize_parent_access!
18
+
19
+ # Read from the raw params by `create_workflow_arguments`, with
20
+ # every line resolved through the document.
21
+ request_params :stock_receipt do |body|
22
+ body.attribute :reference, :string,
23
+ nullable: true,
24
+ example: 'DN-4471',
25
+ description: "The supplier's delivery note, or the carrier's reference."
26
+ body.attribute :received_at, :datetime,
27
+ nullable: true,
28
+ description: 'When the goods were counted in. Defaults to now.'
29
+ body.attribute :notes, :string, nullable: true
30
+ body.attribute :items, :array,
31
+ permit: false,
32
+ as: 'StockReceiptItemParams',
33
+ description: 'Omit to book in everything still outstanding, intact. Naming lines, even none, records exactly what the dock counted: `quantity_accepted` reaches the shelf; `quantity_rejected` is refused, recorded with a `rejection_reason` and never stocked.' do |item|
34
+ item.attribute :id, :id, required: true, description: 'The purchase order or transfer line.'
35
+ item.attribute :quantity_accepted, :integer, example: 58
36
+ item.attribute :quantity_rejected, :integer, example: 2
37
+ item.attribute :rejection_reason, :string,
38
+ nullable: true,
39
+ choices: Spree::StockReceiptItem::REJECTION_REASONS,
40
+ example: 'damaged'
41
+ item.attribute :notes, :string, nullable: true
42
+ end
43
+ end
18
44
  end
19
45
 
20
46
  protected
@@ -39,10 +65,6 @@ module Spree
39
65
  [items: :line]
40
66
  end
41
67
 
42
- def resource_permitted_attributes
43
- [:received_at, :reference, :notes]
44
- end
45
-
46
68
  def create_workflow_arguments
47
69
  {
48
70
  receivable_keyword => @parent,
@@ -44,7 +44,7 @@ module Spree
44
44
  if secret_api_key && store_id_header && secret_api_key.store&.prefixed_id != store_id_header
45
45
  render_error(
46
46
  code: ErrorHandler::ERROR_CODES[:access_denied],
47
- message: Spree.t('api.errors.store_mismatch', default: 'The requested store does not match the store this API key belongs to.'),
47
+ message: I18n.t('spree.api.errors.store_mismatch'),
48
48
  status: :forbidden
49
49
  )
50
50
  return
@@ -13,11 +13,10 @@ module Spree
13
13
  #
14
14
  # The body picks the subclass against the registry (returns 422 with
15
15
  # the configured error code on miss), strips `type`/`preferences`
16
- # from the permitted attrs, builds/assigns the rest, and routes
17
- # preference values through the typed `preferred_<name>=` setters
18
- # so booleans/decimals/etc. get coerced. Unknown preference keys
19
- # are silently dropped — the schema endpoint is the source of truth
20
- # for what's settable.
16
+ # from the permitted attrs, builds/assigns the rest, and writes the
17
+ # preferences after checking them against the subclass's schema —
18
+ # an unknown key or a value of the wrong type is a 422
19
+ # `invalid_preferences`.
21
20
  module SubclassedResource
22
21
  extend ActiveSupport::Concern
23
22
 
@@ -45,9 +44,9 @@ module Spree
45
44
  attrs, preferences, calculator = extract_subclass_params(permitted)
46
45
 
47
46
  @resource = build_subclassed_resource(klass, attrs)
47
+ authorize_resource!(@resource, :create)
48
48
  apply_preferences(@resource, preferences) if preferences.present?
49
49
  apply_calculator(@resource, calculator) if calculator.present?
50
- authorize_resource!(@resource, :create)
51
50
 
52
51
  if @resource.save
53
52
  render json: serialize_resource(@resource), status: :created
@@ -63,11 +62,13 @@ module Spree
63
62
  permitted = permitted_params_for(@resource.class)
64
63
  attrs, preferences, calculator = extract_subclass_params(permitted)
65
64
 
66
- @resource.assign_attributes(attrs)
67
- apply_preferences(@resource, preferences) if preferences.present?
68
- apply_calculator(@resource, calculator) if calculator.present?
65
+ saved = save_atomically do
66
+ @resource.assign_attributes(attrs)
67
+ apply_preferences(@resource, preferences) if preferences.present?
68
+ apply_calculator(@resource, calculator) if calculator.present?
69
+ end
69
70
 
70
- if @resource.save
71
+ if saved
71
72
  render json: serialize_resource(@resource)
72
73
  else
73
74
  render_validation_error(@resource.errors)
@@ -103,31 +104,16 @@ module Spree
103
104
  def render_unknown_type
104
105
  render_error(
105
106
  code: self.class.unknown_type_error_code,
106
- message: Spree.t("api.#{self.class.unknown_type_error_code}",
107
+ message: I18n.t("spree.api.#{self.class.unknown_type_error_code}",
107
108
  default: 'Unknown type'),
108
109
  status: :unprocessable_content
109
110
  )
110
111
  end
111
112
 
113
+ # Validated against the subclass's schema before anything is written
114
+ # (see `Spree::Preferences::Preferable#assign_preferences`).
112
115
  def apply_preferences(resource, preferences)
113
- password_keys = resource.password_preference_keys
114
-
115
- preferences.each do |key, value|
116
- pref_name = key.to_sym
117
- next unless resource.has_preference?(pref_name)
118
- # Internal preferences are Spree's to write — a secret a
119
- # provider issued, an id it gave back. They are absent from the
120
- # schema, so no form offers them; ignoring them here is what
121
- # stops a client writing one anyway and breaking the signature
122
- # check that depends on it.
123
- next if resource.preference_internal(pref_name)
124
- # Round-trip guard: clients fetching a record see masked
125
- # `:password` values. Submitting the mask back unchanged
126
- # must NOT overwrite the real secret with `••••cret`.
127
- next if password_keys.include?(pref_name) && Spree::Preferences::Masking.masked?(value)
128
-
129
- resource.set_preference(pref_name, value)
130
- end
116
+ resource.assign_preferences(preferences)
131
117
  end
132
118
 
133
119
  # Pulls `preferences` and `calculator` out of the permitted
@@ -26,7 +26,7 @@ module Spree
26
26
  # nil code, which the dashboard reads as "render the message".
27
27
  details = errors.details[attribute] || []
28
28
 
29
- result[attribute] = messages.each_with_index.map do |message, index|
29
+ result[wire_error_attribute(errors, attribute)] = messages.each_with_index.map do |message, index|
30
30
  detail = details[index] || {}
31
31
  code = detail[:error].is_a?(Symbol) ? detail[:error] : nil
32
32
 
@@ -4,6 +4,8 @@ module Spree
4
4
  module CartResolvable
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ include Spree::Api::V3::PurchaseSerialization
8
+
7
9
  protected
8
10
 
9
11
  # Find cart by prefixed ID and authorize read access (owner or guest
@@ -57,6 +59,13 @@ module Spree
57
59
  @cart = @cart.remove_out_of_stock_items!
58
60
  end
59
61
 
62
+ # Drops a batch coupon code the cart no longer holds. Unlike the line
63
+ # sweep this runs after writes too, since an API client may rely on
64
+ # write responses alone to learn why its discount went.
65
+ def sweep_unavailable_coupon_code!
66
+ @cart = @cart.remove_unavailable_coupon_code!
67
+ end
68
+
60
69
  # Render what the checkout produced (for the complete action).
61
70
  #
62
71
  # A checkout spanning several sellers produced a group of orders rather
@@ -66,9 +75,8 @@ module Spree
66
75
  # needs there.
67
76
  def render_order(status: :ok)
68
77
  record = @cart.reload
69
- serializer = record.is_a?(Spree::OrderGroup) ? Spree.api.order_group_serializer : Spree.api.order_serializer
70
78
 
71
- render json: serializer.new(record, params: serializer_params).to_h, status: status
79
+ render json: purchase_serializer_for(record).new(record, params: serializer_params).to_h, status: status
72
80
  end
73
81
 
74
82
  # Return the cart token from the request headers.
@@ -59,8 +59,8 @@ module Spree
59
59
  if header && header.id != bound.id
60
60
  render_error(
61
61
  code: ErrorHandler::ERROR_CODES[:channel_mismatch],
62
- message: Spree.t('api.errors.channel_mismatch', default: 'The requested channel does not match the channel this API key is bound to'),
63
- status: :unprocessable_entity
62
+ message: I18n.t('spree.api.errors.channel_mismatch'),
63
+ status: :unprocessable_content
64
64
  )
65
65
  return
66
66
  end
@@ -68,7 +68,7 @@ module Spree
68
68
  unless bound.active?
69
69
  render_error(
70
70
  code: ErrorHandler::ERROR_CODES[:channel_inactive],
71
- message: Spree.t('api.errors.channel_inactive', default: 'The channel this API key is bound to is not active'),
71
+ message: I18n.t('spree.api.errors.channel_inactive'),
72
72
  status: :forbidden
73
73
  )
74
74
  return
@@ -13,8 +13,10 @@ module Spree
13
13
 
14
14
  protected
15
15
 
16
+ # Each including controller declares the address it takes with
17
+ # `request_params`.
16
18
  def permitted_params
17
- params.permit(:label, *Spree::Api::V3::AddressParams::ADDRESS_KEYS)
19
+ params.permit(*declared_permitted_attributes)
18
20
  end
19
21
 
20
22
  # @return [Hash] default keywords for Spree::Addresses::Create / Update
@@ -39,7 +39,7 @@ module Spree
39
39
  def render_current_password_invalid
40
40
  render_error(
41
41
  code: ErrorHandler::ERROR_CODES[:current_password_invalid],
42
- message: Spree.t(:current_password_invalid, scope: :api),
42
+ message: I18n.t('spree.api.current_password_invalid'),
43
43
  status: :unprocessable_content
44
44
  )
45
45
  end
@@ -48,10 +48,12 @@ module Spree
48
48
  insufficient_stock: 'insufficient_stock',
49
49
  invalid_quantity: 'invalid_quantity',
50
50
  invalid_price: 'invalid_price',
51
+ invalid_money_format: 'invalid_money_format',
51
52
  price_override_not_allowed: 'price_override_not_allowed',
52
53
 
53
54
  # Validation errors
54
55
  validation_error: 'validation_error',
56
+ invalid_preferences: 'invalid_preferences',
55
57
  parameter_missing: 'parameter_missing',
56
58
  parameter_invalid: 'parameter_invalid',
57
59
 
@@ -74,6 +76,11 @@ module Spree
74
76
  # Export errors
75
77
  export_not_ready: 'export_not_ready',
76
78
 
79
+ # Email template errors
80
+ email_template_stale: 'email_template_stale',
81
+ email_template_invalid: 'email_template_invalid',
82
+ email_template_no_sample: 'email_template_no_sample',
83
+
77
84
  # Rate limiting errors
78
85
  rate_limit_exceeded: 'rate_limit_exceeded',
79
86
 
@@ -96,8 +103,11 @@ module Spree
96
103
  rescue_from Spree::Core::GatewayError, with: :handle_gateway_error
97
104
  rescue_from ActionController::ParameterMissing, with: :handle_parameter_missing
98
105
  rescue_from ActiveRecord::RecordInvalid, with: :handle_record_invalid
106
+ rescue_from Spree::Preferences::InvalidPreferences, with: :handle_invalid_preferences
107
+ rescue_from ActiveRecord::RecordNotSaved, with: :handle_record_not_saved
99
108
  rescue_from ArgumentError, with: :handle_argument_error
100
109
  rescue_from ActionDispatch::Http::Parameters::ParseError, with: :handle_parse_error
110
+ rescue_from ActiveSupport::MessageVerifier::InvalidSignature, with: :handle_invalid_signature
101
111
  end
102
112
 
103
113
  protected
@@ -155,7 +165,7 @@ module Spree
155
165
  # Workflows reject with a symbol naming the reason. Translate it,
156
166
  # falling back to the symbol so a missing key is visible rather
157
167
  # than silently blank.
158
- render_error(code: code, message: Spree.t(error, default: error.to_s.humanize), status: status)
168
+ render_error(code: code, message: I18n.t("spree.#{error}", default: error.to_s.humanize), status: status)
159
169
  else
160
170
  render_error(code: code, message: error.to_s, status: status)
161
171
  end
@@ -239,6 +249,26 @@ module Spree
239
249
  render_validation_error(exception.record.errors)
240
250
  end
241
251
 
252
+ # Each failing value is keyed by its JSON pointer into the request,
253
+ # e.g. `/preferences/channel_ids/1`.
254
+ def handle_invalid_preferences(exception)
255
+ render_error(
256
+ code: ERROR_CODES[:invalid_preferences],
257
+ message: exception.message,
258
+ status: :unprocessable_content,
259
+ details: exception.failures.group_by { |failure| failure[:pointer] }.transform_values { |failures| failures.pluck(:message) }
260
+ )
261
+ end
262
+
263
+ # Replacing a has_one on a saved record saves the new one at once, and
264
+ # raises when that one fails its own validations.
265
+ def handle_record_not_saved(exception)
266
+ errors = exception.record&.errors
267
+ return render_validation_error(errors) if errors.present?
268
+
269
+ render_error(code: ERROR_CODES[:validation_error], message: exception.message, status: :unprocessable_content)
270
+ end
271
+
242
272
  def handle_argument_error(exception)
243
273
  Rails.error.report(exception, context: error_context, source: 'spree.api.v3')
244
274
  render_error(
@@ -248,6 +278,16 @@ module Spree
248
278
  )
249
279
  end
250
280
 
281
+ # A `signed_id` that was tampered with, or has expired (they last a
282
+ # day), is a bad parameter rather than a server fault.
283
+ def handle_invalid_signature(_exception)
284
+ render_error(
285
+ code: ERROR_CODES[:parameter_invalid],
286
+ message: I18n.t('spree.upload_reference_invalid'),
287
+ status: :unprocessable_content
288
+ )
289
+ end
290
+
251
291
  def handle_parse_error(exception)
252
292
  Rails.error.report(exception, context: error_context, source: 'spree.api.v3')
253
293
  message = exception.respond_to?(:original_message) ? exception.original_message : exception.message
@@ -263,11 +303,22 @@ module Spree
263
303
 
264
304
  # Format validation errors for details field
265
305
  def format_validation_details(errors)
266
- errors.messages.transform_values do |messages|
267
- messages.map { |msg| msg }
306
+ errors.messages.to_h do |attribute, messages|
307
+ [wire_error_attribute(errors, attribute), messages.map { |msg| msg }]
268
308
  end
269
309
  end
270
310
 
311
+ # A setting the API reads and writes under its plain name reports its
312
+ # errors under that name too, never the `preferred_` one the model uses;
313
+ # an attachment slot reports them under the `<slot>_signed_id` it is
314
+ # written with.
315
+ def wire_error_attribute(errors, attribute)
316
+ record_class = errors.objects.first&.base&.class
317
+ (record_class.exposed_preference_name(attribute) if record_class.respond_to?(:exposed_preference_name)) ||
318
+ (record_class.signed_id_attribute_for(attribute) if record_class.respond_to?(:signed_id_attribute_for)) ||
319
+ attribute
320
+ end
321
+
271
322
  # Infer error code from context
272
323
  def infer_error_code(errors, status)
273
324
  case status
@@ -311,7 +362,7 @@ module Spree
311
362
  model_name&.humanize || 'record'
312
363
  end
313
364
 
314
- Spree.t(:record_not_found, scope: 'api', model: label)
365
+ I18n.t('spree.api.record_not_found', model: label)
315
366
  end
316
367
 
317
368
  # Extract clean model name from exception
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # `POST /files`: accepts a file for the current store and returns the
5
+ # opaque, expiring `signed_id` an endpoint that uses the file takes
6
+ # (docs/plans/6.0-uploads-and-file-ownership.md).
7
+ #
8
+ # A JSON request carries the file's metadata and gets back a storage
9
+ # target to send the bytes to; a multipart request carries the bytes in
10
+ # its `file` part. Shared by the admin and seller branches: a file
11
+ # stored here is attached to nothing, so what differs is only the gate
12
+ # each branch puts in front of it, which stays on the including
13
+ # controller as its `scoped_resource`.
14
+ module FileUploads
15
+ extend ActiveSupport::Concern
16
+
17
+ def create
18
+ file_upload = Spree::FileUpload.new(store: current_store, **file_upload_params)
19
+
20
+ if file_upload.save
21
+ render json: file_upload_serializer.new(file_upload, params: serializer_params).to_h, status: :created
22
+ else
23
+ render_validation_error(file_upload.errors)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def file_upload_params
30
+ params.permit(*declared_permitted_attributes).to_h.symbolize_keys
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end