From 7807b734bb4f9768803f95b53350fe3611be9034 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Thu, 16 May 2024 14:41:45 +0200 Subject: [PATCH 1/3] Persist googlesheet refs in context --- packages/backend-core/src/context/types.ts | 6 ++ .../server/src/integrations/googlesheets.ts | 62 +++++++++++++------ 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/packages/backend-core/src/context/types.ts b/packages/backend-core/src/context/types.ts index f297d3089f..6694320978 100644 --- a/packages/backend-core/src/context/types.ts +++ b/packages/backend-core/src/context/types.ts @@ -1,4 +1,6 @@ import { IdentityContext, Snippet, VM } from "@budibase/types" +import { OAuth2Client } from "google-auth-library" +import { GoogleSpreadsheet } from "google-spreadsheet" // keep this out of Budibase types, don't want to expose context info export type ContextMap = { @@ -12,4 +14,8 @@ export type ContextMap = { vm?: VM cleanup?: (() => void | Promise)[] snippets?: Snippet[] + googleSheets?: { + oauthClient: OAuth2Client + clients: Record + } } diff --git a/packages/server/src/integrations/googlesheets.ts b/packages/server/src/integrations/googlesheets.ts index dc945b454a..28df55a981 100644 --- a/packages/server/src/integrations/googlesheets.ts +++ b/packages/server/src/integrations/googlesheets.ts @@ -228,32 +228,56 @@ class GoogleSheetsIntegration implements DatasourcePlus { private async connect() { try { - await setupCreationAuth(this.config) + const bbCtx = context.getCurrentContext() + let oauthClient = bbCtx?.googleSheets?.oauthClient - // Initialise oAuth client - const googleConfig = await configs.getGoogleDatasourceConfig() - if (!googleConfig) { - throw new HTTPError("Google config not found", 400) - } + if (!oauthClient) { + await setupCreationAuth(this.config) - const oauthClient = new OAuth2Client({ - clientId: googleConfig.clientID, - clientSecret: googleConfig.clientSecret, - }) + // Initialise oAuth client + const googleConfig = await configs.getGoogleDatasourceConfig() + if (!googleConfig) { + throw new HTTPError("Google config not found", 400) + } - const tokenResponse = await this.fetchAccessToken({ - client_id: googleConfig.clientID, - client_secret: googleConfig.clientSecret, - refresh_token: this.config.auth.refreshToken, - }) + oauthClient = new OAuth2Client({ + clientId: googleConfig.clientID, + clientSecret: googleConfig.clientSecret, + }) - oauthClient.setCredentials({ - refresh_token: this.config.auth.refreshToken, - access_token: tokenResponse.access_token, - }) + const tokenResponse = await this.fetchAccessToken({ + client_id: googleConfig.clientID, + client_secret: googleConfig.clientSecret, + refresh_token: this.config.auth.refreshToken, + }) + + oauthClient.setCredentials({ + refresh_token: this.config.auth.refreshToken, + access_token: tokenResponse.access_token, + }) + if (bbCtx && !bbCtx.googleSheets) { + bbCtx.googleSheets = { + oauthClient, + clients: {}, + } + bbCtx.cleanup = bbCtx.cleanup || [] this.client = new GoogleSpreadsheet(this.spreadsheetId, oauthClient) await this.client.loadInfo() + } + } + + let client = bbCtx?.googleSheets?.clients[this.spreadsheetId] + if (!client) { + client = new GoogleSpreadsheet(this.spreadsheetId, oauthClient) + await client.loadInfo() + + if (bbCtx?.googleSheets?.clients) { + bbCtx.googleSheets.clients[this.spreadsheetId] = client + } + } + + this.client = client } catch (err: any) { // this happens for xlsx imports if (err.message?.includes("operation is not supported")) { From a780a29337a219580f06870094a2de276d0f8928 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Thu, 16 May 2024 14:43:42 +0200 Subject: [PATCH 2/3] Clean --- packages/server/src/integrations/googlesheets.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/server/src/integrations/googlesheets.ts b/packages/server/src/integrations/googlesheets.ts index 28df55a981..d8a0dc9e65 100644 --- a/packages/server/src/integrations/googlesheets.ts +++ b/packages/server/src/integrations/googlesheets.ts @@ -261,9 +261,6 @@ class GoogleSheetsIntegration implements DatasourcePlus { clients: {}, } bbCtx.cleanup = bbCtx.cleanup || [] - - this.client = new GoogleSpreadsheet(this.spreadsheetId, oauthClient) - await this.client.loadInfo() } } From 39ad85127b838237c959ee6f1d3663b1d89e1db8 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 17 May 2024 12:11:26 +0200 Subject: [PATCH 3/3] Use @budibase/google-spreadsheet --- packages/server/package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index ab6738635d..e816ad3f18 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -79,7 +79,7 @@ "dotenv": "8.2.0", "form-data": "4.0.0", "global-agent": "3.0.0", - "google-spreadsheet": "4.1.2", + "google-spreadsheet": "npm:@budibase/google-spreadsheet@4.1.2", "ioredis": "5.3.2", "isolated-vm": "^4.7.2", "jimp": "0.22.10", diff --git a/yarn.lock b/yarn.lock index 810c7c2888..36ce2ce75e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11540,10 +11540,10 @@ google-p12-pem@^4.0.0: dependencies: node-forge "^1.3.1" -google-spreadsheet@4.1.2: +"google-spreadsheet@npm:@budibase/google-spreadsheet@4.1.2": version "4.1.2" - resolved "https://registry.yarnpkg.com/google-spreadsheet/-/google-spreadsheet-4.1.2.tgz#92e30fdba7e0d78c55d50731528df7835d58bfee" - integrity sha512-HFBweDAkOcyC2qO9kmWESKbNuOcn+R7UzZN/tj5LLNxVv8FHmg113u0Ow+yaKwwIOt/NnDtPLuptAhaxTs0FYw== + resolved "https://registry.yarnpkg.com/@budibase/google-spreadsheet/-/google-spreadsheet-4.1.2.tgz#90548ccba2284b3042b08d2974ef3caeaf772ad9" + integrity sha512-dxoY3rQGGnuNeZiXhNc9oYPduzU8xnIjWujFwNvaRRv3zWeUV7mj6HE2o/OJOeekPGt7o44B+w6DfkiaoteZgg== dependencies: axios "^1.4.0" lodash "^4.17.21"