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
@@ -80,7 +80,7 @@ module Spree
80
80
  # which raises before the controller hook fires and yields 403.
81
81
  def destroy
82
82
  if @resource.respond_to?(:can_be_deleted?) && !@resource.can_be_deleted?
83
- message = Spree.t(:cannot_delete, scope: 'api', model: @resource.class.model_name.human)
83
+ message = I18n.t('spree.api.cannot_delete', model: @resource.class.model_name.human)
84
84
  return render_error(
85
85
  code: ERROR_CODES[:validation_error],
86
86
  message: message,
@@ -96,6 +96,18 @@ module Spree
96
96
 
97
97
  protected
98
98
 
99
+ # Runs the block's assignments and saves the resource as one unit:
100
+ # assigning a has_one (a calculator, say) on a saved record writes it
101
+ # at once, so anything refused afterwards rolls that back too.
102
+ #
103
+ # @return [Boolean] whether the resource was saved
104
+ def save_atomically
105
+ model_class.transaction do
106
+ yield
107
+ @resource.save || raise(ActiveRecord::Rollback)
108
+ end || false
109
+ end
110
+
99
111
  def authenticate_request!
100
112
  raise NotImplementedError, "#{self.class} must implement authenticate_request!"
101
113
  end
@@ -272,6 +284,32 @@ module Spree
272
284
  nil
273
285
  end
274
286
 
287
+ # Whether this endpoint's list filters through Ransack on
288
+ # {#model_class}. An index that ignores `q`, or whose model depends on
289
+ # the request, has no filter table to publish.
290
+ #
291
+ # @return [Boolean]
292
+ def filterable?
293
+ true
294
+ end
295
+
296
+ # Sort keys this endpoint accepts beyond the model's sortable
297
+ # attributes, for a controller that sorts outside Ransack.
298
+ #
299
+ # @return [Array<String>]
300
+ def additional_sort_fields
301
+ []
302
+ end
303
+
304
+ # Whether this endpoint also filters and sorts on the store's
305
+ # searchable custom fields (`cf_<namespace>_<key>`), which are store
306
+ # data and so cannot be listed in the contract.
307
+ #
308
+ # @return [Boolean]
309
+ def custom_field_filters?
310
+ false
311
+ end
312
+
275
313
  # Override in subclass to disable distinct (e.g., for custom sorting with computed columns)
276
314
  # @return [Boolean] whether to apply distinct to the collection
277
315
  def collection_distinct?
@@ -297,6 +335,7 @@ module Spree
297
335
  def ransack_params
298
336
  rp = params[:q]&.to_unsafe_h || params[:q] || {}
299
337
  rp = decode_prefixed_id_predicates(rp)
338
+ rp = decode_api_type_predicates(rp)
300
339
  sort_value = sort_param
301
340
 
302
341
  if sort_value.present?
@@ -329,6 +368,60 @@ module Spree
329
368
  end
330
369
  end
331
370
 
371
+ # Filters on a type column take the same shorthand responses carry
372
+ # (`type_eq=orders`, `receivable_type_eq=purchase_order`), translated
373
+ # here to the class name the column stores. Only the model's own STI
374
+ # column and its polymorphic `*_type` columns are translated; any other
375
+ # `*_type` attribute (`media_type`, `key_type`) is a plain value.
376
+ RANSACK_TYPE_PREDICATE_RE = /\A(?<attribute>(?:\w+_)?type)_(?:eq|not_eq|in|not_in)\z/.freeze
377
+ def decode_api_type_predicates(hash)
378
+ return hash unless hash.is_a?(Hash)
379
+
380
+ hash.each_with_object({}) do |(key, value), result|
381
+ resolver = api_type_resolver(RANSACK_TYPE_PREDICATE_RE.match(key.to_s)&.[](:attribute))
382
+ result[key] = if resolver
383
+ resolve_api_type_values(value, resolver)
384
+ elsif value.is_a?(Hash)
385
+ decode_api_type_predicates(value)
386
+ else
387
+ value
388
+ end
389
+ end
390
+ end
391
+
392
+ # A scalar stays a scalar; a list — including the indexed form
393
+ # (`type_in[0]=orders`) that arrives as a hash — becomes an array.
394
+ def resolve_api_type_values(value, resolver)
395
+ case value
396
+ when Hash, Array then (value.is_a?(Hash) ? value.values : value).map { |entry| resolve_api_type_values(entry, resolver) }
397
+ else resolver.call(value.to_s) || value
398
+ end
399
+ end
400
+
401
+ # A `*type` column of {#model_class}, or of a model it reaches through
402
+ # its associations (`payment_method_type`), as the filter tables publish.
403
+ #
404
+ # @param attribute [String, nil]
405
+ # @return [Proc, nil] shorthand → stored class name
406
+ def api_type_resolver(attribute, model = model_class, depth = 0)
407
+ return if attribute.nil? || !model.respond_to?(:api_type_resolver)
408
+
409
+ model.api_type_resolver(attribute) || begin
410
+ return if depth >= Spree::Api::V3::FilterTable::MAX_DEPTH
411
+
412
+ model.reflect_on_all_associations.each do |reflection|
413
+ next if reflection.polymorphic? || !attribute.start_with?("#{reflection.name}_")
414
+
415
+ resolver = api_type_resolver(attribute.delete_prefix("#{reflection.name}_"), reflection.klass, depth + 1)
416
+ return resolver if resolver
417
+ rescue NameError
418
+ # A reflection naming a class this installation does not load.
419
+ next
420
+ end
421
+ nil
422
+ end
423
+ end
424
+
332
425
  # Matches both prefixed-FK predicates (`product_id_in`, `tax_category_id_eq`)
333
426
  # and the bare-`id` predicates (`id_in`, `id_eq`) on the resource's
334
427
  # primary key. Without the bare-id branch, `q[id_in][]=prod_x` would
@@ -468,9 +561,12 @@ module Spree
468
561
  resource_permitted_attributes + model_additional_permitted_attributes
469
562
  end
470
563
 
471
- # Override in subclass to declare the resource's writable attributes.
564
+ # The resource's writable attributes: its `request_params`
565
+ # declaration, or an override in the subclass.
472
566
  def resource_permitted_attributes
473
- raise NotImplementedError, 'Subclass must implement resource_permitted_attributes or permitted_params'
567
+ return declared_permitted_attributes if request_params_schema
568
+
569
+ raise NotImplementedError, 'Subclass must declare request_params, or implement resource_permitted_attributes or permitted_params'
474
570
  end
475
571
 
476
572
  # Attributes extensions have declared on the model via
@@ -35,6 +35,14 @@ module Spree
35
35
  skip_before_action :set_current_seller_context, only: [:create, :refresh, :logout, :providers]
36
36
  skip_before_action :authenticate_seller!, only: [:create, :refresh, :logout, :providers]
37
37
 
38
+ request_params 'LoginParams' do |body|
39
+ body.attribute :provider, :string,
40
+ choices: %w[email],
41
+ description: 'The authentication method. Defaults to `email`.'
42
+ body.attribute :email, :string, required: true, example: 'seller@example.com'
43
+ body.attribute :password, :string, required: true, example: 'password123'
44
+ end
45
+
38
46
  # POST /api/v3/seller/auth/login
39
47
  def create
40
48
  strategy = authentication_strategy
@@ -48,7 +56,7 @@ module Spree
48
56
  # not enough: without a role on some seller there is no panel to
49
57
  # sign in to, and minting a token would hand out an audience the
50
58
  # holder can do nothing with.
51
- return render_authentication_failed(Spree.t(:seller_membership_required)) unless user.seller_member?
59
+ return render_authentication_failed(I18n.t('spree.seller_membership_required')) unless user.seller_member?
52
60
 
53
61
  set_refresh_cookie(
54
62
  Spree::RefreshToken.create_for(
@@ -100,7 +108,7 @@ module Spree
100
108
  clear_refresh_cookie
101
109
  return render_error(
102
110
  code: ErrorHandler::ERROR_CODES[:access_denied],
103
- message: Spree.t(:seller_membership_required),
111
+ message: I18n.t('spree.seller_membership_required'),
104
112
  status: :forbidden
105
113
  )
106
114
  end
@@ -18,6 +18,7 @@ module Spree
18
18
  before_action :authenticate_seller!
19
19
 
20
20
  include Spree::Api::V3::ScopedAuthorization
21
+ include Spree::Api::V3::StrictMoneyParams
21
22
  end
22
23
  end
23
24
  end
@@ -14,9 +14,9 @@ module Spree
14
14
  # GET /api/v3/seller/countries
15
15
  #
16
16
  # Unpaginated: there are ~250 countries and an address dropdown needs
17
- # them all at once, which Pagy's global max_limit would prevent.
17
+ # them all at once, which Pagy's global client_limit would prevent.
18
18
  def index
19
- countries = Spree::Country.all.sort_by(&:name)
19
+ countries = Spree::Country.all.sort_by(&:iso)
20
20
 
21
21
  render json: {
22
22
  data: countries.map { |country| serialize_country(country) },
@@ -27,7 +27,7 @@ module Spree
27
27
  private
28
28
 
29
29
  def serialize_country(country)
30
- Spree.api.country_serializer.new(
30
+ Spree.api.seller_country_serializer.new(
31
31
  country, params: { store: current_store, expand: ['states'] }
32
32
  ).to_h
33
33
  end
@@ -19,6 +19,42 @@ module Spree
19
19
  class DeliveryMethodsController < Seller::ResourceController
20
20
  scoped_resource :delivery_methods
21
21
 
22
+ # No provider fields: both are fixed for a seller's method, and
23
+ # permitting them would let a write fail validation for a choice the
24
+ # seller was never offered. No markup either — that prices a
25
+ # carrier's quote, and a seller has no carrier.
26
+ request_params :delivery_method do |body|
27
+ body.attribute :name, :string, required: true, on: :create
28
+ body.attribute :admin_name, :string, nullable: true
29
+ body.attribute :code, :string, nullable: true
30
+ body.attribute :delivery_profile_id, :id, description: "One of the marketplace's delivery profiles."
31
+ body.attribute :delivery_zone_id, :id,
32
+ nullable: true,
33
+ description: 'Narrows where the method ships; null serves everywhere the profile reaches.'
34
+ body.attribute :storefront_visible, :boolean
35
+ body.attribute :tracking_url, :string, nullable: true
36
+ body.attribute :estimated_transit_business_days_min, :integer, nullable: true
37
+ body.attribute :estimated_transit_business_days_max, :integer, nullable: true
38
+ body.attribute :calculator, :object,
39
+ description: "How the method is priced: a type from `/delivery_methods/calculators` and its preferences, per that type's `schema`." do |calculator|
40
+ calculator.attribute :type, :string, example: 'flat_rate'
41
+ calculator.attribute :preferences, :hash, example: { amount: '12.5' }
42
+ end
43
+ # Permitted in `permitted_params`, together with the attributes
44
+ # the seller's rule kinds declare on their own classes.
45
+ body.attribute :rules, :array,
46
+ permit: false,
47
+ as: 'DeliveryMethodRuleParams',
48
+ description: 'Replaces the whole set: a rule dropped here is deleted, so re-send surviving rules with their `id`. An empty list clears every condition.' do |rule|
49
+ rule.attribute :id, :id
50
+ rule.attribute :type, :string,
51
+ required: true,
52
+ description: 'A type from `/delivery_methods/rule_types`.'
53
+ rule.attribute :active, :boolean
54
+ rule.attribute :preferences, :hash
55
+ end
56
+ end
57
+
22
58
  # GET /api/v3/seller/delivery_methods/calculators
23
59
  # The ways a seller can price a method, with the preference schema
24
60
  # each one's form is rendered from.
@@ -29,7 +65,7 @@ module Spree
29
65
  {
30
66
  type: calculator_class.api_type,
31
67
  name: calculator_class.description,
32
- preference_schema: calculator_class.respond_to?(:serialized_preference_schema) ? calculator_class.serialized_preference_schema : []
68
+ schema: calculator_class.preference_json_schema
33
69
  }
34
70
  end
35
71
 
@@ -48,7 +84,7 @@ module Spree
48
84
  type: klass.api_type,
49
85
  name: klass.human_name,
50
86
  description: klass.human_description,
51
- preference_schema: klass.serialized_preference_schema
87
+ schema: klass.preference_json_schema
52
88
  }
53
89
  end
54
90
 
@@ -64,9 +100,9 @@ module Spree
64
100
  @resource.assign_attributes(assignable_params)
65
101
  authorize_resource!(@resource, :create)
66
102
  rederive_origin_group(@resource)
67
- assign_calculator(@resource)
103
+ @resource.assign_calculator_attributes(permitted_params[:calculator])
68
104
 
69
- if @resource.errors.empty? && @resource.save
105
+ if @resource.save
70
106
  render json: serialize_resource(@resource), status: :created
71
107
  else
72
108
  render_validation_error(@resource.errors)
@@ -74,11 +110,13 @@ module Spree
74
110
  end
75
111
 
76
112
  def update
77
- @resource.assign_attributes(assignable_params)
78
- rederive_origin_group(@resource)
79
- assign_calculator(@resource)
113
+ saved = save_atomically do
114
+ @resource.assign_attributes(assignable_params)
115
+ rederive_origin_group(@resource)
116
+ @resource.assign_calculator_attributes(permitted_params[:calculator])
117
+ end
80
118
 
81
- if @resource.errors.empty? && @resource.save
119
+ if saved
82
120
  render json: serialize_resource(@resource)
83
121
  else
84
122
  render_validation_error(@resource.errors)
@@ -116,19 +154,10 @@ module Spree
116
154
  action_name == 'show' ? super : resource_scope.find_by_prefix_id!(params[:id])
117
155
  end
118
156
 
119
- # No provider fields: both are fixed for a seller's method, and
120
- # permitting them would let a write fail validation for a choice the
121
- # seller was never offered. No markup either — that prices a
122
- # carrier's quote, and a seller has no carrier.
123
157
  def permitted_params
124
158
  params.permit(
125
- *model_additional_permitted_attributes,
126
- :name, :admin_name, :code, :storefront_visible, :tracking_url,
127
- :estimated_transit_business_days_min, :estimated_transit_business_days_max,
128
- :calculator_type,
129
- :delivery_profile_id, :delivery_zone_id,
130
- calculator_preferences: {},
131
- rules: [:id, :type, :active, { preferences: {} }, *subclassed_rule_attributes]
159
+ *permitted_attributes,
160
+ rules: [*request_params_schema.fields[:rules].schema.permit_list, *subclassed_rule_attributes]
132
161
  )
133
162
  end
134
163
 
@@ -175,7 +204,7 @@ module Spree
175
204
  # resolves its own pickers.
176
205
  def assignable_params
177
206
  attributes = permitted_params.except(
178
- :delivery_profile_id, :delivery_zone_id, :calculator_type, :calculator_preferences, :rules
207
+ :delivery_profile_id, :delivery_zone_id, :calculator, :rules
179
208
  )
180
209
 
181
210
  if params.key?(:delivery_profile_id)
@@ -218,46 +247,6 @@ module Spree
218
247
  row
219
248
  end
220
249
  end
221
-
222
- def assign_calculator(delivery_method)
223
- calculator_type = permitted_params[:calculator_type]
224
- preferences = permitted_params[:calculator_preferences]
225
-
226
- if calculator_type.present? && delivery_method.calculator&.class&.api_type != calculator_type
227
- registered = Spree::DeliveryMethod.calculators.find do |klass|
228
- klass.api_type == calculator_type
229
- end
230
- unless registered
231
- delivery_method.errors.add(:calculator_type, :invalid)
232
- return
233
- end
234
-
235
- # Resolved from the registry entry's OWN name, never the
236
- # request's: nothing user-supplied reaches `constantize`. Going
237
- # back through the name rather than instantiating `registered`
238
- # directly is what survives a reload — in development the
239
- # registry holds a class from an earlier one, and an instance of
240
- # it fails the association's type check.
241
- delivery_method.calculator = registered.to_s.constantize.new
242
- end
243
-
244
- return if preferences.blank?
245
-
246
- # A payload may carry preferences without naming a calculator —
247
- # editing the amount on a method that already has one, or creating
248
- # with the default. The model only builds the default calculator
249
- # at validation, so without this the preferences land on nothing
250
- # and the amount the merchant typed is silently replaced by a free
251
- # rate.
252
- delivery_method.ensure_calculator
253
- return if delivery_method.calculator.nil?
254
-
255
- preferences.each do |key, value|
256
- next unless delivery_method.calculator.has_preference?(key)
257
-
258
- delivery_method.calculator.set_preference(key, value)
259
- end
260
- end
261
250
  end
262
251
  end
263
252
  end
@@ -25,6 +25,23 @@ module Spree
25
25
 
26
26
  scoped_resource :exports
27
27
 
28
+ request_params 'SellerExportCreateParams' do |body|
29
+ body.attribute :type, :string,
30
+ required: true,
31
+ choices: ALLOWED_TYPES,
32
+ description: 'Which dataset to export.'
33
+ body.attribute :record_selection, :string,
34
+ choices: %w[filtered all],
35
+ description: '`filtered` (default) keeps `search_params`; `all` exports everything this seller owns.'
36
+ # Read from the raw params: an arbitrary Ransack hash with nested
37
+ # groupings, which `permit(k: {})` rejects.
38
+ body.attribute :search_params, :hash,
39
+ permit: false,
40
+ description: 'Ransack predicates, the same shape the list endpoints take. Ignored when `record_selection` is `all`.'
41
+ body.attribute :results_url, :string,
42
+ description: "Panel URL the export-done email links back to. Honored only when it matches one of the store's allowed origins."
43
+ end
44
+
28
45
  # POST /api/v3/seller/exports
29
46
  #
30
47
  # Refused before the record is built when the type is not one a
@@ -140,7 +157,7 @@ module Spree
140
157
  # `to_unsafe_h`. `:format` is deliberately dropped: only CSV exists,
141
158
  # and Rails' request format would otherwise overwrite the enum.
142
159
  def permitted_params
143
- attrs = params.permit(*model_additional_permitted_attributes, :type, :record_selection, :results_url)
160
+ attrs = params.permit(*permitted_attributes)
144
161
  raw = params[:search_params]
145
162
  attrs[:search_params] = raw.respond_to?(:to_unsafe_h) ? raw.to_unsafe_h : raw if raw.present?
146
163
  attrs
@@ -181,9 +198,9 @@ module Spree
181
198
  def render_unsupported_type
182
199
  render_error(
183
200
  code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
184
- message: Spree.t(
185
- 'api.errors.unsupported_export_type',
186
- default: "Unsupported export type. Supported types: #{ALLOWED_TYPES.join(', ')}"
201
+ message: I18n.t(
202
+ 'spree.api.errors.unsupported_export_type',
203
+ types: ALLOWED_TYPES.join(', ')
187
204
  ),
188
205
  status: :unprocessable_content
189
206
  )
@@ -0,0 +1,27 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Seller
5
+ # A file stored here is attached to nothing until the seller sends its
6
+ # `signed_id` to an endpoint that checks the target is theirs, so the
7
+ # narrowest meaningful gate is the seller's own profile, which every
8
+ # member of a seller's team holds.
9
+ class FilesController < Seller::BaseController
10
+ include Spree::Api::V3::FileUploads
11
+
12
+ scoped_resource :seller_profile
13
+
14
+ request_params 'FileUploadCreateParams', action: :create do |body|
15
+ body.include_attributes Spree::Api::V3::FileUploadRequestSchema
16
+ end
17
+
18
+ private
19
+
20
+ def file_upload_serializer
21
+ Spree.api.seller_file_upload_serializer
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -32,10 +32,32 @@ module Spree
32
32
 
33
33
  scoped_resource :products
34
34
 
35
+ request_params 'ImportCreateParams' do |body|
36
+ body.attribute :type, :string, required: true, choices: %w[products]
37
+ body.attribute :attachment_signed_id, :string,
38
+ required: true,
39
+ description: "The `signed_id` of the uploaded CSV, from `POST /files` with `visibility: 'private'`."
40
+ body.attribute :delimiter, :string, description: 'CSV column separator. Defaults to a comma.'
41
+ body.attribute :results_url, :string,
42
+ description: "Absolute URL of the panel's imports view; the import-done email links back to it. Honored only when it matches one of the store's allowed origins."
43
+ end
44
+
45
+ request_params 'ImportCompleteMappingParams', action: :complete_mapping do |body|
46
+ body.attribute :mappings, :array,
47
+ permit: false,
48
+ description: 'Column assignments to apply before processing starts.' do |mapping|
49
+ mapping.attribute :schema_field, :string, required: true, description: 'Canonical schema field name.'
50
+ mapping.attribute :file_column, :string,
51
+ required: true,
52
+ nullable: true,
53
+ description: 'CSV header to read the field from; `null` unmaps the field.'
54
+ end
55
+ end
56
+
35
57
  # POST /api/v3/seller/imports
36
58
  #
37
- # `attachment` is an ActiveStorage signed blob id from
38
- # POST /api/v3/seller/direct_uploads. On success the import is
59
+ # `attachment_signed_id` is a signed id from
60
+ # POST /api/v3/seller/files. On success the import is
39
61
  # already in `mapping`, carrying the auto-assigned columns.
40
62
  def create
41
63
  @resource = build_resource
@@ -59,12 +81,6 @@ module Spree
59
81
  else
60
82
  render_errors(@resource.errors)
61
83
  end
62
- rescue ActiveSupport::MessageVerifier::InvalidSignature
63
- render_error(
64
- code: Spree::Api::V3::ErrorHandler::ERROR_CODES[:validation_error],
65
- message: 'Invalid attachment signed id',
66
- status: :unprocessable_content
67
- )
68
84
  end
69
85
 
70
86
  # PATCH /api/v3/seller/imports/:id/complete_mapping
@@ -248,7 +264,7 @@ module Spree
248
264
  end
249
265
 
250
266
  def permitted_params
251
- params.permit(*model_additional_permitted_attributes, :type, :attachment, :preferred_delimiter, :results_url)
267
+ params.permit(*permitted_attributes)
252
268
  end
253
269
 
254
270
  # The registered Import subclass matching `name`, or nil.
@@ -22,6 +22,14 @@ module Spree
22
22
  only: [:lookup, :accept],
23
23
  with: -> { render_rate_limited(limit: Spree::Api::Config[:rate_limit_login]) }
24
24
 
25
+ request_params 'InvitationAcceptParams', action: :accept do |body|
26
+ body.attribute :password, :string,
27
+ description: 'Sets the password of a new account, or confirms the password of an existing one.'
28
+ body.attribute :password_confirmation, :string
29
+ body.attribute :first_name, :string, description: 'Used only when the invitation creates a new account.'
30
+ body.attribute :last_name, :string, description: 'Used only when the invitation creates a new account.'
31
+ end
32
+
25
33
  # GET /api/v3/seller/auth/invitations/:id/lookup?token=:token
26
34
  def lookup
27
35
  return unless load_invitation
@@ -74,7 +82,7 @@ module Spree
74
82
  unless @invitation
75
83
  render_error(
76
84
  code: ErrorHandler::ERROR_CODES[:record_not_found],
77
- message: Spree.t(:invitation_not_acceptable),
85
+ message: I18n.t('spree.invitation_not_acceptable'),
78
86
  status: :not_found
79
87
  )
80
88
  return false
@@ -101,7 +109,7 @@ module Spree
101
109
 
102
110
  render_error(
103
111
  code: ErrorHandler::ERROR_CODES[:authentication_failed],
104
- message: Spree.t(:invalid_password),
112
+ message: I18n.t('spree.invalid_password'),
105
113
  status: :unauthorized
106
114
  )
107
115
  nil
@@ -111,7 +119,7 @@ module Spree
111
119
  if params[:password].blank?
112
120
  render_error(
113
121
  code: ErrorHandler::ERROR_CODES[:parameter_missing],
114
- message: Spree.t(:password_required_to_create_account),
122
+ message: I18n.t('spree.password_required_to_create_account'),
115
123
  status: :unprocessable_content
116
124
  )
117
125
  return nil
@@ -121,7 +129,7 @@ module Spree
121
129
  end
122
130
 
123
131
  def signup_params(invitation)
124
- params.permit(:password, :password_confirmation, :first_name, :last_name).
132
+ params.permit(*declared_permitted_attributes).
125
133
  merge(email: invitation.email)
126
134
  end
127
135
 
@@ -38,7 +38,7 @@ module Spree
38
38
  if @invitation.expired?
39
39
  return render_error(
40
40
  code: ErrorHandler::ERROR_CODES[:processing_error],
41
- message: Spree.t(:invitation_expired),
41
+ message: I18n.t('spree.invitation_expired'),
42
42
  status: :unprocessable_content
43
43
  )
44
44
  end
@@ -16,6 +16,17 @@ module Spree
16
16
  skip_before_action :set_current_seller_context
17
17
  before_action :require_current_user!
18
18
 
19
+ request_params 'AccountUpdateParams' do |body|
20
+ body.attribute :first_name, :string, example: 'Ada'
21
+ body.attribute :last_name, :string, example: 'Lovelace'
22
+ body.attribute :selected_locale, :string,
23
+ example: 'de',
24
+ description: "The panel's display language, as a code the panel ships."
25
+ body.attribute :avatar_signed_id, :string,
26
+ nullable: true,
27
+ description: 'A `signed_id` from `POST /files` to set the photo, or `null` to remove it. Omit to leave the current one alone.'
28
+ end
29
+
19
30
  def show
20
31
  render json: me_response
21
32
  end
@@ -27,8 +38,8 @@ module Spree
27
38
  # seller they are acting for.
28
39
  #
29
40
  # Distinct from PATCH /profile, which writes the seller business.
30
- # `avatar` accepts an ActiveStorage direct-upload signed id to set
31
- # the photo, or `null` to remove it.
41
+ # `avatar_signed_id` takes a signed id from POST /files to set the
42
+ # photo, or `null` to remove it.
32
43
  def update
33
44
  if current_user.update(permitted_params)
34
45
  render json: me_response
@@ -40,7 +51,7 @@ module Spree
40
51
  private
41
52
 
42
53
  def permitted_params
43
- params.permit(:selected_locale, :first_name, :last_name, :avatar)
54
+ params.permit(*declared_permitted_attributes)
44
55
  end
45
56
 
46
57
  def me_response
@@ -83,7 +94,7 @@ module Spree
83
94
 
84
95
  render_error(
85
96
  code: ErrorHandler::ERROR_CODES[:record_not_found],
86
- message: Spree.t(:me_no_current_user),
97
+ message: I18n.t('spree.me_no_current_user'),
87
98
  status: :not_found
88
99
  )
89
100
  false
@@ -12,6 +12,17 @@ module Spree
12
12
  class OnboardingController < Seller::BaseController
13
13
  scoped_resource :seller_profile
14
14
 
15
+ request_params 'OnboardingPayoutAccountParams', action: :payout_account do |body|
16
+ body.attribute :refresh_url, :string,
17
+ required: true,
18
+ format: :uri,
19
+ description: "Where the provider sends the seller back. Must be on the seller panel's origin; any other address is replaced with the panel's."
20
+ body.attribute :return_url, :string,
21
+ required: true,
22
+ format: :uri,
23
+ description: "Where the provider sends the seller back. Must be on the seller panel's origin; any other address is replaced with the panel's."
24
+ end
25
+
15
26
  # GET /api/v3/seller/onboarding
16
27
  def show
17
28
  render json: onboarding_payload