From 9c9d2560b2f8ef6ebc95af1bd8c12a35561cadd4 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Thu, 24 Oct 2024 11:17:31 +0200 Subject: [PATCH 1/6] Remove fetchEnriched --- .../server/src/api/routes/tests/rowAction.spec.ts | 2 +- packages/server/src/tests/utilities/api/automation.ts | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/server/src/api/routes/tests/rowAction.spec.ts b/packages/server/src/api/routes/tests/rowAction.spec.ts index 5cec83fe23..2b6b0f01c9 100644 --- a/packages/server/src/api/routes/tests/rowAction.spec.ts +++ b/packages/server/src/api/routes/tests/rowAction.spec.ts @@ -958,7 +958,7 @@ describe("/rowsActions", () => { // document was not being cleaned up. This meant there existed code paths // that would find it and try to reference the tables within it, resulting // in errors. - await config.api.automation.fetchEnriched({ + await config.api.automation.fetch({ status: 200, }) }) diff --git a/packages/server/src/tests/utilities/api/automation.ts b/packages/server/src/tests/utilities/api/automation.ts index 11c041d52b..9d9a27e891 100644 --- a/packages/server/src/tests/utilities/api/automation.ts +++ b/packages/server/src/tests/utilities/api/automation.ts @@ -23,17 +23,6 @@ export class AutomationAPI extends TestAPI { }) } - fetchEnriched = async ( - expectations?: Expectations - ): Promise => { - return await this._get( - `/api/automations?enrich=true`, - { - expectations, - } - ) - } - post = async ( body: Automation, expectations?: Expectations From ccdb03244966022e25d7a50b5f786dced0e5660b Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Thu, 24 Oct 2024 11:30:59 +0200 Subject: [PATCH 2/6] Move sdk rowaction code --- .../src/sdk/app/{rowActions.ts => rowActions/crud.ts} | 10 +++++----- packages/server/src/sdk/app/rowActions/index.ts | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) rename packages/server/src/sdk/app/{rowActions.ts => rowActions/crud.ts} (96%) create mode 100644 packages/server/src/sdk/app/rowActions/index.ts diff --git a/packages/server/src/sdk/app/rowActions.ts b/packages/server/src/sdk/app/rowActions/crud.ts similarity index 96% rename from packages/server/src/sdk/app/rowActions.ts rename to packages/server/src/sdk/app/rowActions/crud.ts index de73969696..1153677685 100644 --- a/packages/server/src/sdk/app/rowActions.ts +++ b/packages/server/src/sdk/app/rowActions/crud.ts @@ -7,11 +7,11 @@ import { User, VirtualDocumentType, } from "@budibase/types" -import { generateRowActionsID } from "../../db/utils" -import automations from "./automations" -import { definitions as TRIGGER_DEFINITIONS } from "../../automations/triggerInfo" -import * as triggers from "../../automations/triggers" -import sdk from ".." +import { generateRowActionsID } from "../../../db/utils" +import automations from "../automations" +import { definitions as TRIGGER_DEFINITIONS } from "../../../automations/triggerInfo" +import * as triggers from "../../../automations/triggers" +import sdk from "../.." async function ensureUniqueAndThrow( doc: TableRowActions, diff --git a/packages/server/src/sdk/app/rowActions/index.ts b/packages/server/src/sdk/app/rowActions/index.ts new file mode 100644 index 0000000000..8baf08477f --- /dev/null +++ b/packages/server/src/sdk/app/rowActions/index.ts @@ -0,0 +1 @@ +export * from "./crud" From f2e46863f63befe90ea4f0d64c744b63786fa29f Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Thu, 24 Oct 2024 11:53:59 +0200 Subject: [PATCH 3/6] Add test deleting external ds --- .../src/api/routes/tests/rowAction.spec.ts | 59 ++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/packages/server/src/api/routes/tests/rowAction.spec.ts b/packages/server/src/api/routes/tests/rowAction.spec.ts index 2b6b0f01c9..5246304906 100644 --- a/packages/server/src/api/routes/tests/rowAction.spec.ts +++ b/packages/server/src/api/routes/tests/rowAction.spec.ts @@ -1,17 +1,20 @@ import _ from "lodash" import tk from "timekeeper" +import { context, roles } from "@budibase/backend-core" +import { automations } from "@budibase/pro" import { CreateRowActionRequest, DocumentType, PermissionLevel, RowActionResponse, + TableRowActions, } from "@budibase/types" import * as setup from "./utilities" import { generator, mocks } from "@budibase/backend-core/tests" import { Expectations } from "../../../tests/utilities/api/base" -import { roles } from "@budibase/backend-core" -import { automations } from "@budibase/pro" +import { DatabaseName, getDatasource } from "../../../integrations/tests/utils" +import { generateRowActionsID } from "../../../db/utils" const expectAutomationId = () => expect.stringMatching(`^${DocumentType.AUTOMATION}_.+`) @@ -962,5 +965,57 @@ describe("/rowsActions", () => { status: 200, }) }) + + it.each([ + [ + "external", + async () => { + const ds = await config.createDatasource({ + datasource: await getDatasource(DatabaseName.POSTGRES), + }) + const table = await config.api.table.save( + setup.structures.tableForDatasource(ds) + ) + return table + }, + ], + ])( + "should delete all the row actions (and automations) for its tables when a datasource is deleted", + async (_, getTable) => { + async function getRowActionsFromDb(tableId: string) { + return await context.doInAppContext(config.getAppId(), async () => { + const db = context.getAppDB() + const tableDoc = await db.tryGet( + generateRowActionsID(tableId) + ) + return tableDoc + }) + } + + const table = await getTable() + const tableId = table._id! + + await config.api.rowAction.save(tableId, { + name: generator.guid(), + }) + await config.api.rowAction.save(tableId, { + name: generator.guid(), + }) + + const { actions } = (await getRowActionsFromDb(tableId))! + expect(Object.entries(actions)).toHaveLength(2) + + const { automations } = await config.api.automation.fetch() + expect(automations).toHaveLength(2) + + const datasource = await config.api.datasource.get(table.sourceId) + await config.api.datasource.delete(datasource) + + const automationsResp = await config.api.automation.fetch() + expect(automationsResp.automations).toHaveLength(0) + + expect(await getRowActionsFromDb(tableId)).toBeUndefined() + } + ) }) }) From 7b0419773cd9f07af246d1d1584dafa695f34c1b Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Thu, 24 Oct 2024 12:08:17 +0200 Subject: [PATCH 4/6] Implement deletion --- packages/server/src/api/controllers/datasource.ts | 2 ++ packages/server/src/sdk/app/rowActions/index.ts | 1 + packages/server/src/sdk/app/rowActions/utils.ts | 9 +++++++++ 3 files changed, 12 insertions(+) create mode 100644 packages/server/src/sdk/app/rowActions/utils.ts diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index baab008da8..794e2dfddd 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -267,6 +267,8 @@ export async function destroy(ctx: UserCtx) { const datasource = await sdk.datasources.get(datasourceId) // Delete all queries for the datasource + await sdk.rowActions.deleteAllForDatasource(datasourceId) + if (datasource.type === dbCore.BUDIBASE_DATASOURCE_TYPE) { await destroyInternalTablesBySourceId(datasourceId) } else { diff --git a/packages/server/src/sdk/app/rowActions/index.ts b/packages/server/src/sdk/app/rowActions/index.ts index 8baf08477f..b0dbd426df 100644 --- a/packages/server/src/sdk/app/rowActions/index.ts +++ b/packages/server/src/sdk/app/rowActions/index.ts @@ -1 +1,2 @@ export * from "./crud" +export * from "./utils" diff --git a/packages/server/src/sdk/app/rowActions/utils.ts b/packages/server/src/sdk/app/rowActions/utils.ts new file mode 100644 index 0000000000..d4e5a4610d --- /dev/null +++ b/packages/server/src/sdk/app/rowActions/utils.ts @@ -0,0 +1,9 @@ +import sdk from "../../../sdk" + +export async function deleteAllForDatasource(datasourceId: string) { + const allTables = await sdk.tables.getAllTables() + const tables = allTables.filter(t => t.sourceId === datasourceId) + for (const table of Object.values(tables)) { + await sdk.rowActions.deleteAll(table._id!) + } +} From bbc9a2798de2f307f6aca87bf0fd4c35b7964939 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Thu, 24 Oct 2024 12:08:44 +0200 Subject: [PATCH 5/6] Add test for internal --- .../src/api/routes/tests/rowAction.spec.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/routes/tests/rowAction.spec.ts b/packages/server/src/api/routes/tests/rowAction.spec.ts index 5246304906..513953cbfd 100644 --- a/packages/server/src/api/routes/tests/rowAction.spec.ts +++ b/packages/server/src/api/routes/tests/rowAction.spec.ts @@ -1,7 +1,11 @@ import _ from "lodash" import tk from "timekeeper" -import { context, roles } from "@budibase/backend-core" +import { + context, + DEFAULT_BB_DATASOURCE_ID, + roles, +} from "@budibase/backend-core" import { automations } from "@budibase/pro" import { CreateRowActionRequest, @@ -967,6 +971,17 @@ describe("/rowsActions", () => { }) it.each([ + [ + "internal", + async () => { + await config.api.application.addSampleData(config.getAppId()) + const tables = await config.api.table.fetch() + const table = tables.find( + t => t.sourceId === DEFAULT_BB_DATASOURCE_ID + )! + return table + }, + ], [ "external", async () => { From ae6f2f93820f44bca9e6cd797b9ffa65efa8d1da Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Thu, 24 Oct 2024 12:22:51 +0200 Subject: [PATCH 6/6] Fix test --- packages/server/src/api/routes/tests/rowAction.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/server/src/api/routes/tests/rowAction.spec.ts b/packages/server/src/api/routes/tests/rowAction.spec.ts index 513953cbfd..14a1812195 100644 --- a/packages/server/src/api/routes/tests/rowAction.spec.ts +++ b/packages/server/src/api/routes/tests/rowAction.spec.ts @@ -974,6 +974,7 @@ describe("/rowsActions", () => { [ "internal", async () => { + await config.newTenant() await config.api.application.addSampleData(config.getAppId()) const tables = await config.api.table.fetch() const table = tables.find( @@ -985,6 +986,7 @@ describe("/rowsActions", () => { [ "external", async () => { + await config.newTenant() const ds = await config.createDatasource({ datasource: await getDatasource(DatabaseName.POSTGRES), })