diff --git a/app/client/src/WidgetQueryGenerators/BaseQueryGenerator.ts b/app/client/src/WidgetQueryGenerators/BaseQueryGenerator.ts index 8aab940a82..e93e6bc137 100644 --- a/app/client/src/WidgetQueryGenerators/BaseQueryGenerator.ts +++ b/app/client/src/WidgetQueryGenerators/BaseQueryGenerator.ts @@ -1 +1,9 @@ -export class BaseQueryGenerator {} +import type { DatasourceStorage } from "entities/Datasource"; + +export class BaseQueryGenerator { + static getConnectionMode( + datasourceConfiguration: DatasourceStorage["datasourceConfiguration"], + ) { + return datasourceConfiguration?.connection?.mode; + } +} diff --git a/app/client/src/WidgetQueryGenerators/GSheets/index.ts b/app/client/src/WidgetQueryGenerators/GSheets/index.ts index b55765c26f..b79a1ef3b4 100644 --- a/app/client/src/WidgetQueryGenerators/GSheets/index.ts +++ b/app/client/src/WidgetQueryGenerators/GSheets/index.ts @@ -9,6 +9,7 @@ import type { } from "WidgetQueryGenerators/types"; import { removeSpecialChars } from "utils/helpers"; import { DatasourceConnectionMode } from "entities/Datasource"; +import type { DatasourceStorage } from "entities/Datasource"; enum COMMAND_TYPES { "FIND" = "FETCH_MANY", @@ -47,6 +48,7 @@ export default abstract class GSheets extends BaseQueryGenerator { }, }; } + private static buildFind( widgetConfig: WidgetQueryGenerationConfig, formConfig: WidgetQueryGenerationFormConfig, @@ -306,6 +308,16 @@ export default abstract class GSheets extends BaseQueryGenerator { return configs.filter((val) => !!val); } + static getConnectionMode( + datasourceConfiguration: DatasourceStorage["datasourceConfiguration"], + ) { + return datasourceConfiguration?.authentication?.scopeString?.includes( + "spreadsheets.readonly", + ) + ? DatasourceConnectionMode.READ_ONLY + : DatasourceConnectionMode.READ_WRITE; + } + static getTotalRecordExpression(binding: string) { return `${binding}.length`; } diff --git a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/useSource/useDatasourceOptions.tsx b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/useSource/useDatasourceOptions.tsx index 16af43a257..b438d9dac4 100644 --- a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/useSource/useDatasourceOptions.tsx +++ b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/CommonControls/DatasourceDropdown/useSource/useDatasourceOptions.tsx @@ -33,6 +33,7 @@ import { getCurrentWorkspaceId } from "@appsmith/selectors/workspaceSelectors"; import type { WidgetProps } from "widgets/BaseWidget"; import { WidgetQueryGeneratorFormContext } from "components/editorComponents/WidgetQueryGeneratorForm/index"; import { getAssetUrl } from "@appsmith/utils/airgapHelpers"; +import { getDatasourceConnectionMode } from "components/editorComponents/WidgetQueryGeneratorForm/utils"; interface DatasourceOptionsProps { widget: WidgetProps; @@ -83,10 +84,10 @@ function useDatasourceOptions(props: DatasourceOptionsProps) { isValid: isEnvironmentValid(datasource, currentEnvironment), pluginPackageName: pluginsPackageNamesMap[datasource.pluginId], isSample: false, - connectionMode: getEnvironmentConfiguration( - datasource, - currentEnvironment, - )?.connection?.mode, + connectionMode: getDatasourceConnectionMode( + pluginsPackageNamesMap[datasource.pluginId], + getEnvironmentConfiguration(datasource, currentEnvironment), + ), }, icon: ( diff --git a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/utils.test.ts b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/utils.test.ts new file mode 100644 index 0000000000..135c90005d --- /dev/null +++ b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/utils.test.ts @@ -0,0 +1,58 @@ +import WidgetQueryGeneratorRegistry from "utils/WidgetQueryGeneratorRegistry"; +import { getDatasourceConnectionMode } from "./utils"; +import type { DatasourceStorage } from "entities/Datasource"; +import { PluginPackageName } from "entities/Action"; +import PostgreSQL from "WidgetQueryGenerators/PostgreSQL"; +import GSheets from "WidgetQueryGenerators/GSheets"; + +describe("getDatasourceConnectionMode", () => { + beforeAll(() => { + WidgetQueryGeneratorRegistry.register( + PluginPackageName.POSTGRES, + PostgreSQL, + ); + WidgetQueryGeneratorRegistry.register( + PluginPackageName.GOOGLE_SHEETS, + GSheets, + ); + }); + + it("should return the connection mode from the query generator", () => { + expect( + getDatasourceConnectionMode(PluginPackageName.POSTGRES, { + connection: { + mode: "READ_ONLY", + }, + } as DatasourceStorage["datasourceConfiguration"]), + ).toEqual("READ_ONLY"); + + expect( + getDatasourceConnectionMode(PluginPackageName.GOOGLE_SHEETS, { + authentication: { + scopeString: "spreadsheets.readonly", + }, + } as DatasourceStorage["datasourceConfiguration"]), + ).toEqual("READ_ONLY"); + + expect( + getDatasourceConnectionMode(PluginPackageName.GOOGLE_SHEETS, { + authentication: { + scopeString: "spreadsheets", + }, + } as DatasourceStorage["datasourceConfiguration"]), + ).toEqual("READ_WRITE"); + }); + + it("should return null if the query generator is not found", () => { + const result = getDatasourceConnectionMode( + "non-existent-plugin-package-name", + { + connection: { + mode: "READ_ONLY", + }, + } as DatasourceStorage["datasourceConfiguration"], + ); + + expect(result).toBe(undefined); + }); +}); diff --git a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/utils.ts b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/utils.ts index ff5a265ec1..74eb994dd1 100644 --- a/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/utils.ts +++ b/app/client/src/components/editorComponents/WidgetQueryGeneratorForm/utils.ts @@ -1,4 +1,6 @@ import { isNumber } from "lodash"; +import WidgetQueryGeneratorRegistry from "utils/WidgetQueryGeneratorRegistry"; +import type { DatasourceStorage } from "entities/Datasource"; export const getSheetUrl = (sheetId: string): string => `https://docs.google.com/spreadsheets/d/${sheetId}/edit#gid=0`; @@ -9,3 +11,12 @@ export const isValidGsheetConfig = (config: Record) => isNumber(Number(config.tableHeaderIndex)) && !isNaN(Number(config.tableHeaderIndex)) && config.tableHeaderIndex > 0; + +export const getDatasourceConnectionMode = ( + pluginPackageName: string, + datasourceConfiguration?: DatasourceStorage["datasourceConfiguration"], +) => { + const queryGenerator = WidgetQueryGeneratorRegistry.get(pluginPackageName); + + return queryGenerator?.getConnectionMode(datasourceConfiguration); +}; diff --git a/app/client/src/entities/Datasource/index.ts b/app/client/src/entities/Datasource/index.ts index b9ca51279e..a54ecb2950 100644 --- a/app/client/src/entities/Datasource/index.ts +++ b/app/client/src/entities/Datasource/index.ts @@ -54,6 +54,7 @@ export interface DatasourceAuthentication { authenticationType?: string; secretExists?: Record; isAuthorized?: boolean; + scopeString?: string; } export interface DatasourceColumns {