# Shopify

vendor/Shopify.js

## Shopify()

Interact with the Shopify Admin API.

**Returns**

* `Void`

## request()

Make a request to a Shopify site.

This is just a wrapper to Mesa.shopify.request.

**Returns**

* `Void`

## Shopify.get(path\[, options, connectionInfo])

Make a GET request to a Shopify site.

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## handleImageList(path, options, connectionInfo)

Handles listing of images with pagination.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Array` Array of images in REST format.

## handleImage(originalPath, options, connectionInfo)

Handles retrieval of a single image by its ID for a specific product.

**Parameters**

| Name           | Type                                     | Description                                        |   |
| -------------- | ---------------------------------------- | -------------------------------------------------- | - |
| originalPath   | `string`                                 | - Original API endpoint path.                      |   |
| options        | [Options](#object-options)               | - Query options (not used in this implementation). |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Connection information for Shopify.              |   |

**Returns**

* `Object` Processed image data in REST format.

## handleProductCount(options, connectionInfo)

Handles the product count query.

**Parameters**

| Name           | Type | Description |   |
| -------------- | ---- | ----------- | - |
| options        |      |             |   |
| connectionInfo |      |             |   |

**Returns**

*

## handlePaginatedGraphQLQuery(queryFunction, options, transformFunction, connectionInfo)

Handles paginated GraphQL queries for products or variants.

**Parameters**

| Name              | Type       | Description                                                             |   |
| ----------------- | ---------- | ----------------------------------------------------------------------- | - |
| queryFunction     | `Function` | - Function that generates a GraphQL query.                              |   |
| options           | `Object`   | - Query options, including filters and limits.                          |   |
| transformFunction | `Function` | - Function to transform the returned data into the desired REST format. |   |
| connectionInfo    | `Object`   | - Optional connection info for external Shopify sites.                  |   |

**Returns**

* `Array` Array of transformed paginated results.

## handleProductList(path, options, connectionInfo)

Handles listing of products with pagination.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Array` Array of products in REST format.

## Shopify.handleProduct(originalPath, options, connectionInfo)

Retrieve a single product by ID using GraphQL and convert it to REST format.

**Parameters**

