fix: deleting events associated with pages on page delete

This commit is contained in:
arpitnath 2023-08-28 19:32:54 +05:30
parent 72297e6f07
commit 28d46b9f80
3 changed files with 38 additions and 17 deletions

View file

@ -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<DataQuery> {
const dataQuery = this.dataQueriesRepository.save({
id: dataQueryId,

View file

@ -37,8 +37,7 @@ export class EventsService {
where: { sourceId },
});
await manager.remove(allEvents);
return allEvents;
return await manager.remove(allEvents);
});
}

View file

@ -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<Page>,
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) {