9018 fix batch delete (#9149)

Closes #9018
This commit is contained in:
Raphaël Bosi
2024-12-20 10:46:24 +01:00
committed by GitHub
parent a0b5720831
commit 925294675c
22 changed files with 413 additions and 50 deletions

View File

@ -0,0 +1,87 @@
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { In, Repository } from 'typeorm';
import {
FieldMetadataEntity,
FieldMetadataType,
} from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager';
import { FAVORITE_DELETION_BATCH_SIZE } from 'src/modules/favorite/constants/favorite-deletion-batch-size';
import { FavoriteWorkspaceEntity } from 'src/modules/favorite/standard-objects/favorite.workspace-entity';
@Injectable()
export class FavoriteDeletionService {
constructor(
@InjectRepository(ObjectMetadataEntity, 'metadata')
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
@InjectRepository(FieldMetadataEntity, 'metadata')
private readonly fieldMetadataRepository: Repository<FieldMetadataEntity>,
private readonly twentyORMManager: TwentyORMManager,
) {}
async deleteFavoritesForDeletedRecords(
deletedRecordIds: string[],
workspaceId: string,
): Promise<void> {
const favoriteRepository =
await this.twentyORMManager.getRepository<FavoriteWorkspaceEntity>(
'favorite',
);
const favoriteObjectMetadata = await this.objectMetadataRepository.findOne({
where: {
nameSingular: 'favorite',
workspaceId,
},
});
if (!favoriteObjectMetadata) {
throw new Error('Favorite object metadata not found');
}
const favoriteFields = await this.fieldMetadataRepository.find({
where: {
objectMetadataId: favoriteObjectMetadata.id,
type: FieldMetadataType.RELATION,
},
});
const favoritesToDelete = await favoriteRepository.find({
select: {
id: true,
},
where: favoriteFields.map((field) => ({
[`${field.name}Id`]: In(deletedRecordIds),
})),
withDeleted: true,
});
if (favoritesToDelete.length === 0) {
return;
}
const favoriteIdsToDelete = favoritesToDelete.map(
(favorite) => favorite.id,
);
const batches: string[][] = [];
for (
let i = 0;
i < favoriteIdsToDelete.length;
i += FAVORITE_DELETION_BATCH_SIZE
) {
batches.push(
favoriteIdsToDelete.slice(i, i + FAVORITE_DELETION_BATCH_SIZE),
);
}
for (const batch of batches) {
await favoriteRepository.delete(batch);
}
}
}