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.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +1 -1
- data/.github/workflows/build.yml +4 -0
- data/.rubocop.yml +2 -0
- data/BREAKING_CHANGES_FOR_V10.md +231 -0
- data/CHANGELOG.md +25 -1
- data/CONTRIBUTING.md +25 -0
- data/Gemfile.lock +23 -17
- data/README.md +10 -34
- data/ROADMAP.md +10 -0
- data/docs/README.md +0 -1
- data/docs/getting_started.md +20 -3
- data/docs/usage/custom_apps.md +75 -0
- data/docs/usage/graphql.md +91 -17
- data/docs/usage/oauth.md +160 -27
- data/docs/usage/rest.md +216 -59
- data/docs/usage/webhooks.md +22 -4
- data/lib/shopify_api/admin_versions.rb +3 -1
- data/lib/shopify_api/auth/jwt_payload.rb +2 -2
- data/lib/shopify_api/auth/oauth.rb +15 -5
- data/lib/shopify_api/auth/session.rb +5 -0
- data/lib/shopify_api/clients/graphql/client.rb +1 -0
- data/lib/shopify_api/clients/http_client.rb +12 -3
- data/lib/shopify_api/clients/http_response.rb +29 -2
- data/lib/shopify_api/context.rb +18 -5
- data/lib/shopify_api/rest/base.rb +35 -14
- data/lib/shopify_api/rest/resources/2022_04/abandoned_checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/access_scope.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/android_pay_key.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/apple_pay_certificate.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/application_credit.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/article.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/asset.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/assigned_fulfillment_order.rb +12 -6
- data/lib/shopify_api/rest/resources/2022_04/balance.rb +6 -3
- data/lib/shopify_api/rest/resources/2022_04/blog.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/cancellation_request.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/carrier_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/collect.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/collection_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/comment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/country.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/currency.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/custom_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/customer.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/customer_address.rb +17 -3
- data/lib/shopify_api/rest/resources/2022_04/customer_saved_search.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/deprecated_api_call.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/discount_code.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/dispute.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/draft_order.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/event.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/fulfillment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/fulfillment_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/fulfillment_order.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/fulfillment_request.rb +17 -3
- data/lib/shopify_api/rest/resources/2022_04/fulfillment_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/gift_card.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/gift_card_adjustment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/image.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/inventory_item.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/inventory_level.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/location.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/locations_for_move.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/marketing_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/metafield.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/mobile_platform_application.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/order.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/order_risk.rb +12 -6
- data/lib/shopify_api/rest/resources/2022_04/page.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/payment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/payment_gateway.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/payment_transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/payout.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/policy.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/price_rule.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/product.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/product_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/product_resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/province.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/recurring_application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/redirect.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/refund.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/report.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/script_tag.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/shipping_zone.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/shop.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/smart_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/storefront_access_token.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/tender_transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/theme.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/usage_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/user.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/variant.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_04/webhook.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/abandoned_checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/access_scope.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/android_pay_key.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/apple_pay_certificate.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/application_credit.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/article.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/asset.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/assigned_fulfillment_order.rb +12 -6
- data/lib/shopify_api/rest/resources/2022_07/balance.rb +11 -3
- data/lib/shopify_api/rest/resources/2022_07/blog.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/cancellation_request.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/carrier_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/collect.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/collection_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/comment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/country.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/currency.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/custom_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/customer.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/customer_address.rb +17 -3
- data/lib/shopify_api/rest/resources/2022_07/deprecated_api_call.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/discount_code.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/dispute.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/dispute_evidence.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/dispute_file_upload.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/draft_order.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/event.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/fulfillment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/fulfillment_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/fulfillment_order.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/fulfillment_request.rb +17 -3
- data/lib/shopify_api/rest/resources/2022_07/fulfillment_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/gift_card.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/gift_card_adjustment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/image.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/inventory_item.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/inventory_level.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/location.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/locations_for_move.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/marketing_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/metafield.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/mobile_platform_application.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/order.rb +10 -3
- data/lib/shopify_api/rest/resources/2022_07/order_risk.rb +12 -6
- data/lib/shopify_api/rest/resources/2022_07/page.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/payment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/payment_gateway.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/payment_transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/payout.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/policy.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/price_rule.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/product.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/product_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/product_resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/province.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/recurring_application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/redirect.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/refund.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/report.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/script_tag.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/shipping_zone.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/shop.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/smart_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/storefront_access_token.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/tender_transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/theme.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/usage_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/user.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/variant.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_07/webhook.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/abandoned_checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/access_scope.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/android_pay_key.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/apple_pay_certificate.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/application_credit.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/article.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/asset.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/assigned_fulfillment_order.rb +12 -6
- data/lib/shopify_api/rest/resources/2022_10/balance.rb +11 -3
- data/lib/shopify_api/rest/resources/2022_10/blog.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/cancellation_request.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/carrier_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/collect.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/collection_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/comment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/country.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/currency.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/custom_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/customer.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/customer_address.rb +17 -3
- data/lib/shopify_api/rest/resources/2022_10/deprecated_api_call.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/discount_code.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/dispute.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/dispute_evidence.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/dispute_file_upload.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/draft_order.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/event.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/fulfillment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/fulfillment_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/fulfillment_order.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/fulfillment_request.rb +17 -3
- data/lib/shopify_api/rest/resources/2022_10/fulfillment_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/gift_card.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/gift_card_adjustment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/image.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/inventory_item.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/inventory_level.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/location.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/locations_for_move.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/marketing_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/metafield.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/mobile_platform_application.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/order.rb +10 -3
- data/lib/shopify_api/rest/resources/2022_10/order_risk.rb +12 -6
- data/lib/shopify_api/rest/resources/2022_10/page.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/payment.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/payment_gateway.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/payment_transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/payout.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/policy.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/price_rule.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/product.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/product_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/product_resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/province.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/recurring_application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/redirect.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/refund.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/report.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/script_tag.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/shipping_zone.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/shop.rb +7 -6
- data/lib/shopify_api/rest/resources/2022_10/smart_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/storefront_access_token.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/tender_transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/theme.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/usage_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/user.rb +7 -3
- data/lib/shopify_api/rest/resources/2022_10/variant.rb +8 -8
- data/lib/shopify_api/rest/resources/2022_10/webhook.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/abandoned_checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/access_scope.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/apple_pay_certificate.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/application_credit.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/article.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/asset.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/assigned_fulfillment_order.rb +12 -6
- data/lib/shopify_api/rest/resources/2023_01/balance.rb +11 -3
- data/lib/shopify_api/rest/resources/2023_01/blog.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/cancellation_request.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/carrier_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/collect.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/collection_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/comment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/country.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/currency.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/custom_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/customer.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/customer_address.rb +17 -3
- data/lib/shopify_api/rest/resources/2023_01/customer_saved_search.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/deprecated_api_call.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/discount_code.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/dispute.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/dispute_evidence.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/dispute_file_upload.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/draft_order.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/event.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/fulfillment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/fulfillment_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/fulfillment_order.rb +12 -6
- data/lib/shopify_api/rest/resources/2023_01/fulfillment_request.rb +17 -3
- data/lib/shopify_api/rest/resources/2023_01/fulfillment_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/gift_card.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/gift_card_adjustment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/image.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/inventory_item.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/inventory_level.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/location.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/locations_for_move.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/marketing_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/metafield.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/mobile_platform_application.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/order.rb +10 -3
- data/lib/shopify_api/rest/resources/2023_01/order_risk.rb +12 -6
- data/lib/shopify_api/rest/resources/2023_01/page.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/payment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/payment_gateway.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/payment_transaction.rb +12 -5
- data/lib/shopify_api/rest/resources/2023_01/payout.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/policy.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/price_rule.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/product.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/product_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/product_resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/province.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/recurring_application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/redirect.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/refund.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/report.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/script_tag.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/shipping_zone.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/shop.rb +7 -6
- data/lib/shopify_api/rest/resources/2023_01/smart_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/storefront_access_token.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/tender_transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/theme.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/usage_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/user.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_01/variant.rb +8 -8
- data/lib/shopify_api/rest/resources/2023_01/webhook.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/abandoned_checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/access_scope.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/apple_pay_certificate.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/application_credit.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/article.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/asset.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/assigned_fulfillment_order.rb +12 -6
- data/lib/shopify_api/rest/resources/2023_04/balance.rb +11 -3
- data/lib/shopify_api/rest/resources/2023_04/blog.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/cancellation_request.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/carrier_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/collect.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/collection_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/comment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/country.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/currency.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/custom_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/customer.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/customer_address.rb +17 -3
- data/lib/shopify_api/rest/resources/2023_04/customer_saved_search.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/deprecated_api_call.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/discount_code.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/dispute.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/dispute_evidence.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/dispute_file_upload.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/draft_order.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/event.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/fulfillment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/fulfillment_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/fulfillment_order.rb +12 -6
- data/lib/shopify_api/rest/resources/2023_04/fulfillment_request.rb +17 -3
- data/lib/shopify_api/rest/resources/2023_04/fulfillment_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/gift_card.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/gift_card_adjustment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/image.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/inventory_item.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/inventory_level.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/location.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/locations_for_move.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/marketing_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/metafield.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/mobile_platform_application.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/order.rb +10 -9
- data/lib/shopify_api/rest/resources/2023_04/order_risk.rb +12 -6
- data/lib/shopify_api/rest/resources/2023_04/page.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/payment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/payment_gateway.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/payment_transaction.rb +12 -5
- data/lib/shopify_api/rest/resources/2023_04/payout.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/policy.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/price_rule.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/product.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/product_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/product_resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/province.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/recurring_application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/redirect.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/refund.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/report.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/script_tag.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/shipping_zone.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/shop.rb +7 -6
- data/lib/shopify_api/rest/resources/2023_04/smart_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/storefront_access_token.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/tender_transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/theme.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/usage_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/user.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_04/variant.rb +8 -8
- data/lib/shopify_api/rest/resources/2023_04/webhook.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/abandoned_checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/access_scope.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/apple_pay_certificate.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/application_credit.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/article.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/asset.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/assigned_fulfillment_order.rb +12 -6
- data/lib/shopify_api/rest/resources/2023_07/balance.rb +11 -3
- data/lib/shopify_api/rest/resources/2023_07/blog.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/cancellation_request.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/carrier_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/checkout.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/collect.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/collection_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/comment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/country.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/currency.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/custom_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/customer.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/customer_address.rb +17 -3
- data/lib/shopify_api/rest/resources/2023_07/customer_saved_search.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/deprecated_api_call.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/discount_code.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/dispute.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/dispute_evidence.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/dispute_file_upload.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/draft_order.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/event.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/fulfillment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/fulfillment_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/fulfillment_order.rb +12 -6
- data/lib/shopify_api/rest/resources/2023_07/fulfillment_request.rb +17 -3
- data/lib/shopify_api/rest/resources/2023_07/fulfillment_service.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/gift_card.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/gift_card_adjustment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/image.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/inventory_item.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/inventory_level.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/location.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/locations_for_move.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/marketing_event.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/metafield.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/mobile_platform_application.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/order.rb +10 -9
- data/lib/shopify_api/rest/resources/2023_07/order_risk.rb +12 -6
- data/lib/shopify_api/rest/resources/2023_07/page.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/payment.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/payment_gateway.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/payment_transaction.rb +12 -5
- data/lib/shopify_api/rest/resources/2023_07/payout.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/policy.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/price_rule.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/product.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/product_listing.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/product_resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/province.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/recurring_application_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/redirect.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/refund.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/report.rb +125 -0
- data/lib/shopify_api/rest/resources/2023_07/resource_feedback.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/script_tag.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/shipping_zone.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/shop.rb +7 -6
- data/lib/shopify_api/rest/resources/2023_07/smart_collection.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/storefront_access_token.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/tender_transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/theme.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/transaction.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/usage_charge.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/user.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_07/variant.rb +8 -8
- data/lib/shopify_api/rest/resources/2023_07/webhook.rb +7 -3
- data/lib/shopify_api/rest/resources/2023_10/abandoned_checkout.rb +194 -0
- data/lib/shopify_api/rest/resources/2023_10/access_scope.rb +62 -0
- data/lib/shopify_api/rest/resources/2023_10/apple_pay_certificate.rb +109 -0
- data/lib/shopify_api/rest/resources/2023_10/application_charge.rb +113 -0
- data/lib/shopify_api/rest/resources/2023_10/application_credit.rb +95 -0
- data/lib/shopify_api/rest/resources/2023_10/article.rb +269 -0
- data/lib/shopify_api/rest/resources/2023_10/asset.rb +122 -0
- data/lib/shopify_api/rest/resources/2023_10/assigned_fulfillment_order.rb +92 -0
- data/lib/shopify_api/rest/resources/2023_10/balance.rb +58 -0
- data/lib/shopify_api/rest/resources/2023_10/blog.rb +166 -0
- data/lib/shopify_api/rest/resources/2023_10/cancellation_request.rb +87 -0
- data/lib/shopify_api/rest/resources/2023_10/carrier_service.rb +120 -0
- data/lib/shopify_api/rest/resources/2023_10/checkout.rb +213 -0
- data/lib/shopify_api/rest/resources/{2022_10/customer_saved_search.rb → 2023_10/collect.rb} +29 -52
- data/lib/shopify_api/rest/resources/2023_10/collection.rb +114 -0
- data/lib/shopify_api/rest/resources/2023_10/collection_listing.rb +159 -0
- data/lib/shopify_api/rest/resources/2023_10/comment.rb +287 -0
- data/lib/shopify_api/rest/resources/2023_10/country.rb +141 -0
- data/lib/shopify_api/rest/resources/2023_10/currency.rb +61 -0
- data/lib/shopify_api/rest/resources/2023_10/custom_collection.rb +191 -0
- data/lib/shopify_api/rest/resources/2023_10/customer.rb +333 -0
- data/lib/shopify_api/rest/resources/2023_10/customer_address.rb +215 -0
- data/lib/shopify_api/rest/resources/2023_10/deprecated_api_call.rb +61 -0
- data/lib/shopify_api/rest/resources/2023_10/discount_code.rb +226 -0
- data/lib/shopify_api/rest/resources/2023_10/dispute.rb +115 -0
- data/lib/shopify_api/rest/resources/2023_10/dispute_evidence.rb +121 -0
- data/lib/shopify_api/rest/resources/2023_10/dispute_file_upload.rb +85 -0
- data/lib/shopify_api/rest/resources/2023_10/draft_order.rb +279 -0
- data/lib/shopify_api/rest/resources/2023_10/event.rb +152 -0
- data/lib/shopify_api/rest/resources/2023_10/fulfillment.rb +235 -0
- data/lib/shopify_api/rest/resources/2023_10/fulfillment_event.rb +170 -0
- data/lib/shopify_api/rest/resources/2023_10/fulfillment_order.rb +318 -0
- data/lib/shopify_api/rest/resources/2023_10/fulfillment_request.rb +101 -0
- data/lib/shopify_api/rest/resources/2023_10/fulfillment_service.rb +134 -0
- data/lib/shopify_api/rest/resources/2023_10/gift_card.rb +222 -0
- data/lib/shopify_api/rest/resources/2023_10/gift_card_adjustment.rb +122 -0
- data/lib/shopify_api/rest/resources/2023_10/image.rb +161 -0
- data/lib/shopify_api/rest/resources/2023_10/inventory_item.rb +112 -0
- data/lib/shopify_api/rest/resources/2023_10/inventory_level.rb +183 -0
- data/lib/shopify_api/rest/resources/2023_10/location.rb +171 -0
- data/lib/shopify_api/rest/resources/2023_10/locations_for_move.rb +60 -0
- data/lib/shopify_api/rest/resources/2023_10/marketing_event.rb +213 -0
- data/lib/shopify_api/rest/resources/2023_10/metafield.rb +348 -0
- data/lib/shopify_api/rest/resources/2023_10/mobile_platform_application.rb +114 -0
- data/lib/shopify_api/rest/resources/2023_10/order.rb +489 -0
- data/lib/shopify_api/rest/resources/2023_10/order_risk.rb +148 -0
- data/lib/shopify_api/rest/resources/2023_10/page.rb +198 -0
- data/lib/shopify_api/rest/resources/2023_10/payment.rb +144 -0
- data/lib/shopify_api/rest/resources/2023_10/payment_gateway.rb +147 -0
- data/lib/shopify_api/rest/resources/2023_10/payment_transaction.rb +114 -0
- data/lib/shopify_api/rest/resources/2023_10/payout.rb +101 -0
- data/lib/shopify_api/rest/resources/2023_10/policy.rb +73 -0
- data/lib/shopify_api/rest/resources/2023_10/price_rule.rb +227 -0
- data/lib/shopify_api/rest/resources/2023_10/product.rb +227 -0
- data/lib/shopify_api/rest/resources/2023_10/product_listing.rb +200 -0
- data/lib/shopify_api/rest/resources/2023_10/product_resource_feedback.rb +92 -0
- data/lib/shopify_api/rest/resources/2023_10/province.rb +136 -0
- data/lib/shopify_api/rest/resources/2023_10/recurring_application_charge.rb +176 -0
- data/lib/shopify_api/rest/resources/2023_10/redirect.rb +143 -0
- data/lib/shopify_api/rest/resources/2023_10/refund.rb +155 -0
- data/lib/shopify_api/rest/resources/2023_10/report.rb +125 -0
- data/lib/shopify_api/rest/resources/2023_10/resource_feedback.rb +77 -0
- data/lib/shopify_api/rest/resources/2023_10/script_tag.rb +159 -0
- data/lib/shopify_api/rest/resources/2023_10/shipping_zone.rb +87 -0
- data/lib/shopify_api/rest/resources/2023_10/shop.rb +222 -0
- data/lib/shopify_api/rest/resources/2023_10/smart_collection.rb +220 -0
- data/lib/shopify_api/rest/resources/2023_10/storefront_access_token.rb +91 -0
- data/lib/shopify_api/rest/resources/2023_10/tender_transaction.rb +97 -0
- data/lib/shopify_api/rest/resources/2023_10/theme.rb +127 -0
- data/lib/shopify_api/rest/resources/2023_10/transaction.rb +188 -0
- data/lib/shopify_api/rest/resources/2023_10/usage_charge.rb +106 -0
- data/lib/shopify_api/rest/resources/2023_10/user.rb +142 -0
- data/lib/shopify_api/rest/resources/2023_10/variant.rb +212 -0
- data/lib/shopify_api/rest/resources/2023_10/webhook.rb +172 -0
- data/lib/shopify_api/rest/resources/2024_01/abandoned_checkout.rb +194 -0
- data/lib/shopify_api/rest/resources/2024_01/access_scope.rb +62 -0
- data/lib/shopify_api/rest/resources/2024_01/apple_pay_certificate.rb +109 -0
- data/lib/shopify_api/rest/resources/2024_01/application_charge.rb +113 -0
- data/lib/shopify_api/rest/resources/2024_01/application_credit.rb +95 -0
- data/lib/shopify_api/rest/resources/2024_01/article.rb +269 -0
- data/lib/shopify_api/rest/resources/2024_01/asset.rb +122 -0
- data/lib/shopify_api/rest/resources/2024_01/assigned_fulfillment_order.rb +92 -0
- data/lib/shopify_api/rest/resources/2024_01/balance.rb +58 -0
- data/lib/shopify_api/rest/resources/2024_01/blog.rb +166 -0
- data/lib/shopify_api/rest/resources/2024_01/cancellation_request.rb +87 -0
- data/lib/shopify_api/rest/resources/2024_01/carrier_service.rb +120 -0
- data/lib/shopify_api/rest/resources/2024_01/checkout.rb +213 -0
- data/lib/shopify_api/rest/resources/{2022_07/customer_saved_search.rb → 2024_01/collect.rb} +29 -52
- data/lib/shopify_api/rest/resources/2024_01/collection.rb +114 -0
- data/lib/shopify_api/rest/resources/2024_01/collection_listing.rb +159 -0
- data/lib/shopify_api/rest/resources/2024_01/comment.rb +287 -0
- data/lib/shopify_api/rest/resources/2024_01/country.rb +141 -0
- data/lib/shopify_api/rest/resources/2024_01/currency.rb +61 -0
- data/lib/shopify_api/rest/resources/2024_01/custom_collection.rb +191 -0
- data/lib/shopify_api/rest/resources/2024_01/customer.rb +333 -0
- data/lib/shopify_api/rest/resources/2024_01/customer_address.rb +215 -0
- data/lib/shopify_api/rest/resources/2024_01/deprecated_api_call.rb +61 -0
- data/lib/shopify_api/rest/resources/2024_01/discount_code.rb +226 -0
- data/lib/shopify_api/rest/resources/2024_01/dispute.rb +115 -0
- data/lib/shopify_api/rest/resources/2024_01/dispute_evidence.rb +121 -0
- data/lib/shopify_api/rest/resources/2024_01/dispute_file_upload.rb +85 -0
- data/lib/shopify_api/rest/resources/2024_01/draft_order.rb +279 -0
- data/lib/shopify_api/rest/resources/2024_01/event.rb +152 -0
- data/lib/shopify_api/rest/resources/2024_01/fulfillment.rb +235 -0
- data/lib/shopify_api/rest/resources/2024_01/fulfillment_event.rb +170 -0
- data/lib/shopify_api/rest/resources/2024_01/fulfillment_order.rb +326 -0
- data/lib/shopify_api/rest/resources/2024_01/fulfillment_request.rb +101 -0
- data/lib/shopify_api/rest/resources/2024_01/fulfillment_service.rb +134 -0
- data/lib/shopify_api/rest/resources/2024_01/gift_card.rb +222 -0
- data/lib/shopify_api/rest/resources/2024_01/gift_card_adjustment.rb +122 -0
- data/lib/shopify_api/rest/resources/2024_01/image.rb +161 -0
- data/lib/shopify_api/rest/resources/2024_01/inventory_item.rb +112 -0
- data/lib/shopify_api/rest/resources/2024_01/inventory_level.rb +183 -0
- data/lib/shopify_api/rest/resources/2024_01/location.rb +171 -0
- data/lib/shopify_api/rest/resources/2024_01/locations_for_move.rb +60 -0
- data/lib/shopify_api/rest/resources/2024_01/marketing_event.rb +213 -0
- data/lib/shopify_api/rest/resources/2024_01/metafield.rb +348 -0
- data/lib/shopify_api/rest/resources/2024_01/mobile_platform_application.rb +114 -0
- data/lib/shopify_api/rest/resources/2024_01/order.rb +489 -0
- data/lib/shopify_api/rest/resources/2024_01/order_risk.rb +148 -0
- data/lib/shopify_api/rest/resources/2024_01/page.rb +198 -0
- data/lib/shopify_api/rest/resources/2024_01/payment.rb +144 -0
- data/lib/shopify_api/rest/resources/2024_01/payment_gateway.rb +147 -0
- data/lib/shopify_api/rest/resources/2024_01/payment_transaction.rb +114 -0
- data/lib/shopify_api/rest/resources/2024_01/payout.rb +101 -0
- data/lib/shopify_api/rest/resources/2024_01/policy.rb +73 -0
- data/lib/shopify_api/rest/resources/2024_01/price_rule.rb +227 -0
- data/lib/shopify_api/rest/resources/2024_01/product.rb +227 -0
- data/lib/shopify_api/rest/resources/2024_01/product_listing.rb +200 -0
- data/lib/shopify_api/rest/resources/2024_01/product_resource_feedback.rb +92 -0
- data/lib/shopify_api/rest/resources/2024_01/province.rb +136 -0
- data/lib/shopify_api/rest/resources/2024_01/recurring_application_charge.rb +176 -0
- data/lib/shopify_api/rest/resources/2024_01/redirect.rb +143 -0
- data/lib/shopify_api/rest/resources/2024_01/refund.rb +155 -0
- data/lib/shopify_api/rest/resources/2024_01/report.rb +125 -0
- data/lib/shopify_api/rest/resources/2024_01/resource_feedback.rb +77 -0
- data/lib/shopify_api/rest/resources/2024_01/script_tag.rb +159 -0
- data/lib/shopify_api/rest/resources/2024_01/shipping_zone.rb +87 -0
- data/lib/shopify_api/rest/resources/2024_01/shop.rb +222 -0
- data/lib/shopify_api/rest/resources/2024_01/smart_collection.rb +220 -0
- data/lib/shopify_api/rest/resources/2024_01/storefront_access_token.rb +91 -0
- data/lib/shopify_api/rest/resources/2024_01/tender_transaction.rb +97 -0
- data/lib/shopify_api/rest/resources/2024_01/theme.rb +127 -0
- data/lib/shopify_api/rest/resources/2024_01/transaction.rb +188 -0
- data/lib/shopify_api/rest/resources/2024_01/usage_charge.rb +106 -0
- data/lib/shopify_api/rest/resources/2024_01/user.rb +142 -0
- data/lib/shopify_api/rest/resources/2024_01/variant.rb +212 -0
- data/lib/shopify_api/rest/resources/2024_01/webhook.rb +172 -0
- data/lib/shopify_api/utils/hmac_validator.rb +1 -1
- data/lib/shopify_api/version.rb +1 -1
- data/lib/shopify_api/webhooks/registration.rb +19 -4
- data/lib/shopify_api/webhooks/registrations/event_bridge.rb +1 -1
- data/lib/shopify_api/webhooks/registrations/http.rb +1 -1
- data/lib/shopify_api/webhooks/registrations/pub_sub.rb +2 -1
- data/lib/shopify_api/webhooks/registry.rb +36 -5
- data/shopify_api.gemspec +0 -1
- metadata +155 -22
- data/.github/workflows/stale.yml +0 -43
- data/docs/issues.md +0 -39
- 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
|
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
|
-
|
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
|
-
|
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
|
160
|
+
**Note:** _These parameters can still be used in all methods regardless of if they are required._
|
18
161
|
|
19
|
-
|
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
|
-
|
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
|
-
|
25
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
231
|
+
#### Perform a `PUT` request
|
232
|
+
```ruby
|
233
|
+
# Create a new client.
|
234
|
+
client = ShopifyAPI::Clients::Rest::Admin.new
|
66
235
|
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
-
|
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
|
-
|
250
|
+
#### Accessing Rate Limit information
|
75
251
|
|
76
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
261
|
+
retry_after = ShopifyAPI::Product.retry_request_after
|
96
262
|
|
97
|
-
```
|
98
|
-
session = ShopifyAPI::Utils::SessionUtils.load_current_session(headers, cookies, is_online)
|
263
|
+
```
|
99
264
|
|
100
|
-
|
265
|
+
### Pagination
|
101
266
|
|
102
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
129
|
-
|
130
|
-
See example:
|
289
|
+
An example of this is shown below:
|
131
290
|
|
132
291
|
```ruby
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
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)
|
data/docs/usage/webhooks.md
CHANGED
@@ -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
|
-
|
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",
|
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("
|
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, "
|
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
|
-
|
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
|
-
|
76
|
-
|
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 #{
|
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?
|
@@ -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
|
-
|
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
|