| Name           | Type                                     | Description                                            |   |
| -------------- | ---------------------------------------- | ------------------------------------------------------ | - |
| originalPath   | `string`                                 | - Original API endpoint path.                          |   |
| options        | [Options](#object-options)               | - Options containing query parameters.                 |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Connection information for a separate Shopify store. |   |

**Returns**

* `object` Product data in REST format.

## Shopify.handleProductPost(data\[, connectionInfo])

Handles the creation of a product and its variants, if provided. Converts the REST payload into the appropriate GraphQL format.

**Parameters**

| Name           | Type                                     | Description                            |            |
| -------------- | ---------------------------------------- | -------------------------------------- | ---------- |
| data           | `Object`                                 | - The product data in REST API format. |            |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Connection information for Shopify.  | *Optional* |

**Returns**

* `Object` - The product payload in REST API format.

## handleVariantList(path, options, connectionInfo)

Handles listing of variants with pagination.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Array` Array of variants in REST format.

## Shopify.handleVariant(originalPath, options, connectionInfo)

Retrieve a specific variant by product ID and variant ID using GraphQL and convert it to REST format.

**Parameters**

| Name           | Type                                     | Description                                            |   |
| -------------- | ---------------------------------------- | ------------------------------------------------------ | - |
| originalPath   | `string`                                 | - Original API endpoint path.                          |   |
| options        | [Options](#object-options)               | - Options containing query parameters.                 |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Connection information for a separate Shopify store. |   |

**Returns**

* `object` Variant data in REST format.

## handleImagePost(data, connectionInfo)

Handles the creation of a product image. Converts the REST payload to GraphQL format and returns the response in REST format.

**Parameters**

| Name           | Type                                     | Description                |   |
| -------------- | ---------------------------------------- | -------------------------- | - |
| data           | `Object`                                 | - The REST image payload.  |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Shopify connection info. |   |

**Returns**

* `Object` - The image payload in REST format.

## send(query, variables, connectionInfo, endpoint)

Send a GraphQL query to Shopify.

**Parameters**

| Name           | Type | Description |   |
| -------------- | ---- | ----------- | - |
| query          |      |             |   |
| variables      |      |             |   |
| connectionInfo |      |             |   |
| endpoint       |      |             |   |

**Returns**

* `object`

## Shopify.post(path, data\[, options, connectionInfo])

Make a POST request to a Shopify site.

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.post('/admin/products.json', data) will result in { "product": { data } } use options.skipJsonWrap=true to override this behavior

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| data           | `object`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## handleVariantPut(productId, variantId, data, connectionInfo)

Handles updating a single variant for a specific product.

**Parameters**

| Name           | Type                                     | Description                   |   |
| -------------- | ---------------------------------------- | ----------------------------- | - |
| productId      | `string`                                 | - The ID of the product.      |   |
| variantId      | `string`                                 | - The ID of the variant.      |   |
| data           | `Object`                                 | - The variant data to update. |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Shopify connection details. |   |

**Returns**

* `Object` - The updated variant in REST format.

## handleProductPut(productId, data, connectionInfo)

Handles the updating of a product and its related entities (variants, images, etc.).

**Parameters**

| Name           | Type                                     | Description                        |   |
| -------------- | ---------------------------------------- | ---------------------------------- | - |
| productId      | `string`                                 | - The ID of the product to update. |   |
| data           | `Object`                                 | - The product data to update.      |   |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | - Shopify connection details.      |   |

**Returns**

* `Object` - The updated product in REST format.

## Shopify.put(path, data\[, options, connectionInfo])

Make a PUT request to a Shopify site.

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.put('/admin/products.json', data) will result in { "product": { data } } use options.skipJsonWrap=true to override this behavior

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| data           | `object`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## Shopify.patch(path, data\[, options, connectionInfo])

Make a PATCH request to a Shopify site.

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.patch('/admin/products.json', data) will result in { "product": { data } } use options.skipJsonWrap=true to override this behavior

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| data           | `object`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## Shopify.delete(path\[, options, connectionInfo])

Make a DELETE request to a Shopify site.

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.post('/admin/products.json', data) will result in { "product": { data } } use options.skipJsonWrap=true to override this behavior

**Parameters**

| Name           | Type                                     | Description                                                                                                                                          |            |
| -------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| path           | `string`                                 |                                                                                                                                                      |            |
| options        | [Options](#object-options)               | Additional configuration for Shopify calls                                                                                                           | *Optional* |
| connectionInfo | [ConnectionInfo](#object-connectioninfo) | If you would like to connect to a separate Shopify website that Mesa is not installed on, create a Custom App and include a `connectionInfo` object. | *Optional* |

**Returns**

* `object`

## getMyshopifyDomain(context)

Returns myshopify domain from the connection.

**Parameters**

| Name    | Type | Description |   |
| ------- | ---- | ----------- | - |
| context |      |             |   |

**Returns**

* `string` The myshopify domain. Ex: mystore.myshopify.com

## getShopifyAdminUrl(context)

Returns myshopify domain from the connection.

**Parameters**

| Name    | Type | Description |   |
| ------- | ---- | ----------- | - |
| context |      |             |   |

**Returns**

* `string` The Shopify admin url, including https\://. Ex: <https://admin.shopify.com/store/mystore>

## getShopifyUuid(context)

Returns the subdomain part of the myshopify domain from the connection.

**Parameters**

| Name    | Type | Description |   |
| ------- | ---- | ----------- | - |
| context |      |             |   |

**Returns**

* `string` The subdomain part of the myshopify domain. Ex: mystore

## deleteProduct(path, options, connectionInfo)

Delete a product by ID.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Void`

## deleteVariant(path, options, connectionInfo)

Delete a variant by ID.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Void`

## deleteImage(path, options, connectionInfo)

Delete a product image by ID.

**Parameters**

| Name           | Type     | Description                                   |   |
| -------------- | -------- | --------------------------------------------- | - |
| path           | `string` | - Shopify REST endpoint path.                 |   |
| options        | `Object` | - Query options.                              |   |
| connectionInfo | `Object` | - Connection info for external Shopify sites. |   |

**Returns**

* `Void`

## getAllProducts(\[query={}, limit=250])

Make consecutive calls to Shopify in order to retrieve all products. <https://help.shopify.com/en/api/reference/products/product>

**Parameters**

| Name      | Type     | Description                                      |            |
| --------- | -------- | ------------------------------------------------ | ---------- |
| query={}  | `object` | Parameters to append to the Shopify querystring. | *Optional* |
| limit=250 | `number` | Result count for Shopify query.                  | *Optional* |

**Examples**

```javascript
// returns array of all products
const Shopify = require('vendor/Shopify.js');
Shopify.getAllProducts();
```

**Returns**

* `array`

## appendToArray(\[data], The)

Update a value if it already exists, or append it to the array if it does not exist. The example routine below should be every time we are updating `tags` or `note_attributes` to ensure that multiple Automations will work nicely with each other and not overwrite values set in other Automations.

**Parameters**

| Name | Type              | Description                                                                                                         |            |
| ---- | ----------------- | ------------------------------------------------------------------------------------------------------------------- | ---------- |
| data | `array`           | An array of values that you would like to append a value to                                                         | *Optional* |
| The  | `string` `object` | value to append to the array. For `tags`, this would be a `string`. For `note_attributes`, this would be an object. |            |

**Examples**

```javascript
Mesa.log.debug('Calling shopify to get the latest order note_attributes');
const order = Shopify.get(`admin/orders/${payload.id}.json`);
let noteAttributes = order.order.note_attributes;
noteAttributes = Shopify.appendToArray(noteAttributes, {
  name: 'dob',
  value: 'Jan 1 2000',
});
```

**Returns**

* `array`

## getVariantInventoryData(variantId)

Get inventory location information for a Shopify variant. <https://help.shopify.com/en/api/reference/inventory/inventorylevel>

**Parameters**

| Name      | Type     | Description         |   |
| --------- | -------- | ------------------- | - |
| variantId | `number` | Shopify variant id. |   |

**Examples**

```javascript
// returns { inventory_item_id: {number}, [ { inventory_levels: { inventory_item_id: {number}, location_id: {number}, available: {number}, updated_at: {string} } ] }
const Shopify = require('vendor/Shopify.js');
Shopify.getVariantInventoryData(123456);
```

**Returns**

* `&lt;a href&#x3D;&quot;#object-inventorydata&quot;&gt;InventoryData&lt;/a&gt;`

## buildVariantInventoryUpdate(variantId, inventoryCount\[, adjust=true, fulfillableAlter])

Build InventoryLevel update information for a Shopify variant. <https://help.shopify.com/en/api/reference/inventory/inventorylevel>

**Parameters**

| Name             | Type                                  | Description                                                  |            |
| ---------------- | ------------------------------------- | ------------------------------------------------------------ | ---------- |
| variantId        | `number`                              | Shopify variant id.                                          |            |
| inventoryCount   | `number`                              | Value to set as inventory.                                   |            |
| adjust=true      | `bool`                                | Switch for available\_adjustment vs available.               | *Optional* |
| fulfillableAlter | [fulfillableAlter](#fulfillablealter) | Callback function allows fulfillment location to be altered. | *Optional* |

**Examples**

```javascript
// note string for location_id, as it is required by Shopify API post
// returns { inventory_item_id: {number}, location_id: {string}, available|available_adjustment: {number} } ] }
const Shopify = require('vendor/Shopify.js');
Shopify.buildVariantInventoryUpdate(123456, 10, true | false);
```

**Returns**

* `&lt;a href&#x3D;&quot;#object-inventoryupdatedata&quot;&gt;InventoryUpdateData&lt;/a&gt;`

## {Object} Options()

options parameter for Shopify calls

By default Shopify calls will auto-wrap any outgoing JSON data, eg. Shopify.post('/admin/products.json', data) will result in { "product": { data } } use skipJsonWrap=true to override this behavior

**Properties**

**Returns**

* `Void`

## {Object} ConnectionInfo()

connectionInfo parameter for Shopify calls

**Properties**

**Returns**

* `Void`

## {Object} FulfillableLocation()

Fulfillable location shape returned by fulfillableAlter <https://help.shopify.com/en/api/reference/inventory/location>

**Parameters**

| Name         | Type     | Description                                                 |   |
| ------------ | -------- | ----------------------------------------------------------- | - |
| location\_id | `number` | The ID of the location that the inventory level belongs to. |   |

**Returns**

* `Void`

## {Function} fulfillableAlter(inventoryLevels)

Callback allows buildVariantInventoryUpdate fulfillment location to be altered. <https://help.shopify.com/en/api/reference/inventory/inventorylevel>

**Parameters**

| Name                                | Type                     | Description                                              |   |
| ----------------------------------- | ------------------------ | -------------------------------------------------------- | - |
| inventoryLevels                     | `Array.&#60;Object&#62;` | Inventory levels for the variant at different locations. |   |
| inventoryLevels.inventory\_item\_id | `number`                 | Inventory item id for variant                            |   |
| inventoryLevels.location\_id        | `number`                 | Location id                                              |   |
| inventoryLevels.available           | `number`                 | Inventory count                                          |   |
| inventoryLevels.updated\_at         | `string`                 | Last updated                                             |   |

**Returns**

* `&lt;a href&#x3D;&quot;#object-fulfillablelocation&quot;&gt;FulfillableLocation&lt;/a&gt;` fulfillableLocation

## {Object} InventoryData()

Return from getVariantInventoryData.

**Properties**

**Returns**

* `Void`

## {Object} InventoryUpdateData()

Return from buildVariantInventoryUpdate. Will either have available or available\_adjustment depending on adjust param. <https://help.shopify.com/en/api/reference/inventory/inventorylevel>

**Properties**

**Returns**

* `Void`
