From 9063c65e688e5b266ac372e0c209ef4b5fdb778f Mon Sep 17 00:00:00 2001 From: hannathkadher Date: Thu, 19 Dec 2024 10:23:08 +0400 Subject: [PATCH] added subspace delete --- .../propogate-subspace-update-command.ts | 4 +- .../delete-subspace-model.dto.ts | 12 +++ .../dtos/subspaces-model-dtos/index.ts | 1 + .../dtos/update-space-model.dto.ts | 12 +++ .../dtos/update-subspace-model.dto.ts | 4 + .../interfaces/update-subspace.interface.ts | 13 ++- .../services/space-model.service.ts | 4 +- .../subspace/subspace-model.service.ts | 94 ++++++++++++++++++- 8 files changed, 135 insertions(+), 9 deletions(-) create mode 100644 src/space-model/dtos/subspaces-model-dtos/delete-subspace-model.dto.ts create mode 100644 src/space-model/dtos/subspaces-model-dtos/index.ts diff --git a/src/space-model/commands/propogate-subspace-update-command.ts b/src/space-model/commands/propogate-subspace-update-command.ts index 286b9bd..96276ee 100644 --- a/src/space-model/commands/propogate-subspace-update-command.ts +++ b/src/space-model/commands/propogate-subspace-update-command.ts @@ -1,6 +1,6 @@ import { ICommand } from '@nestjs/cqrs'; -import { UpdatedSubspaceModelInterface } from '../interfaces'; +import { IModifySubspaceModelInterface } from '../interfaces'; export class PropogateSubspaceCommand implements ICommand { - constructor(public readonly param: UpdatedSubspaceModelInterface) {} + constructor(public readonly param: IModifySubspaceModelInterface) {} } diff --git a/src/space-model/dtos/subspaces-model-dtos/delete-subspace-model.dto.ts b/src/space-model/dtos/subspaces-model-dtos/delete-subspace-model.dto.ts new file mode 100644 index 0000000..62fe84e --- /dev/null +++ b/src/space-model/dtos/subspaces-model-dtos/delete-subspace-model.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class DeleteSubspaceModelDto { + @ApiProperty({ + description: 'Uuid of the subspace model need to be deleted', + example: '982fc3a3-64dc-4afb-a5b5-65ee8fef0424', + }) + @IsNotEmpty() + @IsString() + subspaceUuid: string; +} diff --git a/src/space-model/dtos/subspaces-model-dtos/index.ts b/src/space-model/dtos/subspaces-model-dtos/index.ts new file mode 100644 index 0000000..e70ef7b --- /dev/null +++ b/src/space-model/dtos/subspaces-model-dtos/index.ts @@ -0,0 +1 @@ +export * from './delete-subspace-model.dto'; diff --git a/src/space-model/dtos/update-space-model.dto.ts b/src/space-model/dtos/update-space-model.dto.ts index daaa62b..62a6bc1 100644 --- a/src/space-model/dtos/update-space-model.dto.ts +++ b/src/space-model/dtos/update-space-model.dto.ts @@ -3,6 +3,7 @@ import { IsArray, IsOptional, IsString, ValidateNested } from 'class-validator'; import { CreateSubspaceModelDto } from './create-subspace-model.dto'; import { Type } from 'class-transformer'; import { UpdateSubspaceModelDto } from './update-subspace-model.dto'; +import { DeleteSubspaceModelDto } from './subspaces-model-dtos'; export class UpdateSubspacesModelDto { @ApiProperty({ @@ -26,6 +27,17 @@ export class UpdateSubspacesModelDto { @ValidateNested({ each: true }) @Type(() => UpdateSubspaceModelDto) update?: UpdateSubspaceModelDto[]; + + @ApiProperty({ + description: 'List of subspaces to delete', + type: [DeleteSubspaceModelDto], + required: false, + }) + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => DeleteSubspaceModelDto) + delete?: DeleteSubspaceModelDto[]; } export class UpdateSpaceModelDto { diff --git a/src/space-model/dtos/update-subspace-model.dto.ts b/src/space-model/dtos/update-subspace-model.dto.ts index da71afc..ee25bd2 100644 --- a/src/space-model/dtos/update-subspace-model.dto.ts +++ b/src/space-model/dtos/update-subspace-model.dto.ts @@ -18,6 +18,10 @@ export class UpdateSubspaceModelDto { @IsString() subspaceName?: string; + @IsNotEmpty() + @IsString() + subspaceUuid: string; + @ApiProperty({ description: 'List of products included in the model', type: [CreateSpaceProductModelDto], diff --git a/src/space-model/interfaces/update-subspace.interface.ts b/src/space-model/interfaces/update-subspace.interface.ts index 4ccc588..4d58469 100644 --- a/src/space-model/interfaces/update-subspace.interface.ts +++ b/src/space-model/interfaces/update-subspace.interface.ts @@ -14,6 +14,17 @@ export interface ProductModelInterface { productItemModels: SubspaceProductItemModelEntity[]; } -export interface UpdatedSubspaceModelInterface { +export interface IModifySubspaceModelInterface { new?: AddSubspaceModelInterface[]; + update?: IUpdateSubspaceModelInterface[]; + delete?: IDeletedSubsaceModelInterface[]; +} + +export interface IUpdateSubspaceModelInterface { + subspaceName?: string; + uuid: string; +} + +export interface IDeletedSubsaceModelInterface { + uuid: string; } diff --git a/src/space-model/services/space-model.service.ts b/src/space-model/services/space-model.service.ts index 6b0c5db..fff944b 100644 --- a/src/space-model/services/space-model.service.ts +++ b/src/space-model/services/space-model.service.ts @@ -18,7 +18,7 @@ import { SpaceModelDto } from '@app/common/modules/space-model/dtos'; import { SpaceModelParam } from '../dtos/space-model-param'; import { ProjectService } from 'src/project/services'; import { ProjectEntity } from '@app/common/modules/project/entities'; -import { UpdatedSubspaceModelInterface } from '../interfaces'; +import { IModifySubspaceModelInterface } from '../interfaces'; import { CommandBus } from '@nestjs/cqrs'; import { PropogateSubspaceCommand } from '../commands'; @@ -146,7 +146,7 @@ export class SpaceModelService { await queryRunner.startTransaction(); try { const { modelName } = dto; - let updatedSubspaces: UpdatedSubspaceModelInterface; + let updatedSubspaces: IModifySubspaceModelInterface; if (modelName) spaceModel.modelName = modelName; await queryRunner.manager.save(spaceModel); diff --git a/src/space-model/services/subspace/subspace-model.service.ts b/src/space-model/services/subspace/subspace-model.service.ts index d49ff83..f69d859 100644 --- a/src/space-model/services/subspace/subspace-model.service.ts +++ b/src/space-model/services/subspace/subspace-model.service.ts @@ -3,10 +3,19 @@ import { SubspaceModelRepository, } from '@app/common/modules/space-model'; import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; -import { CreateSubspaceModelDto, UpdateSubspacesModelDto } from '../../dtos'; +import { + CreateSubspaceModelDto, + UpdateSubspaceModelDto, + UpdateSubspacesModelDto, +} from '../../dtos'; import { QueryRunner } from 'typeorm'; import { SubspaceProductModelService } from './subspace-product-model.service'; -import { UpdatedSubspaceModelInterface } from 'src/space-model/interfaces'; +import { + IDeletedSubsaceModelInterface, + IModifySubspaceModelInterface, + IUpdateSubspaceModelInterface, +} from 'src/space-model/interfaces'; +import { DeleteSubspaceModelDto } from 'src/space-model/dtos/subspaces-model-dtos'; @Injectable() export class SubSpaceModelService { @@ -61,6 +70,79 @@ export class SubSpaceModelService { } } + async updateSubspaceModels( + updateDtos: UpdateSubspaceModelDto[], + queryRunner: QueryRunner, + ) { + const updateResults: IUpdateSubspaceModelInterface[] = []; + + for (const dto of updateDtos) { + try { + const subspaceModel = await this.findOne(dto.subspaceUuid); + const updateResult: IUpdateSubspaceModelInterface = { + uuid: dto.subspaceUuid, + }; + + if (dto.subspaceName) { + subspaceModel.subspaceName = dto.subspaceName; + await queryRunner.manager.update( + this.subspaceModelRepository.target, + { uuid: dto.subspaceUuid }, + { subspaceName: dto.subspaceName }, + ); + updateResult.subspaceName = dto.subspaceName; + } + + updateResults.push(updateResult); + } catch (error) { + console.error( + `SubspaceModel with ${dto.subspaceUuid} not able to update ${error}`, + ); + } + } + + return updateResults; + } + + async deleteSubspaceModels( + dtos: DeleteSubspaceModelDto[], + queryRunner: QueryRunner, + ) { + const deleteResults: IDeletedSubsaceModelInterface[] = []; + try { + for (const dto of dtos) { + await this.findOne(dto.subspaceUuid); + + await queryRunner.manager.update( + this.subspaceModelRepository.target, + { uuid: dto.subspaceUuid }, + { disabled: true }, + ); + + deleteResults.push({ uuid: dto.subspaceUuid }); + } + return deleteResults; + } catch (error) { + console.error(`Bulk delete operation failed: ${error.message}`); + throw new Error('Bulk delete operation failed.'); + } + } + + async findOne(subspaceUuid: string) { + const subspace = await this.subspaceModelRepository.findOne({ + where: { + uuid: subspaceUuid, + }, + }); + if (!subspace) { + throw new HttpException( + `SubspaceModel with ${subspaceUuid} not found`, + HttpStatus.NOT_FOUND, + ); + } + return subspace; + } + private validateInputDtos(subSpaceModelDtos: CreateSubspaceModelDto[]) { if (subSpaceModelDtos.length === 0) { throw new HttpException( @@ -97,7 +179,7 @@ export class SubSpaceModelService { spaceModel: SpaceModelEntity, queryRunner: QueryRunner, ) { - const subspaces: UpdatedSubspaceModelInterface = {}; + const subspaces: IModifySubspaceModelInterface = {}; try { if (dto.add) { const addedSubspaces = await this.createSubSpaceModels( @@ -107,7 +189,11 @@ export class SubSpaceModelService { ); subspaces.new = addedSubspaces; } else if (dto.update) { - + const updatedSubspaces = await this.updateSubspaceModels( + dto.update, + queryRunner, + ); + subspaces.update = updatedSubspaces; } return subspaces; } catch (error) {