added proper validations

This commit is contained in:
hannathkadher
2025-03-06 09:35:25 +04:00
parent 823cb6cf7a
commit 6805ff226c
3 changed files with 85 additions and 26 deletions

View File

@ -124,15 +124,56 @@ export class SpaceModelProductAllocationService {
modifySubspaceModels?: ModifySubspaceModelDto[], modifySubspaceModels?: ModifySubspaceModelDto[],
): Promise<void> { ): Promise<void> {
try { try {
const addDtos = dtos.filter((dto) => dto.action === ModifyAction.ADD);
const deleteDtos = dtos.filter(
(dto) => dto.action === ModifyAction.DELETE,
);
const addTagDtos: ProcessTagDto[] = addDtos.map((dto) => ({
name: dto.name,
productUuid: dto.productUuid,
uuid: dto.newTagUuid,
}));
const processedTags = await this.tagService.processTags(
addTagDtos,
projectUuid,
queryRunner,
);
const addTagUuidMap = new Map<string, ModifyTagModelDto>();
processedTags.forEach((tag, index) => {
addTagUuidMap.set(tag.uuid, addDtos[index]);
});
const addTagUuids = new Set(processedTags.map((tag) => tag.uuid));
const deleteTagUuids = new Set(deleteDtos.map((dto) => dto.tagUuid));
const tagsToIgnore = new Set(
[...addTagUuids].filter((uuid) => deleteTagUuids.has(uuid)),
);
const filteredDtos = dtos.filter(
(dto) =>
!(
tagsToIgnore.has(dto.tagUuid) ||
(dto.action === ModifyAction.ADD &&
tagsToIgnore.has(
[...addTagUuidMap.keys()].find(
(uuid) => addTagUuidMap.get(uuid) === dto,
),
))
),
);
await Promise.all([ await Promise.all([
this.processAddActions( this.processAddActions(
dtos, filteredDtos,
projectUuid, projectUuid,
spaceModel, spaceModel,
queryRunner, queryRunner,
modifySubspaceModels, modifySubspaceModels,
), ),
this.processDeleteActions(dtos, queryRunner), this.processDeleteActions(filteredDtos, queryRunner),
]); ]);
} catch (error) { } catch (error) {
throw this.handleError(error, 'Error while updating product allocations'); throw this.handleError(error, 'Error while updating product allocations');
@ -238,7 +279,7 @@ export class SpaceModelProductAllocationService {
): Promise<SpaceModelProductAllocationEntity[]> { ): Promise<SpaceModelProductAllocationEntity[]> {
try { try {
if (!dtos || dtos.length === 0) { if (!dtos || dtos.length === 0) {
throw new Error('No DTOs provided for deletion.'); return;
} }
const tagUuidsToDelete = dtos const tagUuidsToDelete = dtos

View File

@ -139,8 +139,6 @@ export class SpaceService {
message: 'Space created successfully', message: 'Space created successfully',
}); });
} catch (error) { } catch (error) {
console.log('error', error);
await queryRunner.rollbackTransaction(); await queryRunner.rollbackTransaction();
if (error instanceof HttpException) { if (error instanceof HttpException) {

View File

@ -67,37 +67,52 @@ export class TagService {
} }
async processTags( async processTags(
tags: ProcessTagDto[], tagDtos: ProcessTagDto[],
projectUuid: string, projectUuid: string,
queryRunner?: QueryRunner, queryRunner?: QueryRunner,
): Promise<NewTagEntity[]> { ): Promise<NewTagEntity[]> {
try { try {
if (!tags || tags.length === 0) { if (!tagDtos || tagDtos.length === 0) {
return []; return [];
} }
const newTags: CreateTagDto[] = []; const newTagDtos: CreateTagDto[] = [];
const existingTagUuids: string[] = []; const existingTagUuids: string[] = [];
let fetchedExistingTags: NewTagEntity[] = [];
const directlyFetchedTags: NewTagEntity[] = [];
// Separate new tags and existing tag UUIDs // Separate existing tag UUIDs and new tag DTOs
for (const tag of tags) { for (const tagDto of tagDtos) {
if (tag.uuid) { if (tagDto.uuid) {
existingTagUuids.push(tag.uuid); existingTagUuids.push(tagDto.uuid);
} else { } else {
if (!tag.name || !tag.productUuid) { if (!tagDto.name || !tagDto.productUuid) {
throw new HttpException( throw new HttpException(
`Tag name or product id is missing `, `Tag name or product UUID is missing`,
HttpStatus.BAD_REQUEST, HttpStatus.BAD_REQUEST,
); );
} }
newTags.push(tag);
const existingTag = await queryRunner.manager.findOne(NewTagEntity, {
where: {
name: tagDto.name,
product: { uuid: tagDto.productUuid },
project: { uuid: projectUuid },
},
relations: ['product'],
});
if (!existingTag) {
newTagDtos.push(tagDto);
} else {
directlyFetchedTags.push(existingTag);
}
} }
} }
let existingTags: NewTagEntity[] = []; // Fetch existing tags using UUIDs
if (existingTagUuids.length > 0) { if (existingTagUuids.length > 0) {
existingTags = await (queryRunner fetchedExistingTags = await (queryRunner
? queryRunner.manager.find(NewTagEntity, { ? queryRunner.manager.find(NewTagEntity, {
where: { where: {
uuid: In(existingTagUuids), uuid: In(existingTagUuids),
@ -114,9 +129,9 @@ export class TagService {
})); }));
} }
// Check for missing UUIDs // Ensure all provided UUIDs exist in the database
if (existingTags.length !== existingTagUuids.length) { if (fetchedExistingTags.length !== existingTagUuids.length) {
const foundUuids = new Set(existingTags.map((tag) => tag.uuid)); const foundUuids = new Set(fetchedExistingTags.map((tag) => tag.uuid));
const missingUuids = existingTagUuids.filter( const missingUuids = existingTagUuids.filter(
(uuid) => !foundUuids.has(uuid), (uuid) => !foundUuids.has(uuid),
); );
@ -127,16 +142,21 @@ export class TagService {
); );
} }
let createdTags: NewTagEntity[] = []; let newlyCreatedTags: NewTagEntity[] = [];
if (newTags.length > 0) { if (newTagDtos.length > 0) {
createdTags = await this.bulkCreateTags( newlyCreatedTags = await this.bulkCreateTags(
{ projectUuid, tags: newTags }, { projectUuid, tags: newTagDtos },
queryRunner, queryRunner,
); );
} }
const allTags = [...existingTags, ...createdTags]; // Combine all found and created tags
const allTags = [
...fetchedExistingTags,
...newlyCreatedTags,
...directlyFetchedTags,
];
return allTags; return allTags;
} catch (error) { } catch (error) {