From 6d53b6355f00fc056a0931d362e6ebaedba007ad Mon Sep 17 00:00:00 2001 From: Pratik Patel Date: Mon, 25 Oct 2021 17:43:54 +0530 Subject: [PATCH 1/9] Add multi token sdksetup support --- express/api_routes.js | 5 ++--- express/extension.js | 7 ++++--- express/index.js | 8 ++++---- express/middleware/session_middleware.js | 5 ++--- express/routes.js | 11 +++++------ express/session/session_storage.js | 18 +++++++++--------- 6 files changed, 26 insertions(+), 28 deletions(-) diff --git a/express/api_routes.js b/express/api_routes.js index 55acf630..42411680 100644 --- a/express/api_routes.js +++ b/express/api_routes.js @@ -1,11 +1,10 @@ 'use strict'; -const { extension } = require('./extension'); const express = require('express'); const { sessionMiddleware } = require('./middleware/session_middleware'); const { PlatformClient, ApplicationConfig, ApplicationClient } = require("fdk-client-javascript"); -function setupProxyRoutes() { +function setupProxyRoutes(extension) { const apiRoutes = express.Router({ mergeParams: true }); const applicationProxyRoutes = express.Router({ mergeParams: true }); @@ -29,7 +28,7 @@ function setupProxyRoutes() { } }); - apiRoutes.use(sessionMiddleware(true), async (req, res, next) => { + apiRoutes.use(sessionMiddleware(extension, true), async (req, res, next) => { try { const client = await extension.getPlatformClient(req.fdkSession.company_id, req.fdkSession); req.platformClient = client; diff --git a/express/extension.js b/express/extension.js index c818c428..47d0a7e3 100644 --- a/express/extension.js +++ b/express/extension.js @@ -4,6 +4,7 @@ const {FdkInvalidExtensionJson} = require("./error_code"); const urljoin = require('url-join'); const { PlatformConfig, PlatformClient, ApplicationConfig, ApplicationClient } = require("fdk-client-javascript"); const { WebhookRegistry } = require('./webhook'); +const SessionStorage = require("./session/session_storage"); class Extension { constructor() { @@ -15,11 +16,13 @@ class Extension { this.access_mode = null; this.cluster = "https://api.fynd.com"; this.webhookRegistry = null; + this.sessionStore = null; } initialize(data) { this.storage = data.storage; + this.sessionStorage = new SessionStorage(this.storage); if(!data.api_key){ throw new FdkInvalidExtensionJson("Invalid api_key"); } @@ -95,8 +98,6 @@ class Extension { } } -const extension = new Extension(); - module.exports = { - extension + Extension }; \ No newline at end of file diff --git a/express/index.js b/express/index.js index f729ef11..0809b63d 100644 --- a/express/index.js +++ b/express/index.js @@ -1,16 +1,16 @@ 'use strict'; -const {extension} = require('./extension'); +const {Extension} = require('./extension'); const setupRoutes = require("./routes"); const { setupProxyRoutes } = require("./api_routes"); const Session = require("./session/session"); -const SessionStorage = require("./session/session_storage"); const { ApplicationConfig, ApplicationClient } = require("fdk-client-javascript"); function setupFdk(data) { + var extension = new Extension(); extension.initialize(data); let router = setupRoutes(extension); - let { apiRoutes, applicationProxyRoutes } = setupProxyRoutes(); + let { apiRoutes, applicationProxyRoutes } = setupProxyRoutes(extension); async function getPlatformClient(companyId) { let client = null; @@ -19,7 +19,7 @@ function setupFdk(data) { cluster: extension.cluster, companyId: companyId }); - let session = await SessionStorage.getSession(sid); + let session = await extension.sessionStorage.getSession(sid); client = await extension.getPlatformClient(companyId, session); } return client; diff --git a/express/middleware/session_middleware.js b/express/middleware/session_middleware.js index 687e9b51..0e618455 100644 --- a/express/middleware/session_middleware.js +++ b/express/middleware/session_middleware.js @@ -1,14 +1,13 @@ 'use strict'; const { SESSION_COOKIE_NAME } = require('./../constants'); -const SessionStorage = require("../session/session_storage"); -function sessionMiddleware(strict) { +function sessionMiddleware(extension, strict) { return async (req, res, next) => { try { const companyId = req.headers['x-company-id'] || req.query['company_id']; const compCookieName = `${SESSION_COOKIE_NAME}_${companyId}` let sessionId = req.signedCookies[compCookieName]; - req.fdkSession = await SessionStorage.getSession(sessionId); + req.fdkSession = await extension.sessionStorage.getSession(sessionId); if(strict && !req.fdkSession) { return res.status(401).json({ "message": "unauthorized" }); diff --git a/express/routes.js b/express/routes.js index 357b5246..a3a5927e 100644 --- a/express/routes.js +++ b/express/routes.js @@ -2,7 +2,6 @@ const express = require('express'); const { v4 : uuidv4} = require("uuid"); const Session = require("./session/session"); -const SessionStorage = require("./session/session_storage"); const { FdkSessionNotFoundError, FdkInvalidOAuthError } = require("./error_code"); const { SESSION_COOKIE_NAME } = require('./constants'); const { sessionMiddleware } = require('./middleware/session_middleware'); @@ -27,7 +26,7 @@ function setupRoutes(ext) { cluster: ext.cluster, companyId: companyId }); - session = await SessionStorage.getSession(sid); + session = await ext.sessionStorage.getSession(sid); if(!session) { session = new Session(sid); } else if(session.extension_id !== ext.api_key) { @@ -79,14 +78,14 @@ function setupRoutes(ext) { state: session.state, access_mode: ext.access_mode }); - await SessionStorage.saveSession(session); + await ext.sessionStorage.saveSession(session); res.redirect(redirectUrl); } catch (error) { next(error); } }); - FdkRoutes.get("/fp/auth", sessionMiddleware(false), async (req, res, next) => { + FdkRoutes.get("/fp/auth", sessionMiddleware(extension, false), async (req, res, next) => { // ?code=ddjfhdsjfsfh&client_id=jsfnsajfhkasf&company_id=1&state=jashoh try { if(!req.fdkSession) { @@ -114,7 +113,7 @@ function setupRoutes(ext) { req.fdkSession.access_token_validity = sessionExpires.getTime(); req.fdkSession.current_user = token.current_user; req.fdkSession.refresh_token = token.refresh_token; - await SessionStorage.saveSession(req.fdkSession); + await ext.sessionStorage.saveSession(req.fdkSession); const compCookieName = `${SESSION_COOKIE_NAME}_${req.fdkSession.company_id}` res.cookie(compCookieName, req.fdkSession.id, { @@ -146,7 +145,7 @@ function setupRoutes(ext) { cluster: ext.cluster, companyId: company_id }); - let session = await SessionStorage.getSession(sid); + let session = await ext.sessionStorage.getSession(sid); const client = await ext.getPlatformClient(company_id, session); req.platformClient = client; } diff --git a/express/session/session_storage.js b/express/session/session_storage.js index 4c67905a..6ebdaf86 100644 --- a/express/session/session_storage.js +++ b/express/session/session_storage.js @@ -1,23 +1,23 @@ 'use strict'; const Session = require("./session"); -const { extension } = require("./../extension"); class SessionStorage { - constructor() { + constructor(storage) { + this.storage = storage; } - static async saveSession(session) { + async saveSession(session) { if(session.expires) { let ttl = (new Date() - session.expires) / 1000; ttl = Math.abs(Math.round(Math.min(ttl, 0))); - return extension.storage.setex(session.id, JSON.stringify(session.toJSON()), ttl); + return this.storage.setex(session.id, JSON.stringify(session.toJSON()), ttl); } else { - return extension.storage.set(session.id, JSON.stringify(session.toJSON())); + return this.storage.set(session.id, JSON.stringify(session.toJSON())); } } - static async getSession(sessionId) { - let session = await extension.storage.get(sessionId); + async getSession(sessionId) { + let session = await this.storage.get(sessionId); if(session) { session = JSON.parse(session); session = Session.cloneSession(sessionId, session, false); @@ -25,8 +25,8 @@ class SessionStorage { return session; } - static async deleteSession(sessionId) { - return extension.storage.del(sessionId); + async deleteSession(sessionId) { + return this.storage.del(sessionId); } } From 44b45f1a5721280803de677ef7d92681ebcb1ab3 Mon Sep 17 00:00:00 2001 From: Pratik Patel Date: Mon, 25 Oct 2021 17:57:08 +0530 Subject: [PATCH 2/9] fix --- express/routes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/routes.js b/express/routes.js index a3a5927e..670c8dae 100644 --- a/express/routes.js +++ b/express/routes.js @@ -85,7 +85,7 @@ function setupRoutes(ext) { } }); - FdkRoutes.get("/fp/auth", sessionMiddleware(extension, false), async (req, res, next) => { + FdkRoutes.get("/fp/auth", sessionMiddleware(ext, false), async (req, res, next) => { // ?code=ddjfhdsjfsfh&client_id=jsfnsajfhkasf&company_id=1&state=jashoh try { if(!req.fdkSession) { From f773b9089f8f0cf19c79f6e178fee89f70a424ef Mon Sep 17 00:00:00 2001 From: Pratik Patel Date: Mon, 25 Oct 2021 18:41:05 +0530 Subject: [PATCH 3/9] fix. --- examples/test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/test.js b/examples/test.js index 334f2616..48749035 100644 --- a/examples/test.js +++ b/examples/test.js @@ -57,13 +57,14 @@ let fdkExtension = setupFdk({ } }); -app.use(fdkExtension.fdkHandler); + app.use('/_healthz', (req, res, next) => { res.json({ "ok": "ok" }); }); +app.use('/', fdkExtension.fdkHandler); fdkExtension.apiRoutes.get("/test/routes", async (req, res, next) => { try { let data = await req.platformClient.lead.getTickets(); From bd68dccadc645a21026624617185fdf3f87a6448 Mon Sep 17 00:00:00 2001 From: Brijesh Mahidhariya Date: Fri, 13 Oct 2023 14:12:11 +0530 Subject: [PATCH 4/9] Add cluster id support on extensions --- express/api_routes.js | 12 +++++- express/error_code.js | 9 ++++- express/extension.js | 11 ++++- express/extension_factory.js | 39 ++++++++++++++++++ express/index.js | 51 +++++++++++++++++------- express/middleware/session_middleware.js | 5 +++ express/routes.js | 30 ++++++++------ express/webhook.js | 3 +- 8 files changed, 127 insertions(+), 33 deletions(-) create mode 100644 express/extension_factory.js diff --git a/express/api_routes.js b/express/api_routes.js index dc195663..4ef682d2 100644 --- a/express/api_routes.js +++ b/express/api_routes.js @@ -8,8 +8,12 @@ function setupProxyRoutes(extension) { const apiRoutes = express.Router({ mergeParams: true }); const applicationProxyRoutes = express.Router({ mergeParams: true }); - applicationProxyRoutes.use(async (req, res, next) => { + applicationProxyRoutes.use(["/", "/:cluster_id"],async (req, res, next) => { try { + const clusterId = req.params.cluster_id; + if (clusterId) { + extension = ExtensionFactory.getExtension(clusterId) + } if(req.headers["x-user-data"]) { req.user = JSON.parse(req.headers["x-user-data"]); req.user.user_id = req.user._id; @@ -29,8 +33,12 @@ function setupProxyRoutes(extension) { } }); - apiRoutes.use(sessionMiddleware(extension, true), async (req, res, next) => { + apiRoutes.use(["/", "/:cluster_id"], sessionMiddleware(extension, true), async (req, res, next) => { try { + const clusterId = req.params.cluster_id; + if (clusterId) { + extension = ExtensionFactory.getExtension(clusterId) + } const client = await extension.getPlatformClient(req.fdkSession.company_id, req.fdkSession); req.platformClient = client; req.extension = extension; diff --git a/express/error_code.js b/express/error_code.js index 99334894..52e65cf8 100644 --- a/express/error_code.js +++ b/express/error_code.js @@ -54,6 +54,12 @@ class FdkWebhookHandlerNotFound extends Error { } } +class FdkInvalidCluster extends Error { + constructor(message) { + super(message); + } +} + module.exports = { FdkInvalidExtensionConfig, @@ -64,5 +70,6 @@ module.exports = { FdkInvalidWebhookConfig, FdkWebhookRegistrationError, FdkWebhookProcessError, - FdkWebhookHandlerNotFound + FdkWebhookHandlerNotFound, + FdkInvalidCluster }; \ No newline at end of file diff --git a/express/extension.js b/express/extension.js index 60c322f6..5e31c0f3 100644 --- a/express/extension.js +++ b/express/extension.js @@ -4,6 +4,9 @@ const { FdkInvalidExtensionConfig } = require("./error_code"); const urljoin = require('url-join'); const { PlatformConfig, PlatformClient } = require("@gofynd/fdk-client-javascript"); const { WebhookRegistry } = require('./webhook'); +const logger = require('./logger'); +const { fdkAxios } = require('@gofynd/fdk-client-javascript/sdk/common/AxiosHelper'); +const { version } = require('./../package.json'); const SessionStorage = require("./session/session_storage"); class Extension { @@ -18,6 +21,7 @@ class Extension { this.webhookRegistry = null; this.sessionStore = null; this._isInitialized = false; + this._clusterId = null; } async initialize(data) { @@ -49,6 +53,7 @@ class Extension { throw new FdkInvalidExtensionConfig("Invalid cluster value. Invalid value: " + data.cluster); } this.cluster = data.cluster; + this._clusterId = this.cluster.replace("https://", ""); } this.webhookRegistry = new WebhookRegistry(); @@ -80,6 +85,10 @@ class Extension { return this._isInitialized; } + get clusterId(){ + return this._clusterId; + } + verifyScopes(scopes, extensionData) { const missingScopes = scopes.filter(val => extensionData.scope.indexOf(val) === -1); if (!scopes || scopes.length <= 0 || missingScopes.length) { @@ -158,7 +167,7 @@ class Extension { logger.debug(`Extension details received: ${logger.safeStringify(extensionData)}`); return extensionData; } catch (err) { - throw new FdkInvalidExtensionConfig("Invalid api_key or api_secret. Reason:" + err.message); + throw new FdkInvalidExtensionConfig("Invalid api_key or api_secret. Reason: " + err.message); } } } diff --git a/express/extension_factory.js b/express/extension_factory.js new file mode 100644 index 00000000..2695f5a3 --- /dev/null +++ b/express/extension_factory.js @@ -0,0 +1,39 @@ +const { FdkInvalidCluster } = require("./error_code"); +const { Extension } = require("./extension") + +class ExtensionFactory { + static _extensionMap = {}; + static _defaultExt = null; + + static getExtension(clusterId) { + const clusterExt = ExtensionFactory._extensionMap[clusterId] + if (clusterId !== null && !clusterExt) { + throw FdkInvalidCluster(`Extension instance not found for clusterId ${clusterId}`); + } + return clusterExt; + } + + static defaultExtInstance() { + return ExtensionFactory._defaultExt; + } + + static async initializeExtension(clusterData, clusterId = null) { + const promises = []; + for (let extConfig of clusterData) { + const extInstance = new Extension(); + if(clusterId != null && clusterId !== extConfig.cluster_id) { + continue; + } + if (!ExtensionFactory._defaultExt) { + ExtensionFactory._defaultExt = extInstance; + } + ExtensionFactory._extensionMap[extConfig.cluster_id] = extInstance; + promises.push(extInstance.initialize(extConfig)) + } + return Promise.all(promises); + } +} + +module.exports = { + ExtensionFactory +}; \ No newline at end of file diff --git a/express/index.js b/express/index.js index 34f13822..b069521a 100644 --- a/express/index.js +++ b/express/index.js @@ -1,6 +1,6 @@ 'use strict'; -const {Extension} = require('./extension'); +const {ExtensionFactory} = require('./extension_factory'); const setupRoutes = require("./routes"); const { setupProxyRoutes } = require("./api_routes"); const Session = require("./session/session"); @@ -8,41 +8,61 @@ const { ApplicationConfig, ApplicationClient } = require("@gofynd/fdk-client-jav const logger = require('./logger'); function setupFdk(data, syncInitialization) { + const multiClusterMode = data.cluster_config !== undefined; + const clusterId = data.cluster.replace("https://", "").replace("http://", ""); if (data.debug) { logger.transports[0].level = 'debug'; } - const extension = new Extension(); - const promiseInit = extension.initialize(data) - .catch(err=>{ - logger.error(err); - throw err; - }); + + const promiseInit = ExtensionFactory.initializeExtension(multiClusterMode? data.cluster_config: [data]).catch(err=>{ + logger.error(err); + throw err; + }); + + const extension = !multiClusterMode? ExtensionFactory.defaultExtInstance(): ExtensionFactory.getExtension(clusterId); + let router = setupRoutes(extension); let { apiRoutes, applicationProxyRoutes } = setupProxyRoutes(extension); - async function getPlatformClient(companyId) { + async function getPlatformClient(companyId, clusterId = null) { + let clusterExt = extension; + if (clusterId) { + clusterExt = ExtensionFactory.getExtension(clusterId) + } let client = null; - if (!extension.isOnlineAccessMode()) { + if (!clusterExt.isOnlineAccessMode()) { let sid = Session.generateSessionId(false, { - cluster: extension.cluster, + cluster: clusterExt.cluster, companyId: companyId }); - let session = await extension.sessionStorage.getSession(sid); - client = await extension.getPlatformClient(companyId, session); + let session = await clusterExt.sessionStorage.getSession(sid); + client = await clusterExt.getPlatformClient(companyId, session); } return client; } - async function getApplicationClient(applicationId, applicationToken) { + async function getApplicationClient(applicationId, applicationToken, clusterId = null) { + let clusterExt = extension; + if (clusterId) { + clusterExt = ExtensionFactory.getExtension(clusterId) + } let applicationConfig = new ApplicationConfig({ applicationID: applicationId, applicationToken: applicationToken, - domain: extension.cluster + domain: clusterExt.cluster }); let applicationClient = new ApplicationClient(applicationConfig); return applicationClient; } + function getWebhookRegistry(clusterId) { + let clusterExt = extension; + if (clusterId) { + clusterExt = ExtensionFactory.getExtension(clusterId) + } + return clusterExt.webhookRegistry; + } + const configInstance = { fdkHandler: router, extension: extension, @@ -50,7 +70,8 @@ function setupFdk(data, syncInitialization) { webhookRegistry: extension.webhookRegistry, applicationProxyRoutes: applicationProxyRoutes, getPlatformClient: getPlatformClient, - getApplicationClient: getApplicationClient + getApplicationClient: getApplicationClient, + getWebhookRegistry: getWebhookRegistry }; return syncInitialization? promiseInit.then(()=>configInstance).catch(()=>configInstance): configInstance; diff --git a/express/middleware/session_middleware.js b/express/middleware/session_middleware.js index 0e618455..75ccc3ab 100644 --- a/express/middleware/session_middleware.js +++ b/express/middleware/session_middleware.js @@ -1,9 +1,14 @@ 'use strict'; +const { ExtensionFactory } = require('../extension_factory'); const { SESSION_COOKIE_NAME } = require('./../constants'); function sessionMiddleware(extension, strict) { return async (req, res, next) => { try { + const clusterId = req.params.cluster_id; + if (clusterId) { + extension = ExtensionFactory.getExtension(clusterId) + } const companyId = req.headers['x-company-id'] || req.query['company_id']; const compCookieName = `${SESSION_COOKIE_NAME}_${companyId}` let sessionId = req.signedCookies[compCookieName]; diff --git a/express/routes.js b/express/routes.js index 435fb8eb..a7114b1e 100644 --- a/express/routes.js +++ b/express/routes.js @@ -11,12 +11,13 @@ const FdkRoutes = express.Router(); function setupRoutes(ext) { - let storage = ext.storage; - let callbacks = ext.callbacks; - - FdkRoutes.get("/fp/install", async (req, res, next) => { + FdkRoutes.get(["/fp/install", "/:cluster_id/fp/install"], async (req, res, next) => { // ?company_id=1&client_id=123313112122 try { + const cluster_id = req.params.cluster_id; + if (cluster_id) { + ext = ExtensionFactory.getExtension(cluster_id) + } let companyId = parseInt(req.query.company_id); let platformConfig = ext.getPlatformConfig(companyId); let session; @@ -89,9 +90,13 @@ function setupRoutes(ext) { } }); - FdkRoutes.get("/fp/auth", sessionMiddleware(ext, false), async (req, res, next) => { + FdkRoutes.get(["/fp/auth", "/:cluster_id/fp/auth"], sessionMiddleware(ext, false), async (req, res, next) => { // ?code=ddjfhdsjfsfh&client_id=jsfnsajfhkasf&company_id=1&state=jashoh try { + const cluster_id = req.params.cluster_id; + if (cluster_id) { + ext = ExtensionFactory.getExtension(cluster_id) + } if (!req.fdkSession) { throw new FdkSessionNotFoundError("Can not complete oauth process as session not found"); } @@ -107,11 +112,6 @@ function setupRoutes(ext) { let token = platformConfig.oauthClient.raw_token; let sessionExpires = new Date(Date.now() + token.expires_in * 1000); - req.fdkSession.access_token = token.access_token; - req.fdkSession.expires_in = token.expires_in; - req.fdkSession.access_token_validity = sessionExpires.getTime(); - req.fdkSession.current_user = token.current_user; - req.fdkSession.refresh_token = token.refresh_token; req.fdkSession.expires = sessionExpires; token.access_token_validity = sessionExpires.getTime(); req.fdkSession.updateToken(token); @@ -172,11 +172,14 @@ function setupRoutes(ext) { }); - FdkRoutes.post("/fp/auto_install", sessionMiddleware(false), async (req, res, next) => { + FdkRoutes.post(["/fp/auto_install", "/:cluster_id/fp/auto_install"], sessionMiddleware(ext, false), async (req, res, next) => { try { let { company_id, code } = req.body; - + const cluster_id = req.params.cluster_id; + if (cluster_id) { + ext = ExtensionFactory.getExtension(cluster_id) + } logger.debug(`Extension auto install started for company: ${company_id} on company creation.`); let platformConfig = ext.getPlatformConfig(company_id); @@ -223,9 +226,10 @@ function setupRoutes(ext) { } }); - FdkRoutes.post("/fp/uninstall", async (req, res, next) => { + FdkRoutes.post(["/fp/uninstall", "/:cluster_id/fp/uninstall"], async (req, res, next) => { try { let { company_id } = req.body; + const cluster_id = req.params.cluster_id; let sid; if (!ext.isOnlineAccessMode()) { sid = Session.generateSessionId(false, { diff --git a/express/webhook.js b/express/webhook.js index 78b5be14..cb7547b8 100644 --- a/express/webhook.js +++ b/express/webhook.js @@ -289,6 +289,7 @@ class WebhookRegistry { } try { const { body } = req; + const clusterId = req.params.cluster_id; if (body.event.name === TEST_WEBHOOK_EVENT_NAME) { return; } @@ -304,7 +305,7 @@ class WebhookRegistry { if (typeof extHandler === 'function') { logger.debug(`Webhook event received for company: ${req.body.company_id}, application: ${req.body.application_id || ''}, event name: ${eventName}`); - await extHandler(eventName, req.body, req.body.company_id, req.body.application_id); + await extHandler(eventName, req.body, req.body.company_id, req.body.application_id, clusterId); } else { throw new FdkWebhookHandlerNotFound(`Webhook handler not assigned: ${categoryEventName}`); From fd0fc24c63d9aec9d355e52ef1df04321bec6664 Mon Sep 17 00:00:00 2001 From: Brijesh Mahidhariya Date: Wed, 29 Nov 2023 21:55:54 +0530 Subject: [PATCH 5/9] Add missing imports and move cluster_id param base route on priority - Specific routes will be matched first based on routing logic of Express so moving cluster id based route as first --- express/api_routes.js | 5 +++-- express/routes.js | 25 +++++++++++++------------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/express/api_routes.js b/express/api_routes.js index 4ef682d2..fefba875 100644 --- a/express/api_routes.js +++ b/express/api_routes.js @@ -2,13 +2,14 @@ const express = require('express'); const { sessionMiddleware } = require('./middleware/session_middleware'); const { ApplicationConfig, ApplicationClient } = require("@gofynd/fdk-client-javascript"); +const { ExtensionFactory } = require('./extension_factory'); function setupProxyRoutes(extension) { const apiRoutes = express.Router({ mergeParams: true }); const applicationProxyRoutes = express.Router({ mergeParams: true }); - applicationProxyRoutes.use(["/", "/:cluster_id"],async (req, res, next) => { + applicationProxyRoutes.use(["/:cluster_id", "/"],async (req, res, next) => { try { const clusterId = req.params.cluster_id; if (clusterId) { @@ -33,7 +34,7 @@ function setupProxyRoutes(extension) { } }); - apiRoutes.use(["/", "/:cluster_id"], sessionMiddleware(extension, true), async (req, res, next) => { + apiRoutes.use(["/:cluster_id", "/"], sessionMiddleware(extension, true), async (req, res, next) => { try { const clusterId = req.params.cluster_id; if (clusterId) { diff --git a/express/routes.js b/express/routes.js index a7114b1e..cd07e99d 100644 --- a/express/routes.js +++ b/express/routes.js @@ -5,13 +5,14 @@ const Session = require("./session/session"); const { FdkSessionNotFoundError, FdkInvalidOAuthError } = require("./error_code"); const { SESSION_COOKIE_NAME } = require('./constants'); const { sessionMiddleware } = require('./middleware/session_middleware'); +const { ExtensionFactory } = require('./extension_factory'); const logger = require('./logger'); const FdkRoutes = express.Router(); function setupRoutes(ext) { - FdkRoutes.get(["/fp/install", "/:cluster_id/fp/install"], async (req, res, next) => { + FdkRoutes.get(["/:cluster_id/fp/install", "/fp/install"], async (req, res, next) => { // ?company_id=1&client_id=123313112122 try { const cluster_id = req.params.cluster_id; @@ -21,7 +22,7 @@ function setupRoutes(ext) { let companyId = parseInt(req.query.company_id); let platformConfig = ext.getPlatformConfig(companyId); let session; - if(ext.isOnlineAccessMode()) { + if (ext.isOnlineAccessMode()) { session = new Session(Session.generateSessionId(true)); } else { let sid = Session.generateSessionId(false, { @@ -29,9 +30,9 @@ function setupRoutes(ext) { companyId: companyId }); session = await ext.sessionStorage.getSession(sid); - if(!session) { + if (!session) { session = new Session(sid); - } else if(session.extension_id !== ext.api_key) { + } else if (session.extension_id !== ext.api_key) { session = new Session(sid); } } @@ -90,7 +91,7 @@ function setupRoutes(ext) { } }); - FdkRoutes.get(["/fp/auth", "/:cluster_id/fp/auth"], sessionMiddleware(ext, false), async (req, res, next) => { + FdkRoutes.get(["/:cluster_id/fp/auth", "/fp/auth"], sessionMiddleware(ext, false), async (req, res, next) => { // ?code=ddjfhdsjfsfh&client_id=jsfnsajfhkasf&company_id=1&state=jashoh try { const cluster_id = req.params.cluster_id; @@ -115,7 +116,7 @@ function setupRoutes(ext) { req.fdkSession.expires = sessionExpires; token.access_token_validity = sessionExpires.getTime(); req.fdkSession.updateToken(token); - + await ext.sessionStorage.saveSession(req.fdkSession); // Generate separate access token for offline mode @@ -172,7 +173,7 @@ function setupRoutes(ext) { }); - FdkRoutes.post(["/fp/auto_install", "/:cluster_id/fp/auto_install"], sessionMiddleware(ext, false), async (req, res, next) => { + FdkRoutes.post(["/:cluster_id/fp/auto_install", "/fp/auto_install"], sessionMiddleware(ext, false), async (req, res, next) => { try { let { company_id, code } = req.body; @@ -187,7 +188,7 @@ function setupRoutes(ext) { cluster: ext.cluster, companyId: company_id }); - + let session = await ext.sessionStorage.getSession(sid); if (!session) { session = new Session(sid); @@ -206,9 +207,9 @@ function setupRoutes(ext) { session.updateToken(offlineTokenRes); if (!ext.isOnlineAccessMode()) { - await ext.sessionStorage.saveSession(session); + await ext.sessionStorage.saveSession(session); } - + if (ext.webhookRegistry.isInitialized && ext.webhookRegistry.isSubscribeOnInstall) { const client = await ext.getPlatformClient(company_id, session); await ext.webhookRegistry.syncEvents(client, null, true).catch((err) => { @@ -218,7 +219,7 @@ function setupRoutes(ext) { logger.debug(`Extension installed for company: ${company_id} on company creation.`); if (ext.callbacks.auto_install) { await ext.callbacks.auto_install(req); - } + } res.json({ message: "success" }); } catch (error) { logger.error(error); @@ -226,7 +227,7 @@ function setupRoutes(ext) { } }); - FdkRoutes.post(["/fp/uninstall", "/:cluster_id/fp/uninstall"], async (req, res, next) => { + FdkRoutes.post(["/:cluster_id/fp/uninstall", "/fp/uninstall"], async (req, res, next) => { try { let { company_id } = req.body; const cluster_id = req.params.cluster_id; From 546e0a2e0bea8a2e490da5a88ce428d7d63d6eb1 Mon Sep 17 00:00:00 2001 From: Brijesh Mahidhariya Date: Wed, 29 Nov 2023 21:56:32 +0530 Subject: [PATCH 6/9] update version on package-lock file --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0a80b0bd..0d1590b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "fdk-extension-javascript", - "version": "0.6.0", + "version": "0.6.0-beta.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "fdk-extension-javascript", - "version": "0.5.4", + "version": "0.6.0-beta.3", "license": "ISC", "dependencies": { "axios": "^0.21.1", From 5134791be34753a8c94503d0955c7f12a0b0a2cc Mon Sep 17 00:00:00 2001 From: Brijesh Mahidhariya Date: Thu, 29 Feb 2024 20:52:08 +0530 Subject: [PATCH 7/9] Multicluster support changes and cluster origin added --- express/api_routes.js | 8 ++++---- express/extension_factory.js | 5 +++-- express/middleware/session_middleware.js | 2 +- express/routes.js | 19 +++++++++++-------- express/webhook.js | 2 +- package-lock.json | 2 +- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/express/api_routes.js b/express/api_routes.js index fefba875..f0cffc3f 100644 --- a/express/api_routes.js +++ b/express/api_routes.js @@ -9,9 +9,9 @@ function setupProxyRoutes(extension) { const apiRoutes = express.Router({ mergeParams: true }); const applicationProxyRoutes = express.Router({ mergeParams: true }); - applicationProxyRoutes.use(["/:cluster_id", "/"],async (req, res, next) => { + applicationProxyRoutes.use( "/" ,async (req, res, next) => { try { - const clusterId = req.params.cluster_id; + const clusterId = req.query.cluster_origin; if (clusterId) { extension = ExtensionFactory.getExtension(clusterId) } @@ -34,9 +34,9 @@ function setupProxyRoutes(extension) { } }); - apiRoutes.use(["/:cluster_id", "/"], sessionMiddleware(extension, true), async (req, res, next) => { + apiRoutes.use( "/" , sessionMiddleware(extension, true), async (req, res, next) => { try { - const clusterId = req.params.cluster_id; + const clusterId = req.query.cluster_origin; if (clusterId) { extension = ExtensionFactory.getExtension(clusterId) } diff --git a/express/extension_factory.js b/express/extension_factory.js index 2695f5a3..38355c27 100644 --- a/express/extension_factory.js +++ b/express/extension_factory.js @@ -8,7 +8,7 @@ class ExtensionFactory { static getExtension(clusterId) { const clusterExt = ExtensionFactory._extensionMap[clusterId] if (clusterId !== null && !clusterExt) { - throw FdkInvalidCluster(`Extension instance not found for clusterId ${clusterId}`); + throw new FdkInvalidCluster(`Extension instance not found for clusterId ${clusterId}`); } return clusterExt; } @@ -27,7 +27,8 @@ class ExtensionFactory { if (!ExtensionFactory._defaultExt) { ExtensionFactory._defaultExt = extInstance; } - ExtensionFactory._extensionMap[extConfig.cluster_id] = extInstance; + const cluster_id = clusterId || extConfig.cluster.replace("https://", "").replace("http://", ""); + ExtensionFactory._extensionMap[cluster_id] = extInstance; promises.push(extInstance.initialize(extConfig)) } return Promise.all(promises); diff --git a/express/middleware/session_middleware.js b/express/middleware/session_middleware.js index 75ccc3ab..f339f81f 100644 --- a/express/middleware/session_middleware.js +++ b/express/middleware/session_middleware.js @@ -5,7 +5,7 @@ const { SESSION_COOKIE_NAME } = require('./../constants'); function sessionMiddleware(extension, strict) { return async (req, res, next) => { try { - const clusterId = req.params.cluster_id; + const clusterId = req.query.cluster_origin; if (clusterId) { extension = ExtensionFactory.getExtension(clusterId) } diff --git a/express/routes.js b/express/routes.js index 488c4934..5c705c32 100644 --- a/express/routes.js +++ b/express/routes.js @@ -12,10 +12,10 @@ const FdkRoutes = express.Router(); function setupRoutes(ext) { - FdkRoutes.get(["/:cluster_id/fp/install", "/fp/install"], async (req, res, next) => { + FdkRoutes.get("/fp/install", async (req, res, next) => { // ?company_id=1&client_id=123313112122 try { - const cluster_id = req.params.cluster_id; + const cluster_id = req.query.cluster_origin; if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } @@ -91,10 +91,10 @@ function setupRoutes(ext) { } }); - FdkRoutes.get(["/:cluster_id/fp/auth", "/fp/auth"], sessionMiddleware(ext, false), async (req, res, next) => { + FdkRoutes.get("/fp/auth", sessionMiddleware(ext, false), async (req, res, next) => { // ?code=ddjfhdsjfsfh&client_id=jsfnsajfhkasf&company_id=1&state=jashoh try { - const cluster_id = req.params.cluster_id; + const cluster_id = req.query.cluster_origin; if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } @@ -173,11 +173,11 @@ function setupRoutes(ext) { }); - FdkRoutes.post(["/:cluster_id/fp/auto_install", "/fp/auto_install"], sessionMiddleware(ext, false), async (req, res, next) => { + FdkRoutes.post("/fp/auto_install", sessionMiddleware(ext, false), async (req, res, next) => { try { let { company_id, code } = req.body; - const cluster_id = req.params.cluster_id; + const cluster_id = req.query.cluster_origin; if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } @@ -227,10 +227,13 @@ function setupRoutes(ext) { } }); - FdkRoutes.post(["/:cluster_id/fp/uninstall", "/fp/uninstall"], async (req, res, next) => { + FdkRoutes.post("/fp/uninstall", async (req, res, next) => { try { let { company_id } = req.body; - const cluster_id = req.params.cluster_id; + const cluster_id = req.query.cluster_origin; + if (cluster_id) { + ext = ExtensionFactory.getExtension(cluster_id) + } let sid; if (!ext.isOnlineAccessMode()) { sid = Session.generateSessionId(false, { diff --git a/express/webhook.js b/express/webhook.js index 2d677275..e5ca032f 100644 --- a/express/webhook.js +++ b/express/webhook.js @@ -291,7 +291,7 @@ class WebhookRegistry { } try { const { body } = req; - const clusterId = req.params.cluster_id; + const clusterId = body.referer || req.query.cluster_origin; if (body.event.name === TEST_WEBHOOK_EVENT_NAME) { return; } diff --git a/package-lock.json b/package-lock.json index 49e3844d..1a4f9280 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "fdk-extension-javascript", - "version": "0.6.0-beta.3", + "version": "0.6.0", "lockfileVersion": 3, "requires": true, "packages": { From d9d3a97f155c662e99fd377349079254fb750ee0 Mon Sep 17 00:00:00 2001 From: pooransuthar Date: Wed, 5 Jun 2024 16:43:04 +0530 Subject: [PATCH 8/9] Variable name changed to cluster Domain As per the changes to scattershot --- express/api_routes.js | 4 ++-- express/middleware/session_middleware.js | 2 +- express/routes.js | 8 ++++---- express/webhook.js | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/express/api_routes.js b/express/api_routes.js index f0cffc3f..95f20b75 100644 --- a/express/api_routes.js +++ b/express/api_routes.js @@ -11,7 +11,7 @@ function setupProxyRoutes(extension) { applicationProxyRoutes.use( "/" ,async (req, res, next) => { try { - const clusterId = req.query.cluster_origin; + const clusterId = req.query.cluster_domain; if (clusterId) { extension = ExtensionFactory.getExtension(clusterId) } @@ -36,7 +36,7 @@ function setupProxyRoutes(extension) { apiRoutes.use( "/" , sessionMiddleware(extension, true), async (req, res, next) => { try { - const clusterId = req.query.cluster_origin; + const clusterId = req.query.cluster_domain; if (clusterId) { extension = ExtensionFactory.getExtension(clusterId) } diff --git a/express/middleware/session_middleware.js b/express/middleware/session_middleware.js index f339f81f..bd6e0198 100644 --- a/express/middleware/session_middleware.js +++ b/express/middleware/session_middleware.js @@ -5,7 +5,7 @@ const { SESSION_COOKIE_NAME } = require('./../constants'); function sessionMiddleware(extension, strict) { return async (req, res, next) => { try { - const clusterId = req.query.cluster_origin; + const clusterId = req.query.cluster_domain; if (clusterId) { extension = ExtensionFactory.getExtension(clusterId) } diff --git a/express/routes.js b/express/routes.js index 5c705c32..4126a18e 100644 --- a/express/routes.js +++ b/express/routes.js @@ -15,7 +15,7 @@ function setupRoutes(ext) { FdkRoutes.get("/fp/install", async (req, res, next) => { // ?company_id=1&client_id=123313112122 try { - const cluster_id = req.query.cluster_origin; + const cluster_id = req.query.cluster_domain; if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } @@ -94,7 +94,7 @@ function setupRoutes(ext) { FdkRoutes.get("/fp/auth", sessionMiddleware(ext, false), async (req, res, next) => { // ?code=ddjfhdsjfsfh&client_id=jsfnsajfhkasf&company_id=1&state=jashoh try { - const cluster_id = req.query.cluster_origin; + const cluster_id = req.query.cluster_domain; if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } @@ -177,7 +177,7 @@ function setupRoutes(ext) { try { let { company_id, code } = req.body; - const cluster_id = req.query.cluster_origin; + const cluster_id = req.query.cluster_domain; if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } @@ -230,7 +230,7 @@ function setupRoutes(ext) { FdkRoutes.post("/fp/uninstall", async (req, res, next) => { try { let { company_id } = req.body; - const cluster_id = req.query.cluster_origin; + const cluster_id = req.query.cluster_domain; if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } diff --git a/express/webhook.js b/express/webhook.js index e5ca032f..34b723e2 100644 --- a/express/webhook.js +++ b/express/webhook.js @@ -291,7 +291,7 @@ class WebhookRegistry { } try { const { body } = req; - const clusterId = body.referer || req.query.cluster_origin; + const clusterId = body.referer || req.query.cluster_domain; if (body.event.name === TEST_WEBHOOK_EVENT_NAME) { return; } From 07576db302e6d993d6e54b2fd0e47a46b492adc8 Mon Sep 17 00:00:00 2001 From: pooransuthar Date: Wed, 5 Jun 2024 21:30:51 +0530 Subject: [PATCH 9/9] Multi Extension Fixes --- express/api_routes.js | 4 ++-- express/index.js | 2 +- express/routes.js | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/express/api_routes.js b/express/api_routes.js index 95f20b75..91545f06 100644 --- a/express/api_routes.js +++ b/express/api_routes.js @@ -11,7 +11,7 @@ function setupProxyRoutes(extension) { applicationProxyRoutes.use( "/" ,async (req, res, next) => { try { - const clusterId = req.query.cluster_domain; + const clusterId = req.query.cluster_domain || req.query.cluster_url?.replace("https://", "").replace("http://", ""); if (clusterId) { extension = ExtensionFactory.getExtension(clusterId) } @@ -36,7 +36,7 @@ function setupProxyRoutes(extension) { apiRoutes.use( "/" , sessionMiddleware(extension, true), async (req, res, next) => { try { - const clusterId = req.query.cluster_domain; + const clusterId = req.query.cluster_domain || req.query.cluster_url?.replace("https://", "").replace("http://", ""); if (clusterId) { extension = ExtensionFactory.getExtension(clusterId) } diff --git a/express/index.js b/express/index.js index b069521a..28b99bb7 100644 --- a/express/index.js +++ b/express/index.js @@ -9,7 +9,7 @@ const logger = require('./logger'); function setupFdk(data, syncInitialization) { const multiClusterMode = data.cluster_config !== undefined; - const clusterId = data.cluster.replace("https://", "").replace("http://", ""); + const clusterId = data.cluster?.replace("https://", "").replace("http://", ""); if (data.debug) { logger.transports[0].level = 'debug'; } diff --git a/express/routes.js b/express/routes.js index 4126a18e..d5757c5a 100644 --- a/express/routes.js +++ b/express/routes.js @@ -15,7 +15,7 @@ function setupRoutes(ext) { FdkRoutes.get("/fp/install", async (req, res, next) => { // ?company_id=1&client_id=123313112122 try { - const cluster_id = req.query.cluster_domain; + const cluster_id = req.query.cluster_domain || req.query.cluster_url?.replace("https://", "").replace("http://", ""); if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } @@ -94,7 +94,7 @@ function setupRoutes(ext) { FdkRoutes.get("/fp/auth", sessionMiddleware(ext, false), async (req, res, next) => { // ?code=ddjfhdsjfsfh&client_id=jsfnsajfhkasf&company_id=1&state=jashoh try { - const cluster_id = req.query.cluster_domain; + const cluster_id = req.query.cluster_domain || req.query.cluster_url?.replace("https://", "").replace("http://", ""); if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } @@ -177,7 +177,7 @@ function setupRoutes(ext) { try { let { company_id, code } = req.body; - const cluster_id = req.query.cluster_domain; + const cluster_id = req.query.cluster_domain || req.query.cluster_url?.replace("https://", "").replace("http://", ""); if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) } @@ -230,7 +230,7 @@ function setupRoutes(ext) { FdkRoutes.post("/fp/uninstall", async (req, res, next) => { try { let { company_id } = req.body; - const cluster_id = req.query.cluster_domain; + const cluster_id = req.query.cluster_domain || req.query.cluster_url?.replace("https://", "").replace("http://", ""); if (cluster_id) { ext = ExtensionFactory.getExtension(cluster_id) }