diff --git a/src/space-model/dtos/update-space-model.dto.ts b/src/space-model/dtos/update-space-model.dto.ts index fc2f6aa..09b196d 100644 --- a/src/space-model/dtos/update-space-model.dto.ts +++ b/src/space-model/dtos/update-space-model.dto.ts @@ -1,6 +1,20 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsOptional, IsString } from 'class-validator'; +import { IsArray, IsOptional, IsString, ValidateNested } from 'class-validator'; +import { CreateSubspaceModelDto } from './create-subspace-model.dto'; +import { Type } from 'class-transformer'; +export class UpdateSubspaceModelDto { + @ApiProperty({ + description: 'List of subspaces to add', + type: [CreateSubspaceModelDto], + required: false, + }) + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => CreateSubspaceModelDto) + add?: CreateSubspaceModelDto[]; +} export class UpdateSpaceModelDto { @ApiProperty({ description: 'Updated name of the space model', @@ -9,4 +23,7 @@ export class UpdateSpaceModelDto { @IsOptional() @IsString() modelName?: string; + + @IsOptional() + subspaceModels?: UpdateSubspaceModelDto; } diff --git a/src/space-model/services/space-model.service.ts b/src/space-model/services/space-model.service.ts index dc1a11e..805ffa0 100644 --- a/src/space-model/services/space-model.service.ts +++ b/src/space-model/services/space-model.service.ts @@ -146,6 +146,15 @@ export class SpaceModelService { await queryRunner.manager.save(spaceModel); + if (dto.subspaceModels) { + const updatedSubspaces = + await this.subSpaceModelService.updateSubSpaceModels( + dto.subspaceModels, + spaceModel, + queryRunner, + ); + } + await queryRunner.commitTransaction(); return new SuccessResponseDto({ diff --git a/src/space-model/services/subspace/subspace-model.service.ts b/src/space-model/services/subspace/subspace-model.service.ts index 222dee4..6814362 100644 --- a/src/space-model/services/subspace/subspace-model.service.ts +++ b/src/space-model/services/subspace/subspace-model.service.ts @@ -3,7 +3,7 @@ import { SubspaceModelRepository, } from '@app/common/modules/space-model'; import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; -import { CreateSubspaceModelDto } from '../../dtos'; +import { CreateSubspaceModelDto, UpdateSubspaceModelDto } from '../../dtos'; import { QueryRunner } from 'typeorm'; import { SubspaceProductModelService } from './subspace-product-model.service'; @@ -29,19 +29,25 @@ export class SubSpaceModelService { }), ); - await queryRunner.manager.save(subspaces); + const newSubspaces = await queryRunner.manager.save(subspaces); - await Promise.all( - subSpaceModelDtos.map((dto, index) => { - const subspaceModel = subspaces[index]; - return this.subSpaceProducetModelService.createSubspaceProductModels( - dto.spaceProductModels, - spaceModel, + const addedSubspaces = await Promise.all( + subSpaceModelDtos.map(async (dto, index) => { + const subspaceModel = newSubspaces[index]; + const productModels = + await this.subSpaceProducetModelService.createSubspaceProductModels( + dto.spaceProductModels, + spaceModel, + subspaceModel, + queryRunner, + ); + return { subspaceModel, - queryRunner, - ); + productModels, + }; }), ); + return addedSubspaces; } catch (error) { if (error instanceof HttpException) { throw error; @@ -61,7 +67,6 @@ export class SubSpaceModelService { HttpStatus.BAD_REQUEST, ); } - const incomingNames = subSpaceModelDtos.map((dto) => dto.subspaceName); this.validateName(incomingNames); } @@ -85,4 +90,28 @@ export class SubSpaceModelService { ); } } + + async updateSubSpaceModels( + dto: UpdateSubspaceModelDto, + spaceModel: SpaceModelEntity, + queryRunner: QueryRunner, + ) { + const subspaces: { new?: any } = {}; + try { + if (dto.add) { + const addedSubspaces = await this.createSubSpaceModels( + dto.add, + spaceModel, + queryRunner, + ); + subspaces.new = addedSubspaces; + } + return subspaces; + } catch (error) { + throw new HttpException( + error.message || 'Failed to update SpaceModel', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } } diff --git a/src/space-model/services/subspace/subspace-product-item-model.service.ts b/src/space-model/services/subspace/subspace-product-item-model.service.ts index 393a5f3..85989f8 100644 --- a/src/space-model/services/subspace/subspace-product-item-model.service.ts +++ b/src/space-model/services/subspace/subspace-product-item-model.service.ts @@ -2,6 +2,7 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { QueryRunner } from 'typeorm'; import { SpaceModelEntity, + SubspaceProductItemModelEntity, SubspaceProductItemModelRepository, SubspaceProductModelEntity, } from '@app/common/modules/space-model'; @@ -21,7 +22,7 @@ export class SubspaceProductItemModelService extends BaseProductItemService { subspaceProductModel: SubspaceProductModelEntity, spaceModel: SpaceModelEntity, queryRunner: QueryRunner, - ) { + ): Promise { if (!subspaceProductModel) { throw new HttpException( 'The spaceProductModel parameter is required but was not provided.', @@ -38,6 +39,7 @@ export class SubspaceProductItemModelService extends BaseProductItemService { ); await queryRunner.manager.save(productItems); + return productItems; } catch (error) { if (error instanceof HttpException) { throw error; diff --git a/src/space-model/services/subspace/subspace-product-model.service.ts b/src/space-model/services/subspace/subspace-product-model.service.ts index 30f9062..8b3f9ac 100644 --- a/src/space-model/services/subspace/subspace-product-model.service.ts +++ b/src/space-model/services/subspace/subspace-product-model.service.ts @@ -27,6 +27,8 @@ export class SubspaceProductModelService extends BaseProductModelService { queryRunner: QueryRunner, ) { try { + if (!spaceProductModelDtos?.length) return; + const productModels = await Promise.all( spaceProductModelDtos.map(async (dto) => { this.validateProductCount(dto); @@ -44,17 +46,23 @@ export class SubspaceProductModelService extends BaseProductModelService { const savedProductModels = await queryRunner.manager.save(productModels); - await Promise.all( - spaceProductModelDtos.map((dto, index) => { + const newProductModels = await Promise.all( + spaceProductModelDtos.map(async (dto, index) => { const savedModel = savedProductModels[index]; - return this.subspaceProductItemModelService.createProdutItemModel( - dto.items, - savedModel, // Pass the saved model - spaceModel, - queryRunner, - ); + const productItemModels = + await this.subspaceProductItemModelService.createProdutItemModel( + dto.items, + savedModel, + spaceModel, + queryRunner, + ); + return { + productModel: savedModel, + productItemModels, + }; }), ); + return newProductModels; } catch (error) { if (error instanceof HttpException) { throw error;