Skip to content

Commit

Permalink
Merge branch 'extend/webhooks' of https://github.com/admirsaheta/shop…
Browse files Browse the repository at this point in the history
…ify-api-php into extend/webhooks
  • Loading branch information
DevMahix committed Oct 5, 2024
2 parents e7f0c45 + 0a90819 commit 3e0fa9e
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 27 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## Unreleased
- [#371](https://github.com/Shopify/shopify-api-php/pull/371) Remove API version validation to allow more flexibility of API version.
- [#370](https://github.com/Shopify/shopify-api-php/pull/370) [Patch] Fix params set to zero being removed from request payload
- [#366](https://github.com/Shopify/shopify-api-php/pull/366) [Patch] Updated webhook subscription topic constants

## v5.6.0 - 2024-07-02

Expand Down
4 changes: 2 additions & 2 deletions docs/getting_started.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ The first thing your app will need to do to use this library is to set up your c
| `scopes` | `string \| array` | Yes | - | App scopes |
| `hostName` | `string` | Yes | - | App host name e.g. `my-app.my-domain.ca`. You may optionally include `https://` or `http://` to determine which scheme to use |
| `sessionStorage` | `SessionStorage` | Yes | - | Session storage strategy. Read our [notes on session handling](issues.md#notes-on-session-handling) for more information |
| `apiVersion` | `string` | No | `'unstable'` | App API version, defaults to unstable |
| `apiVersion` | `string` | No | `ApiVersion::LATEST` | App API version, defaults to `ApiVersion::LATEST` |
| `isEmbeddedApp` | `bool` | No | `true` | Whether the app is an embedded app |
| `isPrivateApp` | `bool` | No | `false` | Whether the app is a private app |
| `userAgentPrefix` | `string` | No | - | Prefix for user agent header sent with a request |
Expand All @@ -34,7 +34,7 @@ Context::initialize(
scopes: $_ENV['SHOPIFY_APP_SCOPES'],
hostName: $_ENV['SHOPIFY_APP_HOST_NAME'],
sessionStorage: new FileSessionStorage('/tmp/php_sessions'),
apiVersion: '2023-04',
apiVersion: '2024-10',
isEmbeddedApp: true,
isPrivateApp: false,
);
Expand Down
23 changes: 3 additions & 20 deletions src/ApiVersion.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,24 +29,7 @@ class ApiVersion
/** @var string */
public const JULY_2024 = "2024-07";
/** @var string */
public const LATEST = self::JULY_2024;

private static $ALL_VERSIONS = [
self::UNSTABLE,
self::APRIL_2022,
self::JULY_2022,
self::OCTOBER_2022,
self::JANUARY_2023,
self::APRIL_2023,
self::JULY_2023,
self::OCTOBER_2023,
self::JANUARY_2024,
self::APRIL_2024,
self::JULY_2024,
];

public static function isValid(string $version): bool
{
return in_array($version, self::$ALL_VERSIONS);
}
public const OCTOBER_2024 = "2024-10";
/** @var string */
public const LATEST = self::OCTOBER_2024;
}
4 changes: 0 additions & 4 deletions src/Context.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,6 @@ public static function initialize(
);
}

if (!ApiVersion::isValid($apiVersion)) {
throw new InvalidArgumentException("Invalid API version: $apiVersion");
}

if (!preg_match("/http(s)?:\/\//", $hostName)) {
$hostName = "https://$hostName";
}
Expand Down
5 changes: 4 additions & 1 deletion src/Rest/Base.php
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,10 @@ protected static function request(

$client = new Rest($session->getShop(), $session->getAccessToken());

$params = array_filter($params);
$params = array_filter($params, function ($value) {
return $value !== "";
});

switch ($httpMethod) {
case "get":
$response = $client->get(
Expand Down
97 changes: 97 additions & 0 deletions src/Webhooks/Topics.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,13 @@
final class Topics
{
public const APP_PURCHASES_ONE_TIME_UPDATE = 'APP_PURCHASES_ONE_TIME_UPDATE';
public const APP_SUBSCRIPTIONS_APPROACHING_CAPPED_AMOUNT = 'APP_SUBSCRIPTIONS_APPROACHING_CAPPED_AMOUNT';
public const APP_SUBSCRIPTIONS_UPDATE = 'APP_SUBSCRIPTIONS_UPDATE';
public const APP_UNINSTALLED = 'APP_UNINSTALLED';
public const ATTRIBUTED_SESSIONS_FIRST = 'ATTRIBUTED_SESSIONS_FIRST';
public const ATTRIBUTED_SESSIONS_LAST = 'ATTRIBUTED_SESSIONS_LAST';
public const AUDIT_EVENTS_ADMIN_API_ACTIVITY = 'AUDIT_EVENTS_ADMIN_API_ACTIVITY';
public const BULK_OPERATIONS_FINISH = 'BULK_OPERATIONS_FINISH';
public const ATTRIBUTION_RISK = 'ATTRIBUTION_RISK';
public const CARTS_CREATE = 'CARTS_CREATE';
public const CARTS_UPDATE = 'CARTS_UPDATE';
Expand All @@ -33,17 +36,39 @@ final class Topics
public const COLLECTION_PUBLICATIONS_CREATE = 'COLLECTION_PUBLICATIONS_CREATE';
public const COLLECTION_PUBLICATIONS_DELETE = 'COLLECTION_PUBLICATIONS_DELETE';
public const COLLECTION_PUBLICATIONS_UPDATE = 'COLLECTION_PUBLICATIONS_UPDATE';
public const COMPANIES_CREATE = 'COMPANIES_CREATE';
public const COMPANIES_DELETE = 'COMPANIES_DELETE';
public const COMPANIES_UPDATE = 'COMPANIES_UPDATE';
public const COMPANY_CONTACTS_CREATE = 'COMPANY_CONTACTS_CREATE';
public const COMPANY_CONTACTS_DELETE = 'COMPANY_CONTACTS_DELETE';
public const COMPANY_CONTACTS_UPDATE = 'COMPANY_CONTACTS_UPDATE';
public const COMPANY_CONTACT_ROLES_ASSIGN = 'COMPANY_CONTACT_ROLES_ASSIGN';
public const COMPANY_CONTACT_ROLES_REVOKE = 'COMPANY_CONTACT_ROLES_REVOKE';
public const COMPANY_LOCATIONS_CREATE = 'COMPANY_LOCATIONS_CREATE';
public const COMPANY_LOCATIONS_DELETE = 'COMPANY_LOCATIONS_DELETE';
public const COMPANY_LOCATIONS_UPDATE = 'COMPANY_LOCATIONS_UPDATE';
public const CUSTOMERS_CREATE = 'CUSTOMERS_CREATE';
public const CUSTOMERS_DELETE = 'CUSTOMERS_DELETE';
public const CUSTOMERS_DISABLE = 'CUSTOMERS_DISABLE';
public const CUSTOMERS_EMAIL_MARKETING_CONSENT_UPDATE = 'CUSTOMERS_EMAIL_MARKETING_CONSENT_UPDATE';
public const CUSTOMERS_ENABLE = 'CUSTOMERS_ENABLE';
public const CUSTOMERS_MARKETING_CONSENT_UPDATE = 'CUSTOMERS_MARKETING_CONSENT_UPDATE';
public const CUSTOMERS_MERGE = 'CUSTOMERS_MERGE';
public const CUSTOMERS_UPDATE = 'CUSTOMERS_UPDATE';
public const CUSTOMER_ACCOUNT_SETTINGS_UPDATE = 'CUSTOMER_ACCOUNT_SETTINGS_UPDATE';
public const CUSTOMER_GROUPS_CREATE = 'CUSTOMER_GROUPS_CREATE';
public const CUSTOMER_GROUPS_DELETE = 'CUSTOMER_GROUPS_DELETE';
public const CUSTOMER_GROUPS_UPDATE = 'CUSTOMER_GROUPS_UPDATE';
public const CUSTOMER_PAYMENT_METHODS_CREATE = 'CUSTOMER_PAYMENT_METHODS_CREATE';
public const CUSTOMER_PAYMENT_METHODS_REVOKE = 'CUSTOMER_PAYMENT_METHODS_REVOKE';
public const CUSTOMER_PAYMENT_METHODS_UPDATE = 'CUSTOMER_PAYMENT_METHODS_UPDATE';
public const CUSTOMER_TAGS_ADDED = 'CUSTOMER_TAGS_ADDED';
public const CUSTOMER_TAGS_REMOVED = 'CUSTOMER_TAGS_REMOVED';
public const DISCOUNTS_CREATE = 'DISCOUNTS_CREATE';
public const DISCOUNTS_DELETE = 'DISCOUNTS_DELETE';
public const DISCOUNTS_REDEEMCODE_ADDED = 'DISCOUNTS_REDEEMCODE_ADDED';
public const DISCOUNTS_REDEEMCODE_REMOVED = 'DISCOUNTS_REDEEMCODE_REMOVED';
public const DISCOUNTS_UPDATE = 'DISCOUNTS_UPDATE';
public const DISPUTES_CREATE = 'DISPUTES_CREATE';
public const DISPUTES_UPDATE = 'DISPUTES_UPDATE';
public const DOMAINS_CREATE = 'DOMAINS_CREATE';
Expand All @@ -56,6 +81,28 @@ final class Topics
public const FULFILLMENTS_UPDATE = 'FULFILLMENTS_UPDATE';
public const FULFILLMENT_EVENTS_CREATE = 'FULFILLMENT_EVENTS_CREATE';
public const FULFILLMENT_EVENTS_DELETE = 'FULFILLMENT_EVENTS_DELETE';
public const FULFILLMENT_ORDERS_CANCELLATION_REQUEST_ACCEPTED = 'FULFILLMENT_ORDERS_CANCELLATION_REQUEST_ACCEPTED';
public const FULFILLMENT_ORDERS_CANCELLATION_REQUEST_REJECTED = 'FULFILLMENT_ORDERS_CANCELLATION_REQUEST_REJECTED';
public const FULFILLMENT_ORDERS_CANCELLATION_REQUEST_SUBMITTED =
'FULFILLMENT_ORDERS_CANCELLATION_REQUEST_SUBMITTED';
public const FULFILLMENT_ORDERS_CANCELLED = 'FULFILLMENT_ORDERS_CANCELLED';
public const FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_ACCEPTED = 'FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_ACCEPTED';
public const FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_REJECTED = 'FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_REJECTED';
public const FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_SUBMITTED = 'FULFILLMENT_ORDERS_FULFILLMENT_REQUEST_SUBMITTED';
public const FULFILLMENT_ORDERS_FULFILLMENT_SERVICE_FAILED_TO_COMPLETE =
'FULFILLMENT_ORDERS_FULFILLMENT_SERVICE_FAILED_TO_COMPLETE';
public const FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_LOCAL_DELIVERY =
'FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_LOCAL_DELIVERY';
public const FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_PICKUP =
'FULFILLMENT_ORDERS_LINE_ITEMS_PREPARED_FOR_PICKUP';
public const FULFILLMENT_ORDERS_MERGED = 'FULFILLMENT_ORDERS_MERGED';
public const FULFILLMENT_ORDERS_MOVED = 'FULFILLMENT_ORDERS_MOVED';
public const FULFILLMENT_ORDERS_ORDER_ROUTING_COMPLETE = 'FULFILLMENT_ORDERS_ORDER_ROUTING_COMPLETE';
public const FULFILLMENT_ORDERS_PLACED_ON_HOLD = 'FULFILLMENT_ORDERS_PLACED_ON_HOLD';
public const FULFILLMENT_ORDERS_RESCHEDULED = 'FULFILLMENT_ORDERS_RESCHEDULED';
public const FULFILLMENT_ORDERS_SCHEDULED_FULFILLMENT_ORDER_READY =
'FULFILLMENT_ORDERS_SCHEDULED_FULFILLMENT_ORDER_READY';
public const FULFILLMENT_ORDERS_SPLIT = 'FULFILLMENT_ORDERS_SPLIT';
public const INVENTORY_ITEMS_CREATE = 'INVENTORY_ITEMS_CREATE';
public const INVENTORY_ITEMS_DELETE = 'INVENTORY_ITEMS_DELETE';
public const INVENTORY_ITEMS_UPDATE = 'INVENTORY_ITEMS_UPDATE';
Expand All @@ -64,21 +111,40 @@ final class Topics
public const INVENTORY_LEVELS_UPDATE = 'INVENTORY_LEVELS_UPDATE';
public const LOCALES_CREATE = 'LOCALES_CREATE';
public const LOCALES_UPDATE = 'LOCALES_UPDATE';
public const LOCATIONS_ACTIVATE = 'LOCATIONS_ACTIVATE';
public const LOCATIONS_CREATE = 'LOCATIONS_CREATE';
public const LOCATIONS_DEACTIVATE = 'LOCATIONS_DEACTIVATE';
public const LOCATIONS_DELETE = 'LOCATIONS_DELETE';
public const LOCATIONS_UPDATE = 'LOCATIONS_UPDATE';
public const MARKETS_CREATE = 'MARKETS_CREATE';
public const MARKETS_DELETE = 'MARKETS_DELETE';
public const MARKETS_UPDATE = 'MARKETS_UPDATE';
public const METAOBJECTS_CREATE = 'METAOBJECTS_CREATE';
public const METAOBJECTS_DELETE = 'METAOBJECTS_DELETE';
public const METAOBJECTS_UPDATE = 'METAOBJECTS_UPDATE';
public const ORDERS_CANCELLED = 'ORDERS_CANCELLED';
public const ORDERS_CREATE = 'ORDERS_CREATE';
public const ORDERS_DELETE = 'ORDERS_DELETE';
public const ORDERS_EDITED = 'ORDERS_EDITED';
public const ORDERS_FULFILLED = 'ORDERS_FULFILLED';
public const ORDERS_PAID = 'ORDERS_PAID';
public const ORDERS_PARTIALLY_FULFILLED = 'ORDERS_PARTIALLY_FULFILLED';
public const ORDERS_RISK_ASSESSMENT_CHANGED = 'ORDERS_RISK_ASSESSMENT_CHANGED';
public const ORDERS_SHOPIFY_PROTECT_ELIGIBILITY_CHANGED = 'ORDERS_SHOPIFY_PROTECT_ELIGIBILITY_CHANGED';
public const ORDERS_UPDATED = 'ORDERS_UPDATED';
public const ORDER_TRANSACTIONS_CREATE = 'ORDER_TRANSACTIONS_CREATE';
public const PAYMENT_SCHEDULES_DUE = 'PAYMENT_SCHEDULES_DUE';
public const PAYMENT_TERMS_CREATE = 'PAYMENT_TERMS_CREATE';
public const PAYMENT_TERMS_DELETE = 'PAYMENT_TERMS_DELETE';
public const PAYMENT_TERMS_UPDATE = 'PAYMENT_TERMS_UPDATE';
public const PRODUCTS_CREATE = 'PRODUCTS_CREATE';
public const PRODUCTS_DELETE = 'PRODUCTS_DELETE';
public const PRODUCTS_UPDATE = 'PRODUCTS_UPDATE';
public const PRODUCT_FEEDS_CREATE = 'PRODUCT_FEEDS_CREATE';
public const PRODUCT_FEEDS_FULL_SYNC = 'PRODUCT_FEEDS_FULL_SYNC';
public const PRODUCT_FEEDS_FULL_SYNC_FINISH = 'PRODUCT_FEEDS_FULL_SYNC_FINISH';
public const PRODUCT_FEEDS_INCREMENTAL_SYNC = 'PRODUCT_FEEDS_INCREMENTAL_SYNC';
public const PRODUCT_FEEDS_UPDATE = 'PRODUCT_FEEDS_UPDATE';
public const PRODUCT_LISTINGS_ADD = 'PRODUCT_LISTINGS_ADD';
public const PRODUCT_LISTINGS_REMOVE = 'PRODUCT_LISTINGS_REMOVE';
public const PRODUCT_LISTINGS_UPDATE = 'PRODUCT_LISTINGS_UPDATE';
Expand All @@ -88,14 +154,45 @@ final class Topics
public const PROFILES_CREATE = 'PROFILES_CREATE';
public const PROFILES_DELETE = 'PROFILES_DELETE';
public const PROFILES_UPDATE = 'PROFILES_UPDATE';
public const PUBLICATIONS_DELETE = 'PUBLICATIONS_DELETE';
public const REFUNDS_CREATE = 'REFUNDS_CREATE';
public const RETURNS_APPROVE = 'RETURNS_APPROVE';
public const RETURNS_CANCEL = 'RETURNS_CANCEL';
public const RETURNS_CLOSE = 'RETURNS_CLOSE';
public const RETURNS_DECLINE = 'RETURNS_DECLINE';
public const RETURNS_REOPEN = 'RETURNS_REOPEN';
public const RETURNS_REQUEST = 'RETURNS_REQUEST';
public const RETURNS_UPDATE = 'RETURNS_UPDATE';
public const REVERSE_DELIVERIES_ATTACH_DELIVERABLE = 'REVERSE_DELIVERIES_ATTACH_DELIVERABLE';
public const REVERSE_FULFILLMENT_ORDERS_DISPOSE = 'REVERSE_FULFILLMENT_ORDERS_DISPOSE';
public const SCHEDULED_PRODUCT_LISTINGS_ADD = 'SCHEDULED_PRODUCT_LISTINGS_ADD';
public const SCHEDULED_PRODUCT_LISTINGS_REMOVE = 'SCHEDULED_PRODUCT_LISTINGS_REMOVE';
public const SCHEDULED_PRODUCT_LISTINGS_UPDATE = 'SCHEDULED_PRODUCT_LISTINGS_UPDATE';
public const SEGMENTS_CREATE = 'SEGMENTS_CREATE';
public const SEGMENTS_DELETE = 'SEGMENTS_DELETE';
public const SEGMENTS_UPDATE = 'SEGMENTS_UPDATE';
public const SELLING_PLAN_GROUPS_CREATE = 'SELLING_PLAN_GROUPS_CREATE';
public const SELLING_PLAN_GROUPS_DELETE = 'SELLING_PLAN_GROUPS_DELETE';
public const SELLING_PLAN_GROUPS_UPDATE = 'SELLING_PLAN_GROUPS_UPDATE';
public const SHIPPING_ADDRESSES_CREATE = 'SHIPPING_ADDRESSES_CREATE';
public const SHIPPING_ADDRESSES_UPDATE = 'SHIPPING_ADDRESSES_UPDATE';
public const SHOP_UPDATE = 'SHOP_UPDATE';
public const SUBSCRIPTION_BILLING_ATTEMPTS_CHALLENGED = 'SUBSCRIPTION_BILLING_ATTEMPTS_CHALLENGED';
public const SUBSCRIPTION_BILLING_ATTEMPTS_FAILURE = 'SUBSCRIPTION_BILLING_ATTEMPTS_FAILURE';
public const SUBSCRIPTION_BILLING_ATTEMPTS_SUCCESS = 'SUBSCRIPTION_BILLING_ATTEMPTS_SUCCESS';
public const SUBSCRIPTION_BILLING_CYCLES_SKIP = 'SUBSCRIPTION_BILLING_CYCLES_SKIP';
public const SUBSCRIPTION_BILLING_CYCLES_UNSKIP = 'SUBSCRIPTION_BILLING_CYCLES_UNSKIP';
public const SUBSCRIPTION_BILLING_CYCLE_EDITS_CREATE = 'SUBSCRIPTION_BILLING_CYCLE_EDITS_CREATE';
public const SUBSCRIPTION_BILLING_CYCLE_EDITS_DELETE = 'SUBSCRIPTION_BILLING_CYCLE_EDITS_DELETE';
public const SUBSCRIPTION_BILLING_CYCLE_EDITS_UPDATE = 'SUBSCRIPTION_BILLING_CYCLE_EDITS_UPDATE';
public const SUBSCRIPTION_CONTRACTS_ACTIVATE = 'SUBSCRIPTION_CONTRACTS_ACTIVATE';
public const SUBSCRIPTION_CONTRACTS_CANCEL = 'SUBSCRIPTION_CONTRACTS_CANCEL';
public const SUBSCRIPTION_CONTRACTS_EXPIRE = 'SUBSCRIPTION_CONTRACTS_EXPIRE';
public const SUBSCRIPTION_CONTRACTS_FAIL = 'SUBSCRIPTION_CONTRACTS_FAIL';
public const SUBSCRIPTION_CONTRACTS_PAUSE = 'SUBSCRIPTION_CONTRACTS_PAUSE';
public const SUBSCRIPTION_CONTRACTS_CREATE = 'SUBSCRIPTION_CONTRACTS_CREATE';
public const SUBSCRIPTION_CONTRACTS_UPDATE = 'SUBSCRIPTION_CONTRACTS_UPDATE';
public const TAX_PARTNERS_UPDATE = 'TAX_PARTNERS_UPDATE';
public const TAX_SERVICES_CREATE = 'TAX_SERVICES_CREATE';
public const TAX_SERVICES_UPDATE = 'TAX_SERVICES_UPDATE';
public const TENDER_TRANSACTIONS_CREATE = 'TENDER_TRANSACTIONS_CREATE';
Expand Down
18 changes: 18 additions & 0 deletions tests/Clients/BaseRestResourceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,24 @@ public function testFindsWithParam()
$this->assertEquals([1, "attribute"], [$resource->id, $resource->attribute]);
}

public function testFindsWithFalseyParams()
{
$body = ["fake_resource" => ["id" => 1, "attribute" => "attribute"]];

$this->mockTransportRequests([
new MockRequest(
$this->buildMockHttpResponse(200, $body),
"{$this->prefix}/fake_resources/1.json?zero_param=0",
"GET",
null,
["X-Shopify-Access-Token: access-token"],
),
]);

$resource = FakeResource::find($this->session, 1, ["zero_param" => "0", "empty_param" => ""]);
$this->assertEquals([1, "attribute"], [$resource->id, $resource->attribute]);
}

public function testFindsResourceAndChildrenById()
{
$body = ["fake_resource" => [
Expand Down

0 comments on commit 3e0fa9e

Please sign in to comment.