@things-factory/integration-marketplace 9.0.0-beta.5 → 9.0.0-beta.52

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.
@@ -1,2 +1,2 @@
1
- import './connector';
2
- import './task';
1
+ import './connector/index.js';
2
+ import './task/index.js';
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- require("./connector");
4
- require("./task");
3
+ require("./connector/index.js");
4
+ require("./task/index.js");
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/engine/index.ts"],"names":[],"mappings":";;AAAA,uBAAoB;AACpB,kBAAe","sourcesContent":["import './connector'\nimport './task'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/engine/index.ts"],"names":[],"mappings":";;AAAA,gCAA6B;AAC7B,2BAAwB","sourcesContent":["import './connector/index.js'\nimport './task/index.js'\n"]}
@@ -11,9 +11,9 @@ const magento_1 = require("../controllers/magento");
11
11
  const entities_1 = require("../entities");
12
12
  const constants_1 = require("../graphql/constants");
13
13
  const debug = require('debug')('things-factory:integration-marketplace:magento-private-router');
14
- const isPathBaseDomain = !env_1.config.get('subdomain') && !env_1.config.get('useVirtualHostBasedDomain');
14
+ const isPathBaseDomain = !env_1.config.get('subdomain');
15
15
  exports.magentoPrivateRouter = new koa_router_1.default();
