From 28d46b9f800972a1e7351c688ba9f791144b6f7c Mon Sep 17 00:00:00 2001 From: arpitnath Date: Mon, 28 Aug 2023 19:32:54 +0530 Subject: [PATCH] fix: deleting events associated with pages on page delete --- server/src/services/data_queries.service.ts | 13 +++++++ server/src/services/events_handler.service.ts | 3 +- server/src/services/page.service.ts | 39 ++++++++++++------- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/server/src/services/data_queries.service.ts b/server/src/services/data_queries.service.ts index 7764ef843b..1ef728c371 100644 --- a/server/src/services/data_queries.service.ts +++ b/server/src/services/data_queries.service.ts @@ -15,6 +15,7 @@ import { App } from 'src/entities/app.entity'; import { AppEnvironmentService } from './app_environments.service'; import { dbTransactionWrap } from 'src/helpers/utils.helper'; import { DataSourceScopes } from 'src/helpers/data_source.constants'; +import { EventHandler } from 'src/entities/event_handler.entity'; @Injectable() export class DataQueriesService { @@ -74,9 +75,21 @@ export class DataQueriesService { } async delete(dataQueryId: string) { + await this.deleteDataQueryEvents(dataQueryId); + return await this.dataQueriesRepository.delete(dataQueryId); } + async deleteDataQueryEvents(dataQueryId: string) { + return await dbTransactionWrap(async (manager: EntityManager) => { + const allEvents = await manager.find(EventHandler, { + where: { sourceId: dataQueryId }, + }); + + return await manager.remove(allEvents); + }); + } + async update(dataQueryId: string, name: string, options: object): Promise { const dataQuery = this.dataQueriesRepository.save({ id: dataQueryId, diff --git a/server/src/services/events_handler.service.ts b/server/src/services/events_handler.service.ts index c780e63c86..35397a4c5b 100644 --- a/server/src/services/events_handler.service.ts +++ b/server/src/services/events_handler.service.ts @@ -37,8 +37,7 @@ export class EventsService { where: { sourceId }, }); - await manager.remove(allEvents); - return allEvents; + return await manager.remove(allEvents); }); } diff --git a/server/src/services/page.service.ts b/server/src/services/page.service.ts index 27c1966d4b..a0e2adcbda 100644 --- a/server/src/services/page.service.ts +++ b/server/src/services/page.service.ts @@ -7,6 +7,7 @@ import { ComponentsService } from './components.service'; import { CreatePageDto, UpdatePageDto } from '@dto/pages.dto'; import { AppsService } from './apps.service'; import { dbTransactionWrap } from 'src/helpers/utils.helper'; +import { EventsService } from './events_handler.service'; @Injectable() export class PageService { @@ -15,6 +16,7 @@ export class PageService { private readonly pageRepository: Repository, private componentsService: ComponentsService, + private eventHandlerService: EventsService, private appService: AppsService ) {} @@ -76,28 +78,35 @@ export class PageService { } async deletePage(pageId: string, appVersionId: string) { - const pageExists = await this.pageRepository.findOne(pageId); const { editingVersion } = await this.appService.findAppFromVersion(appVersionId); + return dbTransactionWrap(async (manager: EntityManager) => { + const pageExists = await manager.findOne(Page, pageId); - if (!pageExists) { - throw new Error('Page not found'); - } + if (!pageExists) { + throw new Error('Page not found'); + } - if (editingVersion?.homePageId === pageId) { - throw new Error('Cannot delete home page'); - } - const pageDeletedIndex = pageExists.index; - const pageDeleted = await this.pageRepository.delete(pageId); + if (editingVersion?.homePageId === pageId) { + throw new Error('Cannot delete home page'); + } + this.eventHandlerService.cascadeDeleteEvents(pageExists.id); + const pageDeletedIndex = pageExists.index; + const pageDeleted = await this.pageRepository.delete(pageId); - if (pageDeleted.affected === 0) { - throw new Error('Page not deleted'); - } + if (pageDeleted.affected === 0) { + throw new Error('Page not deleted'); + } - const pages = await this.pageRepository.find({ appVersionId: pageExists.appVersionId }); + const pages = await this.pageRepository.find({ appVersionId: pageExists.appVersionId }); - const rearrangedPages = this.rearrangePagesOnDelete(pages, pageDeletedIndex); + const rearrangedPages = this.rearrangePagesOnDelete(pages, pageDeletedIndex); - await this.pageRepository.save(rearrangedPages); + return await Promise.all( + rearrangedPages.map(async (page) => { + await manager.update(Page, page.id, page); + }) + ); + }); } rearrangePagesOnDelete(pages: Page[], pageDeletedIndex: number) {