From 21e870109c82e1c4ae2c7e96c3b5caeb8525c287 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 31 May 2023 14:29:45 +0200 Subject: [PATCH] Save datasource --- .../modals/GoogleDatasourceConfigModal.svelte | 26 +++++++++++++++---- .../server/src/api/controllers/datasource.ts | 11 ++++++++ .../server/src/integrations/googlesheets.ts | 18 ++++++++++++- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/packages/builder/src/components/backend/DatasourceNavigator/modals/GoogleDatasourceConfigModal.svelte b/packages/builder/src/components/backend/DatasourceNavigator/modals/GoogleDatasourceConfigModal.svelte index f93f7b29da..7b4808967d 100644 --- a/packages/builder/src/components/backend/DatasourceNavigator/modals/GoogleDatasourceConfigModal.svelte +++ b/packages/builder/src/components/backend/DatasourceNavigator/modals/GoogleDatasourceConfigModal.svelte @@ -13,6 +13,10 @@ import { validateDatasourceConfig } from "builderStore/datasource" import cloneDeep from "lodash/cloneDeepWith" import IntegrationConfigForm from "../TableIntegrationMenu/IntegrationConfigForm.svelte" + import { goto } from "@roxi/routify" + + import { saveDatasource } from "builderStore/datasource" + import { DatasourceFeature } from "@budibase/types" export let integration export let continueSetupId = false @@ -36,19 +40,30 @@ ? GoogleDatasouceConfigStep.SET_URL : GoogleDatasouceConfigStep.AUTH - let isValid + let isValid = false const modalConfig = { [GoogleDatasouceConfigStep.AUTH]: {}, [GoogleDatasouceConfigStep.SET_URL]: { confirmButtonText: "Connect", onConfirm: async () => { - const resp = await validateDatasourceConfig(datasource) - if (!resp.connected) { - notifications.error(`Unable to connect - ${resp.error}`) + if (integration.features[DatasourceFeature.CONNECTION_CHECKING]) { + const resp = await validateDatasourceConfig(datasource) + if (!resp.connected) { + notifications.error(`Unable to connect - ${resp.error}`) + return false + } } - return false + try { + const resp = await saveDatasource(datasource) + $goto(`./datasource/${resp._id}`) + notifications.success(`Datasource created successfully.`) + } catch (err) { + notifications.error(err?.message ?? "Error saving datasource") + // prevent the modal from closing + return false + } }, }, } @@ -61,6 +76,7 @@ confirmText={modalConfig[step].confirmButtonText} showConfirmButton={!!modalConfig[step].onConfirm} onConfirm={modalConfig[step].onConfirm} + disabled={!isValid} > {#if step === GoogleDatasouceConfigStep.AUTH} diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index f3d0c5f83b..d21db8ad03 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -29,6 +29,7 @@ import { } from "@budibase/types" import sdk from "../../sdk" import { builderSocket } from "../../websockets" +import { setupCreationAuth as googleSetupCreationAuth } from "src/integrations/googlesheets" function getErrorTables(errors: any, errorType: string) { return Object.entries(errors) @@ -307,6 +308,12 @@ export async function update(ctx: UserCtx) { builderSocket?.emitDatasourceUpdate(ctx, datasource) } +const preSaveAction: Partial> = { + [SourceName.GOOGLE_SHEETS]: async (datasource: Datasource) => { + await googleSetupCreationAuth(datasource.config as any) + }, +} + export async function save( ctx: UserCtx ) { @@ -328,6 +335,10 @@ export async function save( setDefaultDisplayColumns(datasource) } + if (preSaveAction[datasource.source]) { + await preSaveAction[datasource.source](datasource) + } + const dbResp = await db.put(datasource) await events.datasource.created(datasource) datasource._rev = dbResp.rev diff --git a/packages/server/src/integrations/googlesheets.ts b/packages/server/src/integrations/googlesheets.ts index 2598f6db62..a792f49b57 100644 --- a/packages/server/src/integrations/googlesheets.ts +++ b/packages/server/src/integrations/googlesheets.ts @@ -1,5 +1,6 @@ import { ConnectionInfo, + Datasource, DatasourceFeature, DatasourceFieldType, DatasourcePlus, @@ -19,13 +20,15 @@ import { OAuth2Client } from "google-auth-library" import { buildExternalTableId, finaliseExternalTables } from "./utils" import { GoogleSpreadsheet, GoogleSpreadsheetRow } from "google-spreadsheet" import fetch from "node-fetch" -import { configs, HTTPError } from "@budibase/backend-core" +import { cache, configs, context, HTTPError } from "@budibase/backend-core" import { dataFilters } from "@budibase/shared-core" import { GOOGLE_SHEETS_PRIMARY_KEY } from "../constants" +import sdk from "../sdk" interface GoogleSheetsConfig { spreadsheetId: string auth: OAuthClientConfig + continueSetupId?: string } interface OAuthClientConfig { @@ -147,6 +150,7 @@ class GoogleSheetsIntegration implements DatasourcePlus { async testConnection(): Promise { try { + await setupCreationAuth(this.config) await this.connect() return { connected: true } } catch (e: any) { @@ -566,6 +570,18 @@ class GoogleSheetsIntegration implements DatasourcePlus { } } +export async function setupCreationAuth(datasouce: GoogleSheetsConfig) { + if (datasouce.continueSetupId) { + const appId = context.getAppId() + const tokens = await cache.get( + `datasource:creation:${appId}:google:${datasouce.continueSetupId}` + ) + + datasouce.auth = tokens.tokens + delete datasouce.continueSetupId + } +} + export default { schema: SCHEMA, integration: GoogleSheetsIntegration,