@spree/docs 0.1.157 → 0.1.158
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.
|
@@ -87,16 +87,16 @@ paths:
|
|
|
87
87
|
content:
|
|
88
88
|
application/json:
|
|
89
89
|
example:
|
|
90
|
-
token: eyJhbGciOiJIUzI1NiJ9.
|
|
91
|
-
refresh_token:
|
|
90
|
+
token: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX3R5cGUiOiJjdXN0b21lciIsImp0aSI6IjY5NmE2NDdmLThmZDQtNDc1Mi1iOGU3LTFlYTA3OGUzZTAwNyIsImlzcyI6InNwcmVlIiwiYXVkIjoic3RvcmVfYXBpIiwiZXhwIjoxNzg2Njk4ODU4fQ.oOqQ2bauQZ4Ck88b68J1k_XCr7VDE_MJ57RQffZ3TiM
|
|
91
|
+
refresh_token: BzWKLbwXtmd1aZdudRzEuBkv
|
|
92
92
|
user:
|
|
93
93
|
id: cust_UkLWZg9DAJ
|
|
94
94
|
email: test@example.com
|
|
95
|
-
first_name:
|
|
96
|
-
last_name:
|
|
95
|
+
first_name: Hermine
|
|
96
|
+
last_name: Terry
|
|
97
97
|
phone:
|
|
98
98
|
accepts_email_marketing: false
|
|
99
|
-
full_name:
|
|
99
|
+
full_name: Hermine Terry
|
|
100
100
|
available_store_credit_total: '0'
|
|
101
101
|
display_available_store_credit_total: "$0.00"
|
|
102
102
|
addresses: []
|
|
@@ -194,16 +194,16 @@ paths:
|
|
|
194
194
|
content:
|
|
195
195
|
application/json:
|
|
196
196
|
example:
|
|
197
|
-
token: eyJhbGciOiJIUzI1NiJ9.
|
|
198
|
-
refresh_token:
|
|
197
|
+
token: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX3R5cGUiOiJjdXN0b21lciIsImp0aSI6IjljODE1NjQxLWI0ODEtNGE4MS05Mjk2LThkYTliZTUzMGVjOCIsImlzcyI6InNwcmVlIiwiYXVkIjoic3RvcmVfYXBpIiwiZXhwIjoxNzg2Njk4ODU4fQ.yX_50wOMDs2DJqbXHBrObvhZ8G8yr3mxnFi4LUm-J80
|
|
198
|
+
refresh_token: BMeip9U9jEjHHPrJZ4d4L3aH
|
|
199
199
|
user:
|
|
200
200
|
id: cust_UkLWZg9DAJ
|
|
201
201
|
email: test@example.com
|
|
202
|
-
first_name:
|
|
203
|
-
last_name:
|
|
202
|
+
first_name: Merissa
|
|
203
|
+
last_name: Huel
|
|
204
204
|
phone:
|
|
205
205
|
accepts_email_marketing: false
|
|
206
|
-
full_name:
|
|
206
|
+
full_name: Merissa Huel
|
|
207
207
|
available_store_credit_total: '0'
|
|
208
208
|
display_available_store_credit_total: "$0.00"
|
|
209
209
|
addresses: []
|
|
@@ -393,16 +393,16 @@ paths:
|
|
|
393
393
|
content:
|
|
394
394
|
application/json:
|
|
395
395
|
example:
|
|
396
|
-
token: eyJhbGciOiJIUzI1NiJ9.
|
|
397
|
-
refresh_token:
|
|
396
|
+
token: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX3R5cGUiOiJjdXN0b21lciIsImp0aSI6ImVhMWRhOGYzLTE1MWMtNGI2ZC04Y2ZmLTlkNzgwOTQyNjI2MyIsImlzcyI6InNwcmVlIiwiYXVkIjoic3RvcmVfYXBpIiwiZXhwIjoxNzg2Njk4ODYyfQ.9LuICqbKxup_V5_P3OwOL3Z-uEXOL5PDgbzBQql2c-w
|
|
397
|
+
refresh_token: yhFdyWWrHjXRTV1ZmFDWya1P
|
|
398
398
|
user:
|
|
399
399
|
id: cust_UkLWZg9DAJ
|
|
400
400
|
email: customer@example.com
|
|
401
|
-
first_name:
|
|
402
|
-
last_name:
|
|
401
|
+
first_name: Celia
|
|
402
|
+
last_name: Turcotte
|
|
403
403
|
phone:
|
|
404
404
|
accepts_email_marketing: false
|
|
405
|
-
full_name:
|
|
405
|
+
full_name: Celia Turcotte
|
|
406
406
|
available_store_credit_total: '0'
|
|
407
407
|
display_available_store_credit_total: "$0.00"
|
|
408
408
|
addresses: []
|
|
@@ -879,8 +879,8 @@ paths:
|
|
|
879
879
|
example:
|
|
880
880
|
data:
|
|
881
881
|
- id: prod_UkLWZg9DAJ
|
|
882
|
-
name: Product
|
|
883
|
-
slug: product-
|
|
882
|
+
name: Product 134956
|
|
883
|
+
slug: product-134956
|
|
884
884
|
meta_title:
|
|
885
885
|
meta_description:
|
|
886
886
|
meta_keywords:
|
|
@@ -892,12 +892,30 @@ paths:
|
|
|
892
892
|
in_stock: false
|
|
893
893
|
backorderable: true
|
|
894
894
|
available: true
|
|
895
|
-
description:
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
895
|
+
description: Tenetur dolorum illo voluptate labore rerum cum dolores
|
|
896
|
+
delectus. Fugit quis cumque cum quos quia aliquam exercitationem.
|
|
897
|
+
Doloremque ipsam optio dignissimos maiores quidem expedita reprehenderit
|
|
898
|
+
ullam. Adipisci eius voluptate incidunt optio vel occaecati mollitia
|
|
899
|
+
repudiandae. Iusto ullam atque laudantium ipsam quaerat voluptatibus.
|
|
900
|
+
Nam ad facilis dignissimos repudiandae. Amet esse odio quo debitis
|
|
901
|
+
eaque explicabo veritatis accusamus. Qui suscipit odit repellat
|
|
902
|
+
aliquam. Inventore ut perferendis quasi neque asperiores distinctio.
|
|
903
|
+
Velit necessitatibus eum voluptatem rem voluptatum veniam nobis
|
|
904
|
+
dolore. Unde ipsum sed laborum quae qui tenetur perspiciatis.
|
|
905
|
+
Repellat dignissimos qui libero alias ab tempora fugit autem.
|
|
906
|
+
Itaque eius non dolor iste labore officiis autem fugit. Alias
|
|
907
|
+
consequuntur dicta vero facilis nihil quasi. Alias debitis recusandae
|
|
908
|
+
vitae porro molestias similique fugiat perferendis. Minima iusto
|
|
909
|
+
rem iure a explicabo consequatur cum eum. Veniam non dolorem minus
|
|
910
|
+
pariatur quis tempora ut. Tenetur molestiae illum ratione alias
|
|
911
|
+
laborum. Reprehenderit optio nesciunt pariatur nemo laborum mollitia
|
|
912
|
+
esse fugit.
|
|
913
|
+
description_html: |-
|
|
914
|
+
Tenetur dolorum illo voluptate labore rerum cum dolores delectus. Fugit quis cumque cum quos quia aliquam exercitationem. Doloremque ipsam optio dignissimos maiores quidem expedita reprehenderit ullam.
|
|
915
|
+
Adipisci eius voluptate incidunt optio vel occaecati mollitia repudiandae. Iusto ullam atque laudantium ipsam quaerat voluptatibus. Nam ad facilis dignissimos repudiandae. Amet esse odio quo debitis eaque explicabo veritatis accusamus.
|
|
916
|
+
Qui suscipit odit repellat aliquam. Inventore ut perferendis quasi neque asperiores distinctio. Velit necessitatibus eum voluptatem rem voluptatum veniam nobis dolore. Unde ipsum sed laborum quae qui tenetur perspiciatis. Repellat dignissimos qui libero alias ab tempora fugit autem.
|
|
917
|
+
Itaque eius non dolor iste labore officiis autem fugit. Alias consequuntur dicta vero facilis nihil quasi. Alias debitis recusandae vitae porro molestias similique fugiat perferendis. Minima iusto rem iure a explicabo consequatur cum eum.
|
|
918
|
+
Veniam non dolorem minus pariatur quis tempora ut. Tenetur molestiae illum ratione alias laborum. Reprehenderit optio nesciunt pariatur nemo laborum mollitia esse fugit.
|
|
901
919
|
default_variant_id: variant_UkLWZg9DAJ
|
|
902
920
|
thumbnail_url:
|
|
903
921
|
tags: []
|
|
@@ -1052,8 +1070,8 @@ paths:
|
|
|
1052
1070
|
example:
|
|
1053
1071
|
data:
|
|
1054
1072
|
- id: prod_UkLWZg9DAJ
|
|
1055
|
-
name: Product
|
|
1056
|
-
slug: product-
|
|
1073
|
+
name: Product 1797268
|
|
1074
|
+
slug: product-1797268
|
|
1057
1075
|
meta_title:
|
|
1058
1076
|
meta_description:
|
|
1059
1077
|
meta_keywords:
|
|
@@ -1082,8 +1100,8 @@ paths:
|
|
|
1082
1100
|
price_list_id:
|
|
1083
1101
|
original_price:
|
|
1084
1102
|
- id: prod_gbHJdmfrXB
|
|
1085
|
-
name: Product
|
|
1086
|
-
slug: product-
|
|
1103
|
+
name: Product 1804864
|
|
1104
|
+
slug: product-1804864
|
|
1087
1105
|
meta_title:
|
|
1088
1106
|
meta_description:
|
|
1089
1107
|
meta_keywords:
|
|
@@ -1095,25 +1113,12 @@ paths:
|
|
|
1095
1113
|
in_stock: false
|
|
1096
1114
|
backorderable: true
|
|
1097
1115
|
available: true
|
|
1098
|
-
description:
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
porro. Possimus molestias eius nemo ipsa soluta. Explicabo inventore
|
|
1105
|
-
officia necessitatibus magnam consectetur. Ullam veniam neque
|
|
1106
|
-
autem deleniti rem dolores fugit delectus. Necessitatibus temporibus
|
|
1107
|
-
quibusdam quis quae dolor error voluptatum. Corporis at quis quam
|
|
1108
|
-
a. Reprehenderit asperiores fugit distinctio voluptas porro. Excepturi
|
|
1109
|
-
perferendis aliquid consectetur maiores odio ut. Quisquam tempore
|
|
1110
|
-
sunt maxime doloremque. Placeat minima non facilis veritatis commodi
|
|
1111
|
-
vitae repudiandae praesentium.
|
|
1112
|
-
description_html: |-
|
|
1113
|
-
Nobis vel quas nesciunt aperiam nulla corporis doloribus non. Autem tempore aperiam doloribus illum quis iusto eius. Saepe eum repellat mollitia dolore maiores eaque fugit velit.
|
|
1114
|
-
Hic recusandae temporibus quia deleniti nisi ut. Nihil explicabo fuga officia quibusdam natus quidem. Eaque natus in maxime numquam possimus exercitationem. Asperiores debitis autem ipsam pariatur quisquam porro. Possimus molestias eius nemo ipsa soluta.
|
|
1115
|
-
Explicabo inventore officia necessitatibus magnam consectetur. Ullam veniam neque autem deleniti rem dolores fugit delectus. Necessitatibus temporibus quibusdam quis quae dolor error voluptatum. Corporis at quis quam a.
|
|
1116
|
-
Reprehenderit asperiores fugit distinctio voluptas porro. Excepturi perferendis aliquid consectetur maiores odio ut. Quisquam tempore sunt maxime doloremque. Placeat minima non facilis veritatis commodi vitae repudiandae praesentium.
|
|
1116
|
+
description: Error sit blanditiis recusandae inventore sunt in.
|
|
1117
|
+
Iste saepe veniam beatae consequuntur. Ad sed temporibus quis
|
|
1118
|
+
explicabo nostrum reiciendis iste.
|
|
1119
|
+
description_html: Error sit blanditiis recusandae inventore sunt
|
|
1120
|
+
in. Iste saepe veniam beatae consequuntur. Ad sed temporibus quis
|
|
1121
|
+
explicabo nostrum reiciendis iste.
|
|
1117
1122
|
default_variant_id: variant_EfhxLZ9ck8
|
|
1118
1123
|
thumbnail_url:
|
|
1119
1124
|
tags: []
|
|
@@ -1215,8 +1220,8 @@ paths:
|
|
|
1215
1220
|
application/json:
|
|
1216
1221
|
example:
|
|
1217
1222
|
id: prod_UkLWZg9DAJ
|
|
1218
|
-
name: Product
|
|
1219
|
-
slug: product-
|
|
1223
|
+
name: Product 2076374
|
|
1224
|
+
slug: product-2076374
|
|
1220
1225
|
meta_title:
|
|
1221
1226
|
meta_description:
|
|
1222
1227
|
meta_keywords:
|
|
@@ -1250,7 +1255,7 @@ paths:
|
|
|
1250
1255
|
amount_in_cents: 999
|
|
1251
1256
|
currency: USD
|
|
1252
1257
|
display_amount: "$9.99"
|
|
1253
|
-
recorded_at: '2026-07-
|
|
1258
|
+
recorded_at: '2026-07-30T08:14:32Z'
|
|
1254
1259
|
schema:
|
|
1255
1260
|
"$ref": "#/components/schemas/Product"
|
|
1256
1261
|
'404':
|
|
@@ -1500,7 +1505,7 @@ paths:
|
|
|
1500
1505
|
channel_id: ch_UkLWZg9DAJ
|
|
1501
1506
|
preferred_stock_location_id:
|
|
1502
1507
|
number: cart_gbHJdmfrXB
|
|
1503
|
-
token:
|
|
1508
|
+
token: zMBG4xPmvnvUpweDoiSkeU9M
|
|
1504
1509
|
email:
|
|
1505
1510
|
customer_note:
|
|
1506
1511
|
currency: USD
|
|
@@ -1559,8 +1564,8 @@ paths:
|
|
|
1559
1564
|
preorder_ships_at:
|
|
1560
1565
|
quantity: 1
|
|
1561
1566
|
currency: USD
|
|
1562
|
-
name: Product
|
|
1563
|
-
slug: product-
|
|
1567
|
+
name: Product 1097994
|
|
1568
|
+
slug: product-1097994
|
|
1564
1569
|
options_text: ''
|
|
1565
1570
|
price: '10.0'
|
|
1566
1571
|
display_price: "$10.00"
|
|
@@ -1605,7 +1610,7 @@ paths:
|
|
|
1605
1610
|
channel_id: ch_UkLWZg9DAJ
|
|
1606
1611
|
preferred_stock_location_id:
|
|
1607
1612
|
number: cart_UkLWZg9DAJ
|
|
1608
|
-
token:
|
|
1613
|
+
token: p97ABaANxtNUsn9MFiKsHfgq
|
|
1609
1614
|
email:
|
|
1610
1615
|
customer_note:
|
|
1611
1616
|
currency: USD
|
|
@@ -1664,8 +1669,8 @@ paths:
|
|
|
1664
1669
|
preorder_ships_at:
|
|
1665
1670
|
quantity: 1
|
|
1666
1671
|
currency: USD
|
|
1667
|
-
name: Product
|
|
1668
|
-
slug: product-
|
|
1672
|
+
name: Product 1083868
|
|
1673
|
+
slug: product-1083868
|
|
1669
1674
|
options_text: ''
|
|
1670
1675
|
price: '10.0'
|
|
1671
1676
|
display_price: "$10.00"
|
|
@@ -1783,7 +1788,7 @@ paths:
|
|
|
1783
1788
|
channel_id: ch_UkLWZg9DAJ
|
|
1784
1789
|
preferred_stock_location_id:
|
|
1785
1790
|
number: cart_UkLWZg9DAJ
|
|
1786
|
-
token:
|
|
1791
|
+
token: PN2NE4NhAi12bC3ro1jxELiA
|
|
1787
1792
|
email:
|
|
1788
1793
|
customer_note:
|
|
1789
1794
|
currency: USD
|
|
@@ -1948,7 +1953,7 @@ paths:
|
|
|
1948
1953
|
channel_id: ch_UkLWZg9DAJ
|
|
1949
1954
|
preferred_stock_location_id:
|
|
1950
1955
|
number: cart_UkLWZg9DAJ
|
|
1951
|
-
token:
|
|
1956
|
+
token: 32bnSsVMJaZaft4HetrZkkpx
|
|
1952
1957
|
email:
|
|
1953
1958
|
customer_note:
|
|
1954
1959
|
currency: USD
|
|
@@ -1956,7 +1961,7 @@ paths:
|
|
|
1956
1961
|
total_quantity: 0
|
|
1957
1962
|
warnings:
|
|
1958
1963
|
- code: line_item_removed
|
|
1959
|
-
message: Product
|
|
1964
|
+
message: Product 1139651 was removed because it was sold out
|
|
1960
1965
|
line_item_id: li_UkLWZg9DAJ
|
|
1961
1966
|
variant_id: variant_UkLWZg9DAJ
|
|
1962
1967
|
coupon_code:
|
|
@@ -2098,7 +2103,7 @@ paths:
|
|
|
2098
2103
|
channel_id: ch_UkLWZg9DAJ
|
|
2099
2104
|
preferred_stock_location_id:
|
|
2100
2105
|
number: cart_UkLWZg9DAJ
|
|
2101
|
-
token:
|
|
2106
|
+
token: krrviFWRbaXyKfCMiZzNrypf
|
|
2102
2107
|
email:
|
|
2103
2108
|
customer_note: Leave at door
|
|
2104
2109
|
currency: USD
|
|
@@ -2153,8 +2158,8 @@ paths:
|
|
|
2153
2158
|
preorder_ships_at:
|
|
2154
2159
|
quantity: 1
|
|
2155
2160
|
currency: USD
|
|
2156
|
-
name: Product
|
|
2157
|
-
slug: product-
|
|
2161
|
+
name: Product 1145279
|
|
2162
|
+
slug: product-1145279
|
|
2158
2163
|
options_text: ''
|
|
2159
2164
|
price: '10.0'
|
|
2160
2165
|
display_price: "$10.00"
|
|
@@ -2373,8 +2378,8 @@ paths:
|
|
|
2373
2378
|
channel_id: ch_UkLWZg9DAJ
|
|
2374
2379
|
preferred_stock_location_id:
|
|
2375
2380
|
number: cart_UkLWZg9DAJ
|
|
2376
|
-
token:
|
|
2377
|
-
email:
|
|
2381
|
+
token: UzZb7Q5pbA3owE3XsLSdjK3p
|
|
2382
|
+
email: emanuel.moen@batz.ca
|
|
2378
2383
|
customer_note:
|
|
2379
2384
|
currency: USD
|
|
2380
2385
|
locale: en
|
|
@@ -2425,8 +2430,8 @@ paths:
|
|
|
2425
2430
|
preorder_ships_at:
|
|
2426
2431
|
quantity: 1
|
|
2427
2432
|
currency: USD
|
|
2428
|
-
name: Product
|
|
2429
|
-
slug: product-
|
|
2433
|
+
name: Product 1169451
|
|
2434
|
+
slug: product-1169451
|
|
2430
2435
|
options_text: ''
|
|
2431
2436
|
price: '10.0'
|
|
2432
2437
|
display_price: "$10.00"
|
|
@@ -2581,7 +2586,7 @@ paths:
|
|
|
2581
2586
|
cart_id: cart_UkLWZg9DAJ
|
|
2582
2587
|
channel_id: ch_UkLWZg9DAJ
|
|
2583
2588
|
number: R1001
|
|
2584
|
-
email:
|
|
2589
|
+
email: aleen@sanfordpacocha.co.uk
|
|
2585
2590
|
customer_note:
|
|
2586
2591
|
currency: USD
|
|
2587
2592
|
locale: en
|
|
@@ -2589,7 +2594,7 @@ paths:
|
|
|
2589
2594
|
coupon_code:
|
|
2590
2595
|
fulfillment_status: backorder
|
|
2591
2596
|
payment_status: paid
|
|
2592
|
-
completed_at: '2026-08-
|
|
2597
|
+
completed_at: '2026-08-14T08:14:20.198Z'
|
|
2593
2598
|
item_total: '10.0'
|
|
2594
2599
|
display_item_total: "$10.00"
|
|
2595
2600
|
adjustment_total: '0.0'
|
|
@@ -2621,8 +2626,8 @@ paths:
|
|
|
2621
2626
|
preorder_ships_at:
|
|
2622
2627
|
quantity: 1
|
|
2623
2628
|
currency: USD
|
|
2624
|
-
name: Product
|
|
2625
|
-
slug: product-
|
|
2629
|
+
name: Product 1198757
|
|
2630
|
+
slug: product-1198757
|
|
2626
2631
|
options_text: ''
|
|
2627
2632
|
price: '10.0'
|
|
2628
2633
|
display_price: "$10.00"
|
|
@@ -2688,7 +2693,7 @@ paths:
|
|
|
2688
2693
|
stock_location:
|
|
2689
2694
|
id: sloc_UkLWZg9DAJ
|
|
2690
2695
|
state_abbr: NY
|
|
2691
|
-
name:
|
|
2696
|
+
name: Tesha Murray
|
|
2692
2697
|
address1: 1600 Pennsylvania Ave NW
|
|
2693
2698
|
city: Washington
|
|
2694
2699
|
zipcode: '20500'
|
|
@@ -2727,7 +2732,7 @@ paths:
|
|
|
2727
2732
|
payments:
|
|
2728
2733
|
- id: py_UkLWZg9DAJ
|
|
2729
2734
|
payment_method_id: pm_UkLWZg9DAJ
|
|
2730
|
-
response_code: BGS-
|
|
2735
|
+
response_code: BGS-145d3d64c735
|
|
2731
2736
|
number: R1001-P1
|
|
2732
2737
|
amount: '20.0'
|
|
2733
2738
|
display_amount: "$20.00"
|
|
@@ -2884,7 +2889,7 @@ paths:
|
|
|
2884
2889
|
channel_id: ch_UkLWZg9DAJ
|
|
2885
2890
|
preferred_stock_location_id:
|
|
2886
2891
|
number: cart_UkLWZg9DAJ
|
|
2887
|
-
token:
|
|
2892
|
+
token: FtJyKty4FppHQrdsicaKevfc
|
|
2888
2893
|
email:
|
|
2889
2894
|
customer_note:
|
|
2890
2895
|
currency: USD
|
|
@@ -2942,8 +2947,8 @@ paths:
|
|
|
2942
2947
|
preorder_ships_at:
|
|
2943
2948
|
quantity: 1
|
|
2944
2949
|
currency: USD
|
|
2945
|
-
name: Product
|
|
2946
|
-
slug: product-
|
|
2950
|
+
name: Product 1454442
|
|
2951
|
+
slug: product-1454442
|
|
2947
2952
|
options_text: ''
|
|
2948
2953
|
price: '10.0'
|
|
2949
2954
|
display_price: "$10.00"
|
|
@@ -3072,7 +3077,7 @@ paths:
|
|
|
3072
3077
|
channel_id: ch_UkLWZg9DAJ
|
|
3073
3078
|
preferred_stock_location_id:
|
|
3074
3079
|
number: cart_UkLWZg9DAJ
|
|
3075
|
-
token:
|
|
3080
|
+
token: fDVhvAqKMEF9SWSX9xgHN9sB
|
|
3076
3081
|
email:
|
|
3077
3082
|
customer_note:
|
|
3078
3083
|
currency: USD
|
|
@@ -3127,8 +3132,8 @@ paths:
|
|
|
3127
3132
|
preorder_ships_at:
|
|
3128
3133
|
quantity: 1
|
|
3129
3134
|
currency: USD
|
|
3130
|
-
name: Product
|
|
3131
|
-
slug: product-
|
|
3135
|
+
name: Product 1479236
|
|
3136
|
+
slug: product-1479236
|
|
3132
3137
|
options_text: ''
|
|
3133
3138
|
price: '10.0'
|
|
3134
3139
|
display_price: "$10.00"
|
|
@@ -3246,8 +3251,8 @@ paths:
|
|
|
3246
3251
|
channel_id: ch_UkLWZg9DAJ
|
|
3247
3252
|
preferred_stock_location_id:
|
|
3248
3253
|
number: cart_UkLWZg9DAJ
|
|
3249
|
-
token:
|
|
3250
|
-
email:
|
|
3254
|
+
token: b7KRponWQxis6iAoHQhanMGC
|
|
3255
|
+
email: reatha@boehm.com
|
|
3251
3256
|
customer_note:
|
|
3252
3257
|
currency: USD
|
|
3253
3258
|
locale: en
|
|
@@ -3295,8 +3300,8 @@ paths:
|
|
|
3295
3300
|
preorder_ships_at:
|
|
3296
3301
|
quantity: 1
|
|
3297
3302
|
currency: USD
|
|
3298
|
-
name: Product
|
|
3299
|
-
slug: product-
|
|
3303
|
+
name: Product 1496348
|
|
3304
|
+
slug: product-1496348
|
|
3300
3305
|
options_text: ''
|
|
3301
3306
|
price: '10.0'
|
|
3302
3307
|
display_price: "$10.00"
|
|
@@ -3362,7 +3367,7 @@ paths:
|
|
|
3362
3367
|
stock_location:
|
|
3363
3368
|
id: sloc_UkLWZg9DAJ
|
|
3364
3369
|
state_abbr: NY
|
|
3365
|
-
name:
|
|
3370
|
+
name: Jen Orn
|
|
3366
3371
|
address1: 1600 Pennsylvania Ave NW
|
|
3367
3372
|
city: Washington
|
|
3368
3373
|
zipcode: '20500'
|
|
@@ -3524,7 +3529,7 @@ paths:
|
|
|
3524
3529
|
channel_id: ch_UkLWZg9DAJ
|
|
3525
3530
|
preferred_stock_location_id:
|
|
3526
3531
|
number: cart_UkLWZg9DAJ
|
|
3527
|
-
token:
|
|
3532
|
+
token: ztfpWFzyos2yJGrY3a9ZZxQU
|
|
3528
3533
|
email:
|
|
3529
3534
|
customer_note:
|
|
3530
3535
|
currency: USD
|
|
@@ -3575,8 +3580,8 @@ paths:
|
|
|
3575
3580
|
preorder_ships_at:
|
|
3576
3581
|
quantity: 1
|
|
3577
3582
|
currency: USD
|
|
3578
|
-
name: Product
|
|
3579
|
-
slug: product-
|
|
3583
|
+
name: Product 1513484
|
|
3584
|
+
slug: product-1513484
|
|
3580
3585
|
options_text: ''
|
|
3581
3586
|
price: '10.0'
|
|
3582
3587
|
display_price: "$10.00"
|
|
@@ -3603,7 +3608,7 @@ paths:
|
|
|
3603
3608
|
payments:
|
|
3604
3609
|
- id: py_UkLWZg9DAJ
|
|
3605
3610
|
payment_method_id: pm_UkLWZg9DAJ
|
|
3606
|
-
response_code: 1-SC-
|
|
3611
|
+
response_code: 1-SC-20260814081425362871
|
|
3607
3612
|
number: cart_UkLWZg9DAJ-P1
|
|
3608
3613
|
amount: '10.0'
|
|
3609
3614
|
display_amount: "$10.00"
|
|
@@ -3760,7 +3765,7 @@ paths:
|
|
|
3760
3765
|
channel_id: ch_UkLWZg9DAJ
|
|
3761
3766
|
preferred_stock_location_id:
|
|
3762
3767
|
number: cart_UkLWZg9DAJ
|
|
3763
|
-
token:
|
|
3768
|
+
token: iNFM9wetMx5mij7Rjv2fFJMj
|
|
3764
3769
|
email:
|
|
3765
3770
|
customer_note:
|
|
3766
3771
|
currency: USD
|
|
@@ -3815,8 +3820,8 @@ paths:
|
|
|
3815
3820
|
preorder_ships_at:
|
|
3816
3821
|
quantity: 1
|
|
3817
3822
|
currency: USD
|
|
3818
|
-
name: Product
|
|
3819
|
-
slug: product-
|
|
3823
|
+
name: Product 1556379
|
|
3824
|
+
slug: product-1556379
|
|
3820
3825
|
options_text: ''
|
|
3821
3826
|
price: '10.0'
|
|
3822
3827
|
display_price: "$10.00"
|
|
@@ -3843,7 +3848,7 @@ paths:
|
|
|
3843
3848
|
payments:
|
|
3844
3849
|
- id: py_UkLWZg9DAJ
|
|
3845
3850
|
payment_method_id: pm_UkLWZg9DAJ
|
|
3846
|
-
response_code: 1-SC-
|
|
3851
|
+
response_code: 1-SC-20260814081425795920
|
|
3847
3852
|
number: cart_UkLWZg9DAJ-P1
|
|
3848
3853
|
amount: '10.0'
|
|
3849
3854
|
display_amount: "$10.00"
|
|
@@ -3951,7 +3956,7 @@ paths:
|
|
|
3951
3956
|
channel_id: ch_UkLWZg9DAJ
|
|
3952
3957
|
preferred_stock_location_id:
|
|
3953
3958
|
number: cart_UkLWZg9DAJ
|
|
3954
|
-
token:
|
|
3959
|
+
token: YhcjyHK16vakgDzkXgxshpJj
|
|
3955
3960
|
email:
|
|
3956
3961
|
customer_note:
|
|
3957
3962
|
currency: USD
|
|
@@ -3959,10 +3964,10 @@ paths:
|
|
|
3959
3964
|
total_quantity: 2
|
|
3960
3965
|
warnings:
|
|
3961
3966
|
- code: delivery_unavailable
|
|
3962
|
-
message: Product
|
|
3967
|
+
message: Product 1585627 cannot be delivered to the selected address
|
|
3963
3968
|
line_item_id: li_UkLWZg9DAJ
|
|
3964
3969
|
- code: delivery_unavailable
|
|
3965
|
-
message: Product
|
|
3970
|
+
message: Product 1599117 cannot be delivered to the selected address
|
|
3966
3971
|
line_item_id: li_gbHJdmfrXB
|
|
3967
3972
|
coupon_code:
|
|
3968
3973
|
item_total: '29.99'
|
|
@@ -4012,8 +4017,8 @@ paths:
|
|
|
4012
4017
|
preorder_ships_at:
|
|
4013
4018
|
quantity: 1
|
|
4014
4019
|
currency: USD
|
|
4015
|
-
name: Product
|
|
4016
|
-
slug: product-
|
|
4020
|
+
name: Product 1585627
|
|
4021
|
+
slug: product-1585627
|
|
4017
4022
|
options_text: ''
|
|
4018
4023
|
price: '10.0'
|
|
4019
4024
|
display_price: "$10.00"
|
|
@@ -4042,8 +4047,8 @@ paths:
|
|
|
4042
4047
|
preorder_ships_at:
|
|
4043
4048
|
quantity: 1
|
|
4044
4049
|
currency: USD
|
|
4045
|
-
name: Product
|
|
4046
|
-
slug: product-
|
|
4050
|
+
name: Product 1599117
|
|
4051
|
+
slug: product-1599117
|
|
4047
4052
|
options_text: ''
|
|
4048
4053
|
price: '19.99'
|
|
4049
4054
|
display_price: "$19.99"
|
|
@@ -4095,6 +4100,19 @@ paths:
|
|
|
4095
4100
|
message: Variant not found
|
|
4096
4101
|
schema:
|
|
4097
4102
|
"$ref": "#/components/schemas/ErrorResponse"
|
|
4103
|
+
'422':
|
|
4104
|
+
description: rejected by a store rule
|
|
4105
|
+
content:
|
|
4106
|
+
application/json:
|
|
4107
|
+
example:
|
|
4108
|
+
error:
|
|
4109
|
+
code: validation_error
|
|
4110
|
+
message: Quantity You can order at most 10 of this item.
|
|
4111
|
+
details:
|
|
4112
|
+
quantity:
|
|
4113
|
+
- You can order at most 10 of this item.
|
|
4114
|
+
schema:
|
|
4115
|
+
"$ref": "#/components/schemas/ErrorResponse"
|
|
4098
4116
|
requestBody:
|
|
4099
4117
|
content:
|
|
4100
4118
|
application/json:
|
|
@@ -4172,7 +4190,7 @@ paths:
|
|
|
4172
4190
|
type: string
|
|
4173
4191
|
responses:
|
|
4174
4192
|
'200':
|
|
4175
|
-
description:
|
|
4193
|
+
description: quantity change rejected, reported in warnings
|
|
4176
4194
|
content:
|
|
4177
4195
|
application/json:
|
|
4178
4196
|
example:
|
|
@@ -4181,16 +4199,20 @@ paths:
|
|
|
4181
4199
|
channel_id: ch_UkLWZg9DAJ
|
|
4182
4200
|
preferred_stock_location_id:
|
|
4183
4201
|
number: cart_UkLWZg9DAJ
|
|
4184
|
-
token:
|
|
4202
|
+
token: acPE3ThQkWgFXuQb3mzPzA6M
|
|
4185
4203
|
email:
|
|
4186
4204
|
customer_note:
|
|
4187
4205
|
currency: USD
|
|
4188
4206
|
locale: en
|
|
4189
|
-
total_quantity:
|
|
4190
|
-
warnings:
|
|
4207
|
+
total_quantity: 1
|
|
4208
|
+
warnings:
|
|
4209
|
+
- code: purchase_limit_exceeded
|
|
4210
|
+
message: Quantity You can order at most 10 of this item.
|
|
4211
|
+
variant_id: variant_UkLWZg9DAJ
|
|
4212
|
+
item_index: 0
|
|
4191
4213
|
coupon_code:
|
|
4192
|
-
item_total: '
|
|
4193
|
-
display_item_total: "$
|
|
4214
|
+
item_total: '10.0'
|
|
4215
|
+
display_item_total: "$10.00"
|
|
4194
4216
|
adjustment_total: '0.0'
|
|
4195
4217
|
display_adjustment_total: "$0.00"
|
|
4196
4218
|
discount_total: '0.0'
|
|
@@ -4201,12 +4223,12 @@ paths:
|
|
|
4201
4223
|
display_included_tax_total: "$0.00"
|
|
4202
4224
|
additional_tax_total: '0.0'
|
|
4203
4225
|
display_additional_tax_total: "$0.00"
|
|
4204
|
-
total: '
|
|
4205
|
-
display_total: "$
|
|
4226
|
+
total: '10.0'
|
|
4227
|
+
display_total: "$10.00"
|
|
4206
4228
|
gift_card_total: '0.0'
|
|
4207
4229
|
display_gift_card_total: "$0.00"
|
|
4208
|
-
amount_due: '
|
|
4209
|
-
display_amount_due: "$
|
|
4230
|
+
amount_due: '10.0'
|
|
4231
|
+
display_amount_due: "$10.00"
|
|
4210
4232
|
delivery_total: '0.0'
|
|
4211
4233
|
display_delivery_total: "$0.00"
|
|
4212
4234
|
store_credit_total: '0.0'
|
|
@@ -4223,6 +4245,10 @@ paths:
|
|
|
4223
4245
|
step: delivery
|
|
4224
4246
|
field: delivery_method
|
|
4225
4247
|
message: Select a delivery method for all fulfillments
|
|
4248
|
+
- code: payment_required
|
|
4249
|
+
step: payment
|
|
4250
|
+
field: payment
|
|
4251
|
+
message: Add a payment method
|
|
4226
4252
|
shipping_eq_billing_address: true
|
|
4227
4253
|
discounts: []
|
|
4228
4254
|
items:
|
|
@@ -4232,8 +4258,8 @@ paths:
|
|
|
4232
4258
|
preorder_ships_at:
|
|
4233
4259
|
quantity: 1
|
|
4234
4260
|
currency: USD
|
|
4235
|
-
name: Product
|
|
4236
|
-
slug: product-
|
|
4261
|
+
name: Product 1653067
|
|
4262
|
+
slug: product-1653067
|
|
4237
4263
|
options_text: ''
|
|
4238
4264
|
price: '10.0'
|
|
4239
4265
|
display_price: "$10.00"
|
|
@@ -4351,7 +4377,7 @@ paths:
|
|
|
4351
4377
|
channel_id: ch_UkLWZg9DAJ
|
|
4352
4378
|
preferred_stock_location_id:
|
|
4353
4379
|
number: cart_UkLWZg9DAJ
|
|
4354
|
-
token:
|
|
4380
|
+
token: NwdkLSsYTUJcNgt3eWsyRtdB
|
|
4355
4381
|
email:
|
|
4356
4382
|
customer_note:
|
|
4357
4383
|
currency: USD
|
|
@@ -4491,9 +4517,9 @@ paths:
|
|
|
4491
4517
|
id: ps_gbHJdmfrXB
|
|
4492
4518
|
status: pending
|
|
4493
4519
|
currency: USD
|
|
4494
|
-
external_id:
|
|
4520
|
+
external_id: bogus_e65e225eac6ce02bb7a76160
|
|
4495
4521
|
external_data:
|
|
4496
|
-
client_secret:
|
|
4522
|
+
client_secret: bogus_secret_d86a4e5e86272b8c
|
|
4497
4523
|
customer_external_id:
|
|
4498
4524
|
expires_at:
|
|
4499
4525
|
amount: '10.0'
|
|
@@ -4592,7 +4618,7 @@ paths:
|
|
|
4592
4618
|
id: ps_UkLWZg9DAJ
|
|
4593
4619
|
status: pending
|
|
4594
4620
|
currency: USD
|
|
4595
|
-
external_id:
|
|
4621
|
+
external_id: bogus_f738692572bdcbb7d5cfccf7
|
|
4596
4622
|
external_data:
|
|
4597
4623
|
client_secret: secret_123
|
|
4598
4624
|
customer_external_id:
|
|
@@ -4655,7 +4681,7 @@ paths:
|
|
|
4655
4681
|
id: ps_UkLWZg9DAJ
|
|
4656
4682
|
status: pending
|
|
4657
4683
|
currency: USD
|
|
4658
|
-
external_id:
|
|
4684
|
+
external_id: bogus_2257118dd52fbdc67ae837bc
|
|
4659
4685
|
external_data:
|
|
4660
4686
|
client_secret: secret_123
|
|
4661
4687
|
customer_external_id:
|
|
@@ -4758,7 +4784,7 @@ paths:
|
|
|
4758
4784
|
id: ps_UkLWZg9DAJ
|
|
4759
4785
|
status: completed
|
|
4760
4786
|
currency: USD
|
|
4761
|
-
external_id:
|
|
4787
|
+
external_id: bogus_729786e1d972ccb86e4ef475
|
|
4762
4788
|
external_data:
|
|
4763
4789
|
client_secret: secret_123
|
|
4764
4790
|
customer_external_id:
|
|
@@ -4966,7 +4992,7 @@ paths:
|
|
|
4966
4992
|
channel_id: ch_UkLWZg9DAJ
|
|
4967
4993
|
preferred_stock_location_id:
|
|
4968
4994
|
number: cart_UkLWZg9DAJ
|
|
4969
|
-
token:
|
|
4995
|
+
token: avVKTys5AodncSjbFf84Sjp8
|
|
4970
4996
|
email:
|
|
4971
4997
|
customer_note:
|
|
4972
4998
|
currency: USD
|
|
@@ -5017,8 +5043,8 @@ paths:
|
|
|
5017
5043
|
preorder_ships_at:
|
|
5018
5044
|
quantity: 1
|
|
5019
5045
|
currency: USD
|
|
5020
|
-
name: Product
|
|
5021
|
-
slug: product-
|
|
5046
|
+
name: Product 2276440
|
|
5047
|
+
slug: product-2276440
|
|
5022
5048
|
options_text: ''
|
|
5023
5049
|
price: '10.0'
|
|
5024
5050
|
display_price: "$10.00"
|
|
@@ -5045,7 +5071,7 @@ paths:
|
|
|
5045
5071
|
payments:
|
|
5046
5072
|
- id: py_UkLWZg9DAJ
|
|
5047
5073
|
payment_method_id: pm_UkLWZg9DAJ
|
|
5048
|
-
response_code: 1-SC-
|
|
5074
|
+
response_code: 1-SC-20260814081433997087
|
|
5049
5075
|
number: cart_UkLWZg9DAJ-P1
|
|
5050
5076
|
amount: '10.0'
|
|
5051
5077
|
display_amount: "$10.00"
|
|
@@ -5166,7 +5192,7 @@ paths:
|
|
|
5166
5192
|
channel_id: ch_UkLWZg9DAJ
|
|
5167
5193
|
preferred_stock_location_id:
|
|
5168
5194
|
number: cart_UkLWZg9DAJ
|
|
5169
|
-
token:
|
|
5195
|
+
token: 4q5MaaMs2XS1X2NKuJR7gh2J
|
|
5170
5196
|
email:
|
|
5171
5197
|
customer_note:
|
|
5172
5198
|
currency: USD
|
|
@@ -5221,8 +5247,8 @@ paths:
|
|
|
5221
5247
|
preorder_ships_at:
|
|
5222
5248
|
quantity: 1
|
|
5223
5249
|
currency: USD
|
|
5224
|
-
name: Product
|
|
5225
|
-
slug: product-
|
|
5250
|
+
name: Product 2294123
|
|
5251
|
+
slug: product-2294123
|
|
5226
5252
|
options_text: ''
|
|
5227
5253
|
price: '10.0'
|
|
5228
5254
|
display_price: "$10.00"
|
|
@@ -5346,7 +5372,7 @@ paths:
|
|
|
5346
5372
|
coupon_code:
|
|
5347
5373
|
fulfillment_status:
|
|
5348
5374
|
payment_status:
|
|
5349
|
-
completed_at: '2026-08-
|
|
5375
|
+
completed_at: '2026-08-14T08:14:28.782Z'
|
|
5350
5376
|
item_total: '10.0'
|
|
5351
5377
|
display_item_total: "$10.00"
|
|
5352
5378
|
adjustment_total: '0.0'
|
|
@@ -5378,8 +5404,8 @@ paths:
|
|
|
5378
5404
|
preorder_ships_at:
|
|
5379
5405
|
quantity: 1
|
|
5380
5406
|
currency: USD
|
|
5381
|
-
name: Product
|
|
5382
|
-
slug: product-
|
|
5407
|
+
name: Product 1698581
|
|
5408
|
+
slug: product-1698581
|
|
5383
5409
|
options_text: ''
|
|
5384
5410
|
price: '10.0'
|
|
5385
5411
|
display_price: "$10.00"
|
|
@@ -5445,7 +5471,7 @@ paths:
|
|
|
5445
5471
|
stock_location:
|
|
5446
5472
|
id: sloc_UkLWZg9DAJ
|
|
5447
5473
|
state_abbr: NY
|
|
5448
|
-
name:
|
|
5474
|
+
name: Michell Stracke
|
|
5449
5475
|
address1: 1600 Pennsylvania Ave NW
|
|
5450
5476
|
city: Washington
|
|
5451
5477
|
zipcode: '20500'
|
|
@@ -5487,7 +5513,7 @@ paths:
|
|
|
5487
5513
|
first_name: John
|
|
5488
5514
|
last_name: Doe
|
|
5489
5515
|
full_name: John Doe
|
|
5490
|
-
address1:
|
|
5516
|
+
address1: 251 Lovely Street
|
|
5491
5517
|
address2: Northwest
|
|
5492
5518
|
postal_code: '10118'
|
|
5493
5519
|
city: New York
|
|
@@ -5506,7 +5532,7 @@ paths:
|
|
|
5506
5532
|
first_name: John
|
|
5507
5533
|
last_name: Doe
|
|
5508
5534
|
full_name: John Doe
|
|
5509
|
-
address1:
|
|
5535
|
+
address1: 252 Lovely Street
|
|
5510
5536
|
address2: Northwest
|
|
5511
5537
|
postal_code: '10118'
|
|
5512
5538
|
city: New York
|
|
@@ -6405,7 +6431,7 @@ paths:
|
|
|
6405
6431
|
cart_id:
|
|
6406
6432
|
channel_id: ch_UkLWZg9DAJ
|
|
6407
6433
|
number: R1001
|
|
6408
|
-
email:
|
|
6434
|
+
email: carole@vonrueden.biz
|
|
6409
6435
|
customer_note:
|
|
6410
6436
|
currency: USD
|
|
6411
6437
|
locale: en
|
|
@@ -6413,7 +6439,7 @@ paths:
|
|
|
6413
6439
|
coupon_code:
|
|
6414
6440
|
fulfillment_status:
|
|
6415
6441
|
payment_status:
|
|
6416
|
-
completed_at: '2026-08-
|
|
6442
|
+
completed_at: '2026-08-14T08:14:23.132Z'
|
|
6417
6443
|
item_total: '10.0'
|
|
6418
6444
|
display_item_total: "$10.00"
|
|
6419
6445
|
adjustment_total: '0.0'
|
|
@@ -6445,8 +6471,8 @@ paths:
|
|
|
6445
6471
|
preorder_ships_at:
|
|
6446
6472
|
quantity: 1
|
|
6447
6473
|
currency: USD
|
|
6448
|
-
name: Product
|
|
6449
|
-
slug: product-
|
|
6474
|
+
name: Product 1354977
|
|
6475
|
+
slug: product-1354977
|
|
6450
6476
|
options_text: ''
|
|
6451
6477
|
price: '10.0'
|
|
6452
6478
|
display_price: "$10.00"
|
|
@@ -6512,7 +6538,7 @@ paths:
|
|
|
6512
6538
|
stock_location:
|
|
6513
6539
|
id: sloc_UkLWZg9DAJ
|
|
6514
6540
|
state_abbr: NY
|
|
6515
|
-
name:
|
|
6541
|
+
name: Kylee Ledner
|
|
6516
6542
|
address1: 1600 Pennsylvania Ave NW
|
|
6517
6543
|
city: Washington
|
|
6518
6544
|
zipcode: '20500'
|
|
@@ -6697,7 +6723,7 @@ paths:
|
|
|
6697
6723
|
cart_id:
|
|
6698
6724
|
channel_id: ch_UkLWZg9DAJ
|
|
6699
6725
|
number: R1001
|
|
6700
|
-
email:
|
|
6726
|
+
email: tiffani@schroedermohr.ca
|
|
6701
6727
|
customer_note:
|
|
6702
6728
|
currency: USD
|
|
6703
6729
|
locale: en
|
|
@@ -6705,7 +6731,7 @@ paths:
|
|
|
6705
6731
|
coupon_code:
|
|
6706
6732
|
fulfillment_status:
|
|
6707
6733
|
payment_status:
|
|
6708
|
-
completed_at: '2026-08-
|
|
6734
|
+
completed_at: '2026-08-14T08:14:23.362Z'
|
|
6709
6735
|
item_total: '10.0'
|
|
6710
6736
|
display_item_total: "$10.00"
|
|
6711
6737
|
adjustment_total: '0.0'
|
|
@@ -6737,8 +6763,8 @@ paths:
|
|
|
6737
6763
|
preorder_ships_at:
|
|
6738
6764
|
quantity: 1
|
|
6739
6765
|
currency: USD
|
|
6740
|
-
name: Product
|
|
6741
|
-
slug: product-
|
|
6766
|
+
name: Product 1372684
|
|
6767
|
+
slug: product-1372684
|
|
6742
6768
|
options_text: ''
|
|
6743
6769
|
price: '10.0'
|
|
6744
6770
|
display_price: "$10.00"
|
|
@@ -6804,7 +6830,7 @@ paths:
|
|
|
6804
6830
|
stock_location:
|
|
6805
6831
|
id: sloc_UkLWZg9DAJ
|
|
6806
6832
|
state_abbr: NY
|
|
6807
|
-
name:
|
|
6833
|
+
name: Marcos Collier
|
|
6808
6834
|
address1: 1600 Pennsylvania Ave NW
|
|
6809
6835
|
city: Washington
|
|
6810
6836
|
zipcode: '20500'
|
|
@@ -6944,8 +6970,8 @@ paths:
|
|
|
6944
6970
|
content:
|
|
6945
6971
|
application/json:
|
|
6946
6972
|
example:
|
|
6947
|
-
token: eyJhbGciOiJIUzI1NiJ9.
|
|
6948
|
-
refresh_token:
|
|
6973
|
+
token: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX3R5cGUiOiJjdXN0b21lciIsImp0aSI6ImJhNGIzN2RmLTJhMzctNDhmOC1hODU2LWUxYjdlYmNjMDMyNyIsImlzcyI6InNwcmVlIiwiYXVkIjoic3RvcmVfYXBpIiwiZXhwIjoxNzg2Njk4ODYzfQ.Tbftvzfg5hqT3AAk5BdhN8EhIEZLOGea25SrEqfnIbM
|
|
6974
|
+
refresh_token: eiVQSfZhNpsu4zzKUbZZ2iRB
|
|
6949
6975
|
user:
|
|
6950
6976
|
id: cust_UkLWZg9DAJ
|
|
6951
6977
|
email: newuser@example.com
|
|
@@ -6962,10 +6988,10 @@ paths:
|
|
|
6962
6988
|
newsletter_subscriber:
|
|
6963
6989
|
id: sub_UkLWZg9DAJ
|
|
6964
6990
|
email: newuser@example.com
|
|
6965
|
-
created_at: '2026-08-
|
|
6966
|
-
updated_at: '2026-08-
|
|
6991
|
+
created_at: '2026-08-14T08:14:23.585Z'
|
|
6992
|
+
updated_at: '2026-08-14T08:14:23.587Z'
|
|
6967
6993
|
verified: true
|
|
6968
|
-
verified_at: '2026-08-
|
|
6994
|
+
verified_at: '2026-08-14T08:14:23Z'
|
|
6969
6995
|
customer_id: cust_UkLWZg9DAJ
|
|
6970
6996
|
customer_groups: []
|
|
6971
6997
|
schema:
|
|
@@ -7068,12 +7094,12 @@ paths:
|
|
|
7068
7094
|
application/json:
|
|
7069
7095
|
example:
|
|
7070
7096
|
id: cust_UkLWZg9DAJ
|
|
7071
|
-
email:
|
|
7072
|
-
first_name:
|
|
7073
|
-
last_name:
|
|
7097
|
+
email: jacqualine.turner@lubowitz.name
|
|
7098
|
+
first_name: Chester
|
|
7099
|
+
last_name: Ferry
|
|
7074
7100
|
phone: 555-555-0199
|
|
7075
7101
|
accepts_email_marketing: false
|
|
7076
|
-
full_name:
|
|
7102
|
+
full_name: Chester Ferry
|
|
7077
7103
|
available_store_credit_total: '0'
|
|
7078
7104
|
display_available_store_credit_total: "$0.00"
|
|
7079
7105
|
addresses:
|
|
@@ -7209,7 +7235,7 @@ paths:
|
|
|
7209
7235
|
application/json:
|
|
7210
7236
|
example:
|
|
7211
7237
|
id: cust_UkLWZg9DAJ
|
|
7212
|
-
email:
|
|
7238
|
+
email: zandra.kautzer@hauck.co.uk
|
|
7213
7239
|
first_name: Updated
|
|
7214
7240
|
last_name: Name
|
|
7215
7241
|
phone: 555-555-0199
|
|
@@ -7400,7 +7426,7 @@ paths:
|
|
|
7400
7426
|
example:
|
|
7401
7427
|
data:
|
|
7402
7428
|
- id: gc_UkLWZg9DAJ
|
|
7403
|
-
code:
|
|
7429
|
+
code: F1AD9ECE6F0F8E0B
|
|
7404
7430
|
status: active
|
|
7405
7431
|
currency: USD
|
|
7406
7432
|
amount: '10.0'
|
|
@@ -7496,7 +7522,7 @@ paths:
|
|
|
7496
7522
|
application/json:
|
|
7497
7523
|
example:
|
|
7498
7524
|
id: gc_UkLWZg9DAJ
|
|
7499
|
-
code:
|
|
7525
|
+
code: 669A1D3D288A601C
|
|
7500
7526
|
status: active
|
|
7501
7527
|
currency: USD
|
|
7502
7528
|
amount: '10.0'
|
|
@@ -7568,8 +7594,8 @@ paths:
|
|
|
7568
7594
|
example:
|
|
7569
7595
|
id: pss_gbHJdmfrXB
|
|
7570
7596
|
status: pending
|
|
7571
|
-
external_id:
|
|
7572
|
-
external_client_secret:
|
|
7597
|
+
external_id: bogus_seti_74fa22cd538112ddfeb512e1
|
|
7598
|
+
external_client_secret: bogus_seti_secret_806adcdde276088b
|
|
7573
7599
|
external_data: {}
|
|
7574
7600
|
payment_method_id: pm_UkLWZg9DAJ
|
|
7575
7601
|
payment_source_id:
|
|
@@ -7668,8 +7694,8 @@ paths:
|
|
|
7668
7694
|
example:
|
|
7669
7695
|
id: pss_UkLWZg9DAJ
|
|
7670
7696
|
status: pending
|
|
7671
|
-
external_id:
|
|
7672
|
-
external_client_secret:
|
|
7697
|
+
external_id: seti_test_e84dec3f397329cf04fd243c
|
|
7698
|
+
external_client_secret: seti_secret_1376518d96ebfa042b93ae07
|
|
7673
7699
|
external_data:
|
|
7674
7700
|
client_secret: secret_123
|
|
7675
7701
|
payment_method_id: pm_UkLWZg9DAJ
|
|
@@ -7745,8 +7771,8 @@ paths:
|
|
|
7745
7771
|
example:
|
|
7746
7772
|
id: pss_UkLWZg9DAJ
|
|
7747
7773
|
status: completed
|
|
7748
|
-
external_id:
|
|
7749
|
-
external_client_secret:
|
|
7774
|
+
external_id: seti_test_5271ae630222abb656d797ec
|
|
7775
|
+
external_client_secret: seti_secret_c19c748f265c0cff3bb9e670
|
|
7750
7776
|
external_data:
|
|
7751
7777
|
client_secret: secret_123
|
|
7752
7778
|
payment_method_id: pm_UkLWZg9DAJ
|
|
@@ -8690,7 +8716,7 @@ paths:
|
|
|
8690
8716
|
data:
|
|
8691
8717
|
- id: wl_UkLWZg9DAJ
|
|
8692
8718
|
name: My Wishlist
|
|
8693
|
-
token:
|
|
8719
|
+
token: RAWrQxQvGuj5shU9uZhnk7qV
|
|
8694
8720
|
is_default: false
|
|
8695
8721
|
is_private: true
|
|
8696
8722
|
meta:
|
|
@@ -8766,7 +8792,7 @@ paths:
|
|
|
8766
8792
|
example:
|
|
8767
8793
|
id: wl_gbHJdmfrXB
|
|
8768
8794
|
name: Birthday Ideas
|
|
8769
|
-
token:
|
|
8795
|
+
token: PiLjz1PqW43WMhE3xhEj38aN
|
|
8770
8796
|
is_default: false
|
|
8771
8797
|
is_private: true
|
|
8772
8798
|
schema:
|
|
@@ -8867,7 +8893,7 @@ paths:
|
|
|
8867
8893
|
example:
|
|
8868
8894
|
id: wl_UkLWZg9DAJ
|
|
8869
8895
|
name: My Wishlist
|
|
8870
|
-
token:
|
|
8896
|
+
token: ZKW28uLSYhMW8AzgVnSRsDGU
|
|
8871
8897
|
is_default: false
|
|
8872
8898
|
is_private: true
|
|
8873
8899
|
schema:
|
|
@@ -8929,7 +8955,7 @@ paths:
|
|
|
8929
8955
|
example:
|
|
8930
8956
|
id: wl_UkLWZg9DAJ
|
|
8931
8957
|
name: Updated Name
|
|
8932
|
-
token:
|
|
8958
|
+
token: sWswuNKqn88rEGPxXQN8Q3m3
|
|
8933
8959
|
is_default: false
|
|
8934
8960
|
is_private: true
|
|
8935
8961
|
schema:
|
|
@@ -9045,7 +9071,7 @@ paths:
|
|
|
9045
9071
|
variant:
|
|
9046
9072
|
id: variant_gbHJdmfrXB
|
|
9047
9073
|
product_id: prod_gbHJdmfrXB
|
|
9048
|
-
sku: SKU-
|
|
9074
|
+
sku: SKU-277
|
|
9049
9075
|
options_text: ''
|
|
9050
9076
|
track_inventory: true
|
|
9051
9077
|
media_count: 0
|
|
@@ -9211,11 +9237,11 @@ paths:
|
|
|
9211
9237
|
application/json:
|
|
9212
9238
|
example:
|
|
9213
9239
|
id: sub_UkLWZg9DAJ
|
|
9214
|
-
email:
|
|
9215
|
-
created_at: '2026-08-
|
|
9216
|
-
updated_at: '2026-08-
|
|
9240
|
+
email: andreas_oreilly@gottliebtromp.name
|
|
9241
|
+
created_at: '2026-08-14T08:14:27.879Z'
|
|
9242
|
+
updated_at: '2026-08-14T08:14:27.880Z'
|
|
9217
9243
|
verified: true
|
|
9218
|
-
verified_at: '2026-08-
|
|
9244
|
+
verified_at: '2026-08-14T08:14:27Z'
|
|
9219
9245
|
customer_id: cust_UkLWZg9DAJ
|
|
9220
9246
|
schema:
|
|
9221
9247
|
"$ref": "#/components/schemas/NewsletterSubscriber"
|
|
@@ -9294,10 +9320,10 @@ paths:
|
|
|
9294
9320
|
example:
|
|
9295
9321
|
id: sub_UkLWZg9DAJ
|
|
9296
9322
|
email: pending@example.com
|
|
9297
|
-
created_at: '2026-08-
|
|
9298
|
-
updated_at: '2026-08-
|
|
9323
|
+
created_at: '2026-08-14T08:14:27.914Z'
|
|
9324
|
+
updated_at: '2026-08-14T08:14:27.923Z'
|
|
9299
9325
|
verified: true
|
|
9300
|
-
verified_at: '2026-08-
|
|
9326
|
+
verified_at: '2026-08-14T08:14:27Z'
|
|
9301
9327
|
customer_id:
|
|
9302
9328
|
schema:
|
|
9303
9329
|
"$ref": "#/components/schemas/NewsletterSubscriber"
|
|
@@ -9467,7 +9493,7 @@ paths:
|
|
|
9467
9493
|
body_html: ''
|
|
9468
9494
|
- id: pol_OIJLhNcSbf
|
|
9469
9495
|
name: Privacy Policy
|
|
9470
|
-
slug: privacy-policy-
|
|
9496
|
+
slug: privacy-policy-19b0f311-6692-42d7-8b75-232c59dab389
|
|
9471
9497
|
body: We respect your privacy.
|
|
9472
9498
|
body_html: We respect your privacy.
|
|
9473
9499
|
- id: pol_uw2YK1rnl0
|
|
@@ -9803,14 +9829,14 @@ paths:
|
|
|
9803
9829
|
example:
|
|
9804
9830
|
data:
|
|
9805
9831
|
- id: sloc_UkLWZg9DAJ
|
|
9806
|
-
state_abbr:
|
|
9832
|
+
state_abbr: STATE_ABBR_94
|
|
9807
9833
|
name: Downtown
|
|
9808
9834
|
address1: 1600 Pennsylvania Ave NW
|
|
9809
9835
|
city: Washington
|
|
9810
9836
|
zipcode: '20500'
|
|
9811
9837
|
country_iso: US
|
|
9812
9838
|
country_name: United States of America
|
|
9813
|
-
state_text:
|
|
9839
|
+
state_text: STATE_ABBR_94
|
|
9814
9840
|
pickup_ready_in_minutes:
|
|
9815
9841
|
pickup_instructions:
|
|
9816
9842
|
servers:
|
|
@@ -10051,6 +10077,12 @@ components:
|
|
|
10051
10077
|
nullable: true
|
|
10052
10078
|
description: Prefixed variant ID (when applicable)
|
|
10053
10079
|
example: variant_abc123
|
|
10080
|
+
item_index:
|
|
10081
|
+
type: integer
|
|
10082
|
+
nullable: true
|
|
10083
|
+
description: Position in the submitted items array, for warnings raised
|
|
10084
|
+
while applying a batch of item changes
|
|
10085
|
+
example: 1
|
|
10054
10086
|
required:
|
|
10055
10087
|
- code
|
|
10056
10088
|
- message
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Validations
|
|
3
|
+
section: customization
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
Adding a rule — and occasionally relaxing one Spree ships — is one of the most
|
|
9
|
+
common reasons to reach into core models. There are three ways to do it, and
|
|
10
|
+
picking the right one is mostly a question of *what kind of rule* you have.
|
|
11
|
+
|
|
12
|
+
| Your rule is about… | Use |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Whether an **operation** may happen — a purchase limit, B2B eligibility, a region policy | A workflow [`validate` hook](workflows.md) |
|
|
15
|
+
| The **shape of a record** — a field you added must be present, a format must match | A [decorator](decorators.md) adding a validation |
|
|
16
|
+
| A **new attribute** you need on an existing model | [Custom fields](../core-concepts/metafields.md) |
|
|
17
|
+
|
|
18
|
+
Spree deliberately has no registry for adding or removing arbitrary model
|
|
19
|
+
validations. Adding one with a decorator is already a single line of ordinary
|
|
20
|
+
Rails, and removing a core rule is served by the knobs below.
|
|
21
|
+
|
|
22
|
+
## Vetoing an operation
|
|
23
|
+
|
|
24
|
+
This is the one to reach for first. A `validate` hook runs inside the flow,
|
|
25
|
+
before anything is written, and can stop it:
|
|
26
|
+
|
|
27
|
+
```ruby
|
|
28
|
+
# config/initializers/spree.rb
|
|
29
|
+
Spree.hooks.register('carts.add_item.validate', 'MyStore::CheckPurchaseLimit')
|
|
30
|
+
Spree.hooks.register('carts.upsert_items.validate', 'MyStore::CheckPurchaseLimit')
|
|
31
|
+
|
|
32
|
+
module MyStore
|
|
33
|
+
class CheckPurchaseLimit
|
|
34
|
+
def call(workflow)
|
|
35
|
+
return if workflow.quantity <= 10
|
|
36
|
+
|
|
37
|
+
workflow.errors.add(:quantity, :purchase_limit_exceeded,
|
|
38
|
+
message: 'You can order at most 10 of this item.')
|
|
39
|
+
workflow.reject!
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Why this beats a model validation for operational rules: it runs only for the
|
|
46
|
+
operation you targeted, so a data migration or an admin correction isn't fought
|
|
47
|
+
by a customer-facing rule; it sees the whole flow, not one record; and it can
|
|
48
|
+
tell staff from customers (`workflow.created_by`) to allow a supervisor
|
|
49
|
+
override.
|
|
50
|
+
|
|
51
|
+
Both cart keys appear above because adding to a cart and setting a quantity are
|
|
52
|
+
different flows. See [Services & Workflows](workflows.md)
|
|
53
|
+
for the full hook list.
|
|
54
|
+
|
|
55
|
+
## Adding a rule to a model
|
|
56
|
+
|
|
57
|
+
For rules about the shape of a record, a decorator is the supported route:
|
|
58
|
+
|
|
59
|
+
```ruby
|
|
60
|
+
# app/models/spree/product_decorator.rb
|
|
61
|
+
module MyStore
|
|
62
|
+
module ProductDecorator
|
|
63
|
+
def self.prepended(base)
|
|
64
|
+
base.validates :external_id, presence: true, uniqueness: true
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
Spree::Product.prepend(MyStore::ProductDecorator)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Decorators couple you to Spree internals, so prefer a hook when the rule is
|
|
73
|
+
really about an operation. See
|
|
74
|
+
[Decorators](decorators.md).
|
|
75
|
+
|
|
76
|
+
## Relaxing a rule Spree ships
|
|
77
|
+
|
|
78
|
+
Never call `clear_validators!` — it wipes every validation on the model,
|
|
79
|
+
including ones added by other extensions, and the breakage appears far from the
|
|
80
|
+
cause. Use one of these instead.
|
|
81
|
+
|
|
82
|
+
### Store preferences
|
|
83
|
+
|
|
84
|
+
Some rules are already switchable, per store, from the dashboard or a console:
|
|
85
|
+
|
|
86
|
+
| Preference | Effect |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `address_requires_phone` | Requires a phone number on addresses |
|
|
89
|
+
| `company_field_enabled` | Shows the company field on address forms |
|
|
90
|
+
| `address_requires_company` | Requires it — only meaningful with the field shown |
|
|
91
|
+
| `disable_sku_validation` | Turns off SKU uniqueness |
|
|
92
|
+
|
|
93
|
+
```ruby
|
|
94
|
+
store.update!(preferred_address_requires_company: true)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Overriding the gating predicate
|
|
98
|
+
|
|
99
|
+
Most conditional validations in `Spree::Address` are gated on a predicate you
|
|
100
|
+
can override, which is far safer than removing the validation:
|
|
101
|
+
|
|
102
|
+
```ruby
|
|
103
|
+
module MyStore
|
|
104
|
+
module AddressDecorator
|
|
105
|
+
# Business addresses only in this store.
|
|
106
|
+
def require_company?
|
|
107
|
+
!quick_checkout
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
Spree::Address.prepend(MyStore::AddressDecorator)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
`require_name?`, `require_street?`, `require_zipcode?`, `require_phone?` and
|
|
116
|
+
`require_company?` all work this way.
|
|
117
|
+
|
|
118
|
+
### The address validator registry
|
|
119
|
+
|
|
120
|
+
Address rules are regional and business-specific, so addresses carry a registry
|
|
121
|
+
of extra validator classes you can add to and remove from:
|
|
122
|
+
|
|
123
|
+
```ruby
|
|
124
|
+
# config/initializers/spree.rb — or config.to_prepare for your own classes
|
|
125
|
+
Spree.validators.addresses.register(MyStore::PostBoxValidator)
|
|
126
|
+
|
|
127
|
+
# Drop a rule Spree ships
|
|
128
|
+
Spree.validators.addresses.unregister(Spree::Addresses::PhoneValidator)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
A validator is an ordinary `ActiveModel::Validator`:
|
|
132
|
+
|
|
133
|
+
```ruby
|
|
134
|
+
module MyStore
|
|
135
|
+
class PostBoxValidator < ActiveModel::Validator
|
|
136
|
+
def validate(record)
|
|
137
|
+
return unless record.address1.to_s.match?(/\A\s*P\.?O\.? Box/i)
|
|
138
|
+
|
|
139
|
+
record.errors.add(:address1, :po_box_not_deliverable)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Register your own classes from `config.to_prepare` rather than an initializer —
|
|
146
|
+
the registry holds classes, and a reloadable constant registered once at boot
|
|
147
|
+
goes stale on the next reload.
|
|
148
|
+
|
|
149
|
+
## Checkout requirements
|
|
150
|
+
|
|
151
|
+
Rules about what a cart needs *before it can be completed* — a phone number
|
|
152
|
+
before delivery, a purchase order number for B2B — belong in the checkout
|
|
153
|
+
requirements registry rather than a model validation, because they also drive
|
|
154
|
+
what the storefront shows as outstanding:
|
|
155
|
+
|
|
156
|
+
```ruby
|
|
157
|
+
Spree::Checkout::Registry.add_requirement(
|
|
158
|
+
step: 'address',
|
|
159
|
+
field: 'phone',
|
|
160
|
+
message: 'Phone number is required for delivery',
|
|
161
|
+
satisfied: ->(cart) { cart.ship_address&.phone.present? }
|
|
162
|
+
)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
See the [Spree 6 quickstart](/v6/developer/customization/quickstart) for the full registry API.
|
|
166
|
+
|
|
167
|
+
## Custom field values
|
|
168
|
+
|
|
169
|
+
Custom fields currently validate their type only — a `Number` field rejects
|
|
170
|
+
non-numbers, a `Json` field rejects malformed JSON. There is no per-definition
|
|
171
|
+
length, range or format rule yet. A product type marking a custom field as
|
|
172
|
+
*required* is an advisory marker shown in the dashboard; the server does not
|
|
173
|
+
enforce it.
|
|
@@ -37,7 +37,7 @@ result = Spree.cart_add_item_workflow.call(cart: cart, variant: variant, quantit
|
|
|
37
37
|
if result.success?
|
|
38
38
|
line_item = result.value
|
|
39
39
|
else
|
|
40
|
-
puts result.error.
|
|
40
|
+
puts result.error.to_s
|
|
41
41
|
end
|
|
42
42
|
```
|
|
43
43
|
|
|
@@ -76,12 +76,31 @@ module MyStore
|
|
|
76
76
|
# every #perform keyword is a reader: cart, variant, quantity, ...
|
|
77
77
|
return if workflow.quantity <= 10
|
|
78
78
|
|
|
79
|
-
workflow.
|
|
79
|
+
workflow.errors.add(:quantity, :purchase_limit_exceeded,
|
|
80
|
+
message: 'You can order at most 10 of this item.')
|
|
81
|
+
workflow.reject!
|
|
80
82
|
end
|
|
81
83
|
end
|
|
82
84
|
end
|
|
83
85
|
```
|
|
84
86
|
|
|
87
|
+
`workflow.errors` is an `ActiveModel::Errors`, the same object a model uses. A
|
|
88
|
+
rejection therefore reaches the API in the shape clients already handle for
|
|
89
|
+
validation failures — the field name, a symbolic code, and the message:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"error": {
|
|
94
|
+
"code": "validation_error",
|
|
95
|
+
"message": "Quantity You can order at most 10 of this item.",
|
|
96
|
+
"details": { "quantity": ["You can order at most 10 of this item."] }
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Add to `:base` for a rejection that isn't about one field. `reject!('message')`
|
|
102
|
+
with an argument is shorthand for exactly that.
|
|
103
|
+
|
|
85
104
|
> **NOTE:** Hook keys are validated at boot. Registering against a hook that doesn't exist
|
|
86
105
|
> raises `Spree::Hooks::UnknownHookError` with the list of valid hooks for that
|
|
87
106
|
> workflow, so a typo fails immediately instead of silently never firing.
|
|
@@ -179,9 +198,10 @@ The caller receives a normal failure result — no exception reaches your
|
|
|
179
198
|
controller:
|
|
180
199
|
|
|
181
200
|
```ruby
|
|
182
|
-
result = Spree.
|
|
201
|
+
result = Spree.return_create_workflow.call(order: order, items: items)
|
|
183
202
|
result.success? # => false
|
|
184
|
-
result.error.
|
|
203
|
+
result.error.to_s # => "This order is outside the 30-day return window."
|
|
204
|
+
result.error.value # => ActiveModel::Errors — the rejection, field by field
|
|
185
205
|
```
|
|
186
206
|
|
|
187
207
|
> **WARNING:** Reject from `validate` hooks, not from `after_*` hooks. Rejecting late still
|
|
@@ -227,6 +247,8 @@ is reported through `Rails.error` so it's visible rather than mysterious.
|
|
|
227
247
|
|---|---|---|---|
|
|
228
248
|
| `carts.add_item` | `validate` | validate | Before the line item is built |
|
|
229
249
|
| `carts.add_item` | `after_item_added` | lifecycle | After the item is saved and totals recalculated (in transaction) |
|
|
250
|
+
| `carts.upsert_items` | `validate` | validate | Once per item, immediately before that item is applied — quantity edits, removals and bulk payloads. Earlier items in the batch may already be written |
|
|
251
|
+
| `carts.upsert_items` | `after_items_upserted` | lifecycle | After the batch is applied and the cart recalculated once (in transaction) |
|
|
230
252
|
| `carts.complete` | `validate` | validate | After checkout requirements pass, before the order is created |
|
|
231
253
|
| `carts.complete` | `before_finalize` | lifecycle | After payment, before the order is placed |
|
|
232
254
|
| `carts.complete` | `after_finalize` | lifecycle | After the order is placed |
|
|
@@ -251,13 +273,33 @@ is reported through `Rails.error` so it's visible rather than mysterious.
|
|
|
251
273
|
| `payments.handle_webhook` | `after_handle` | lifecycle | After the gateway callback is processed |
|
|
252
274
|
| `customers.create` | `validate` | validate | After the customer is built, before it is saved — the registration-policy veto (bot screening, B2B approval) |
|
|
253
275
|
| `customers.create` | `after_create` | lifecycle | After the customer is created and the newsletter subscriber linked |
|
|
276
|
+
| `products.create` | `validate` | validate | After the product is built, before it is saved — fires for the Admin API, CSV imports and seeds alike |
|
|
277
|
+
| `products.create` | `after_create` | lifecycle | After the product is saved (in transaction) |
|
|
278
|
+
| `products.update` | `validate` | validate | With the pending attributes assigned, so `product.changes` describes the edit |
|
|
279
|
+
| `products.update` | `after_update` | lifecycle | After the product is saved (in transaction) |
|
|
280
|
+
| `products.destroy` | `validate` | validate | Before the product is soft-deleted — refuse a deletion your store shouldn't allow |
|
|
281
|
+
| `products.destroy` | `after_destroy` | lifecycle | After the soft-delete, for host cleanup (in transaction) |
|
|
254
282
|
|
|
255
283
|
`before_cancel` and `before_resume` accept `reject!` like a `validate` hook.
|
|
256
284
|
|
|
257
285
|
Draft-order editing in the admin uses **twin workflows** with their own keys —
|
|
258
|
-
`orders.add_item`, `orders.
|
|
259
|
-
the same hooks as their cart
|
|
260
|
-
|
|
286
|
+
`orders.add_item`, `orders.upsert_items`, `orders.recalculate`,
|
|
287
|
+
`orders.recalculate_totals` — carrying the same hooks as their cart
|
|
288
|
+
counterparts. Register against the cart key for storefront carts, the order key
|
|
289
|
+
for admin edits, or both.
|
|
290
|
+
|
|
291
|
+
> **NOTE:** `carts.add_item` **adds** to a quantity; `carts.upsert_items` **sets** it, and
|
|
292
|
+
> is what a quantity edit, a removal (quantity `0`) and a bulk item payload all
|
|
293
|
+
> run through. A rule about what may be in a cart therefore belongs on both keys —
|
|
294
|
+
> the readers are the same (`cart`, `variant`, `quantity`), so one handler class
|
|
295
|
+
> registers against each.
|
|
296
|
+
>
|
|
297
|
+
> `upsert_items` is also the one flow where a rejection is **not** fatal on the
|
|
298
|
+
> storefront: the vetoed item is skipped, the rest of the batch applies, and what
|
|
299
|
+
> was dropped comes back in the cart's `warnings`. A customer restoring a saved
|
|
300
|
+
> cart keeps whatever is still purchasable. Admin order edits behave the opposite
|
|
301
|
+
> way — the whole edit fails — because a silently dropped row is worse than a
|
|
302
|
+
> failed request when a merchant is editing.
|
|
261
303
|
|
|
262
304
|
Inspect what's available at runtime:
|
|
263
305
|
|
|
@@ -340,7 +382,7 @@ The whole vocabulary:
|
|
|
340
382
|
| `on_flow_failure: :name` | Names the undo for a step, run in reverse if a later step fails |
|
|
341
383
|
| `run_hooks :name` | Dispatches a declared hook; returns the merged hash from context handlers |
|
|
342
384
|
| `failure(value, error)` | Aborts the flow — rolls back an open transaction and returns a failure result |
|
|
343
|
-
| `reject
|
|
385
|
+
| `reject!` | The same, named for hook handlers vetoing a flow — carries `workflow.errors` |
|
|
344
386
|
| `halt!(value)` | Successful early exit (not valid inside a transaction the workflow opened) |
|
|
345
387
|
| `hooks :a, :b` | Declares the extension points this workflow dispatches |
|
|
346
388
|
|