16
- exports.magentoPrivateRouter.get(`${isPathBaseDomain ? '/domain/:domain' : ''}/callback-magento-pre-install`, async (context, next) => {
16
+ exports.magentoPrivateRouter.get(`${isPathBaseDomain ? `/${(0, shell_1.getRoutePrefixForDomainType)()}/:domain` : ''}/callback-magento-pre-install`, async (context, next) => {
17
17
  const { domain, user } = context.state;
18
18
  const { store_base_url: storeURL, oauth_verifier: oauthVerifier, oauth_consumer_key: accessKey, oauth_consumer_secret: accessSecret } = process['MagentoInstallSessions'];
19
19
  // const {
@@ -130,6 +130,6 @@ exports.magentoPrivateRouter.get(`${isPathBaseDomain ? '/domain/:domain' : ''}/c
130
130
  }
131
131
  });
132
132
  var message = 'success to activate';
133
- context.redirect(`${(0, shell_1.getRedirectSubdomainPath)(context, domain.subdomain)}marketplace-store-magento/${marketplaceStore.id}/connect-callback?status=${marketplaceStore.status}&message=${message}`);
133
+ context.redirect(`${(0, shell_1.getRedirectSubdomainPath)(context, domain)}marketplace-store-magento/${marketplaceStore.id}/connect-callback?status=${marketplaceStore.status}&message=${message}`);
134
134
  });
135
135
  //# sourceMappingURL=magento-private-router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"magento-private-router.js","sourceRoot":"","sources":["../../server/routers/magento-private-router.ts"],"names":[],"mappings":"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","sourcesContent":["import Router from 'koa-router'\nimport fetch from 'node-fetch'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { config } from '@things-factory/env'\nimport { getRedirectSubdomainPath, getRepository } from '@things-factory/shell'\n\nimport { Magento } from '../controllers/magento'\nimport { MarketplaceSetting, MarketplaceStore } from '../entities'\nimport { STORE_STATUS } from '../graphql/constants'\n\nconst debug = require('debug')('things-factory:integration-marketplace:magento-private-router')\n\nconst isPathBaseDomain = !config.get('subdomain') && !config.get('useVirtualHostBasedDomain')\n\nexport const magentoPrivateRouter = new Router()\n\nexport type MagentoAccessInfo = {\n store_base_url: string\n oauth_verifier: string\n oauth_consumer_key: string\n oauth_consumer_secret: string\n oauth_token?: string\n}\n\nmagentoPrivateRouter.get(\n `${isPathBaseDomain ? '/domain/:domain' : ''}/callback-magento-pre-install`,\n async (context, next) => {\n const { domain, user } = context.state\n\n const {\n store_base_url: storeURL,\n oauth_verifier: oauthVerifier,\n oauth_consumer_key: accessKey,\n oauth_consumer_secret: accessSecret\n } = process['MagentoInstallSessions']\n\n // const {\n // store_base_url: storeURL,\n // oauth_verifier: oauthVerifier,\n // oauth_consumer_key: accessKey,\n // oauth_consumer_secret: accessSecret\n // } = JSON.parse(accessInfoCookies)\n\n // const accessInfoCookies = context.cookies.get('magento-access-info')\n // const {\n // store_base_url: storeURL,\n // oauth_verifier: oauthVerifier,\n // oauth_consumer_key: accessKey,\n // oauth_consumer_secret: accessSecret\n // } = JSON.parse(accessInfoCookies)\n\n const magento = new Magento({ oauthConsumerKey: accessKey, oauthConsumerSecret: accessSecret, shop: storeURL })\n const requestURL: string = `${storeURL}oauth/token/request`\n const requestAuthorizationHeader: string = magento.makeRequestAuthorizationHeader(\n requestURL,\n 'POST',\n accessKey,\n accessSecret\n )\n\n const requestTokenResponse = await fetch(`${requestURL}`, {\n method: 'post',\n headers: {\n Authorization: requestAuthorizationHeader,\n 'Content-Type': 'application/json'\n }\n })\n\n if (!requestTokenResponse.ok) {\n const message = `failed to request token from magento : ${\n requestTokenResponse.status\n }, ${await requestTokenResponse.text()}`\n debug(message)\n context.throw(500, message)\n }\n\n // const requestTokenResponse = new URLSearchParams(\n // 'oauth_token=4cqw0r7vo0s5goyyqnjb72sqj3vxwr0h&oauth_token_secret=rig3x3j5a9z5j6d4ubjwyf9f1l21itrr'\n // )\n\n var requestBody: any = requestTokenResponse.json()\n if (!requestBody.oauth_token) {\n const message = `failed to get oauth-token from magento : ${JSON.stringify(requestBody, null, 2)}`\n debug(message)\n context.throw(500, message)\n }\n\n const accessURL: string = `${storeURL}oauth/token/access`\n const accessAuthorizationHeader: string = magento.makeAccessAuthorizationHeader(\n accessURL,\n 'POST',\n accessKey,\n requestBody.oauth_token,\n oauthVerifier\n )\n const accessTokenResponse = await fetch(`${accessURL}`, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: accessAuthorizationHeader\n },\n body: JSON.stringify({\n oauth_consumer_key: accessKey,\n oauth_consumer_secret: accessSecret\n })\n })\n\n if (!accessTokenResponse.ok) {\n const message = `failed to access token from magento : ${\n accessTokenResponse.status\n }, ${await accessTokenResponse.text()}`\n debug(message)\n context.throw(500, message)\n }\n\n // const accessTokenResponse = new URLSearchParams(\n // 'oauth_token=0lnuajnuzeei2o8xcddii5us77xnb6v0&oauth_token_secret=1c6d2hycnir5ygf39fycs6zhtaagx8pd'\n // )\n\n var accessBody: any = accessTokenResponse.json()\n if (!accessBody.oauth_token) {\n const message = `failed to get access token from magento : ${JSON.stringify(accessBody, null, 2)}`\n debug(message)\n context.throw(500, message)\n }\n\n // need to get or save marketplace-store here\n var marketplaceStore = await getRepository(MarketplaceStore).findOne({\n where: {\n domain: { id: domain.id },\n storeId: oauthVerifier,\n platform: 'magento'\n }\n })\n\n if (!marketplaceStore) {\n marketplaceStore = await getRepository(MarketplaceStore).save({\n domain,\n platform: 'magento',\n name: 'magento-' + oauthVerifier,\n storeId: oauthVerifier,\n countryCode: '',\n accessToken: accessBody.outh_token,\n refreshToken: '',\n accessInfo: accessBody,\n status: STORE_STATUS.ACTIVE,\n creator: user,\n updater: user\n })\n } else {\n var patch = {\n accessToken: accessBody.outh_token,\n refreshToken: '',\n accessInfo: accessBody,\n status: STORE_STATUS.ACTIVE,\n updater: user\n }\n\n marketplaceStore = await getRepository(MarketplaceStore).save({\n ...marketplaceStore,\n ...patch\n })\n }\n\n const marketplaceSettingCategories: any[] = ['stock_allocation', 'marketplace_order_max_weight']\n\n marketplaceSettingCategories.forEach(async category => {\n const foundMarketplaceSetting: MarketplaceSetting = await getRepository(MarketplaceSetting).findOne({\n where: { marketplaceStore: { id: marketplaceStore.id }, domain: { id: domain.id }, category }\n })\n\n if (!foundMarketplaceSetting) {\n const marketplaceSetting = new MarketplaceSetting()\n marketplaceSetting.name = uuidv4()\n marketplaceSetting.marketplaceStore = marketplaceStore\n marketplaceSetting.value = '100'\n marketplaceSetting.category = category\n marketplaceSetting.domain = domain\n marketplaceSetting.creator = user\n await getRepository(MarketplaceSetting).save(marketplaceSetting)\n }\n })\n\n var message = 'success to activate'\n context.redirect(\n `${getRedirectSubdomainPath(context, domain.subdomain)}marketplace-store-magento/${\n marketplaceStore.id\n }/connect-callback?status=${marketplaceStore.status}&message=${message}`\n )\n }\n)\n"]}
1
+ {"version":3,"file":"magento-private-router.js","sourceRoot":"","sources":["../../server/routers/magento-private-router.ts"],"names":[],"mappings":"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","sourcesContent":["import Router from 'koa-router'\nimport fetch from 'node-fetch'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { config } from '@things-factory/env'\nimport { getRedirectSubdomainPath, getRoutePrefixForDomainType, getRepository } from '@things-factory/shell'\n\nimport { Magento } from '../controllers/magento'\nimport { MarketplaceSetting, MarketplaceStore } from '../entities'\nimport { STORE_STATUS } from '../graphql/constants'\n\nconst debug = require('debug')('things-factory:integration-marketplace:magento-private-router')\n\nconst isPathBaseDomain = !config.get('subdomain')\n\nexport const magentoPrivateRouter = new Router()\n\nexport type MagentoAccessInfo = {\n store_base_url: string\n oauth_verifier: string\n oauth_consumer_key: string\n oauth_consumer_secret: string\n oauth_token?: string\n}\n\nmagentoPrivateRouter.get(\n `${isPathBaseDomain ? `/${getRoutePrefixForDomainType()}/:domain` : ''}/callback-magento-pre-install`,\n async (context, next) => {\n const { domain, user } = context.state\n\n const {\n store_base_url: storeURL,\n oauth_verifier: oauthVerifier,\n oauth_consumer_key: accessKey,\n oauth_consumer_secret: accessSecret\n } = process['MagentoInstallSessions']\n\n // const {\n // store_base_url: storeURL,\n // oauth_verifier: oauthVerifier,\n // oauth_consumer_key: accessKey,\n // oauth_consumer_secret: accessSecret\n // } = JSON.parse(accessInfoCookies)\n\n // const accessInfoCookies = context.cookies.get('magento-access-info')\n // const {\n // store_base_url: storeURL,\n // oauth_verifier: oauthVerifier,\n // oauth_consumer_key: accessKey,\n // oauth_consumer_secret: accessSecret\n // } = JSON.parse(accessInfoCookies)\n\n const magento = new Magento({ oauthConsumerKey: accessKey, oauthConsumerSecret: accessSecret, shop: storeURL })\n const requestURL: string = `${storeURL}oauth/token/request`\n const requestAuthorizationHeader: string = magento.makeRequestAuthorizationHeader(\n requestURL,\n 'POST',\n accessKey,\n accessSecret\n )\n\n const requestTokenResponse = await fetch(`${requestURL}`, {\n method: 'post',\n headers: {\n Authorization: requestAuthorizationHeader,\n 'Content-Type': 'application/json'\n }\n })\n\n if (!requestTokenResponse.ok) {\n const message = `failed to request token from magento : ${\n requestTokenResponse.status\n }, ${await requestTokenResponse.text()}`\n debug(message)\n context.throw(500, message)\n }\n\n // const requestTokenResponse = new URLSearchParams(\n // 'oauth_token=4cqw0r7vo0s5goyyqnjb72sqj3vxwr0h&oauth_token_secret=rig3x3j5a9z5j6d4ubjwyf9f1l21itrr'\n // )\n\n var requestBody: any = requestTokenResponse.json()\n if (!requestBody.oauth_token) {\n const message = `failed to get oauth-token from magento : ${JSON.stringify(requestBody, null, 2)}`\n debug(message)\n context.throw(500, message)\n }\n\n const accessURL: string = `${storeURL}oauth/token/access`\n const accessAuthorizationHeader: string = magento.makeAccessAuthorizationHeader(\n accessURL,\n 'POST',\n accessKey,\n requestBody.oauth_token,\n oauthVerifier\n )\n const accessTokenResponse = await fetch(`${accessURL}`, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: accessAuthorizationHeader\n },\n body: JSON.stringify({\n oauth_consumer_key: accessKey,\n oauth_consumer_secret: accessSecret\n })\n })\n\n if (!accessTokenResponse.ok) {\n const message = `failed to access token from magento : ${\n accessTokenResponse.status\n }, ${await accessTokenResponse.text()}`\n debug(message)\n context.throw(500, message)\n }\n\n // const accessTokenResponse = new URLSearchParams(\n // 'oauth_token=0lnuajnuzeei2o8xcddii5us77xnb6v0&oauth_token_secret=1c6d2hycnir5ygf39fycs6zhtaagx8pd'\n // )\n\n var accessBody: any = accessTokenResponse.json()\n if (!accessBody.oauth_token) {\n const message = `failed to get access token from magento : ${JSON.stringify(accessBody, null, 2)}`\n debug(message)\n context.throw(500, message)\n }\n\n // need to get or save marketplace-store here\n var marketplaceStore = await getRepository(MarketplaceStore).findOne({\n where: {\n domain: { id: domain.id },\n storeId: oauthVerifier,\n platform: 'magento'\n }\n })\n\n if (!marketplaceStore) {\n marketplaceStore = await getRepository(MarketplaceStore).save({\n domain,\n platform: 'magento',\n name: 'magento-' + oauthVerifier,\n storeId: oauthVerifier,\n countryCode: '',\n accessToken: accessBody.outh_token,\n refreshToken: '',\n accessInfo: accessBody,\n status: STORE_STATUS.ACTIVE,\n creator: user,\n updater: user\n })\n } else {\n var patch = {\n accessToken: accessBody.outh_token,\n refreshToken: '',\n accessInfo: accessBody,\n status: STORE_STATUS.ACTIVE,\n updater: user\n }\n\n marketplaceStore = await getRepository(MarketplaceStore).save({\n ...marketplaceStore,\n ...patch\n })\n }\n\n const marketplaceSettingCategories: any[] = ['stock_allocation', 'marketplace_order_max_weight']\n\n marketplaceSettingCategories.forEach(async category => {\n const foundMarketplaceSetting: MarketplaceSetting = await getRepository(MarketplaceSetting).findOne({\n where: { marketplaceStore: { id: marketplaceStore.id }, domain: { id: domain.id }, category }\n })\n\n if (!foundMarketplaceSetting) {\n const marketplaceSetting = new MarketplaceSetting()\n marketplaceSetting.name = uuidv4()\n marketplaceSetting.marketplaceStore = marketplaceStore\n marketplaceSetting.value = '100'\n marketplaceSetting.category = category\n marketplaceSetting.domain = domain\n marketplaceSetting.creator = user\n await getRepository(MarketplaceSetting).save(marketplaceSetting)\n }\n })\n\n var message = 'success to activate'\n context.redirect(\n `${getRedirectSubdomainPath(context, domain)}marketplace-store-magento/${\n marketplaceStore.id\n }/connect-callback?status=${marketplaceStore.status}&message=${message}`\n )\n }\n)\n"]}
@@ -8,10 +8,10 @@ const env_1 = require("@things-factory/env");
8
8
  const shell_1 = require("@things-factory/shell");
9
9
  const entities_1 = require("../entities");
10
10
  const constants_1 = require("../graphql/constants");
11
- const isPathBaseDomain = !env_1.config.get('subdomain') && !env_1.config.get('useVirtualHostBasedDomain');
11
+ const isPathBaseDomain = !env_1.config.get('subdomain');
12
12
  const debug = require('debug')('things-factory:integration-marketplace:shopify-install-private-router');
13
13
  exports.shopifyInstallPrivateRouter = new koa_router_1.default();
14
- exports.shopifyInstallPrivateRouter.get(`${isPathBaseDomain ? '/domain/:domain' : ''}/callback-shopify-post-install`, async (context, next) => {
14
+ exports.shopifyInstallPrivateRouter.get(`${isPathBaseDomain ? `/${(0, shell_1.getRoutePrefixForDomainType)()}/:domain` : ''}/callback-shopify-post-install`, async (context, next) => {
15
15
  const { secure } = context;
16
16
  const { domain, user } = context.state;
17
17
  const shopifyCookie = context.cookies.get('shopify-access-token');
@@ -71,6 +71,6 @@ exports.shopifyInstallPrivateRouter.get(`${isPathBaseDomain ? '/domain/:domain'
71
71
  }
72
72
  });
73
73
  var message = 'success to activate';
74
- context.redirect(`${(0, shell_1.getRedirectSubdomainPath)(context, domain.subdomain)}marketplace-store-shopify/${marketplaceStore.id}/connect-callback?status=${marketplaceStore.status}&message=${message}`);
74
+ context.redirect(`${(0, shell_1.getRedirectSubdomainPath)(context, domain)}marketplace-store-shopify/${marketplaceStore.id}/connect-callback?status=${marketplaceStore.status}&message=${message}`);
75
75
  });
76
76
  //# sourceMappingURL=shopify-install-private-router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shopify-install-private-router.js","sourceRoot":"","sources":["../../server/routers/shopify-install-private-router.ts"],"names":[],"mappings":";;;;AAAA,oEAA+B;AAC/B,+BAAmC;AAEnC,6CAA4C;AAC5C,iDAA+E;AAE/E,0CAAkE;AAClE,oDAAmD;AAEnD,MAAM,gBAAgB,GAAG,CAAC,YAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,YAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;AAE7F,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,uEAAuE,CAAC,CAAA;AAE1F,QAAA,2BAA2B,GAAG,IAAI,oBAAM,EAAE,CAAA;AAEvD,mCAA2B,CAAC,GAAG,CAC7B,GAAG,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,gCAAgC,EAC5E,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACtB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC1B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAEtC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IACjE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;IAElD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,EAAE;QAC9C,MAAM;QACN,QAAQ,EAAE,IAAI;KACf,CAAC,CAAA;IAEF,6CAA6C;IAC7C,IAAI,gBAAgB,GAAG,MAAM,IAAA,qBAAa,EAAC,2BAAgB,CAAC,CAAC,OAAO,CAAC;QACnE,KAAK,EAAE;YACL,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,SAAS;SACpB;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,MAAM,IAAA,qBAAa,EAAC,2BAAgB,CAAC,CAAC,IAAI,CAAC;YAC5D,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,UAAU,GAAG,IAAI;YACvB,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,EAAE;YACf,WAAW;YACX,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,aAAa;YACzB,MAAM,EAAE,wBAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,GAAG;YACV,WAAW;YACX,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,aAAa;YACzB,MAAM,EAAE,wBAAY,CAAC,MAAM;YAC3B,OAAO,EAAE,IAAI;SACd,CAAA;QAED,gBAAgB,GAAG,MAAM,IAAA,qBAAa,EAAC,2BAAgB,CAAC,CAAC,IAAI,iCACxD,gBAAgB,GAChB,KAAK,EACR,CAAA;IACJ,CAAC;IAED,MAAM,4BAA4B,GAAU,CAAC,kBAAkB,EAAE,8BAA8B,CAAC,CAAA;IAEhG,4BAA4B,CAAC,OAAO,CAAC,KAAK,EAAC,QAAQ,EAAC,EAAE;QACpD,MAAM,uBAAuB,GAAuB,MAAM,IAAA,qBAAa,EAAC,6BAAkB,CAAC,CAAC,OAAO,CAAC;YAClG,KAAK,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,EAAE,gBAAgB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE;SAC9F,CAAC,CAAA;QAEF,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,MAAM,kBAAkB,GAAG,IAAI,6BAAkB,EAAE,CAAA;YACnD,kBAAkB,CAAC,IAAI,GAAG,IAAA,SAAM,GAAE,CAAA;YAClC,kBAAkB,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;YACtD,kBAAkB,CAAC,KAAK,GAAG,KAAK,CAAA;YAChC,kBAAkB,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACtC,kBAAkB,CAAC,MAAM,GAAG,MAAM,CAAA;YAClC,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAA;YACjC,MAAM,IAAA,qBAAa,EAAC,6BAAkB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QAClE,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,OAAO,GAAG,qBAAqB,CAAA;IACnC,OAAO,CAAC,QAAQ,CACd,GAAG,IAAA,gCAAwB,EAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,6BACpD,gBAAgB,CAAC,EACnB,4BAA4B,gBAAgB,CAAC,MAAM,YAAY,OAAO,EAAE,CACzE,CAAA;AACH,CAAC,CACF,CAAA","sourcesContent":["import Router from 'koa-router'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { config } from '@things-factory/env'\nimport { getRedirectSubdomainPath, getRepository } from '@things-factory/shell'\n\nimport { MarketplaceSetting, MarketplaceStore } from '../entities'\nimport { STORE_STATUS } from '../graphql/constants'\n\nconst isPathBaseDomain = !config.get('subdomain') && !config.get('useVirtualHostBasedDomain')\n\nconst debug = require('debug')('things-factory:integration-marketplace:shopify-install-private-router')\n\nexport const shopifyInstallPrivateRouter = new Router()\n\nshopifyInstallPrivateRouter.get(\n `${isPathBaseDomain ? '/domain/:domain' : ''}/callback-shopify-post-install`,\n async (context, next) => {\n const { secure } = context\n const { domain, user } = context.state\n\n const shopifyCookie = context.cookies.get('shopify-access-token')\n const { access_token: accessToken, shop: shopUrl } = JSON.parse(shopifyCookie)\n const shop = shopUrl.replace('.myshopify.com', '')\n\n context.cookies.set('shopify-access-token', '', {\n secure,\n httpOnly: true\n })\n\n // need to get or save marketplace-store here\n var marketplaceStore = await getRepository(MarketplaceStore).findOne({\n where: {\n domain: { id: domain.id },\n storeId: shop,\n platform: 'shopify'\n }\n })\n\n if (!marketplaceStore) {\n marketplaceStore = await getRepository(MarketplaceStore).save({\n domain: { id: domain.id },\n platform: 'shopify',\n name: 'shopify-' + shop,\n storeId: shop,\n countryCode: '',\n accessToken,\n refreshToken: '',\n accessInfo: shopifyCookie,\n status: STORE_STATUS.ACTIVE,\n creator: user,\n updater: user\n })\n } else {\n var patch = {\n accessToken,\n refreshToken: '',\n accessInfo: shopifyCookie,\n status: STORE_STATUS.ACTIVE,\n updater: user\n }\n\n marketplaceStore = await getRepository(MarketplaceStore).save({\n ...marketplaceStore,\n ...patch\n })\n }\n\n const marketplaceSettingCategories: any[] = ['stock_allocation', 'marketplace_order_max_weight']\n\n marketplaceSettingCategories.forEach(async category => {\n const foundMarketplaceSetting: MarketplaceSetting = await getRepository(MarketplaceSetting).findOne({\n where: { marketplaceStore: { id: marketplaceStore.id }, domain: { id: domain.id }, category }\n })\n\n if (!foundMarketplaceSetting) {\n const marketplaceSetting = new MarketplaceSetting()\n marketplaceSetting.name = uuidv4()\n marketplaceSetting.marketplaceStore = marketplaceStore\n marketplaceSetting.value = '100'\n marketplaceSetting.category = category\n marketplaceSetting.domain = domain\n marketplaceSetting.creator = user\n await getRepository(MarketplaceSetting).save(marketplaceSetting)\n }\n })\n\n var message = 'success to activate'\n context.redirect(\n `${getRedirectSubdomainPath(context, domain.subdomain)}marketplace-store-shopify/${\n marketplaceStore.id\n }/connect-callback?status=${marketplaceStore.status}&message=${message}`\n )\n }\n)\n"]}
1
+ {"version":3,"file":"shopify-install-private-router.js","sourceRoot":"","sources":["../../server/routers/shopify-install-private-router.ts"],"names":[],"mappings":"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","sourcesContent":["import Router from 'koa-router'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { config } from '@things-factory/env'\nimport { getRedirectSubdomainPath, getRoutePrefixForDomainType, getRepository } from '@things-factory/shell'\n\nimport { MarketplaceSetting, MarketplaceStore } from '../entities'\nimport { STORE_STATUS } from '../graphql/constants'\n\nconst isPathBaseDomain = !config.get('subdomain')\n\nconst debug = require('debug')('things-factory:integration-marketplace:shopify-install-private-router')\n\nexport const shopifyInstallPrivateRouter = new Router()\n\nshopifyInstallPrivateRouter.get(\n `${isPathBaseDomain ? `/${getRoutePrefixForDomainType()}/:domain` : ''}/callback-shopify-post-install`,\n async (context, next) => {\n const { secure } = context\n const { domain, user } = context.state\n\n const shopifyCookie = context.cookies.get('shopify-access-token')\n const { access_token: accessToken, shop: shopUrl } = JSON.parse(shopifyCookie)\n const shop = shopUrl.replace('.myshopify.com', '')\n\n context.cookies.set('shopify-access-token', '', {\n secure,\n httpOnly: true\n })\n\n // need to get or save marketplace-store here\n var marketplaceStore = await getRepository(MarketplaceStore).findOne({\n where: {\n domain: { id: domain.id },\n storeId: shop,\n platform: 'shopify'\n }\n })\n\n if (!marketplaceStore) {\n marketplaceStore = await getRepository(MarketplaceStore).save({\n domain: { id: domain.id },\n platform: 'shopify',\n name: 'shopify-' + shop,\n storeId: shop,\n countryCode: '',\n accessToken,\n refreshToken: '',\n accessInfo: shopifyCookie,\n status: STORE_STATUS.ACTIVE,\n creator: user,\n updater: user\n })\n } else {\n var patch = {\n accessToken,\n refreshToken: '',\n accessInfo: shopifyCookie,\n status: STORE_STATUS.ACTIVE,\n updater: user\n }\n\n marketplaceStore = await getRepository(MarketplaceStore).save({\n ...marketplaceStore,\n ...patch\n })\n }\n\n const marketplaceSettingCategories: any[] = ['stock_allocation', 'marketplace_order_max_weight']\n\n marketplaceSettingCategories.forEach(async category => {\n const foundMarketplaceSetting: MarketplaceSetting = await getRepository(MarketplaceSetting).findOne({\n where: { marketplaceStore: { id: marketplaceStore.id }, domain: { id: domain.id }, category }\n })\n\n if (!foundMarketplaceSetting) {\n const marketplaceSetting = new MarketplaceSetting()\n marketplaceSetting.name = uuidv4()\n marketplaceSetting.marketplaceStore = marketplaceStore\n marketplaceSetting.value = '100'\n marketplaceSetting.category = category\n marketplaceSetting.domain = domain\n marketplaceSetting.creator = user\n await getRepository(MarketplaceSetting).save(marketplaceSetting)\n }\n })\n\n var message = 'success to activate'\n context.redirect(\n `${getRedirectSubdomainPath(context, domain)}marketplace-store-shopify/${\n marketplaceStore.id\n }/connect-callback?status=${marketplaceStore.status}&message=${message}`\n )\n }\n)\n"]}
@@ -12,10 +12,10 @@ const entities_1 = require("../entities");
12
12
  const constants_1 = require("../graphql/constants");
13
13
  const shopifyConfig = env_1.config.get('marketplaceIntegrationShopify', {});
14
14
  const { apiKey, apiSecret } = shopifyConfig;
15
- const isPathBaseDomain = !env_1.config.get('subdomain') && !env_1.config.get('useVirtualHostBasedDomain');
15
+ const isPathBaseDomain = !env_1.config.get('subdomain');
16
16
  const debug = require('debug')('things-factory:integration-marketplace:shopify-private-router');
17
17
  exports.shopifyPrivateRouter = new koa_router_1.default();
18
- exports.shopifyPrivateRouter.get(`${isPathBaseDomain ? '/domain/:domain' : ''}/callback-shopify-install`, async (context, next) => {
18
+ exports.shopifyPrivateRouter.get(`${isPathBaseDomain ? `/${(0, shell_1.getRoutePrefixForDomainType)()}/:domain` : ''}/callback-shopify-install`, async (context, next) => {
19
19
  // https://example.org/callback-shopify-install?shop={shop}&hmac=da9d83c171400a41f8db91a950508985&timestamp=1409617544
20
20
  const { hmac, timestamp } = context.query;
21
21
  const { domain, user } = context.state;
@@ -1 +1 @@
1
- {"version":3,"file":"shopify-private-router.js","sourceRoot":"","sources":["../../server/routers/shopify-private-router.ts"],"names":[],"mappings":"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","sourcesContent":["import Router from 'koa-router'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { VerificationToken, VerificationTokenType } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { getRepository, getUrlFromContext } from '@things-factory/shell'\n\nimport { Shopify } from '../controllers/shopify'\nimport { MarketplaceSetting, MarketplaceStore } from '../entities'\nimport { STORE_STATUS } from '../graphql/constants'\n\nconst shopifyConfig = config.get('marketplaceIntegrationShopify', {})\nconst { apiKey, apiSecret } = shopifyConfig\nconst isPathBaseDomain = !config.get('subdomain') && !config.get('useVirtualHostBasedDomain')\n\nconst debug = require('debug')('things-factory:integration-marketplace:shopify-private-router')\n\nexport const shopifyPrivateRouter = new Router()\n\nshopifyPrivateRouter.get(\n `${isPathBaseDomain ? '/domain/:domain' : ''}/callback-shopify-install`,\n async (context, next) => {\n // https://example.org/callback-shopify-install?shop={shop}&hmac=da9d83c171400a41f8db91a950508985&timestamp=1409617544\n const { hmac, timestamp } = context.query\n const { domain, user } = context.state\n\n let shop: any = context.query.shop\n shop = shop.replace('.myshopify.com', '')\n\n const shopify = new Shopify({ apiKey, apiSecret, shop })\n\n // need to get or save marketplace-store here\n var marketplaceStore = await getRepository(MarketplaceStore).findOne({\n where: {\n domain: { id: domain.id },\n storeId: shop,\n platform: 'shopify'\n }\n })\n\n if (!marketplaceStore) {\n marketplaceStore = await getRepository(MarketplaceStore).save({\n domain,\n platform: 'shopify',\n name: shop,\n storeId: shop,\n countryCode: '',\n status: STORE_STATUS.INACTIVE,\n creator: user,\n updater: user\n })\n }\n\n const marketplaceSetting = new MarketplaceSetting()\n marketplaceSetting.name = uuidv4()\n marketplaceSetting.marketplaceStore = marketplaceStore\n marketplaceSetting.value = '100'\n marketplaceSetting.category = 'stock_allocation'\n marketplaceSetting.domain = marketplaceStore.domain\n marketplaceSetting.creator = marketplaceStore.creator\n await getRepository(MarketplaceSetting).save(marketplaceSetting)\n\n /* generate verification-token as a nonce */\n const nonce = shopify.makeVerificationTokenForNonce()\n await getRepository(VerificationToken).save({\n userId: user.id,\n token: nonce,\n type: VerificationTokenType.REQUEST_ACCESS_TOKEN,\n suppliment: marketplaceStore.id\n })\n\n const redirectUrl = getUrlFromContext(context, '/callback-shopify')\n const redirectTo = shopify.buildAuthURL(redirectUrl, nonce)\n\n debug('get:/callback-shopify-install', redirectTo)\n context.redirect(redirectTo)\n }\n)\n"]}
1
+ {"version":3,"file":"shopify-private-router.js","sourceRoot":"","sources":["../../server/routers/shopify-private-router.ts"],"names":[],"mappings":"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","sourcesContent":["import Router from 'koa-router'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { VerificationToken, VerificationTokenType } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { getRepository, getRoutePrefixForDomainType, getUrlFromContext } from '@things-factory/shell'\n\nimport { Shopify } from '../controllers/shopify'\nimport { MarketplaceSetting, MarketplaceStore } from '../entities'\nimport { STORE_STATUS } from '../graphql/constants'\n\nconst shopifyConfig = config.get('marketplaceIntegrationShopify', {})\nconst { apiKey, apiSecret } = shopifyConfig\nconst isPathBaseDomain = !config.get('subdomain')\n\nconst debug = require('debug')('things-factory:integration-marketplace:shopify-private-router')\n\nexport const shopifyPrivateRouter = new Router()\n\nshopifyPrivateRouter.get(\n `${isPathBaseDomain ? `/${getRoutePrefixForDomainType()}/:domain` : ''}/callback-shopify-install`,\n async (context, next) => {\n // https://example.org/callback-shopify-install?shop={shop}&hmac=da9d83c171400a41f8db91a950508985&timestamp=1409617544\n const { hmac, timestamp } = context.query\n const { domain, user } = context.state\n\n let shop: any = context.query.shop\n shop = shop.replace('.myshopify.com', '')\n\n const shopify = new Shopify({ apiKey, apiSecret, shop })\n\n // need to get or save marketplace-store here\n var marketplaceStore = await getRepository(MarketplaceStore).findOne({\n where: {\n domain: { id: domain.id },\n storeId: shop,\n platform: 'shopify'\n }\n })\n\n if (!marketplaceStore) {\n marketplaceStore = await getRepository(MarketplaceStore).save({\n domain,\n platform: 'shopify',\n name: shop,\n storeId: shop,\n countryCode: '',\n status: STORE_STATUS.INACTIVE,\n creator: user,\n updater: user\n })\n }\n\n const marketplaceSetting = new MarketplaceSetting()\n marketplaceSetting.name = uuidv4()\n marketplaceSetting.marketplaceStore = marketplaceStore\n marketplaceSetting.value = '100'\n marketplaceSetting.category = 'stock_allocation'\n marketplaceSetting.domain = marketplaceStore.domain\n marketplaceSetting.creator = marketplaceStore.creator\n await getRepository(MarketplaceSetting).save(marketplaceSetting)\n\n /* generate verification-token as a nonce */\n const nonce = shopify.makeVerificationTokenForNonce()\n await getRepository(VerificationToken).save({\n userId: user.id,\n token: nonce,\n type: VerificationTokenType.REQUEST_ACCESS_TOKEN,\n suppliment: marketplaceStore.id\n })\n\n const redirectUrl = getUrlFromContext(context, '/callback-shopify')\n const redirectTo = shopify.buildAuthURL(redirectUrl, nonce)\n\n debug('get:/callback-shopify-install', redirectTo)\n context.redirect(redirectTo)\n }\n)\n"]}
@@ -77,12 +77,12 @@ exports.shopifyPublicRouter.get('/callback-shopify', async (context, next) => {
77
77
  marketplaceSetting.creator = store.creator;
78
78
  await (0, shell_1.getRepository)(entities_1.MarketplaceSetting).save(marketplaceSetting);
79
79
  var message = 'success to activate';
80
- context.redirect(`${(0, shell_1.getRedirectSubdomainPath)(context, store.domain.subdomain)}marketplace-store-shopify/${store.id}/connect-callback?status=${store.status}&message=${message}`);
80
+ context.redirect(`${(0, shell_1.getRedirectSubdomainPath)(context, store.domain)}marketplace-store-shopify/${store.id}/connect-callback?status=${store.status}&message=${message}`);
81
81
  }
82
82
  catch (err) {
83
83
  var message = err.message;
84
84
  if (store) {
85
- context.redirect(`${(0, shell_1.getRedirectSubdomainPath)(context, store.domain.subdomain)}marketplace-store-shopify/${store.id}/connect-callback?status=${store.status}&message=${message}`);
85
+ context.redirect(`${(0, shell_1.getRedirectSubdomainPath)(context, store.domain)}marketplace-store-shopify/${store.id}/connect-callback?status=${store.status}&message=${message}`);
86
86
  return;
87
87
  }
88
88
  throw err;
@@ -1 +1 @@
1
- {"version":3,"file":"shopify-public-router.js","sourceRoot":"","sources":["../../server/routers/shopify-public-router.ts"],"names":[],"mappings":"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","sourcesContent":["import Router from 'koa-router'\nimport fetch from 'node-fetch'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { User, VerificationToken, VerificationTokenType } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { getRedirectSubdomainPath, getRepository } from '@things-factory/shell'\n\nimport { StoreAPI } from '../controllers/store-api'\nimport { MarketplaceSetting, MarketplaceStore } from '../entities'\nimport { STORE_STATUS } from '../graphql/constants'\n\nconst shopifyConfig = config.get('marketplaceIntegrationShopify', {})\nconst { apiKey, apiSecret } = shopifyConfig\n\nconst debug = require('debug')('things-factory:integration-marketplace:shopify-public-router')\n\nexport const shopifyPublicRouter = new Router()\n\nshopifyPublicRouter.get('/callback-shopify', async (context, next) => {\n try {\n // https://example.org/some/redirect/uri?code={authorization_code}&hmac=da9d83c171400a41f8db91a950508985&timestamp=1409617544&state={nonce}&shop={hostname}\n const { code, hmac, timestamp, state: nonce, shop: hostname } = context.query\n\n const verificationTokenRepository = getRepository(VerificationToken)\n\n var verification: VerificationToken = await verificationTokenRepository.findOne({\n where: {\n token: nonce,\n type: VerificationTokenType.REQUEST_ACCESS_TOKEN\n }\n })\n\n const { userId, suppliment: marketplaceStoreId } = verification\n\n await verificationTokenRepository.delete({\n userId,\n token: nonce,\n type: VerificationTokenType.REQUEST_ACCESS_TOKEN\n })\n\n var store = await StoreAPI.getMarketplaceStore(marketplaceStoreId)\n const storeId = store.storeId\n\n const response = await fetch(`https://${storeId}.myshopify.com/admin/oauth/access_token`, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n client_id: apiKey,\n client_secret: apiSecret,\n code\n })\n })\n\n if (response.ok) {\n var body = await response.json()\n var { access_token } = body\n if (!access_token) {\n const message = `failed to get access-token from shopify : ${JSON.stringify(body, null, 2)}`\n debug(message)\n throw new Error(message)\n }\n } else {\n const message = `failed to get access-token from shopify : ${response.status}, ${await response.text()}`\n debug(message)\n throw new Error(message)\n }\n\n var patch = {\n accessToken: access_token,\n refreshToken: '',\n accessInfo: JSON.stringify(body, null, 2),\n storeId: storeId,\n status: STORE_STATUS.ACTIVE\n }\n\n var user = await getRepository(User).findOneBy({ id: userId })\n\n store = await getRepository(MarketplaceStore).save({\n ...store,\n ...patch,\n updater: user\n })\n\n const marketplaceSetting = new MarketplaceSetting()\n marketplaceSetting.name = uuidv4()\n marketplaceSetting.marketplaceStore = store\n marketplaceSetting.value = '100'\n marketplaceSetting.category = 'stock_allocation'\n marketplaceSetting.domain = store.domain\n marketplaceSetting.creator = store.creator\n await getRepository(MarketplaceSetting).save(marketplaceSetting)\n\n var message = 'success to activate'\n context.redirect(\n `${getRedirectSubdomainPath(context, store.domain.subdomain)}marketplace-store-shopify/${\n store.id\n }/connect-callback?status=${store.status}&message=${message}`\n )\n } catch (err) {\n var message: string = err.message\n\n if (store) {\n context.redirect(\n `${getRedirectSubdomainPath(context, store.domain.subdomain)}marketplace-store-shopify/${\n store.id\n }/connect-callback?status=${store.status}&message=${message}`\n )\n return\n }\n\n throw err\n }\n})\n\nshopifyPublicRouter.post('/webhook-shopify/customers/redact', async (context, next) => {\n // When a store owner requests deletion of data on behalf of a customer,\n // Shopify sends a payload on the customers/redact topic to the apps installed on that store.\n // If the customer hasn't placed an order in the past six months,\n // then Shopify sends the payload 10 days after their request.\n // Otherwise, the the request will be withheld until 6 months have passed.\n // If your app has been granted access to the store's customers or orders,\n // then you receive a redaction request webhook with the resource IDs that you need to redact or delete.\n // In some cases, a customer record contains only the customer's email address.\n //\n // https://shopify.dev/tutorials/add-gdpr-webhooks-to-your-app\n // {\n // \"shop_id\": 954889,\n // \"shop_domain\": \"snowdevil.myshopify.com\",\n // \"customer\": {\n // \"id\": 191167,\n // \"email\": \"john@email.com\",\n // \"phone\": \"555-625-1199\"\n // },\n // \"orders_to_redact\": [299938, 280263, 220458]\n // }\n\n context.status = 200\n})\n\nshopifyPublicRouter.post('/webhook-shopify/shop/redact', async (context, next) => {\n // 48 hours after a store owner uninstalls your app,\n // Shopify sends you a shop/redact webhook.\n // This webhook provides the store's shop_id and shop_domain so that you can erase the customer information\n // for that store from your database.\n //\n // https://shopify.dev/tutorials/add-gdpr-webhooks-to-your-app\n // {\n // \"shop_id\": 954889,\n // \"shop_domain\": \"snowdevil.myshopify.com\"\n // }\n\n context.status = 200\n})\n\nshopifyPublicRouter.post('/webhook-shopify/customers/data_request', async (context, next) => {\n // When a customer requests their data from a store owner,\n // Shopify sends a payload on the customers/data_request topic to the apps installed on that store.\n // If your app has been granted access to customers or orders,\n // then you receive a data request webhook with the resource IDs of the data that you need to provide to the store owner.\n // It's your responsibility to provide this data to the store owner directly.\n // In some cases, a customer record contains only the customer's email address.\n //\n // https://shopify.dev/tutorials/add-gdpr-webhooks-to-your-app\n // {\n // \"shop_id\": 954889,\n // \"shop_domain\": \"snowdevil.myshopify.com\",\n // \"orders_requested\": [299938, 280263, 220458],\n // \"customer\": {\n // \"id\": 191167,\n // \"email\": \"john@email.com\",\n // \"phone\": \"555-625-1199\"\n // },\n // \"data_request\": {\n // \"id\": 9999\n // }\n // }\n\n context.status = 200\n})\n"]}
1
+ {"version":3,"file":"shopify-public-router.js","sourceRoot":"","sources":["../../server/routers/shopify-public-router.ts"],"names":[],"mappings":"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","sourcesContent":["import Router from 'koa-router'\nimport fetch from 'node-fetch'\nimport { v4 as uuidv4 } from 'uuid'\n\nimport { User, VerificationToken, VerificationTokenType } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { getRedirectSubdomainPath, getRepository } from '@things-factory/shell'\n\nimport { StoreAPI } from '../controllers/store-api'\nimport { MarketplaceSetting, MarketplaceStore } from '../entities'\nimport { STORE_STATUS } from '../graphql/constants'\n\nconst shopifyConfig = config.get('marketplaceIntegrationShopify', {})\nconst { apiKey, apiSecret } = shopifyConfig\n\nconst debug = require('debug')('things-factory:integration-marketplace:shopify-public-router')\n\nexport const shopifyPublicRouter = new Router()\n\nshopifyPublicRouter.get('/callback-shopify', async (context, next) => {\n try {\n // https://example.org/some/redirect/uri?code={authorization_code}&hmac=da9d83c171400a41f8db91a950508985&timestamp=1409617544&state={nonce}&shop={hostname}\n const { code, hmac, timestamp, state: nonce, shop: hostname } = context.query\n\n const verificationTokenRepository = getRepository(VerificationToken)\n\n var verification: VerificationToken = await verificationTokenRepository.findOne({\n where: {\n token: nonce,\n type: VerificationTokenType.REQUEST_ACCESS_TOKEN\n }\n })\n\n const { userId, suppliment: marketplaceStoreId } = verification\n\n await verificationTokenRepository.delete({\n userId,\n token: nonce,\n type: VerificationTokenType.REQUEST_ACCESS_TOKEN\n })\n\n var store = await StoreAPI.getMarketplaceStore(marketplaceStoreId)\n const storeId = store.storeId\n\n const response = await fetch(`https://${storeId}.myshopify.com/admin/oauth/access_token`, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n client_id: apiKey,\n client_secret: apiSecret,\n code\n })\n })\n\n if (response.ok) {\n var body = await response.json()\n var { access_token } = body\n if (!access_token) {\n const message = `failed to get access-token from shopify : ${JSON.stringify(body, null, 2)}`\n debug(message)\n throw new Error(message)\n }\n } else {\n const message = `failed to get access-token from shopify : ${response.status}, ${await response.text()}`\n debug(message)\n throw new Error(message)\n }\n\n var patch = {\n accessToken: access_token,\n refreshToken: '',\n accessInfo: JSON.stringify(body, null, 2),\n storeId: storeId,\n status: STORE_STATUS.ACTIVE\n }\n\n var user = await getRepository(User).findOneBy({ id: userId })\n\n store = await getRepository(MarketplaceStore).save({\n ...store,\n ...patch,\n updater: user\n })\n\n const marketplaceSetting = new MarketplaceSetting()\n marketplaceSetting.name = uuidv4()\n marketplaceSetting.marketplaceStore = store\n marketplaceSetting.value = '100'\n marketplaceSetting.category = 'stock_allocation'\n marketplaceSetting.domain = store.domain\n marketplaceSetting.creator = store.creator\n await getRepository(MarketplaceSetting).save(marketplaceSetting)\n\n var message = 'success to activate'\n context.redirect(\n `${getRedirectSubdomainPath(context, store.domain)}marketplace-store-shopify/${\n store.id\n }/connect-callback?status=${store.status}&message=${message}`\n )\n } catch (err) {\n var message: string = err.message\n\n if (store) {\n context.redirect(\n `${getRedirectSubdomainPath(context, store.domain)}marketplace-store-shopify/${\n store.id\n }/connect-callback?status=${store.status}&message=${message}`\n )\n return\n }\n\n throw err\n }\n})\n\nshopifyPublicRouter.post('/webhook-shopify/customers/redact', async (context, next) => {\n // When a store owner requests deletion of data on behalf of a customer,\n // Shopify sends a payload on the customers/redact topic to the apps installed on that store.\n // If the customer hasn't placed an order in the past six months,\n // then Shopify sends the payload 10 days after their request.\n // Otherwise, the the request will be withheld until 6 months have passed.\n // If your app has been granted access to the store's customers or orders,\n // then you receive a redaction request webhook with the resource IDs that you need to redact or delete.\n // In some cases, a customer record contains only the customer's email address.\n //\n // https://shopify.dev/tutorials/add-gdpr-webhooks-to-your-app\n // {\n // \"shop_id\": 954889,\n // \"shop_domain\": \"snowdevil.myshopify.com\",\n // \"customer\": {\n // \"id\": 191167,\n // \"email\": \"john@email.com\",\n // \"phone\": \"555-625-1199\"\n // },\n // \"orders_to_redact\": [299938, 280263, 220458]\n // }\n\n context.status = 200\n})\n\nshopifyPublicRouter.post('/webhook-shopify/shop/redact', async (context, next) => {\n // 48 hours after a store owner uninstalls your app,\n // Shopify sends you a shop/redact webhook.\n // This webhook provides the store's shop_id and shop_domain so that you can erase the customer information\n // for that store from your database.\n //\n // https://shopify.dev/tutorials/add-gdpr-webhooks-to-your-app\n // {\n // \"shop_id\": 954889,\n // \"shop_domain\": \"snowdevil.myshopify.com\"\n // }\n\n context.status = 200\n})\n\nshopifyPublicRouter.post('/webhook-shopify/customers/data_request', async (context, next) => {\n // When a customer requests their data from a store owner,\n // Shopify sends a payload on the customers/data_request topic to the apps installed on that store.\n // If your app has been granted access to customers or orders,\n // then you receive a data request webhook with the resource IDs of the data that you need to provide to the store owner.\n // It's your responsibility to provide this data to the store owner directly.\n // In some cases, a customer record contains only the customer's email address.\n //\n // https://shopify.dev/tutorials/add-gdpr-webhooks-to-your-app\n // {\n // \"shop_id\": 954889,\n // \"shop_domain\": \"snowdevil.myshopify.com\",\n // \"orders_requested\": [299938, 280263, 220458],\n // \"customer\": {\n // \"id\": 191167,\n // \"email\": \"john@email.com\",\n // \"phone\": \"555-625-1199\"\n // },\n // \"data_request\": {\n // \"id\": 9999\n // }\n // }\n\n context.status = 200\n})\n"]}