shopify_api 13.1.0 → 13.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (635) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -1
  3. data/.github/workflows/build.yml +4 -0
  4. data/.rubocop.yml +2 -0
  5. data/BREAKING_CHANGES_FOR_V10.md +231 -0
  6. data/CHANGELOG.md +25 -1
  7. data/CONTRIBUTING.md +25 -0
  8. data/Gemfile.lock +23 -17
  9. data/README.md +10 -34
  10. data/ROADMAP.md +10 -0
  11. data/docs/README.md +0 -1
  12. data/docs/getting_started.md +20 -3
  13. data/docs/usage/custom_apps.md +75 -0
  14. data/docs/usage/graphql.md +91 -17
  15. data/docs/usage/oauth.md +160 -27
  16. data/docs/usage/rest.md +216 -59
  17. data/docs/usage/webhooks.md +22 -4
  18. data/lib/shopify_api/admin_versions.rb +3 -1
  19. data/lib/shopify_api/auth/jwt_payload.rb +2 -2
  20. data/lib/shopify_api/auth/oauth.rb +15 -5
  21. data/lib/shopify_api/auth/session.rb +5 -0
  22. data/lib/shopify_api/clients/graphql/client.rb +1 -0
  23. data/lib/shopify_api/clients/http_client.rb +12 -3
  24. data/lib/shopify_api/clients/http_response.rb +29 -2
  25. data/lib/shopify_api/context.rb +18 -5
  26. data/lib/shopify_api/rest/base.rb +35 -14
  27. data/lib/shopify_api/rest/resources/2022_04/abandoned_checkout.rb +7 -3
  28. data/lib/shopify_api/rest/resources/2022_04/access_scope.rb +7 -3
  29. data/lib/shopify_api/rest/resources/2022_04/android_pay_key.rb +7 -3
  30. data/lib/shopify_api/rest/resources/2022_04/apple_pay_certificate.rb +7 -3
  31. data/lib/shopify_api/rest/resources/2022_04/application_charge.rb +7 -3
  32. data/lib/shopify_api/rest/resources/2022_04/application_credit.rb +7 -3
  33. data/lib/shopify_api/rest/resources/2022_04/article.rb +7 -3
  34. data/lib/shopify_api/rest/resources/2022_04/asset.rb +7 -3
  35. data/lib/shopify_api/rest/resources/2022_04/assigned_fulfillment_order.rb +12 -6
  36. data/lib/shopify_api/rest/resources/2022_04/balance.rb +6 -3
  37. data/lib/shopify_api/rest/resources/2022_04/blog.rb +7 -3
  38. data/lib/shopify_api/rest/resources/2022_04/cancellation_request.rb +7 -3
  39. data/lib/shopify_api/rest/resources/2022_04/carrier_service.rb +7 -3
  40. data/lib/shopify_api/rest/resources/2022_04/checkout.rb +7 -3
  41. data/lib/shopify_api/rest/resources/2022_04/collect.rb +7 -3
  42. data/lib/shopify_api/rest/resources/2022_04/collection.rb +7 -3
  43. data/lib/shopify_api/rest/resources/2022_04/collection_listing.rb +7 -3
  44. data/lib/shopify_api/rest/resources/2022_04/comment.rb +7 -3
  45. data/lib/shopify_api/rest/resources/2022_04/country.rb +7 -3
  46. data/lib/shopify_api/rest/resources/2022_04/currency.rb +7 -3
  47. data/lib/shopify_api/rest/resources/2022_04/custom_collection.rb +7 -3
  48. data/lib/shopify_api/rest/resources/2022_04/customer.rb +7 -3
  49. data/lib/shopify_api/rest/resources/2022_04/customer_address.rb +17 -3
  50. data/lib/shopify_api/rest/resources/2022_04/customer_saved_search.rb +7 -3
  51. data/lib/shopify_api/rest/resources/2022_04/deprecated_api_call.rb +7 -3
  52. data/lib/shopify_api/rest/resources/2022_04/discount_code.rb +7 -3
  53. data/lib/shopify_api/rest/resources/2022_04/dispute.rb +7 -3
  54. data/lib/shopify_api/rest/resources/2022_04/draft_order.rb +7 -3
  55. data/lib/shopify_api/rest/resources/2022_04/event.rb +7 -3
  56. data/lib/shopify_api/rest/resources/2022_04/fulfillment.rb +7 -3
  57. data/lib/shopify_api/rest/resources/2022_04/fulfillment_event.rb +7 -3
  58. data/lib/shopify_api/rest/resources/2022_04/fulfillment_order.rb +7 -3
  59. data/lib/shopify_api/rest/resources/2022_04/fulfillment_request.rb +17 -3
  60. data/lib/shopify_api/rest/resources/2022_04/fulfillment_service.rb +7 -3
  61. data/lib/shopify_api/rest/resources/2022_04/gift_card.rb +7 -3
  62. data/lib/shopify_api/rest/resources/2022_04/gift_card_adjustment.rb +7 -3
  63. data/lib/shopify_api/rest/resources/2022_04/image.rb +7 -3
  64. data/lib/shopify_api/rest/resources/2022_04/inventory_item.rb +7 -3
  65. data/lib/shopify_api/rest/resources/2022_04/inventory_level.rb +7 -3
  66. data/lib/shopify_api/rest/resources/2022_04/location.rb +7 -3
  67. data/lib/shopify_api/rest/resources/2022_04/locations_for_move.rb +7 -3
  68. data/lib/shopify_api/rest/resources/2022_04/marketing_event.rb +7 -3
  69. data/lib/shopify_api/rest/resources/2022_04/metafield.rb +7 -3
  70. data/lib/shopify_api/rest/resources/2022_04/mobile_platform_application.rb +7 -3
  71. data/lib/shopify_api/rest/resources/2022_04/order.rb +7 -3
  72. data/lib/shopify_api/rest/resources/2022_04/order_risk.rb +12 -6
  73. data/lib/shopify_api/rest/resources/2022_04/page.rb +7 -3
  74. data/lib/shopify_api/rest/resources/2022_04/payment.rb +7 -3
  75. data/lib/shopify_api/rest/resources/2022_04/payment_gateway.rb +7 -3
  76. data/lib/shopify_api/rest/resources/2022_04/payment_transaction.rb +7 -3
  77. data/lib/shopify_api/rest/resources/2022_04/payout.rb +7 -3
  78. data/lib/shopify_api/rest/resources/2022_04/policy.rb +7 -3
  79. data/lib/shopify_api/rest/resources/2022_04/price_rule.rb +7 -3
  80. data/lib/shopify_api/rest/resources/2022_04/product.rb +7 -3
  81. data/lib/shopify_api/rest/resources/2022_04/product_listing.rb +7 -3
  82. data/lib/shopify_api/rest/resources/2022_04/product_resource_feedback.rb +7 -3
  83. data/lib/shopify_api/rest/resources/2022_04/province.rb +7 -3
  84. data/lib/shopify_api/rest/resources/2022_04/recurring_application_charge.rb +7 -3
  85. data/lib/shopify_api/rest/resources/2022_04/redirect.rb +7 -3
  86. data/lib/shopify_api/rest/resources/2022_04/refund.rb +7 -3
  87. data/lib/shopify_api/rest/resources/2022_04/report.rb +7 -3
  88. data/lib/shopify_api/rest/resources/2022_04/resource_feedback.rb +7 -3
  89. data/lib/shopify_api/rest/resources/2022_04/script_tag.rb +7 -3
  90. data/lib/shopify_api/rest/resources/2022_04/shipping_zone.rb +7 -3
  91. data/lib/shopify_api/rest/resources/2022_04/shop.rb +7 -3
  92. data/lib/shopify_api/rest/resources/2022_04/smart_collection.rb +7 -3
  93. data/lib/shopify_api/rest/resources/2022_04/storefront_access_token.rb +7 -3
  94. data/lib/shopify_api/rest/resources/2022_04/tender_transaction.rb +7 -3
  95. data/lib/shopify_api/rest/resources/2022_04/theme.rb +7 -3
  96. data/lib/shopify_api/rest/resources/2022_04/transaction.rb +7 -3
  97. data/lib/shopify_api/rest/resources/2022_04/usage_charge.rb +7 -3
  98. data/lib/shopify_api/rest/resources/2022_04/user.rb +7 -3
  99. data/lib/shopify_api/rest/resources/2022_04/variant.rb +7 -3
  100. data/lib/shopify_api/rest/resources/2022_04/webhook.rb +7 -3
  101. data/lib/shopify_api/rest/resources/2022_07/abandoned_checkout.rb +7 -3
  102. data/lib/shopify_api/rest/resources/2022_07/access_scope.rb +7 -3
  103. data/lib/shopify_api/rest/resources/2022_07/android_pay_key.rb +7 -3
  104. data/lib/shopify_api/rest/resources/2022_07/apple_pay_certificate.rb +7 -3
  105. data/lib/shopify_api/rest/resources/2022_07/application_charge.rb +7 -3
  106. data/lib/shopify_api/rest/resources/2022_07/application_credit.rb +7 -3
  107. data/lib/shopify_api/rest/resources/2022_07/article.rb +7 -3
  108. data/lib/shopify_api/rest/resources/2022_07/asset.rb +7 -3
  109. data/lib/shopify_api/rest/resources/2022_07/assigned_fulfillment_order.rb +12 -6
  110. data/lib/shopify_api/rest/resources/2022_07/balance.rb +11 -3
  111. data/lib/shopify_api/rest/resources/2022_07/blog.rb +7 -3
  112. data/lib/shopify_api/rest/resources/2022_07/cancellation_request.rb +7 -3
  113. data/lib/shopify_api/rest/resources/2022_07/carrier_service.rb +7 -3
  114. data/lib/shopify_api/rest/resources/2022_07/checkout.rb +7 -3
  115. data/lib/shopify_api/rest/resources/2022_07/collect.rb +7 -3
  116. data/lib/shopify_api/rest/resources/2022_07/collection.rb +7 -3
  117. data/lib/shopify_api/rest/resources/2022_07/collection_listing.rb +7 -3
  118. data/lib/shopify_api/rest/resources/2022_07/comment.rb +7 -3
  119. data/lib/shopify_api/rest/resources/2022_07/country.rb +7 -3
  120. data/lib/shopify_api/rest/resources/2022_07/currency.rb +7 -3
  121. data/lib/shopify_api/rest/resources/2022_07/custom_collection.rb +7 -3
  122. data/lib/shopify_api/rest/resources/2022_07/customer.rb +7 -3
  123. data/lib/shopify_api/rest/resources/2022_07/customer_address.rb +17 -3
  124. data/lib/shopify_api/rest/resources/2022_07/deprecated_api_call.rb +7 -3
  125. data/lib/shopify_api/rest/resources/2022_07/discount_code.rb +7 -3
  126. data/lib/shopify_api/rest/resources/2022_07/dispute.rb +7 -3
  127. data/lib/shopify_api/rest/resources/2022_07/dispute_evidence.rb +7 -3
  128. data/lib/shopify_api/rest/resources/2022_07/dispute_file_upload.rb +7 -3
  129. data/lib/shopify_api/rest/resources/2022_07/draft_order.rb +7 -3
  130. data/lib/shopify_api/rest/resources/2022_07/event.rb +7 -3
  131. data/lib/shopify_api/rest/resources/2022_07/fulfillment.rb +7 -3
  132. data/lib/shopify_api/rest/resources/2022_07/fulfillment_event.rb +7 -3
  133. data/lib/shopify_api/rest/resources/2022_07/fulfillment_order.rb +7 -3
  134. data/lib/shopify_api/rest/resources/2022_07/fulfillment_request.rb +17 -3
  135. data/lib/shopify_api/rest/resources/2022_07/fulfillment_service.rb +7 -3
  136. data/lib/shopify_api/rest/resources/2022_07/gift_card.rb +7 -3
  137. data/lib/shopify_api/rest/resources/2022_07/gift_card_adjustment.rb +7 -3
  138. data/lib/shopify_api/rest/resources/2022_07/image.rb +7 -3
  139. data/lib/shopify_api/rest/resources/2022_07/inventory_item.rb +7 -3
  140. data/lib/shopify_api/rest/resources/2022_07/inventory_level.rb +7 -3
  141. data/lib/shopify_api/rest/resources/2022_07/location.rb +7 -3
  142. data/lib/shopify_api/rest/resources/2022_07/locations_for_move.rb +7 -3
  143. data/lib/shopify_api/rest/resources/2022_07/marketing_event.rb +7 -3
  144. data/lib/shopify_api/rest/resources/2022_07/metafield.rb +7 -3
  145. data/lib/shopify_api/rest/resources/2022_07/mobile_platform_application.rb +7 -3
  146. data/lib/shopify_api/rest/resources/2022_07/order.rb +10 -3
  147. data/lib/shopify_api/rest/resources/2022_07/order_risk.rb +12 -6
  148. data/lib/shopify_api/rest/resources/2022_07/page.rb +7 -3
  149. data/lib/shopify_api/rest/resources/2022_07/payment.rb +7 -3
  150. data/lib/shopify_api/rest/resources/2022_07/payment_gateway.rb +7 -3
  151. data/lib/shopify_api/rest/resources/2022_07/payment_transaction.rb +7 -3
  152. data/lib/shopify_api/rest/resources/2022_07/payout.rb +7 -3
  153. data/lib/shopify_api/rest/resources/2022_07/policy.rb +7 -3
  154. data/lib/shopify_api/rest/resources/2022_07/price_rule.rb +7 -3
  155. data/lib/shopify_api/rest/resources/2022_07/product.rb +7 -3
  156. data/lib/shopify_api/rest/resources/2022_07/product_listing.rb +7 -3
  157. data/lib/shopify_api/rest/resources/2022_07/product_resource_feedback.rb +7 -3
  158. data/lib/shopify_api/rest/resources/2022_07/province.rb +7 -3
  159. data/lib/shopify_api/rest/resources/2022_07/recurring_application_charge.rb +7 -3
  160. data/lib/shopify_api/rest/resources/2022_07/redirect.rb +7 -3
  161. data/lib/shopify_api/rest/resources/2022_07/refund.rb +7 -3
  162. data/lib/shopify_api/rest/resources/2022_07/report.rb +7 -3
  163. data/lib/shopify_api/rest/resources/2022_07/resource_feedback.rb +7 -3
  164. data/lib/shopify_api/rest/resources/2022_07/script_tag.rb +7 -3
  165. data/lib/shopify_api/rest/resources/2022_07/shipping_zone.rb +7 -3
  166. data/lib/shopify_api/rest/resources/2022_07/shop.rb +7 -3
  167. data/lib/shopify_api/rest/resources/2022_07/smart_collection.rb +7 -3
  168. data/lib/shopify_api/rest/resources/2022_07/storefront_access_token.rb +7 -3
  169. data/lib/shopify_api/rest/resources/2022_07/tender_transaction.rb +7 -3
  170. data/lib/shopify_api/rest/resources/2022_07/theme.rb +7 -3
  171. data/lib/shopify_api/rest/resources/2022_07/transaction.rb +7 -3
  172. data/lib/shopify_api/rest/resources/2022_07/usage_charge.rb +7 -3
  173. data/lib/shopify_api/rest/resources/2022_07/user.rb +7 -3
  174. data/lib/shopify_api/rest/resources/2022_07/variant.rb +7 -3
  175. data/lib/shopify_api/rest/resources/2022_07/webhook.rb +7 -3
  176. data/lib/shopify_api/rest/resources/2022_10/abandoned_checkout.rb +7 -3
  177. data/lib/shopify_api/rest/resources/2022_10/access_scope.rb +7 -3
  178. data/lib/shopify_api/rest/resources/2022_10/android_pay_key.rb +7 -3
  179. data/lib/shopify_api/rest/resources/2022_10/apple_pay_certificate.rb +7 -3
  180. data/lib/shopify_api/rest/resources/2022_10/application_charge.rb +7 -3
  181. data/lib/shopify_api/rest/resources/2022_10/application_credit.rb +7 -3
  182. data/lib/shopify_api/rest/resources/2022_10/article.rb +7 -3
  183. data/lib/shopify_api/rest/resources/2022_10/asset.rb +7 -3
  184. data/lib/shopify_api/rest/resources/2022_10/assigned_fulfillment_order.rb +12 -6
  185. data/lib/shopify_api/rest/resources/2022_10/balance.rb +11 -3
  186. data/lib/shopify_api/rest/resources/2022_10/blog.rb +7 -3
  187. data/lib/shopify_api/rest/resources/2022_10/cancellation_request.rb +7 -3
  188. data/lib/shopify_api/rest/resources/2022_10/carrier_service.rb +7 -3
  189. data/lib/shopify_api/rest/resources/2022_10/checkout.rb +7 -3
  190. data/lib/shopify_api/rest/resources/2022_10/collect.rb +7 -3
  191. data/lib/shopify_api/rest/resources/2022_10/collection.rb +7 -3
  192. data/lib/shopify_api/rest/resources/2022_10/collection_listing.rb +7 -3
  193. data/lib/shopify_api/rest/resources/2022_10/comment.rb +7 -3
  194. data/lib/shopify_api/rest/resources/2022_10/country.rb +7 -3
  195. data/lib/shopify_api/rest/resources/2022_10/currency.rb +7 -3
  196. data/lib/shopify_api/rest/resources/2022_10/custom_collection.rb +7 -3
  197. data/lib/shopify_api/rest/resources/2022_10/customer.rb +7 -3
  198. data/lib/shopify_api/rest/resources/2022_10/customer_address.rb +17 -3
  199. data/lib/shopify_api/rest/resources/2022_10/deprecated_api_call.rb +7 -3
  200. data/lib/shopify_api/rest/resources/2022_10/discount_code.rb +7 -3
  201. data/lib/shopify_api/rest/resources/2022_10/dispute.rb +7 -3
  202. data/lib/shopify_api/rest/resources/2022_10/dispute_evidence.rb +7 -3
  203. data/lib/shopify_api/rest/resources/2022_10/dispute_file_upload.rb +7 -3
  204. data/lib/shopify_api/rest/resources/2022_10/draft_order.rb +7 -3
  205. data/lib/shopify_api/rest/resources/2022_10/event.rb +7 -3
  206. data/lib/shopify_api/rest/resources/2022_10/fulfillment.rb +7 -3
  207. data/lib/shopify_api/rest/resources/2022_10/fulfillment_event.rb +7 -3
  208. data/lib/shopify_api/rest/resources/2022_10/fulfillment_order.rb +7 -3
  209. data/lib/shopify_api/rest/resources/2022_10/fulfillment_request.rb +17 -3
  210. data/lib/shopify_api/rest/resources/2022_10/fulfillment_service.rb +7 -3
  211. data/lib/shopify_api/rest/resources/2022_10/gift_card.rb +7 -3
  212. data/lib/shopify_api/rest/resources/2022_10/gift_card_adjustment.rb +7 -3
  213. data/lib/shopify_api/rest/resources/2022_10/image.rb +7 -3
  214. data/lib/shopify_api/rest/resources/2022_10/inventory_item.rb +7 -3
  215. data/lib/shopify_api/rest/resources/2022_10/inventory_level.rb +7 -3
  216. data/lib/shopify_api/rest/resources/2022_10/location.rb +7 -3
  217. data/lib/shopify_api/rest/resources/2022_10/locations_for_move.rb +7 -3
  218. data/lib/shopify_api/rest/resources/2022_10/marketing_event.rb +7 -3
  219. data/lib/shopify_api/rest/resources/2022_10/metafield.rb +7 -3
  220. data/lib/shopify_api/rest/resources/2022_10/mobile_platform_application.rb +7 -3
  221. data/lib/shopify_api/rest/resources/2022_10/order.rb +10 -3
  222. data/lib/shopify_api/rest/resources/2022_10/order_risk.rb +12 -6
  223. data/lib/shopify_api/rest/resources/2022_10/page.rb +7 -3
  224. data/lib/shopify_api/rest/resources/2022_10/payment.rb +7 -3
  225. data/lib/shopify_api/rest/resources/2022_10/payment_gateway.rb +7 -3
  226. data/lib/shopify_api/rest/resources/2022_10/payment_transaction.rb +7 -3
  227. data/lib/shopify_api/rest/resources/2022_10/payout.rb +7 -3
  228. data/lib/shopify_api/rest/resources/2022_10/policy.rb +7 -3
  229. data/lib/shopify_api/rest/resources/2022_10/price_rule.rb +7 -3
  230. data/lib/shopify_api/rest/resources/2022_10/product.rb +7 -3
  231. data/lib/shopify_api/rest/resources/2022_10/product_listing.rb +7 -3
  232. data/lib/shopify_api/rest/resources/2022_10/product_resource_feedback.rb +7 -3
  233. data/lib/shopify_api/rest/resources/2022_10/province.rb +7 -3
  234. data/lib/shopify_api/rest/resources/2022_10/recurring_application_charge.rb +7 -3
  235. data/lib/shopify_api/rest/resources/2022_10/redirect.rb +7 -3
  236. data/lib/shopify_api/rest/resources/2022_10/refund.rb +7 -3
  237. data/lib/shopify_api/rest/resources/2022_10/report.rb +7 -3
  238. data/lib/shopify_api/rest/resources/2022_10/resource_feedback.rb +7 -3
  239. data/lib/shopify_api/rest/resources/2022_10/script_tag.rb +7 -3
  240. data/lib/shopify_api/rest/resources/2022_10/shipping_zone.rb +7 -3
  241. data/lib/shopify_api/rest/resources/2022_10/shop.rb +7 -6
  242. data/lib/shopify_api/rest/resources/2022_10/smart_collection.rb +7 -3
  243. data/lib/shopify_api/rest/resources/2022_10/storefront_access_token.rb +7 -3
  244. data/lib/shopify_api/rest/resources/2022_10/tender_transaction.rb +7 -3
  245. data/lib/shopify_api/rest/resources/2022_10/theme.rb +7 -3
  246. data/lib/shopify_api/rest/resources/2022_10/transaction.rb +7 -3
  247. data/lib/shopify_api/rest/resources/2022_10/usage_charge.rb +7 -3
  248. data/lib/shopify_api/rest/resources/2022_10/user.rb +7 -3
  249. data/lib/shopify_api/rest/resources/2022_10/variant.rb +8 -8
  250. data/lib/shopify_api/rest/resources/2022_10/webhook.rb +7 -3
  251. data/lib/shopify_api/rest/resources/2023_01/abandoned_checkout.rb +7 -3
  252. data/lib/shopify_api/rest/resources/2023_01/access_scope.rb +7 -3
  253. data/lib/shopify_api/rest/resources/2023_01/apple_pay_certificate.rb +7 -3
  254. data/lib/shopify_api/rest/resources/2023_01/application_charge.rb +7 -3
  255. data/lib/shopify_api/rest/resources/2023_01/application_credit.rb +7 -3
  256. data/lib/shopify_api/rest/resources/2023_01/article.rb +7 -3
  257. data/lib/shopify_api/rest/resources/2023_01/asset.rb +7 -3
  258. data/lib/shopify_api/rest/resources/2023_01/assigned_fulfillment_order.rb +12 -6
  259. data/lib/shopify_api/rest/resources/2023_01/balance.rb +11 -3
  260. data/lib/shopify_api/rest/resources/2023_01/blog.rb +7 -3
  261. data/lib/shopify_api/rest/resources/2023_01/cancellation_request.rb +7 -3
  262. data/lib/shopify_api/rest/resources/2023_01/carrier_service.rb +7 -3
  263. data/lib/shopify_api/rest/resources/2023_01/checkout.rb +7 -3
  264. data/lib/shopify_api/rest/resources/2023_01/collect.rb +7 -3
  265. data/lib/shopify_api/rest/resources/2023_01/collection.rb +7 -3
  266. data/lib/shopify_api/rest/resources/2023_01/collection_listing.rb +7 -3
  267. data/lib/shopify_api/rest/resources/2023_01/comment.rb +7 -3
  268. data/lib/shopify_api/rest/resources/2023_01/country.rb +7 -3
  269. data/lib/shopify_api/rest/resources/2023_01/currency.rb +7 -3
  270. data/lib/shopify_api/rest/resources/2023_01/custom_collection.rb +7 -3
  271. data/lib/shopify_api/rest/resources/2023_01/customer.rb +7 -3
  272. data/lib/shopify_api/rest/resources/2023_01/customer_address.rb +17 -3
  273. data/lib/shopify_api/rest/resources/2023_01/customer_saved_search.rb +7 -3
  274. data/lib/shopify_api/rest/resources/2023_01/deprecated_api_call.rb +7 -3
  275. data/lib/shopify_api/rest/resources/2023_01/discount_code.rb +7 -3
  276. data/lib/shopify_api/rest/resources/2023_01/dispute.rb +7 -3
  277. data/lib/shopify_api/rest/resources/2023_01/dispute_evidence.rb +7 -3
  278. data/lib/shopify_api/rest/resources/2023_01/dispute_file_upload.rb +7 -3
  279. data/lib/shopify_api/rest/resources/2023_01/draft_order.rb +7 -3
  280. data/lib/shopify_api/rest/resources/2023_01/event.rb +7 -3
  281. data/lib/shopify_api/rest/resources/2023_01/fulfillment.rb +7 -3
  282. data/lib/shopify_api/rest/resources/2023_01/fulfillment_event.rb +7 -3
  283. data/lib/shopify_api/rest/resources/2023_01/fulfillment_order.rb +12 -6
  284. data/lib/shopify_api/rest/resources/2023_01/fulfillment_request.rb +17 -3
  285. data/lib/shopify_api/rest/resources/2023_01/fulfillment_service.rb +7 -3
  286. data/lib/shopify_api/rest/resources/2023_01/gift_card.rb +7 -3
  287. data/lib/shopify_api/rest/resources/2023_01/gift_card_adjustment.rb +7 -3
  288. data/lib/shopify_api/rest/resources/2023_01/image.rb +7 -3
  289. data/lib/shopify_api/rest/resources/2023_01/inventory_item.rb +7 -3
  290. data/lib/shopify_api/rest/resources/2023_01/inventory_level.rb +7 -3
  291. data/lib/shopify_api/rest/resources/2023_01/location.rb +7 -3
  292. data/lib/shopify_api/rest/resources/2023_01/locations_for_move.rb +7 -3
  293. data/lib/shopify_api/rest/resources/2023_01/marketing_event.rb +7 -3
  294. data/lib/shopify_api/rest/resources/2023_01/metafield.rb +7 -3
  295. data/lib/shopify_api/rest/resources/2023_01/mobile_platform_application.rb +7 -3
  296. data/lib/shopify_api/rest/resources/2023_01/order.rb +10 -3
  297. data/lib/shopify_api/rest/resources/2023_01/order_risk.rb +12 -6
  298. data/lib/shopify_api/rest/resources/2023_01/page.rb +7 -3
  299. data/lib/shopify_api/rest/resources/2023_01/payment.rb +7 -3
  300. data/lib/shopify_api/rest/resources/2023_01/payment_gateway.rb +7 -3
  301. data/lib/shopify_api/rest/resources/2023_01/payment_transaction.rb +12 -5
  302. data/lib/shopify_api/rest/resources/2023_01/payout.rb +7 -3
  303. data/lib/shopify_api/rest/resources/2023_01/policy.rb +7 -3
  304. data/lib/shopify_api/rest/resources/2023_01/price_rule.rb +7 -3
  305. data/lib/shopify_api/rest/resources/2023_01/product.rb +7 -3
  306. data/lib/shopify_api/rest/resources/2023_01/product_listing.rb +7 -3
  307. data/lib/shopify_api/rest/resources/2023_01/product_resource_feedback.rb +7 -3
  308. data/lib/shopify_api/rest/resources/2023_01/province.rb +7 -3
  309. data/lib/shopify_api/rest/resources/2023_01/recurring_application_charge.rb +7 -3
  310. data/lib/shopify_api/rest/resources/2023_01/redirect.rb +7 -3
  311. data/lib/shopify_api/rest/resources/2023_01/refund.rb +7 -3
  312. data/lib/shopify_api/rest/resources/2023_01/report.rb +7 -3
  313. data/lib/shopify_api/rest/resources/2023_01/resource_feedback.rb +7 -3
  314. data/lib/shopify_api/rest/resources/2023_01/script_tag.rb +7 -3
  315. data/lib/shopify_api/rest/resources/2023_01/shipping_zone.rb +7 -3
  316. data/lib/shopify_api/rest/resources/2023_01/shop.rb +7 -6
  317. data/lib/shopify_api/rest/resources/2023_01/smart_collection.rb +7 -3
  318. data/lib/shopify_api/rest/resources/2023_01/storefront_access_token.rb +7 -3
  319. data/lib/shopify_api/rest/resources/2023_01/tender_transaction.rb +7 -3
  320. data/lib/shopify_api/rest/resources/2023_01/theme.rb +7 -3
  321. data/lib/shopify_api/rest/resources/2023_01/transaction.rb +7 -3
  322. data/lib/shopify_api/rest/resources/2023_01/usage_charge.rb +7 -3
  323. data/lib/shopify_api/rest/resources/2023_01/user.rb +7 -3
  324. data/lib/shopify_api/rest/resources/2023_01/variant.rb +8 -8
  325. data/lib/shopify_api/rest/resources/2023_01/webhook.rb +7 -3
  326. data/lib/shopify_api/rest/resources/2023_04/abandoned_checkout.rb +7 -3
  327. data/lib/shopify_api/rest/resources/2023_04/access_scope.rb +7 -3
  328. data/lib/shopify_api/rest/resources/2023_04/apple_pay_certificate.rb +7 -3
  329. data/lib/shopify_api/rest/resources/2023_04/application_charge.rb +7 -3
  330. data/lib/shopify_api/rest/resources/2023_04/application_credit.rb +7 -3
  331. data/lib/shopify_api/rest/resources/2023_04/article.rb +7 -3
  332. data/lib/shopify_api/rest/resources/2023_04/asset.rb +7 -3
  333. data/lib/shopify_api/rest/resources/2023_04/assigned_fulfillment_order.rb +12 -6
  334. data/lib/shopify_api/rest/resources/2023_04/balance.rb +11 -3
  335. data/lib/shopify_api/rest/resources/2023_04/blog.rb +7 -3
  336. data/lib/shopify_api/rest/resources/2023_04/cancellation_request.rb +7 -3
  337. data/lib/shopify_api/rest/resources/2023_04/carrier_service.rb +7 -3
  338. data/lib/shopify_api/rest/resources/2023_04/checkout.rb +7 -3
  339. data/lib/shopify_api/rest/resources/2023_04/collect.rb +7 -3
  340. data/lib/shopify_api/rest/resources/2023_04/collection.rb +7 -3
  341. data/lib/shopify_api/rest/resources/2023_04/collection_listing.rb +7 -3
  342. data/lib/shopify_api/rest/resources/2023_04/comment.rb +7 -3
  343. data/lib/shopify_api/rest/resources/2023_04/country.rb +7 -3
  344. data/lib/shopify_api/rest/resources/2023_04/currency.rb +7 -3
  345. data/lib/shopify_api/rest/resources/2023_04/custom_collection.rb +7 -3
  346. data/lib/shopify_api/rest/resources/2023_04/customer.rb +7 -3
  347. data/lib/shopify_api/rest/resources/2023_04/customer_address.rb +17 -3
  348. data/lib/shopify_api/rest/resources/2023_04/customer_saved_search.rb +7 -3
  349. data/lib/shopify_api/rest/resources/2023_04/deprecated_api_call.rb +7 -3
  350. data/lib/shopify_api/rest/resources/2023_04/discount_code.rb +7 -3
  351. data/lib/shopify_api/rest/resources/2023_04/dispute.rb +7 -3
  352. data/lib/shopify_api/rest/resources/2023_04/dispute_evidence.rb +7 -3
  353. data/lib/shopify_api/rest/resources/2023_04/dispute_file_upload.rb +7 -3
  354. data/lib/shopify_api/rest/resources/2023_04/draft_order.rb +7 -3
  355. data/lib/shopify_api/rest/resources/2023_04/event.rb +7 -3
  356. data/lib/shopify_api/rest/resources/2023_04/fulfillment.rb +7 -3
  357. data/lib/shopify_api/rest/resources/2023_04/fulfillment_event.rb +7 -3
  358. data/lib/shopify_api/rest/resources/2023_04/fulfillment_order.rb +12 -6
  359. data/lib/shopify_api/rest/resources/2023_04/fulfillment_request.rb +17 -3
  360. data/lib/shopify_api/rest/resources/2023_04/fulfillment_service.rb +7 -3
  361. data/lib/shopify_api/rest/resources/2023_04/gift_card.rb +7 -3
  362. data/lib/shopify_api/rest/resources/2023_04/gift_card_adjustment.rb +7 -3
  363. data/lib/shopify_api/rest/resources/2023_04/image.rb +7 -3
  364. data/lib/shopify_api/rest/resources/2023_04/inventory_item.rb +7 -3
  365. data/lib/shopify_api/rest/resources/2023_04/inventory_level.rb +7 -3
  366. data/lib/shopify_api/rest/resources/2023_04/location.rb +7 -3
  367. data/lib/shopify_api/rest/resources/2023_04/locations_for_move.rb +7 -3
  368. data/lib/shopify_api/rest/resources/2023_04/marketing_event.rb +7 -3
  369. data/lib/shopify_api/rest/resources/2023_04/metafield.rb +7 -3
  370. data/lib/shopify_api/rest/resources/2023_04/mobile_platform_application.rb +7 -3
  371. data/lib/shopify_api/rest/resources/2023_04/order.rb +10 -9
  372. data/lib/shopify_api/rest/resources/2023_04/order_risk.rb +12 -6
  373. data/lib/shopify_api/rest/resources/2023_04/page.rb +7 -3
  374. data/lib/shopify_api/rest/resources/2023_04/payment.rb +7 -3
  375. data/lib/shopify_api/rest/resources/2023_04/payment_gateway.rb +7 -3
  376. data/lib/shopify_api/rest/resources/2023_04/payment_transaction.rb +12 -5
  377. data/lib/shopify_api/rest/resources/2023_04/payout.rb +7 -3
  378. data/lib/shopify_api/rest/resources/2023_04/policy.rb +7 -3
  379. data/lib/shopify_api/rest/resources/2023_04/price_rule.rb +7 -3
  380. data/lib/shopify_api/rest/resources/2023_04/product.rb +7 -3
  381. data/lib/shopify_api/rest/resources/2023_04/product_listing.rb +7 -3
  382. data/lib/shopify_api/rest/resources/2023_04/product_resource_feedback.rb +7 -3
  383. data/lib/shopify_api/rest/resources/2023_04/province.rb +7 -3
  384. data/lib/shopify_api/rest/resources/2023_04/recurring_application_charge.rb +7 -3
  385. data/lib/shopify_api/rest/resources/2023_04/redirect.rb +7 -3
  386. data/lib/shopify_api/rest/resources/2023_04/refund.rb +7 -3
  387. data/lib/shopify_api/rest/resources/2023_04/report.rb +7 -3
  388. data/lib/shopify_api/rest/resources/2023_04/resource_feedback.rb +7 -3
  389. data/lib/shopify_api/rest/resources/2023_04/script_tag.rb +7 -3
  390. data/lib/shopify_api/rest/resources/2023_04/shipping_zone.rb +7 -3
  391. data/lib/shopify_api/rest/resources/2023_04/shop.rb +7 -6
  392. data/lib/shopify_api/rest/resources/2023_04/smart_collection.rb +7 -3
  393. data/lib/shopify_api/rest/resources/2023_04/storefront_access_token.rb +7 -3
  394. data/lib/shopify_api/rest/resources/2023_04/tender_transaction.rb +7 -3
  395. data/lib/shopify_api/rest/resources/2023_04/theme.rb +7 -3
  396. data/lib/shopify_api/rest/resources/2023_04/transaction.rb +7 -3
  397. data/lib/shopify_api/rest/resources/2023_04/usage_charge.rb +7 -3
  398. data/lib/shopify_api/rest/resources/2023_04/user.rb +7 -3
  399. data/lib/shopify_api/rest/resources/2023_04/variant.rb +8 -8
  400. data/lib/shopify_api/rest/resources/2023_04/webhook.rb +7 -3
  401. data/lib/shopify_api/rest/resources/2023_07/abandoned_checkout.rb +7 -3
  402. data/lib/shopify_api/rest/resources/2023_07/access_scope.rb +7 -3
  403. data/lib/shopify_api/rest/resources/2023_07/apple_pay_certificate.rb +7 -3
  404. data/lib/shopify_api/rest/resources/2023_07/application_charge.rb +7 -3
  405. data/lib/shopify_api/rest/resources/2023_07/application_credit.rb +7 -3
  406. data/lib/shopify_api/rest/resources/2023_07/article.rb +7 -3
  407. data/lib/shopify_api/rest/resources/2023_07/asset.rb +7 -3
  408. data/lib/shopify_api/rest/resources/2023_07/assigned_fulfillment_order.rb +12 -6
  409. data/lib/shopify_api/rest/resources/2023_07/balance.rb +11 -3
  410. data/lib/shopify_api/rest/resources/2023_07/blog.rb +7 -3
  411. data/lib/shopify_api/rest/resources/2023_07/cancellation_request.rb +7 -3
  412. data/lib/shopify_api/rest/resources/2023_07/carrier_service.rb +7 -3
  413. data/lib/shopify_api/rest/resources/2023_07/checkout.rb +7 -3
  414. data/lib/shopify_api/rest/resources/2023_07/collect.rb +7 -3
  415. data/lib/shopify_api/rest/resources/2023_07/collection.rb +7 -3
  416. data/lib/shopify_api/rest/resources/2023_07/collection_listing.rb +7 -3
  417. data/lib/shopify_api/rest/resources/2023_07/comment.rb +7 -3
  418. data/lib/shopify_api/rest/resources/2023_07/country.rb +7 -3
  419. data/lib/shopify_api/rest/resources/2023_07/currency.rb +7 -3
  420. data/lib/shopify_api/rest/resources/2023_07/custom_collection.rb +7 -3
  421. data/lib/shopify_api/rest/resources/2023_07/customer.rb +7 -3
  422. data/lib/shopify_api/rest/resources/2023_07/customer_address.rb +17 -3
  423. data/lib/shopify_api/rest/resources/2023_07/customer_saved_search.rb +7 -3
  424. data/lib/shopify_api/rest/resources/2023_07/deprecated_api_call.rb +7 -3
  425. data/lib/shopify_api/rest/resources/2023_07/discount_code.rb +7 -3
  426. data/lib/shopify_api/rest/resources/2023_07/dispute.rb +7 -3
  427. data/lib/shopify_api/rest/resources/2023_07/dispute_evidence.rb +7 -3
  428. data/lib/shopify_api/rest/resources/2023_07/dispute_file_upload.rb +7 -3
  429. data/lib/shopify_api/rest/resources/2023_07/draft_order.rb +7 -3
  430. data/lib/shopify_api/rest/resources/2023_07/event.rb +7 -3
  431. data/lib/shopify_api/rest/resources/2023_07/fulfillment.rb +7 -3
  432. data/lib/shopify_api/rest/resources/2023_07/fulfillment_event.rb +7 -3
  433. data/lib/shopify_api/rest/resources/2023_07/fulfillment_order.rb +12 -6
  434. data/lib/shopify_api/rest/resources/2023_07/fulfillment_request.rb +17 -3
  435. data/lib/shopify_api/rest/resources/2023_07/fulfillment_service.rb +7 -3
  436. data/lib/shopify_api/rest/resources/2023_07/gift_card.rb +7 -3
  437. data/lib/shopify_api/rest/resources/2023_07/gift_card_adjustment.rb +7 -3
  438. data/lib/shopify_api/rest/resources/2023_07/image.rb +7 -3
  439. data/lib/shopify_api/rest/resources/2023_07/inventory_item.rb +7 -3
  440. data/lib/shopify_api/rest/resources/2023_07/inventory_level.rb +7 -3
  441. data/lib/shopify_api/rest/resources/2023_07/location.rb +7 -3
  442. data/lib/shopify_api/rest/resources/2023_07/locations_for_move.rb +7 -3
  443. data/lib/shopify_api/rest/resources/2023_07/marketing_event.rb +7 -3
  444. data/lib/shopify_api/rest/resources/2023_07/metafield.rb +7 -3
  445. data/lib/shopify_api/rest/resources/2023_07/mobile_platform_application.rb +7 -3
  446. data/lib/shopify_api/rest/resources/2023_07/order.rb +10 -9
  447. data/lib/shopify_api/rest/resources/2023_07/order_risk.rb +12 -6
  448. data/lib/shopify_api/rest/resources/2023_07/page.rb +7 -3
  449. data/lib/shopify_api/rest/resources/2023_07/payment.rb +7 -3
  450. data/lib/shopify_api/rest/resources/2023_07/payment_gateway.rb +7 -3
  451. data/lib/shopify_api/rest/resources/2023_07/payment_transaction.rb +12 -5
  452. data/lib/shopify_api/rest/resources/2023_07/payout.rb +7 -3
  453. data/lib/shopify_api/rest/resources/2023_07/policy.rb +7 -3
  454. data/lib/shopify_api/rest/resources/2023_07/price_rule.rb +7 -3
  455. data/lib/shopify_api/rest/resources/2023_07/product.rb +7 -3
  456. data/lib/shopify_api/rest/resources/2023_07/product_listing.rb +7 -3
  457. data/lib/shopify_api/rest/resources/2023_07/product_resource_feedback.rb +7 -3
  458. data/lib/shopify_api/rest/resources/2023_07/province.rb +7 -3
  459. data/lib/shopify_api/rest/resources/2023_07/recurring_application_charge.rb +7 -3
  460. data/lib/shopify_api/rest/resources/2023_07/redirect.rb +7 -3
  461. data/lib/shopify_api/rest/resources/2023_07/refund.rb +7 -3
  462. data/lib/shopify_api/rest/resources/2023_07/report.rb +125 -0
  463. data/lib/shopify_api/rest/resources/2023_07/resource_feedback.rb +7 -3
  464. data/lib/shopify_api/rest/resources/2023_07/script_tag.rb +7 -3
  465. data/lib/shopify_api/rest/resources/2023_07/shipping_zone.rb +7 -3
  466. data/lib/shopify_api/rest/resources/2023_07/shop.rb +7 -6
  467. data/lib/shopify_api/rest/resources/2023_07/smart_collection.rb +7 -3
  468. data/lib/shopify_api/rest/resources/2023_07/storefront_access_token.rb +7 -3
  469. data/lib/shopify_api/rest/resources/2023_07/tender_transaction.rb +7 -3
  470. data/lib/shopify_api/rest/resources/2023_07/theme.rb +7 -3
  471. data/lib/shopify_api/rest/resources/2023_07/transaction.rb +7 -3
  472. data/lib/shopify_api/rest/resources/2023_07/usage_charge.rb +7 -3
  473. data/lib/shopify_api/rest/resources/2023_07/user.rb +7 -3
  474. data/lib/shopify_api/rest/resources/2023_07/variant.rb +8 -8
  475. data/lib/shopify_api/rest/resources/2023_07/webhook.rb +7 -3
  476. data/lib/shopify_api/rest/resources/2023_10/abandoned_checkout.rb +194 -0
  477. data/lib/shopify_api/rest/resources/2023_10/access_scope.rb +62 -0
  478. data/lib/shopify_api/rest/resources/2023_10/apple_pay_certificate.rb +109 -0
  479. data/lib/shopify_api/rest/resources/2023_10/application_charge.rb +113 -0
  480. data/lib/shopify_api/rest/resources/2023_10/application_credit.rb +95 -0
  481. data/lib/shopify_api/rest/resources/2023_10/article.rb +269 -0
  482. data/lib/shopify_api/rest/resources/2023_10/asset.rb +122 -0
  483. data/lib/shopify_api/rest/resources/2023_10/assigned_fulfillment_order.rb +92 -0
  484. data/lib/shopify_api/rest/resources/2023_10/balance.rb +58 -0
  485. data/lib/shopify_api/rest/resources/2023_10/blog.rb +166 -0
  486. data/lib/shopify_api/rest/resources/2023_10/cancellation_request.rb +87 -0
  487. data/lib/shopify_api/rest/resources/2023_10/carrier_service.rb +120 -0
  488. data/lib/shopify_api/rest/resources/2023_10/checkout.rb +213 -0
  489. data/lib/shopify_api/rest/resources/{2022_10/customer_saved_search.rb → 2023_10/collect.rb} +29 -52
  490. data/lib/shopify_api/rest/resources/2023_10/collection.rb +114 -0
  491. data/lib/shopify_api/rest/resources/2023_10/collection_listing.rb +159 -0
  492. data/lib/shopify_api/rest/resources/2023_10/comment.rb +287 -0
  493. data/lib/shopify_api/rest/resources/2023_10/country.rb +141 -0
  494. data/lib/shopify_api/rest/resources/2023_10/currency.rb +61 -0
  495. data/lib/shopify_api/rest/resources/2023_10/custom_collection.rb +191 -0
  496. data/lib/shopify_api/rest/resources/2023_10/customer.rb +333 -0
  497. data/lib/shopify_api/rest/resources/2023_10/customer_address.rb +215 -0
  498. data/lib/shopify_api/rest/resources/2023_10/deprecated_api_call.rb +61 -0
  499. data/lib/shopify_api/rest/resources/2023_10/discount_code.rb +226 -0
  500. data/lib/shopify_api/rest/resources/2023_10/dispute.rb +115 -0
  501. data/lib/shopify_api/rest/resources/2023_10/dispute_evidence.rb +121 -0
  502. data/lib/shopify_api/rest/resources/2023_10/dispute_file_upload.rb +85 -0
  503. data/lib/shopify_api/rest/resources/2023_10/draft_order.rb +279 -0
  504. data/lib/shopify_api/rest/resources/2023_10/event.rb +152 -0
  505. data/lib/shopify_api/rest/resources/2023_10/fulfillment.rb +235 -0
  506. data/lib/shopify_api/rest/resources/2023_10/fulfillment_event.rb +170 -0
  507. data/lib/shopify_api/rest/resources/2023_10/fulfillment_order.rb +318 -0
  508. data/lib/shopify_api/rest/resources/2023_10/fulfillment_request.rb +101 -0
  509. data/lib/shopify_api/rest/resources/2023_10/fulfillment_service.rb +134 -0
  510. data/lib/shopify_api/rest/resources/2023_10/gift_card.rb +222 -0
  511. data/lib/shopify_api/rest/resources/2023_10/gift_card_adjustment.rb +122 -0
  512. data/lib/shopify_api/rest/resources/2023_10/image.rb +161 -0
  513. data/lib/shopify_api/rest/resources/2023_10/inventory_item.rb +112 -0
  514. data/lib/shopify_api/rest/resources/2023_10/inventory_level.rb +183 -0
  515. data/lib/shopify_api/rest/resources/2023_10/location.rb +171 -0
  516. data/lib/shopify_api/rest/resources/2023_10/locations_for_move.rb +60 -0
  517. data/lib/shopify_api/rest/resources/2023_10/marketing_event.rb +213 -0
  518. data/lib/shopify_api/rest/resources/2023_10/metafield.rb +348 -0
  519. data/lib/shopify_api/rest/resources/2023_10/mobile_platform_application.rb +114 -0
  520. data/lib/shopify_api/rest/resources/2023_10/order.rb +489 -0
  521. data/lib/shopify_api/rest/resources/2023_10/order_risk.rb +148 -0
  522. data/lib/shopify_api/rest/resources/2023_10/page.rb +198 -0
  523. data/lib/shopify_api/rest/resources/2023_10/payment.rb +144 -0
  524. data/lib/shopify_api/rest/resources/2023_10/payment_gateway.rb +147 -0
  525. data/lib/shopify_api/rest/resources/2023_10/payment_transaction.rb +114 -0
  526. data/lib/shopify_api/rest/resources/2023_10/payout.rb +101 -0
  527. data/lib/shopify_api/rest/resources/2023_10/policy.rb +73 -0
  528. data/lib/shopify_api/rest/resources/2023_10/price_rule.rb +227 -0
  529. data/lib/shopify_api/rest/resources/2023_10/product.rb +227 -0
  530. data/lib/shopify_api/rest/resources/2023_10/product_listing.rb +200 -0
  531. data/lib/shopify_api/rest/resources/2023_10/product_resource_feedback.rb +92 -0
  532. data/lib/shopify_api/rest/resources/2023_10/province.rb +136 -0
  533. data/lib/shopify_api/rest/resources/2023_10/recurring_application_charge.rb +176 -0
  534. data/lib/shopify_api/rest/resources/2023_10/redirect.rb +143 -0
  535. data/lib/shopify_api/rest/resources/2023_10/refund.rb +155 -0
  536. data/lib/shopify_api/rest/resources/2023_10/report.rb +125 -0
  537. data/lib/shopify_api/rest/resources/2023_10/resource_feedback.rb +77 -0
  538. data/lib/shopify_api/rest/resources/2023_10/script_tag.rb +159 -0
  539. data/lib/shopify_api/rest/resources/2023_10/shipping_zone.rb +87 -0
  540. data/lib/shopify_api/rest/resources/2023_10/shop.rb +222 -0
  541. data/lib/shopify_api/rest/resources/2023_10/smart_collection.rb +220 -0
  542. data/lib/shopify_api/rest/resources/2023_10/storefront_access_token.rb +91 -0
  543. data/lib/shopify_api/rest/resources/2023_10/tender_transaction.rb +97 -0
  544. data/lib/shopify_api/rest/resources/2023_10/theme.rb +127 -0
  545. data/lib/shopify_api/rest/resources/2023_10/transaction.rb +188 -0
  546. data/lib/shopify_api/rest/resources/2023_10/usage_charge.rb +106 -0
  547. data/lib/shopify_api/rest/resources/2023_10/user.rb +142 -0
  548. data/lib/shopify_api/rest/resources/2023_10/variant.rb +212 -0
  549. data/lib/shopify_api/rest/resources/2023_10/webhook.rb +172 -0
  550. data/lib/shopify_api/rest/resources/2024_01/abandoned_checkout.rb +194 -0
  551. data/lib/shopify_api/rest/resources/2024_01/access_scope.rb +62 -0
  552. data/lib/shopify_api/rest/resources/2024_01/apple_pay_certificate.rb +109 -0
  553. data/lib/shopify_api/rest/resources/2024_01/application_charge.rb +113 -0
  554. data/lib/shopify_api/rest/resources/2024_01/application_credit.rb +95 -0
  555. data/lib/shopify_api/rest/resources/2024_01/article.rb +269 -0
  556. data/lib/shopify_api/rest/resources/2024_01/asset.rb +122 -0
  557. data/lib/shopify_api/rest/resources/2024_01/assigned_fulfillment_order.rb +92 -0
  558. data/lib/shopify_api/rest/resources/2024_01/balance.rb +58 -0
  559. data/lib/shopify_api/rest/resources/2024_01/blog.rb +166 -0
  560. data/lib/shopify_api/rest/resources/2024_01/cancellation_request.rb +87 -0
  561. data/lib/shopify_api/rest/resources/2024_01/carrier_service.rb +120 -0
  562. data/lib/shopify_api/rest/resources/2024_01/checkout.rb +213 -0
  563. data/lib/shopify_api/rest/resources/{2022_07/customer_saved_search.rb → 2024_01/collect.rb} +29 -52
  564. data/lib/shopify_api/rest/resources/2024_01/collection.rb +114 -0
  565. data/lib/shopify_api/rest/resources/2024_01/collection_listing.rb +159 -0
  566. data/lib/shopify_api/rest/resources/2024_01/comment.rb +287 -0
  567. data/lib/shopify_api/rest/resources/2024_01/country.rb +141 -0
  568. data/lib/shopify_api/rest/resources/2024_01/currency.rb +61 -0
  569. data/lib/shopify_api/rest/resources/2024_01/custom_collection.rb +191 -0
  570. data/lib/shopify_api/rest/resources/2024_01/customer.rb +333 -0
  571. data/lib/shopify_api/rest/resources/2024_01/customer_address.rb +215 -0
  572. data/lib/shopify_api/rest/resources/2024_01/deprecated_api_call.rb +61 -0
  573. data/lib/shopify_api/rest/resources/2024_01/discount_code.rb +226 -0
  574. data/lib/shopify_api/rest/resources/2024_01/dispute.rb +115 -0
  575. data/lib/shopify_api/rest/resources/2024_01/dispute_evidence.rb +121 -0
  576. data/lib/shopify_api/rest/resources/2024_01/dispute_file_upload.rb +85 -0
  577. data/lib/shopify_api/rest/resources/2024_01/draft_order.rb +279 -0
  578. data/lib/shopify_api/rest/resources/2024_01/event.rb +152 -0
  579. data/lib/shopify_api/rest/resources/2024_01/fulfillment.rb +235 -0
  580. data/lib/shopify_api/rest/resources/2024_01/fulfillment_event.rb +170 -0
  581. data/lib/shopify_api/rest/resources/2024_01/fulfillment_order.rb +326 -0
  582. data/lib/shopify_api/rest/resources/2024_01/fulfillment_request.rb +101 -0
  583. data/lib/shopify_api/rest/resources/2024_01/fulfillment_service.rb +134 -0
  584. data/lib/shopify_api/rest/resources/2024_01/gift_card.rb +222 -0
  585. data/lib/shopify_api/rest/resources/2024_01/gift_card_adjustment.rb +122 -0
  586. data/lib/shopify_api/rest/resources/2024_01/image.rb +161 -0
  587. data/lib/shopify_api/rest/resources/2024_01/inventory_item.rb +112 -0
  588. data/lib/shopify_api/rest/resources/2024_01/inventory_level.rb +183 -0
  589. data/lib/shopify_api/rest/resources/2024_01/location.rb +171 -0
  590. data/lib/shopify_api/rest/resources/2024_01/locations_for_move.rb +60 -0
  591. data/lib/shopify_api/rest/resources/2024_01/marketing_event.rb +213 -0
  592. data/lib/shopify_api/rest/resources/2024_01/metafield.rb +348 -0
  593. data/lib/shopify_api/rest/resources/2024_01/mobile_platform_application.rb +114 -0
  594. data/lib/shopify_api/rest/resources/2024_01/order.rb +489 -0
  595. data/lib/shopify_api/rest/resources/2024_01/order_risk.rb +148 -0
  596. data/lib/shopify_api/rest/resources/2024_01/page.rb +198 -0
  597. data/lib/shopify_api/rest/resources/2024_01/payment.rb +144 -0
  598. data/lib/shopify_api/rest/resources/2024_01/payment_gateway.rb +147 -0
  599. data/lib/shopify_api/rest/resources/2024_01/payment_transaction.rb +114 -0
  600. data/lib/shopify_api/rest/resources/2024_01/payout.rb +101 -0
  601. data/lib/shopify_api/rest/resources/2024_01/policy.rb +73 -0
  602. data/lib/shopify_api/rest/resources/2024_01/price_rule.rb +227 -0
  603. data/lib/shopify_api/rest/resources/2024_01/product.rb +227 -0
  604. data/lib/shopify_api/rest/resources/2024_01/product_listing.rb +200 -0
  605. data/lib/shopify_api/rest/resources/2024_01/product_resource_feedback.rb +92 -0
  606. data/lib/shopify_api/rest/resources/2024_01/province.rb +136 -0
  607. data/lib/shopify_api/rest/resources/2024_01/recurring_application_charge.rb +176 -0
  608. data/lib/shopify_api/rest/resources/2024_01/redirect.rb +143 -0
  609. data/lib/shopify_api/rest/resources/2024_01/refund.rb +155 -0
  610. data/lib/shopify_api/rest/resources/2024_01/report.rb +125 -0
  611. data/lib/shopify_api/rest/resources/2024_01/resource_feedback.rb +77 -0
  612. data/lib/shopify_api/rest/resources/2024_01/script_tag.rb +159 -0
  613. data/lib/shopify_api/rest/resources/2024_01/shipping_zone.rb +87 -0
  614. data/lib/shopify_api/rest/resources/2024_01/shop.rb +222 -0
  615. data/lib/shopify_api/rest/resources/2024_01/smart_collection.rb +220 -0
  616. data/lib/shopify_api/rest/resources/2024_01/storefront_access_token.rb +91 -0
  617. data/lib/shopify_api/rest/resources/2024_01/tender_transaction.rb +97 -0
  618. data/lib/shopify_api/rest/resources/2024_01/theme.rb +127 -0
  619. data/lib/shopify_api/rest/resources/2024_01/transaction.rb +188 -0
  620. data/lib/shopify_api/rest/resources/2024_01/usage_charge.rb +106 -0
  621. data/lib/shopify_api/rest/resources/2024_01/user.rb +142 -0
  622. data/lib/shopify_api/rest/resources/2024_01/variant.rb +212 -0
  623. data/lib/shopify_api/rest/resources/2024_01/webhook.rb +172 -0
  624. data/lib/shopify_api/utils/hmac_validator.rb +1 -1
  625. data/lib/shopify_api/version.rb +1 -1
  626. data/lib/shopify_api/webhooks/registration.rb +19 -4
  627. data/lib/shopify_api/webhooks/registrations/event_bridge.rb +1 -1
  628. data/lib/shopify_api/webhooks/registrations/http.rb +1 -1
  629. data/lib/shopify_api/webhooks/registrations/pub_sub.rb +2 -1
  630. data/lib/shopify_api/webhooks/registry.rb +36 -5
  631. data/shopify_api.gemspec +0 -1
  632. metadata +155 -22
  633. data/.github/workflows/stale.yml +0 -43
  634. data/docs/issues.md +0 -39
  635. data/docs/usage/session_storage.md +0 -46
