From 00076272f6f7606d36ae15ed7111856dd53ab59d Mon Sep 17 00:00:00 2001 From: karishmas6 Date: Thu, 17 Oct 2024 21:22:34 +0530 Subject: [PATCH] feat: write data to sheet with oauth --- .../integrations/gsheet.ts | 46 +++++++++++++------ .../integrations-Load More Test.json | 18 ++++++++ 2 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 server/src/workflow-management/integrations/integrations-Load More Test.json diff --git a/server/src/workflow-management/integrations/gsheet.ts b/server/src/workflow-management/integrations/gsheet.ts index b5aa56fa..ca8c254c 100644 --- a/server/src/workflow-management/integrations/gsheet.ts +++ b/server/src/workflow-management/integrations/gsheet.ts @@ -68,32 +68,52 @@ export async function updateGoogleSheet(robotId: string, runId: string) { } }; -export async function writeDataToSheet(fileName: string, spreadsheetId: string, range: string, data: any[]) { +export async function writeDataToSheet(robotId: string, spreadsheetId: string, data: any[]) { try { - const integrationCredentialsPath = getIntegrationsFilePath(fileName); - const integrationCredentials = JSON.parse(fs.readFileSync(integrationCredentialsPath, 'utf-8'));; + const robot = await Robot.findOne({ where: { 'recording_meta.id': robotId } }); - const auth = new google.auth.GoogleAuth({ - credentials: { - client_email: integrationCredentials.credentials.client_email, - private_key: integrationCredentials.credentials.private_key, - }, - scopes: ['https://www.googleapis.com/auth/spreadsheets'], + if (!robot) { + throw new Error(`Robot not found for robotId: ${robotId}`); + } + + if (!robot.google_access_token || !robot.google_refresh_token) { + throw new Error('Google Sheets access not configured for user'); + } + + const oauth2Client = new google.auth.OAuth2( + process.env.GOOGLE_CLIENT_ID, + process.env.GOOGLE_CLIENT_SECRET, + 'http://localhost:3000' + ); + + oauth2Client.setCredentials({ + access_token: robot.google_access_token, + refresh_token: robot.google_refresh_token, }); - const authToken = await auth.getClient(); - const sheets = google.sheets({ version: 'v4', auth: authToken as any }); + // Refresh the access token if needed + oauth2Client.on('tokens', async (tokens) => { + if (tokens.refresh_token) { + await robot.update({ google_refresh_token: tokens.refresh_token }); + } + + if (tokens.access_token) { + await robot.update({ google_access_token: tokens.access_token }); + } + }); + + const sheets = google.sheets({ version: 'v4', auth: oauth2Client }); const resource = { values: data }; await sheets.spreadsheets.values.append({ spreadsheetId, - range, + range: 'Sheet1!A1', valueInputOption: 'USER_ENTERED', requestBody: resource, }); - logger.log(`info`, `Data written to Google Sheet: ${spreadsheetId}, Range: ${range}`); + logger.log(`info`, `Data written to Google Sheet: ${spreadsheetId}`); } catch (error: any) { logger.log(`error`, `Error writing data to Google Sheet: ${error.message}`); throw error; diff --git a/server/src/workflow-management/integrations/integrations-Load More Test.json b/server/src/workflow-management/integrations/integrations-Load More Test.json new file mode 100644 index 00000000..56135720 --- /dev/null +++ b/server/src/workflow-management/integrations/integrations-Load More Test.json @@ -0,0 +1,18 @@ +{ + "fileName": "Load More Test", + "spreadsheetId": "1lv1DV_Fs2pqRWje5Go9Lfi4qFRjaVH5a8-wOdduOLpM", + "range": "Sheet1!A1:B2", + "credentials": { + "type": "service_account", + "project_id": "maxun-test", + "private_key_id": "19ebcba7a1df27c872e9f4944f38c1636f31ab71", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC6JMuPu+4XvObD\npKcRjNqVb/oCgPLQ4EVVe7yr4u7w8RS5bsQ98ef9lSf4YFlBB8mv+iNqcLCpnW+0\nx/rY+GeuHuUsAzpmvqlBA3s6YnOW52bkNLQsPJfHZTSHOn0pO/5WwWwZkGNNpjY/\njhsqWDXG+CkXq5qAt/e6B2DlM1y3nhYVooguNujqhxKYT8GnS75utEDFpHxvcTN+\n/0dYTz/iDQcqbge2iHFiYbDGjacqecK9s9sbXchsFVLad/gf1Vjk40xYvbMRgzI0\nUJo5GRwa2QUzSCsZViG7VzoQ7pLxRBSl+6CR5n+UvSECGzJxKYgLhMdd40qP4JTl\nSn9TkjARAgMBAAECggEAJiKUq6lKQYW7Vzib264aOARdWXb2iBFyUu2LPUG8RxN0\n9fp57ODq8NpGeo2uq3J/gPSDnfJhVxaAhK51t07I2vTMaaRtqhAEl+OxMshpuvBE\ndZtQkEGHrNuQk+XJL5HxbO+qiGA63/Ud5w5jhVzWA6HitU08VYObFnsdgEdyBtHc\nbVtU02hgComkeaEzuj4fQUR6wOxZ+nlS6K8A9KObk2k+zYzWaoTpDq1pw4g8U0WL\nzAb9btSpEg130JiLAFrNhKzhqtKxU8/Iz9/YEXOmLlAHUSXb9R9yXg0hPLAoAGUL\nKhu6O/GEW8S4UQxMJp3tkMxPT/x7CDCCcXPjPHVKgwKBgQDa4OpjgcABXBfsi8JS\nFnO5PKjoAvlhB8FFlk8lTN/QlXmLfW22hwnlUunvopAfqVgHIj1KqLcqk0qugX8H\n372w/Fj/KC/seb2Z/xe3Yq/VqcWuAsoAfp856cxTISUXhn+OfFoBBirlGon0gMSl\noKpWi8NRjhdXeG6wkWZgZYGcGwKBgQDZtqA2Aqbn9VzVskvqYq0v1LVAFJFUpZTs\naXxYUMU4usuEKhYLWzBraCq+sQlrj9qQl1u6gMcNEZwcr65nlOonzJSq1Qum1kon\nZ+YSFsHnjoBJH9M7FoHfGuR7WKp089QLFW6h1KE85GZ7HMcbYNmQ/Zu5lqNxHqRN\nSn6RTg5PQwKBgQCdilPKiYJsuB+UJ8gXE4f55Rph3Hooh89pydVvsJRL6rqQVxhX\nz3yk7ffpfqWj1FzCzbc1/JfR8jBHyHdpcHZ1ZDyecwuDduCsbfphCYwsCsV5CRLi\nJkFvCsQBdZLgCvPW19Rkdk77lg2DygdAe5L/NhvAoLhWQh3RwuXgLk+KzwKBgQCA\n+D2qISIMkP5AnVF5dKERj5kbb9Oz6C7zaX2+t4JNm+JJ1cCfU5K4XcnMkwV4kYwx\nUWiGcBj6de8b0zqmo8GeeAOtu20elRzygQr6tj6B1JnMN60i+K9QohattxWrGHIJ\natXRyisF7muDDMYqQtI/oOyqIUGLFlLQcovNugaiDwKBgQCRHTfXCu4GyaXmW7du\n1liWLx2W7HWF8e7Lbfo4mw7dR/qaU+LtY+IGFviVmOWmfg5YkstSbnZnJ/h6TMMw\nLQUL4p/gtC+TEKtISU0BUei2T4URGfFNEXybZqD/PKc6FJs0hwolAuuK2AcnvZur\nAclfCbofvdN0owKnHhBFz4o7AA==\n-----END PRIVATE KEY-----\n", + "client_email": "maxun-test@maxun-test.iam.gserviceaccount.com", + "client_id": "112924857681130955230", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/maxun-test%40maxun-test.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" + } +} \ No newline at end of file