From fe44c467fda33c0a369425410fa3a7a8371e2803 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 3 Mar 2025 12:58:48 +0000 Subject: [PATCH 1/4] Fixing an issue when deleting apps that have nothing stored in object storage, this primarily happens in development environments that haven't stored the client library. --- packages/backend-core/src/objectStore/objectStore.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/backend-core/src/objectStore/objectStore.ts b/packages/backend-core/src/objectStore/objectStore.ts index 064cc630d8..33b42e0131 100644 --- a/packages/backend-core/src/objectStore/objectStore.ts +++ b/packages/backend-core/src/objectStore/objectStore.ts @@ -478,7 +478,7 @@ export async function deleteFolder( if (existingObjectsResponse.Contents?.length === 0) { return } - const deleteParams: any = { + const deleteParams: { Bucket: string; Delete: { Objects: any[] } } = { Bucket: bucketName, Delete: { Objects: [], @@ -489,10 +489,12 @@ export async function deleteFolder( deleteParams.Delete.Objects.push({ Key: content.Key }) }) - const deleteResponse = await client.deleteObjects(deleteParams) - // can only empty 1000 items at once - if (deleteResponse.Deleted?.length === 1000) { - return deleteFolder(bucketName, folder) + if (deleteParams.Delete.Objects.length) { + const deleteResponse = await client.deleteObjects(deleteParams) + // can only empty 1000 items at once + if (deleteResponse.Deleted?.length === 1000) { + return deleteFolder(bucketName, folder) + } } } From 762d28f30561b21c110eeba8e11c9e6917dcdde8 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 3 Mar 2025 13:11:35 +0000 Subject: [PATCH 2/4] Clearing upp app cache a bit more safely. --- packages/server/src/api/controllers/application.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/server/src/api/controllers/application.ts b/packages/server/src/api/controllers/application.ts index a3b08b5ff9..74b08115ec 100644 --- a/packages/server/src/api/controllers/application.ts +++ b/packages/server/src/api/controllers/application.ts @@ -635,6 +635,11 @@ async function unpublishApp(ctx: UserCtx) { return result } +async function invalidateAppCache(appId: string) { + await cache.app.invalidateAppMetadata(dbCore.getDevAppID(appId)) + await cache.app.invalidateAppMetadata(dbCore.getProdAppID(appId)) +} + async function destroyApp(ctx: UserCtx) { let appId = ctx.params.appId appId = dbCore.getProdAppID(appId) @@ -659,12 +664,16 @@ async function destroyApp(ctx: UserCtx) { } await removeAppFromUserRoles(ctx, appId) - await cache.app.invalidateAppMetadata(devAppId) + await invalidateAppCache(appId) return result } async function preDestroyApp(ctx: UserCtx) { - const { rows } = await getUniqueRows([ctx.params.appId]) + // invalidate the cache immediately in-case they are leading to + // zombie appearing apps + const appId = ctx.params.appId + await invalidateAppCache(appId) + const { rows } = await getUniqueRows([appId]) ctx.rowCount = rows.length } From 3d7270983c780d9a2f45fcd74f8a12280314ef1f Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 3 Mar 2025 13:40:16 +0000 Subject: [PATCH 3/4] Make sure application test case uses MinIO. --- packages/server/src/api/controllers/application.ts | 2 +- packages/server/src/api/routes/tests/application.spec.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/controllers/application.ts b/packages/server/src/api/controllers/application.ts index 74b08115ec..867eb2881b 100644 --- a/packages/server/src/api/controllers/application.ts +++ b/packages/server/src/api/controllers/application.ts @@ -659,7 +659,7 @@ async function destroyApp(ctx: UserCtx) { await quotas.removeApp() await events.app.deleted(app) - if (!env.isTest()) { + if (!env.USE_LOCAL_COMPONENT_LIBS) { await deleteAppFiles(appId) } diff --git a/packages/server/src/api/routes/tests/application.spec.ts b/packages/server/src/api/routes/tests/application.spec.ts index 9480593c2a..790772df42 100644 --- a/packages/server/src/api/routes/tests/application.spec.ts +++ b/packages/server/src/api/routes/tests/application.spec.ts @@ -1,4 +1,7 @@ import { DEFAULT_TABLES } from "../../../db/defaultData/datasource_bb_default" +import { setEnv } from "../../../environment" + +setEnv({ USE_LOCAL_COMPONENT_LIBS: "0" }) jest.mock("../../../utilities/redis", () => ({ init: jest.fn(), From 0669151704543273225918a7db2e6acda2dbc3d2 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 3 Mar 2025 14:20:44 +0000 Subject: [PATCH 4/4] PR comments. --- .../src/api/routes/tests/application.spec.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/server/src/api/routes/tests/application.spec.ts b/packages/server/src/api/routes/tests/application.spec.ts index 790772df42..cff205bbfa 100644 --- a/packages/server/src/api/routes/tests/application.spec.ts +++ b/packages/server/src/api/routes/tests/application.spec.ts @@ -1,8 +1,6 @@ import { DEFAULT_TABLES } from "../../../db/defaultData/datasource_bb_default" import { setEnv } from "../../../environment" -setEnv({ USE_LOCAL_COMPONENT_LIBS: "0" }) - jest.mock("../../../utilities/redis", () => ({ init: jest.fn(), getLocksById: () => { @@ -30,10 +28,16 @@ import path from "path" describe("/applications", () => { let config = setup.getConfig() - let app: App + let app: App, cleanup: () => void - afterAll(setup.afterAll) - beforeAll(async () => await config.init()) + afterAll(() => { + setup.afterAll() + cleanup() + }) + beforeAll(async () => { + cleanup = setEnv({ USE_LOCAL_COMPONENT_LIBS: "0" }) + await config.init() + }) beforeEach(async () => { app = await config.api.application.create({ name: utils.newid() })