From 680040d52019167b155feb24875f8ec193c19f32 Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 10 Jul 2025 12:31:16 +0530 Subject: [PATCH] fix: workflow schedule cleanup (#13295) --- frontend/ee | 2 +- server/ee | 2 +- server/src/modules/apps/module.ts | 7 ++++ server/src/modules/apps/service.ts | 34 ++++++++++++++----- ...on.listener.ts => app-actions.listener.ts} | 4 +-- 5 files changed, 37 insertions(+), 12 deletions(-) rename server/src/modules/workflows/listeners/{app-deletion.listener.ts => app-actions.listener.ts} (71%) diff --git a/frontend/ee b/frontend/ee index c955741e5a..aed7af0149 160000 --- a/frontend/ee +++ b/frontend/ee @@ -1 +1 @@ -Subproject commit c955741e5a120cd61651eaf14aef0d5c67059cb0 +Subproject commit aed7af0149525ff745650c21ee40bf9caf2892dc diff --git a/server/ee b/server/ee index 1754d14f2f..8c0e6dec37 160000 --- a/server/ee +++ b/server/ee @@ -1 +1 @@ -Subproject commit 1754d14f2fc5dee8616f09f13e63b3569e42f3ee +Subproject commit 8c0e6dec37f1b0bb7fb5552d8eef4db3ddc18b31 diff --git a/server/src/modules/apps/module.ts b/server/src/modules/apps/module.ts index f30e91cd11..71351a825c 100644 --- a/server/src/modules/apps/module.ts +++ b/server/src/modules/apps/module.ts @@ -52,6 +52,11 @@ export class AppsModule extends SubModule { 'services/page.util.service', ]); + const { AppsActionsListener, TemporalService } = await this.getProviders(configs, 'workflows', [ + 'listeners/app-actions.listener', + 'services/temporal.service', + ]); + return { module: AppsModule, imports: [ @@ -74,6 +79,8 @@ export class AppsModule extends SubModule { VersionRepository, AppsRepository, AppGitRepository, + AppsActionsListener, + TemporalService, PageService, EventsService, AppsUtilService, diff --git a/server/src/modules/apps/service.ts b/server/src/modules/apps/service.ts index 2f57c6d737..182c29da46 100644 --- a/server/src/modules/apps/service.ts +++ b/server/src/modules/apps/service.ts @@ -42,6 +42,7 @@ import { AUDIT_LOGS_REQUEST_CONTEXT_KEY } from '@modules/app/constants'; import { MODULES } from '@modules/app/constants/modules'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { AppGitRepository } from '@modules/app-git/repository'; +import { WorkflowSchedule } from '@entities/workflow_schedule.entity'; @Injectable() export class AppsService implements IAppsService { @@ -60,7 +61,7 @@ export class AppsService implements IAppsService { protected readonly componentsService: ComponentsService, protected readonly eventEmitter: EventEmitter2, protected readonly appGitRepository: AppGitRepository - ) { } + ) {} async create(user: User, appCreateDto: AppCreateDto) { const { name, icon, type, prompt } = appCreateDto; return await dbTransactionWrap(async (manager: EntityManager) => { @@ -107,12 +108,12 @@ export class AppsService implements IAppsService { : versionName ? await this.versionRepository.findByName(versionName, app.id) : // Handle version retrieval based on env - await this.versionRepository.findLatestVersionForEnvironment( - app.id, - envId, - environmentName, - app.organizationId - ); + await this.versionRepository.findLatestVersionForEnvironment( + app.id, + envId, + environmentName, + app.organizationId + ); if (!version) { throw new NotFoundException("Couldn't found app version. Please check the version name"); @@ -181,7 +182,24 @@ export class AppsService implements IAppsService { const { organizationId } = user; const { id } = app; - await this.appRepository.delete({ id, organizationId }); + await dbTransactionWrap(async (manager: EntityManager) => { + const schedules = await manager + .createQueryBuilder(WorkflowSchedule, 'workflowSchedule') + .innerJoinAndSelect('workflowSchedule.workflow', 'appVersion') + .where('appVersion.appId = :appId', { appId: id }) + .getMany(); + + // Emit event with schedule IDs for temporal schedule cleanup + if (schedules.length > 0) { + const scheduleIds = schedules.map((schedule) => schedule.id); + this.eventEmitter.emit('app.deleted', { + appId: id, + scheduleIds: scheduleIds, + }); + } + + await manager.delete(App, { id, organizationId }); + }); //APP_DELETE audit RequestContext.setLocals(AUDIT_LOGS_REQUEST_CONTEXT_KEY, { diff --git a/server/src/modules/workflows/listeners/app-deletion.listener.ts b/server/src/modules/workflows/listeners/app-actions.listener.ts similarity index 71% rename from server/src/modules/workflows/listeners/app-deletion.listener.ts rename to server/src/modules/workflows/listeners/app-actions.listener.ts index 302bd36b86..72d28d991e 100644 --- a/server/src/modules/workflows/listeners/app-deletion.listener.ts +++ b/server/src/modules/workflows/listeners/app-actions.listener.ts @@ -4,8 +4,8 @@ import { OnEvent } from '@nestjs/event-emitter'; @Injectable() export class AppsActionsListener { constructor() {} - @OnEvent('beforeAppDelete') + @OnEvent('app.deleted') async handleAppDeletion(args: { appId: string }) { - throw new Error('Method not implemented'); + console.log(`App with ID ${args.appId} has been deleted.`); } }