@things-factory/integration-marketplace 7.0.24 → 7.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@ exports.Shopify = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
5
5
|
const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
|
6
6
|
const crypto_1 = tslib_1.__importDefault(require("crypto"));
|
7
|
-
const
|
7
|
+
const url_1 = require("url");
|
8
8
|
const debug = require('debug')('things-factory:integration-marketplace:shopify');
|
9
9
|
class Shopify {
|
10
10
|
constructor(config) {
|
@@ -27,7 +27,7 @@ class Shopify {
|
|
27
27
|
isValidSignature(query) {
|
28
28
|
const { apiSecret } = this.config;
|
29
29
|
const { hmac } = query, params = tslib_1.__rest(query, ["hmac"]);
|
30
|
-
const queryParams =
|
30
|
+
const queryParams = new url_1.URLSearchParams(params).toString();
|
31
31
|
return hmac === crypto_1.default.createHmac('sha256', apiSecret).update(queryParams).digest('hex');
|
32
32
|
}
|
33
33
|
verifyWebhook(request, hmac, webhookKey) {
|
@@ -35,9 +35,7 @@ class Shopify {
|
|
35
35
|
}
|
36
36
|
async get(path, data) {
|
37
37
|
const { shop, accessToken } = this.config;
|
38
|
-
const qs =
|
39
|
-
.map(([k, v]) => `${k}=${encodeURIComponent(String(v))}`)
|
40
|
-
.join('&');
|
38
|
+
const qs = new url_1.URLSearchParams(data).toString();
|
41
39
|
const endpoint = `https://${shop}.myshopify.com/admin/api/2020-01${path}${qs ? '?' + qs : ''}`;
|
42
40
|
debug('endpoint', endpoint);
|
43
41
|
const response = await (0, node_fetch_1.default)(endpoint, {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"shopify.js","sourceRoot":"","sources":["../../../server/controllers/shopify/shopify.ts"],"names":[],"mappings":";;;;AAAA,oEAA8B;AAC9B,4DAA2B;AAC3B,
|
1
|
+
{"version":3,"file":"shopify.js","sourceRoot":"","sources":["../../../server/controllers/shopify/shopify.ts"],"names":[],"mappings":"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","sourcesContent":["import fetch from 'node-fetch'\nimport crypto from 'crypto'\nimport { URLSearchParams } from 'url'\n\nimport { createPayloadLog } from '@things-factory/integration-base'\n\nconst debug = require('debug')('things-factory:integration-marketplace:shopify')\n\nexport type ShopifyConfig = {\n apiKey: string\n apiSecret: string\n shop: string\n accessToken?: string\n}\n\nexport class Shopify {\n private config: ShopifyConfig\n\n constructor(config: ShopifyConfig) {\n this.config = {\n ...config\n }\n }\n\n makeVerificationTokenForNonce() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n buildAuthURL(redirectUrl, nonce) {\n // regarding accessMode refer to https://shopify.dev/tutorials/authenticate-with-oauth#step-2-ask-for-permission\n // and https://community.shopify.com/c/API-Announcements/Shopify-now-offers-two-types-of-API-access-tokens/td-p/315398\n // so, accessMode should be 'offline'\n // var accessMode = 'per-user'\n\n // TODO make scopes properly\n var scopes = 'read_products,write_orders,read_customers,read_inventory,write_inventory'\n\n var { shop, apiKey } = this.config\n\n // return `https://${shop}.myshopify.com/admin/oauth/authorize?client_id=${apiKey}&scope=${scopes}&redirect_uri=${redirectUrl}&state=${nonce}&grant_options[]=${accessMode}`\n return `https://${shop}.myshopify.com/admin/oauth/authorize?client_id=${apiKey}&scope=${scopes}&redirect_uri=${redirectUrl}&state=${nonce}`\n }\n\n isValidSignature(query) {\n const { apiSecret } = this.config\n const { hmac, ...params } = query\n\n const queryParams = new URLSearchParams(params).toString()\n\n return hmac === crypto.createHmac('sha256', apiSecret).update(queryParams).digest('hex')\n }\n\n verifyWebhook(request, hmac: string, webhookKey) {\n return hmac === crypto.createHmac('sha256', webhookKey).update(request.rawBody.toString()).digest('base64')\n }\n\n async get(path: string, data: any) {\n const { shop, accessToken } = this.config\n\n const qs = new URLSearchParams(data).toString()\n\n const endpoint = `https://${shop}.myshopify.com/admin/api/2020-01${path}${qs ? '?' + qs : ''}`\n debug('endpoint', endpoint)\n\n const response = await fetch(endpoint, {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Shopify-Access-Token': accessToken\n }\n })\n\n const callLimit = response.headers.get('x-shopify-shop-api-call-limit')\n debug('call-limit', callLimit)\n\n const retryAfter = response.headers.get('retry-after')\n\n const link = response.headers.get('link')\n var result = await response.json()\n result.link = link\n\n // try {\n // createPayloadLog(shop, path, qs || '', result, {\n // state: { domain: null }\n // })\n // } catch (e) {}\n debug('response result', result)\n\n return result\n }\n\n async post(path: string, data: any = {}) {\n const { shop, accessToken } = this.config\n\n debug('data', data)\n\n const jsondata = JSON.stringify(data)\n\n const endpoint = `https://${shop}.myshopify.com/admin/api/2020-01${path}`\n\n const response = await fetch(endpoint, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Shopify-Access-Token': accessToken\n },\n body: jsondata\n })\n\n const result = await response.json()\n // try {\n // createPayloadLog(shop, path, jsondata, result, {\n // state: { domain: null }\n // })\n // } catch (e) {}\n debug('response result', result)\n\n return result\n }\n\n async put(path: string, data: any = {}) {\n const { shop, accessToken } = this.config\n\n debug('data', data)\n\n const jsondata = JSON.stringify(data)\n\n const endpoint = `https://${shop}.myshopify.com/admin/api/2020-01${path}`\n\n const response = await fetch(endpoint, {\n method: 'put',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Shopify-Access-Token': accessToken\n },\n body: jsondata\n })\n\n const result = await response.json()\n // try {\n // createPayloadLog(shop, path, jsondata, result, {\n // state: { domain: null }\n // })\n // } catch (e) {}\n debug('response result', result)\n\n return result\n }\n}\n"]}
|