data/docs/usage/rest.md CHANGED
@@ -1,10 +1,153 @@
1
1
  # Make a REST API call
2
2
 
3
- Once OAuth is complete, we can use the `ShopifyAPI::Clients::Rest::Admin` client to make an API call to the Shopify Admin API. To do this, you can create an instance of `ShopifyAPI::Clients::Rest::Admin` using the current session to make requests to the Admin API.
3
+ Once OAuth is complete, we can use `ShopifyAPI`'s REST library to make authenticated API calls to the Shopify Admin API.
4
+ #### Required Session
5
+ Every API request requires a valid
6
+ [ShopifyAPI::Auth::Session](https://github.com/Shopify/shopify-api-ruby/blob/main/lib/shopify_api/auth/session.rb).
7
+
8
+ To instantiate a session, we recommend you either use the `shopify_app` if working in Rails, or refer to our OAuth docs on constructing a session:
9
+ - ["Custom Apps"](https://github.com/Shopify/shopify-api-ruby/blob/main/docs/usage/custom_apps.md) - documentation on how to create Session from a custom app API token.
10
+ - ["Performing OAuth"](https://github.com/Shopify/shopify-api-ruby/blob/main/docs/usage/oauth.md) - documentation on how to create new sessions
11
+ - [[ShopifyApp] - "Session"](https://github.com/Shopify/shopify_app/blob/main/docs/shopify_app/sessions.md) - documentation on session handling if you're using the [`ShopifyApp`](https://github.com/Shopify/shopify_app) gem.
12
+
13
+ #### There are 2 methods you can use to make REST API calls to Shopify:
14
+ - [Using REST Resources](#using-rest-resources)
15
+ - Resource classes with similar syntax as `ActiveResource`, and follows our REST convention. Example:
16
+ ``` ruby
17
+ # Update product title
18
+ product = ShopifyAPI::Product.find(id: <product_id>)
19
+ product.title = "My awesome product"
20
+ product.save!
21
+ ```
22
+
23
+ - [Using REST Admin Client](#using-rest-admin-client)
24
+ - More manual input method to make the API call. Example:
25
+ ```ruby
26
+ # Create a new client.
27
+ rest_client = ShopifyAPI::Clients::Rest::Admin.new
28
+
29
+ # Update product title
30
+ body = {
31
+ product: {
32
+ title: "My cool product"
33
+ }
34
+ }
35
+
36
+ # Use `client.put` to send your request to the specified Shopify Admin REST API endpoint.
37
+ rest_client.put(path: "products/<id>.json", body: body)
38
+ ```
39
+
40
+ ## Using REST Resources
41
+ We provide a templated class library to access REST resources similar to `ActiveResource`. Format of the methods closely resemble our [REST API schema](https://shopify.dev/docs/api/admin-rest).
42
+
43
+ The version of REST resource that's loaded and used is set from [`ShopifyAPI::Context.setup`](https://github.com/Shopify/shopify-api-ruby/blob/main/README.md#setup-shopify-context)
44
+
45
+ ### Instantiation
46
+ Create an instance of the REST resource you'd like to use and optionally provide the following parameters.
47
+ #### Constructor parameters
48
+ | Parameter | Type | Notes |
49
+ | ----------|------|-------|
50
+ | `session` | `ShopifyAPI::Auth::Session` | Default value is `nil`. <br><br>When `nil` is passed in, active session information is inferred from `ShopifyAPI::Context.active_session`. <br>To set active session, use `ShopifyAPI::Context.activate_session`. <br><br>This is handled automatically behind the scenes if you use ShopifyApp's [session controllers](https://github.com/Shopify/shopify_app/blob/main/docs/shopify_app/sessions.md). |
51
+ | `from_hash` | `Hash` | Default value is `nil`. Sets the resource properties to the values provided from the hash. |
52
+
53
+ Examples:
54
+
55
+ ```ruby
56
+ # To construct an Orders object using default session
57
+ # This creates a new order object with properties provided from the hash
58
+ order = ShopifyAPI::Orders.new(from_hash: {property: value})
59
+ order.save!
60
+ ```
61
+
62
+ ### Methods
63
+ Typical methods provided for each resources are:
64
+ - `find`
65
+ - `delete`
66
+ - `all`
67
+ - `count`
68
+
69
+ Full list of methods can be found on each of the resource class.
70
+ - Path:
71
+ - https://github.com/Shopify/shopify-api-ruby/blob/main/lib/shopify_api/rest/resources/#{version}/#{resource}.rb
72
+ - Example for `Order` resource on `2023-04` version:
73
+ - https://github.com/Shopify/shopify-api-ruby/blob/main/lib/shopify_api/rest/resources/2023_04/order.rb
74
+
75
+ ### Usage Examples
76
+ ⚠️ Reference documentation on [shopify.dev](https://shopify.dev/docs/api/admin-rest) contains more examples on how to use each REST Resources.
77
+
78
+ ```Ruby
79
+ # Find and update a customer email
80
+ customer = ShopifyAPI::Customer.find(id: customer_id)
81
+ customer.email = "steve-lastnameson@example.com"
82
+ customer.save!
83
+
84
+ # Create a new product from hash
85
+ product_properties = {
86
+ title: "My awesome product"
87
+ }
88
+ product = ShopifyAPI::Product.new(from_hash: product_properties)
89
+ product.save!
90
+
91
+ # Create a product manually
92
+ product = ShopifyAPI::Product.new
93
+ product.title = "Another one"
94
+ product.save!
95
+
96
+ # Get all orders
97
+ orders = ShopifyAPI::Orders.all
98
+
99
+ # Retrieve a specific fulfillment order
100
+ fulfillment_order_id = 123456789
101
+ fulfillment_order = ShopifyAPI::FulfillmentOrder.find(id: fulfillment_order_id)
102
+
103
+ # Remove an existing product image
104
+ product_id = 1234567
105
+ image_id = 1233211234567
106
+ ShopifyAPI::Image.delete(product_id: product_id, id: image_id)
107
+ ```
108
+
109
+ More examples can be found in each resource's documentation on [shopify.dev](https://shopify.dev/docs/api/admin-rest), e.g.:
110
+ - [Order](https://shopify.dev/docs/api/admin-rest/current/resources/order)
111
+ - [Product](https://shopify.dev/docs/api/admin-rest/current/resources/product)
112
+
113
+ ## Using REST Admin Client
4
114
 
5
- ## Methods
115
+ ### Instantiation
116
+ Create an instance of [`ShopifyAPI::Clients::Rest::Admin`](https://github.com/Shopify/shopify-api-ruby/blob/main/lib/shopify_api/clients/rest/admin.rb) using the current session to make requests to the Admin API.
117
+ #### Constructor parameters
118
+ | Parameter | Type | Notes |
119
+ | ----------|------|-------|
120
+ | `session` | `ShopifyAPI::Auth::Session` | Default value is `nil`. <br><br>When `nil` is passed in, active session information is inferred from `ShopifyAPI::Context.active_session`. <br>To set active session, use `ShopifyAPI::Context.activate_session`. <br><br>This is handled automatically behind the scenes if you use ShopifyApp's [session controllers](https://github.com/Shopify/shopify_app/blob/main/docs/shopify_app/sessions.md). |
121
+ | `api_version` | `String` | Default value is `nil`. When `nil` is passed in, api version is inferred from [`ShopifyAPI::Context.setup`](https://github.com/Shopify/shopify-api-ruby/blob/main/README.md#setup-shopify-context).|
6
122
 
7
- The Rest Admin client offers the 4 core request methods: `get`, `delete`, `post`, and `put`. These methods each take the parameters outlined in the table below. If the request is successful these methods will all return a `ShopifyAPI::Clients::HttpResponse` object, which has properties `code`, `headers`, and `body` otherwise an error will be raised describing what went wrong.
123
+ Examples:
124
+ ```ruby
125
+ # Create a default client with `ShopifyAPI::Context.api_version`
126
+ # and the active session from `ShopifyAPI::Context.active_session`
127
+ client = ShopifyAPI::Clients::Rest::Admin.new
128
+
129
+ # Create a client with a specific session "my_session"
130
+ client = ShopifyAPI::Clients::Rest::Admin.new(session: my_session)
131
+
132
+ # Create a client with active session from `ShopifyAPI::Context.active_session`
133
+ # and a specific api_version - "unstable"
134
+ client = ShopifyAPI::Clients::Rest::Admin.new(api_version: "unstable")
135
+
136
+ # Create a client with a specific session "my_session" and api_version "unstable"
137
+ client = ShopifyAPI::Clients::Rest::Admin.new(session: my_session, api_version: "unstable")
138
+ ```
139
+
140
+ ### Methods
141
+
142
+ The `ShopifyAPI::Clients::Rest::Admin` client offers the 4 core request methods:
143
+ - `get`
144
+ - `delete`
145
+ - `post`
146
+ - `put`
147
+
148
+ #### Input Parameters
149
+
150
+ Each method can take the parameters outlined in the table below.
8
151
 
9
152
  | Parameter | Type | Required in Methods | Default Value | Notes |
10
153
  | -------------- | -------------------------------------------------------- | :-----------------: | :-----------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -14,16 +157,40 @@ The Rest Admin client offers the 4 core request methods: `get`, `delete`, `post`
14
157
  | `extraHeaders` | `Hash(any(Symbol, String), any(String, Integer, Float))` | none | none | Any additional headers you want to send with your request |
15
158
  | `tries` | `Integer` | None | `1` | The maximum number of times to try the request _(must be >= 0)_ |
16
159
 
17
- **Note:** _These paramaters can still be used in all methods regardless of if they are required._
160
+ **Note:** _These parameters can still be used in all methods regardless of if they are required._
18
161
 
19
- ## Usage Examples:
162
+ #### Output
163
+ ##### Success
164
+ If the request is successful these methods will all return a [`ShopifyAPI::Clients::HttpResponse`](https://github.com/Shopify/shopify-api-ruby/blob/main/lib/shopify_api/clients/http_response.rb) object, which has the following methods:
165
+ | Methods | Type | Notes |
166
+ |---------|------|-------|
167
+ | `code` |`Integer`| HTTP Response code, e.g. `200`|
168
+ | `header` |`Hash{String, [String]}` | HTTP Response headers |
169
+ | `body` | `Hash{String, Untyped}` | HTTP Response body |
170
+ | `prev_page_info` | `String` | See [Pagination](#pagination)|
171
+ | `next_page_info` | `String` | See [Pagination](#pagination)|
20
172
 
21
- ### Perform a `GET` request:
173
+ ##### Failure
174
+ If the request has failed, an error will be raised describing what went wrong.
175
+ You can rescue [`ShopifyAPI::Errors::HttpResponseError`](https://github.com/Shopify/shopify-api-ruby/blob/main/lib/shopify_api/errors/http_response_error.rb)
176
+ and output error messages with `errors.full_messages`
177
+
178
+ See example:
22
179
 
23
180
  ```ruby
24
- # Load the current session to get the `accessToken`.
25
- session = ShopifyAPI::Utils::SessionUtils.load_current_session(headers, cookies, is_online)
181
+ client = ShopifyAPI::Clients::Rest::Admin.new(session: session)
182
+ response = client.get(path: "NOT-REAL")
183
+ some_function(response.body)
184
+ rescue ShopifyAPI::Errors::HttpResponseError => e
185
+ puts fulfillment.errors.full_messages
186
+ # {"errors"=>"Not Found"}
187
+ # If you report this error, please include this id: bce76672-40c6-4047-b598-46208ab076f0.
188
+ ```
189
+ ### Usage Examples
26
190
 
191
+ #### Perform a `GET` request
192
+
193
+ ```ruby
27
194
  # Create a new client.
28
195
  client = ShopifyAPI::Clients::Rest::Admin.new(session: session)
29
196
 
@@ -33,13 +200,11 @@ response = client.get(path: "products")
33
200
  # Do something with the returned data
34
201
  some_function(response.body)
35
202
  ```
203
+ _For more information on the `products` endpoint, [check out our API reference guide](https://shopify.dev/docs/api/admin-rest/latest/resources/product)._
36
204
 
37
- ### Perform a `POST` request:
205
+ #### Perform a `POST` request
38
206
 
39
207
  ```ruby
40
- # Load the current session to get the `accessToken`.
41
- session = ShopifyAPI::Utils::SessionUtils.load_current_session(headers, cookies, is_online)
42
-
43
208
  # Create a new client.
44
209
  client = ShopifyAPI::Clients::Rest::Admin.new(session: session)
45
210
 
@@ -54,64 +219,59 @@ body = {
54
219
  }
55
220
 
56
221
  # Use `client.post` to send your request to the specified Shopify Admin REST API endpoint.
222
+ # This POST request will create a new product.
57
223
  client.post({
58
224
  path: "products",
59
225
  body: body,
60
226
  });
61
227
  ```
62
228
 
63
- _for more information on the `products` endpoint, [check out our API reference guide](https://shopify.dev/docs/api/admin-rest/unstable/resources/product)._
229
+ _For more information on the `products` endpoint, [check out our API reference guide](https://shopify.dev/docs/api/admin-rest/latest/resources/product)._
64
230
 
65
- ### Override the `api_version`:
231
+ #### Perform a `PUT` request
232
+ ```ruby
233
+ # Create a new client.
234
+ client = ShopifyAPI::Clients::Rest::Admin.new
66
235
 
67
- ```ruby
68
- # To experiment with prerelease features, pass the api_version "unstable".
69
- client = ShopifyAPI::Clients::Rest::Admin.new(session: session, api_version: "unstable")
236
+ # Update product title
237
+ body = {
238
+ product: {
239
+ title: "My cool product"
240
+ }
241
+ }
242
+
243
+ # Use `client.put` to send your request to the specified Shopify Admin REST API endpoint.
244
+ # This will update product title for product with ID <id>
245
+ client.put(path: "products/<id>.json", body: body)
70
246
  ```
71
247
 
72
- ## Pagination
248
+ _For more information on the `products` endpoint, [check out our API reference guide](https://shopify.dev/docs/api/admin-rest/latest/resources/product)._
73
249
 
74
- This library also supports cursor-based pagination for REST Admin API requests. [Learn more about REST request pagination](https://shopify.dev/docs/api/usage/pagination-rest).
250
+ #### Accessing Rate Limit information
75
251
 
76
- After making a request, the `next_page_info` and `prev_page_info` can be found on the response object and passed as the page_info query param in other requests.
77
-
78
- An example of this is shown below:
252
+ The REST resources have `api_call_limit` and `retry_after` can be found on the Resource class. These values correspond to the `X-Shopify-Shop-Api-Call-Limit` and `Retry-After` [headers](https://shopify.dev/docs/api/usage/rate-limits#rest-admin-api-rate-limits) respectively.
79
253
 
80
254
  ```ruby
81
- session = ShopifyAPI::Utils::SessionUtils.load_current_session(headers, cookies, is_online)
82
- client = ShopifyAPI::Clients::Rest::Admin.new(session: session)
83
-
84
- response = client.get(path: "products", query: { limit: 10 })
85
-
86
- loop do
87
- some_function(response.body)
88
- break unless response.next_page_info
89
- response = client.get(path: "products", query: { limit: 10, page_info: response.next_page_info })
90
- end
91
- ```
255
+ product = ShopifyAPI::Product.find(session: session, id: 12345)
92
256
 
93
- Similarly, when using REST resources the `next_page_info` and `prev_page_info` can be found on the Resource class and passed as the page_info query param in other requests.
257
+ # X-Shopify-Shop-Api-Call-Limit: 32/40
258
+ request_count = ShopifyAPI::Product.api_call_limit[:request_count] # 32
259
+ bucket_size = ShopifyAPI::Product.api_call_limit[:bucket_size] # 40
94
260
 
95
- An example of this is shown below:
261
+ retry_after = ShopifyAPI::Product.retry_request_after
96
262
 
97
- ```ruby
98
- session = ShopifyAPI::Utils::SessionUtils.load_current_session(headers, cookies, is_online)
263
+ ```
99
264
 
100
- products = ShopifyAPI::Product.all(session: session, limit: 10)
265
+ ### Pagination
101
266
 
102
- loop do
103
- some_function(products)
104
- break unless ShopifyAPI::Product.next_page?
105
- products = ShopifyAPI::Product.all(session: session, limit: 10, page_info: ShopifyAPI::Product.next_page_info)
106
- end
107
- ```
267
+ This library also supports cursor-based pagination for REST Admin API requests. [Learn more about REST request pagination](https://shopify.dev/docs/api/usage/pagination-rest).
108
268
 
109
- The next/previous page_info strings can also be retrieved from the response object and added to a request query to retrieve the next/previous pages.
269
+ #### REST Admin Client
270
+ After making a request, the `next_page_info` and `prev_page_info` can be found on the response object and passed as the `page_info` query param in other requests.
110
271
 
111
272
  An example of this is shown below:
112
273
 
113
274
  ```ruby
114
- session = ShopifyAPI::Utils::SessionUtils.load_current_session(headers, cookies, is_online)
115
275
  client = ShopifyAPI::Clients::Rest::Admin.new(session: session)
116
276
 
117
277
  response = client.get(path: "products", query: { limit: 10 })
@@ -123,22 +283,19 @@ if next_page_info
123
283
  end
124
284
  ```
125
285
 
126
- ### Error Messages
286
+ #### REST Resource
287
+ Similarly, when using REST resources the `next_page_info` and `prev_page_info` can be found on the Resource class and passed as the `page_info` query param in other requests.
127
288
 
128
- You can rescue `ShopifyAPI::Errors::HttpResponseError` and output error messages with `errors.full_messages`
129
-
130
- See example:
289
+ An example of this is shown below:
131
290
 
132
291
  ```ruby
133
- fulfillment = ShopifyAPI::Fulfillment.new(session: @session)
134
- fulfillment.order_id = 2776493818000
135
- ...
136
- fulfillment.tracking_company = "Jack Black's Pack, Stack and Track"
137
- fulfillment.save()
138
- rescue ShopifyAPI::Errors::HttpResponseError => e
139
- puts fulfillment.errors.full_messages
140
- # {"base"=>["Line items are already fulfilled"]}
141
- # If you report this error, please include this id: e712dde0-1270-4258-8cdb-d198792c917e.
292
+ products = ShopifyAPI::Product.all(session: session, limit: 10)
293
+
294
+ loop do
295
+ some_function(products)
296
+ break unless ShopifyAPI::Product.next_page?
297
+ products = ShopifyAPI::Product.all(session: session, limit: 10, page_info: ShopifyAPI::Product.next_page_info)
298
+ end
142
299
  ```
143
300
 
144
301
  [Back to guide index](../README.md)
@@ -2,13 +2,16 @@
2
2
 
3
3
  The `shopify_api` gem provides webhook functionality to make it easy to both subscribe to and process webhooks. To implement in your app follow the steps outlined below.
4
4
 
5
+ ## Use with Rails
6
+ If using in the Rails framework, we highly recommend you use the [shopify_app](https://github.com/Shopify/shopify_app) gem to interact with this gem. That gem handles [webhooks with a declarative configuration](https://github.com/Shopify/shopify_app/blob/main/docs/shopify_app/webhooks.md).
7
+
5
8
  ## Create a Webhook Handler
6
9
 
7
10
  If you want to register for an http webhook you need to implement a webhook handler which the `shopify_api` gem can use to determine how to process your webhook. You can make multiple implementations (one per topic) or you can make one implementation capable of handling all the topics you want to subscribe to. To do this simply make a module or class that includes or extends `ShopifyAPI::Webhooks::WebhookHandler` and implement the handle method which accepts the following named parameters: topic: `String`, shop: `String`, and body: `Hash[String, untyped]`. An example implementation is shown below:
8
11
 
9
12
  ```ruby
10
13
  module WebhookHandler
11
- include ShopifyAPI::Webhooks::Handler
14
+ extend ShopifyAPI::Webhooks::Handler
12
15
 
13
16
  class << self
14
17
  def handle(topic:, shop:, body:)
@@ -25,7 +28,10 @@ end
25
28
  The next step is to add all the webhooks you would like to subscribe to for any shop to the webhook registry. To do this you can call `ShopifyAPI::Webhooks::Registry.add_registration` for each webhook you would like to handle. `add_registration` accepts a topic string, a delivery_method symbol (currently supporting `:http`, `:event_bridge`, and `:pub_sub`), a webhook path (the relative path for an http webhook) and a handler. This only needs to be done once when the app is started and we recommend doing this at the same time that you setup `ShopifyAPI::Context`. An example is shown below to register an http webhook:
26
29
 
27
30
  ```ruby
28
- registration = ShopifyAPI::Webhooks::Registry.add_registration(topic: "orders/create", delivery_method: :http, handler: WebhookHandler)
31
+ registration = ShopifyAPI::Webhooks::Registry.add_registration(topic: "orders/create",
32
+ delivery_method: :http,
33
+ handler: WebhookHandler,
34
+ path: 'callback/orders/create')
29
35
  ```
30
36
  If you are only interested in particular fields, you can optionally filter the data sent by Shopify by specifying the `fields` parameter. Note that you will still receive a webhook request from Shopify every time the resource is updated, but only the specified fields will be sent:
31
37
 
@@ -34,8 +40,20 @@ registration = ShopifyAPI::Webhooks::Registry.add_registration(
34
40
  topic: "orders/create",
35
41
  delivery_method: :http,
36
42
  handler: WebhookHandler,
43
+ path: 'callback/orders/create',
37
44
  fields: ["number","note"] # this can also be a single comma separated string
38
- )
45
+ )
46
+ ```
47
+
48
+ If you are storing metafields on an object you are receiving webhooks for, you can specify them on registration to make sure that they are also sent through the `metafieldNamespaces` parameter. Note if you are also using the `fields` parameter you will need to add `metafields` into that as well.
49
+
50
+ ```ruby
51
+ registration = ShopifyAPI::Webhooks::Registry.add_registration(
52
+ topic: "orders/create",
53
+ delivery_method: :http,
54
+ handler: WebhookHandler,
55
+ metafieldNamespaces: ["custom"]
56
+ )
39
57
  ```
40
58
 
41
59
  **Note**: The webhooks you register with Shopify are saved in the Shopify platform, but the local `ShopifyAPI::Webhooks::Registry` needs to be reloaded whenever your server restarts.
@@ -75,7 +93,7 @@ ShopifyAPI::Webhooks::Registry.register(topic: "<specific-topic>", session: shop
75
93
 
76
94
  This will return a single `ShopifyAPI::Webhooks::RegisterResult`.
77
95
 
78
- ## Unregister a Webhook
96
+ ## Unregister a Webhook
79
97
 
80
98
  To unregister a topic from a shop you can simply call:
81
99
  ```ruby
@@ -5,6 +5,8 @@ module ShopifyAPI
5
5
  module AdminVersions
6
6
  SUPPORTED_ADMIN_VERSIONS = T.let([
7
7
  "unstable",
8
+ "2024-01",
9
+ "2023-10",
8
10
  "2023-07",
9
11
  "2023-04",
10
12
  "2023-01",
@@ -14,7 +16,7 @@ module ShopifyAPI
14
16
  "2022-01",
15
17
  ], T::Array[String])
16
18
 
17
- LATEST_SUPPORTED_ADMIN_VERSION = T.let("2023-07", String)
19
+ LATEST_SUPPORTED_ADMIN_VERSION = T.let("2024-01", String)
18
20
  end
19
21
 
20
22
  SUPPORTED_ADMIN_VERSIONS = ShopifyAPI::AdminVersions::SUPPORTED_ADMIN_VERSIONS
@@ -75,8 +75,8 @@ module ShopifyAPI
75
75
  def decode_token(token, api_secret_key)
76
76
  JWT.decode(token, api_secret_key, true,
77
77
  { exp_leeway: JWT_EXPIRATION_LEEWAY, algorithm: "HS256" })[0]
78
- rescue
79
- raise ShopifyAPI::Errors::InvalidJwtTokenError, "Failed to parse session token '#{token}'"
78
+ rescue JWT::DecodeError => err
79
+ raise ShopifyAPI::Errors::InvalidJwtTokenError, "Error decoding session token: #{err.message}"
80
80
  end
81
81
  end
82
82
  end
@@ -70,15 +70,25 @@ module ShopifyAPI
70
70
  raise Errors::InvalidOauthError,
71
71
  "Invalid state in OAuth callback." unless state == auth_query.state
72
72
 
73
- # TODO: replace this call with the HTTP client once it is built
73
+ null_session = Auth::Session.new(shop: auth_query.shop)
74
74
  body = { client_id: Context.api_key, client_secret: Context.api_secret_key, code: auth_query.code }
75
- response = HTTParty.post("https://#{auth_query.shop}/admin/oauth/access_token", body: body)
76
- unless response.ok?
75
+
76
+ client = Clients::HttpClient.new(session: null_session, base_path: "/admin/oauth")
77
+ response = begin
78
+ client.request(
79
+ Clients::HttpRequest.new(
80
+ http_method: :post,
81
+ path: "access_token",
82
+ body: body,
83
+ body_type: "application/json",
84
+ ),
85
+ )
86
+ rescue ShopifyAPI::Errors::HttpResponseError => e
77
87
  raise Errors::RequestAccessTokenError,
78
- "Cannot complete OAuth process. Received a #{response.code} error while requesting access token."
88
+ "Cannot complete OAuth process. Received a #{e.code} error while requesting access token."
79
89
  end
80
- session_params = response.to_h
81
90
 
91
+ session_params = T.cast(response.body, T::Hash[String, T.untyped]).to_h
82
92
  session = create_new_session(session_params, auth_query.shop)
83
93
 
84
94
  cookie = if Context.embedded?
@@ -35,6 +35,11 @@ module ShopifyAPI
35
35
  @is_online
36
36
  end
37
37
 
38
+ sig { returns(T::Boolean) }
39
+ def expired?
40
+ @expires ? @expires < Time.now : false
41
+ end
42
+
38
43
  sig do
39
44
  params(
40
45
  shop: String,
@@ -42,6 +42,7 @@ module ShopifyAPI
42
42
  body_type: "application/json",
43
43
  tries: tries,
44
44
  ),
45
+ response_as_struct: Context.response_as_struct || false,
45
46
  )
46
47
  end
47
48
  end
@@ -13,7 +13,9 @@ module ShopifyAPI
13
13
  session ||= Context.active_session
14
14
  raise Errors::NoActiveSessionError, "No passed or active session" unless session
15
15
 
16
- @base_uri = T.let("https://#{session.shop}", String)
16
+ api_host = Context.api_host
17
+
18
+ @base_uri = T.let("https://#{api_host || session.shop}", String)
17
19
  @base_uri_and_path = T.let("#{@base_uri}#{base_path}", String)
18
20
 
19
21
  user_agent_prefix = Context.user_agent_prefix.nil? ? "" : "#{Context.user_agent_prefix} | "
@@ -23,13 +25,15 @@ module ShopifyAPI
23
25
  "Accept": "application/json",
24
26
  }, T::Hash[T.any(Symbol, String), T.untyped])
25
27
 
28
+ @headers["Host"] = session.shop unless api_host.nil?
29
+
26
30
  unless session.access_token.nil? || T.must(session.access_token).empty?
27
31
  @headers["X-Shopify-Access-Token"] = T.cast(session.access_token, String)
28
32
  end
29
33
  end
30
34
 
31
- sig { params(request: HttpRequest).returns(HttpResponse) }
32
- def request(request)
35
+ sig { params(request: HttpRequest, response_as_struct: T::Boolean).returns(HttpResponse) }
36
+ def request(request, response_as_struct: false)
33
37
  request.verify
34
38
 
35
39
  headers = @headers
@@ -56,6 +60,11 @@ module ShopifyAPI
56
60
  body = res.body
57
61
  end
58
62
 
63
+ if response_as_struct && body.is_a?(Hash)
64
+ json_body = body.to_json
65
+ body = JSON.parse(json_body, object_class: OpenStruct)
66
+ end
67
+
59
68
  response = HttpResponse.new(code: res.code.to_i, headers: res.headers.to_h, body: body)
60
69
 
61
70
  if response.headers["x-shopify-api-deprecated-reason"]
@@ -12,17 +12,23 @@ module ShopifyAPI
12
12
  sig { returns(T::Hash[String, T::Array[String]]) }
13
13
  attr_reader :headers
14
14
 
15
- sig { returns(T.any(T::Hash[String, T.untyped], String)) }
15
+ sig { returns(T.any(T::Hash[String, T.untyped], String, OpenStruct)) }
16
16
  attr_reader :body
17
17
 
18
18
  sig { returns(T.nilable(String)) }
19
19
  attr_reader :prev_page_info, :next_page_info
20
20
 
21
+ sig { returns(T.nilable(T::Hash[String, Integer])) }
22
+ attr_reader :api_call_limit
23
+
24
+ sig { returns(T.nilable(Float)) }
25
+ attr_reader :retry_request_after
26
+
21
27
  sig do
22
28
  params(
23
29
  code: Integer,
24
30
  headers: T::Hash[String, T::Array[String]],
25
- body: T.any(T::Hash[String, T.untyped], String),
31
+ body: T.any(T::Hash[String, T.untyped], String, OpenStruct),
26
32
  ).void
27
33
  end
28
34
  def initialize(code:, headers:, body:)
@@ -33,6 +39,11 @@ module ShopifyAPI
33
39
  @prev_page_info = T.let(nil, T.nilable(String))
34
40
  @next_page_info = T.let(nil, T.nilable(String))
35
41
  @prev_page_info, @next_page_info = parse_link_header
42
+
43
+ @api_call_limit = T.let(nil, T.nilable(T::Hash[String, Integer]))
44
+ @retry_request_after = T.let(nil, T.nilable(Float))
45
+ @api_call_limit = parse_api_call_limit_header
46
+ @retry_request_after = parse_retry_header
36
47
  end
37
48
 
38
49
  sig { returns(T::Boolean) }
@@ -61,6 +72,22 @@ module ShopifyAPI
61
72
 
62
73
  [page_info["previous"], page_info["next"]]
63
74
  end
75
+
76
+ sig { returns(T.nilable(Float)) }
77
+ def parse_retry_header
78
+ return nil if @headers["retry-after"].nil?
79
+
80
+ T.must(@headers["retry-after"])[0].to_f
81
+ end
82
+
83
+ sig { returns(T.nilable(T::Hash[String, Integer])) }
84
+ def parse_api_call_limit_header
85
+ rate_limit_info = headers["x-shopify-shop-api-call-limit"]&.first
86
+ return if rate_limit_info.nil?
87
+
88
+ request_count, bucket_size = rate_limit_info.split("/").map(&:to_i)
89
+ { request_count: request_count, bucket_size: bucket_size }
90
+ end
64
91
  end
65
92
  end
66
93
  end