Skip to content

Commit

Permalink
chore: creating a datasource and a quarry after chat widget drop
Browse files Browse the repository at this point in the history
  • Loading branch information
KelvinOm committed Oct 9, 2024
1 parent f2c6a76 commit 5938175
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 121 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import {
BlueprintOperationTypes,
type WidgetDefaultProps,
} from "WidgetProvider/constants";
import { createOrUpdateDataSourceWithAction } from "sagas/DatasourcesSagas";
import { PluginPackageName } from "entities/Action";

export const defaultsConfig = {
isVisible: true,
Expand All @@ -14,7 +16,14 @@ export const defaultsConfig = {
operations: [
{
type: BlueprintOperationTypes.ADD_ACTION,
fn: () => {},
fn: function* () {
yield createOrUpdateDataSourceWithAction(
PluginPackageName.APPSMITH_AI,
{
usecase: { data: "TEXT_CLASSIFY" },
},
);
},
},
],
},
Expand Down
86 changes: 59 additions & 27 deletions app/client/src/sagas/DatasourcesSagas.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { objectKeys } from "@appsmith/utils";
import {
all,
call,
Expand Down Expand Up @@ -33,7 +34,10 @@ import {
getCurrentBasePageId,
getCurrentPageId,
} from "selectors/editorSelectors";
import type { DatasourceGroupByPluginCategory } from "ee/selectors/entitiesSelector";
import {
type DatasourceGroupByPluginCategory,
getDatasourceByPluginId,
} from "ee/selectors/entitiesSelector";
import {
getDatasource,
getDatasourceActionRouteInfo,
Expand Down Expand Up @@ -80,7 +84,6 @@ import type {
import {
AuthenticationStatus,
FilePickerActionStatus,
ToastMessageType,
} from "entities/Datasource";
import {
INTEGRATION_TABS,
Expand Down Expand Up @@ -149,12 +152,10 @@ import {
saasEditorDatasourceIdURL,
} from "ee/RouteBuilder";
import {
DATASOURCE_NAME_DEFAULT_PREFIX,
GOOGLE_SHEET_FILE_PICKER_OVERLAY_CLASS,
GOOGLE_SHEET_SPECIFIC_SHEETS_SCOPE,
TEMP_DATASOURCE_ID,
} from "constants/Datasource";
import { getUntitledDatasourceSequence } from "utils/DatasourceSagaUtils";
import { toast } from "@appsmith/ads";
import { fetchPluginFormConfig } from "actions/pluginActions";
import { addClassToDocumentRoot } from "pages/utils";
Expand All @@ -175,11 +176,15 @@ import { getCurrentGitBranch } from "selectors/gitSyncSelectors";
import FocusRetention from "./FocusRetentionSaga";
import { identifyEntityFromPath } from "../navigation/FocusEntity";
import { MAX_DATASOURCE_SUGGESTIONS } from "constants/DatasourceEditorConstants";
import { getFromServerWhenNoPrefetchedResult } from "./helper";
import {
getFromServerWhenNoPrefetchedResult,
getInitialDatasourcePayload,
} from "./helper";
import { executeGoogleApi } from "./loadGoogleApi";
import type { ActionParentEntityTypeInterface } from "ee/entities/Engine/actionHelpers";
import { getCurrentModuleId } from "ee/selectors/modulesSelector";
import type { ApplicationPayload } from "entities/Application";
import { createActionRequest } from "../actions/pluginActionActions";

function* fetchDatasourcesSaga(
action: ReduxAction<
Expand Down Expand Up @@ -592,7 +597,7 @@ function* updateDatasourceSaga(
//So we need to update the other storages with the old values.
// TODO server should send ony the updated storage or whole datasource.
if (!isNewStorage) {
Object.keys(datasourcePayload.datasourceStorages).forEach(
objectKeys(datasourcePayload.datasourceStorages).forEach(
(storageId: string) => {
if (storageId !== currentEnvironment) {
response.data.datasourceStorages[storageId] =
Expand Down Expand Up @@ -1061,9 +1066,6 @@ function* createTempDatasourceFromFormSaga(
);
const initialValues: unknown = yield call(getConfigInitialValues, formConfig);

const dsList: Datasource[] = yield select(getDatasources);
const sequence = getUntitledDatasourceSequence(dsList);

let datasourceType = actionPayload?.payload?.type;

if (!actionPayload?.payload.type) {
Expand All @@ -1076,25 +1078,11 @@ function* createTempDatasourceFromFormSaga(
}

const defaultEnvId = getDefaultEnvId();
const initialPayload: Datasource = yield getInitialDatasourcePayload(
actionPayload.payload.pluginId,
datasourceType,
);

const initialPayload = {
id: TEMP_DATASOURCE_ID,
name: DATASOURCE_NAME_DEFAULT_PREFIX + sequence,
type: datasourceType,
pluginId: actionPayload.payload.pluginId,
new: false,
datasourceStorages: {
[defaultEnvId]: {
datasourceId: TEMP_DATASOURCE_ID,
environmentId: defaultEnvId,
isValid: false,
datasourceConfiguration: {
properties: [],
},
toastMessage: ToastMessageType.EMPTY_TOAST_MESSAGE,
},
},
};
const payload = merge(initialPayload, actionPayload.payload);

payload.datasourceStorages[defaultEnvId] = merge(
Expand Down Expand Up @@ -1128,6 +1116,50 @@ function* createTempDatasourceFromFormSaga(
);
}

export function* createOrUpdateDataSourceWithAction(
pluginPackageName: PluginPackageName,
formData: Record<string, unknown>,
) {
const plugin: Plugin = yield select(
getPluginByPackageName,
pluginPackageName,
);
const aiDatasources: Datasource[] = yield select(
getDatasourceByPluginId,
plugin.id,
);
const pageId: string = yield select(getCurrentPageId);
const payload: Datasource = yield getInitialDatasourcePayload(
plugin.id,
plugin.type,
);

if (aiDatasources.length === 0) {
yield createDatasourceFromFormSaga({
payload,
type: ReduxActionTypes.CREATE_DATASOURCE_FROM_FORM_INIT,
});
}

const updatedAiDatasources: Datasource[] = yield select(
getDatasourceByPluginId,
plugin.id,
);

yield put(
createActionRequest({
pageId,
pluginId: updatedAiDatasources[0].pluginId,
datasource: {
id: updatedAiDatasources[0].id,
},
actionConfiguration: {
formData,
},
}),
);
}

export function* createDatasourceFromFormSaga(
actionPayload: ReduxActionWithCallbacks<Datasource, unknown, unknown>,
) {
Expand Down
99 changes: 6 additions & 93 deletions app/client/src/sagas/WidgetBlueprintSagas.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { getFormValues } from "redux-form";
import type { WidgetBlueprint } from "WidgetProvider/constants";
import type { FlattenedWidgetProps } from "reducers/entityReducers/canvasWidgetsReducer";
import type { WidgetProps } from "widgets/BaseWidget";
import { generateReactKey } from "utils/generators";
import { call, put, select } from "redux-saga/effects";
import { call, select } from "redux-saga/effects";
import { get } from "lodash";
import WidgetFactory from "WidgetProvider/factory";

Expand All @@ -14,33 +13,6 @@ import * as log from "loglevel";
import { toast } from "@appsmith/ads";
import type { LayoutSystemTypes } from "layoutSystems/types";
import { getLayoutSystemType } from "selectors/layoutSystemSelectors";
import { getUntitledDatasourceSequence } from "utils/DatasourceSagaUtils";
import { createTempDatasourceFromForm } from "actions/datasourceActions";
import type { CreateDatasourceConfig } from "../api/DatasourcesApi";
// import { createActionRequest } from "../actions/pluginActionActions";
import DatasourcesApi from "api/DatasourcesApi";
import type { Plugin } from "../api/PluginApi";
import { getDefaultEnvId } from "../ce/api/ApiUtils";
import { ReduxActionTypes } from "../ce/constants/ReduxActionConstants";
import {
getDatasources,
// getEntities,
// getPlugin,
// getPluginForm,
// getPluginPackageFromDatasourceId,
getPlugins,
} from "../ce/selectors/entitiesSelector";
import { getCurrentEnvironmentId } from "../ce/selectors/environmentSelectors";
import { getCurrentWorkspaceId } from "../ce/selectors/selectedWorkspaceSelectors";
import {
DATASOURCE_NAME_DEFAULT_PREFIX,
TEMP_DATASOURCE_ID,
} from "../constants/Datasource";
import { PluginName } from "../entities/Action";
import { type Datasource, ToastMessageType } from "../entities/Datasource";
import { getCurrentPageId } from "../selectors/editorSelectors";
import { getFormData } from "../selectors/formSelectors";
import { createDatasourceFromFormSaga } from "./DatasourcesSagas";

function buildView(view: WidgetBlueprint["view"], widgetId: string) {
const children = [];
Expand Down Expand Up @@ -88,7 +60,7 @@ export interface UpdatePropertyArgs {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
propertyValue: any;
}
export type BlueprintOperationAddActionFn = () => void;
export type BlueprintOperationAddActionFn = () => Generator;
export type BlueprintOperationModifyPropsFn = (
widget: WidgetProps & { children?: WidgetProps[] },
widgets: { [widgetId: string]: FlattenedWidgetProps },
Expand Down Expand Up @@ -137,51 +109,6 @@ export function* executeWidgetBlueprintOperations(
widgetId: string,
) {
const layoutSystemType: LayoutSystemTypes = yield select(getLayoutSystemType);
// const datasources: Datasource[] = yield select(getDatasources);
const plugins: Plugin[] = yield select(getPlugins);
// const { initialValues } = yield select(getFormData, DATASOURCE_DB_FORM);
// const pluginId: string = yield select(
// getPluginIdOfPackageName,
// PluginPackageName.APPSMITH_AI,
// );
// const formConfig: Record<string, unknown>[] = yield select(
// getPluginForm,
// pluginId,
// );
//
// const formData = yield select(getFormValues(QUERY_EDITOR_FORM_NAME));
const pageId: string = yield select(getCurrentPageId);
const workspaceId: string = yield select(getCurrentWorkspaceId);
// let currentEnvironment: string = yield select(getCurrentEnvironmentId);

const dsList: Datasource[] = yield select(getDatasources);
const sequence = getUntitledDatasourceSequence(dsList);
const defaultEnvId = getDefaultEnvId();

const plugin = plugins.find(
(plugin: Plugin) => plugin.name === PluginName.APPSMITH_AI,
);

const payload = {
id: TEMP_DATASOURCE_ID,
name: DATASOURCE_NAME_DEFAULT_PREFIX + sequence,
type: plugin!.type,
pluginId: plugin!.id,
new: false,
workspaceId,
datasourceStorages: {
[defaultEnvId]: {
datasourceId: TEMP_DATASOURCE_ID,
environmentId: defaultEnvId,
isValid: false,
datasourceConfiguration: {
url: "",
properties: [],
},
toastMessage: ToastMessageType.EMPTY_TOAST_MESSAGE,
},
},
};

for (const operation of operations) {
const widget: WidgetProps & { children?: string[] | WidgetProps[] } = {
Expand All @@ -190,24 +117,10 @@ export function* executeWidgetBlueprintOperations(

switch (operation.type) {
case BlueprintOperationTypes.ADD_ACTION:
yield createDatasourceFromFormSaga({
payload,
type: ReduxActionTypes.CREATE_DATASOURCE_FROM_FORM_INIT,
});
// yield put(
// createActionRequest({
// pageId,
// pluginId: datasources[0].pluginId,
// datasource: {
// id: datasources[0].id,
// },
// actionConfiguration: {
// formData: {
// usecase: { data: "TEXT_CLASSIFY" },
// },
// },
// }),
// );
if (operation.fn) {
yield (operation.fn as BlueprintOperationAddActionFn)();
}

break;
case BlueprintOperationTypes.MODIFY_PROPS:
if (widget.children && widget.children.length > 0) {
Expand Down
38 changes: 38 additions & 0 deletions app/client/src/sagas/helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import type {
FormEvalOutput,
ConditionalOutput,
} from "reducers/evaluationReducers/formEvaluationReducer";
import { select } from "redux-saga/effects";
import AppsmithConsole from "utils/AppsmithConsole";
import LOG_TYPE from "entities/AppsmithConsole/logtype";
import type { Log } from "entities/AppsmithConsole";
Expand All @@ -22,6 +23,14 @@ import { isPlainObject, isString } from "lodash";
import { DATA_BIND_REGEX_GLOBAL } from "constants/BindingsConstants";
import { apiFailureResponseInterceptor } from "api/interceptors";
import { klonaLiteWithTelemetry } from "utils/helpers";
import { getDefaultEnvId } from "ee/api/ApiUtils";
import { getDatasources } from "ee/selectors/entitiesSelector";
import {
DATASOURCE_NAME_DEFAULT_PREFIX,
TEMP_DATASOURCE_ID,
} from "../constants/Datasource";
import { type Datasource, ToastMessageType } from "../entities/Datasource";
import { getUntitledDatasourceSequence } from "../utils/DatasourceSagaUtils";

// function to extract all objects that have dynamic values
export const extractFetchDynamicValueFormConfigs = (
Expand Down Expand Up @@ -249,3 +258,32 @@ export function* getFromServerWhenNoPrefetchedResult(

return yield apiEffect();
}

export function* getInitialDatasourcePayload(
pluginId: string,
pluginType?: string,
) {
const dsList: Datasource[] = yield select(getDatasources);
const sequence = getUntitledDatasourceSequence(dsList);
const defaultEnvId = getDefaultEnvId();

return {
id: TEMP_DATASOURCE_ID,
name: DATASOURCE_NAME_DEFAULT_PREFIX + sequence,
type: pluginType,
pluginId: pluginId,
new: false,
datasourceStorages: {
[defaultEnvId]: {
datasourceId: TEMP_DATASOURCE_ID,
environmentId: defaultEnvId,
isValid: false,
datasourceConfiguration: {
url: "",
properties: [],
},
toastMessage: ToastMessageType.EMPTY_TOAST_MESSAGE,
},
},
};
}

0 comments on commit 5938175

Please sign in to comment.