diff --git a/src/space/services/space-validation.service.ts b/src/space/services/space-validation.service.ts index f58f5c3..89a539a 100644 --- a/src/space/services/space-validation.service.ts +++ b/src/space/services/space-validation.service.ts @@ -49,6 +49,7 @@ export class ValidationService { 'subspaces', 'tags', 'subspaces.tags', + 'subspaces.devices', 'devices', ], }); diff --git a/src/space/services/subspace/subspace-device.service.ts b/src/space/services/subspace/subspace-device.service.ts index d6f6320..130da1d 100644 --- a/src/space/services/subspace/subspace-device.service.ts +++ b/src/space/services/subspace/subspace-device.service.ts @@ -9,6 +9,8 @@ import { ProductRepository } from '@app/common/modules/product/repositories'; import { GetDeviceDetailsInterface } from '../../../device/interfaces/get.device.interface'; import { ValidationService } from '../space-validation.service'; import { SubspaceRepository } from '@app/common/modules/space/repositories/subspace.repository'; +import { In, QueryRunner } from 'typeorm'; +import { DeviceEntity } from '@app/common/modules/device/entities'; @Injectable() export class SubspaceDeviceService { @@ -173,6 +175,30 @@ export class SubspaceDeviceService { return device; } + async deleteSubspaceDevices( + devices: DeviceEntity[], + queryRunner: QueryRunner, + ): Promise { + const deviceUuids = devices.map((device) => device.uuid); + + try { + if (deviceUuids.length === 0) { + return; + } + + await queryRunner.manager.update( + this.deviceRepository.target, + { uuid: In(deviceUuids) }, + { subspace: null }, + ); + } catch (error) { + throw new HttpException( + `Failed to delete devices with IDs ${deviceUuids.join(', ')}: ${error.message}`, + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } + private throwNotFound(entity: string, uuid: string) { throw new HttpException( `${entity} with ID ${uuid} not found`, diff --git a/src/space/services/subspace/subspace.service.ts b/src/space/services/subspace/subspace.service.ts index 08a7ef1..dbaa3b3 100644 --- a/src/space/services/subspace/subspace.service.ts +++ b/src/space/services/subspace/subspace.service.ts @@ -25,6 +25,7 @@ import { ValidationService } from '../space-validation.service'; import { SubspaceRepository } from '@app/common/modules/space/repositories/subspace.repository'; import { TagService } from '../tag'; import { ModifyAction } from '@app/common/constants/modify-action.enum'; +import { SubspaceDeviceService } from './subspace-device.service'; @Injectable() export class SubSpaceService { @@ -32,6 +33,7 @@ export class SubSpaceService { private readonly subspaceRepository: SubspaceRepository, private readonly validationService: ValidationService, private readonly tagService: TagService, + public readonly deviceService: SubspaceDeviceService, ) {} async createSubspaces( @@ -280,7 +282,7 @@ export class SubSpaceService { const deleteResults: { uuid: string }[] = []; for (const dto of deleteDtos) { - const subspaceModel = await this.findOne(dto.subspaceUuid); + const subspace = await this.findOne(dto.subspaceUuid); await queryRunner.manager.update( this.subspaceRepository.target, @@ -288,8 +290,8 @@ export class SubSpaceService { { disabled: true }, ); - if (subspaceModel.tags?.length) { - const modifyTagDtos = subspaceModel.tags.map((tag) => ({ + if (subspace.tags?.length) { + const modifyTagDtos = subspace.tags.map((tag) => ({ uuid: tag.uuid, action: ModifyAction.DELETE, })); @@ -297,10 +299,16 @@ export class SubSpaceService { modifyTagDtos, queryRunner, null, - subspaceModel, + subspace, ); } + if (subspace.devices) + await this.deviceService.deleteSubspaceDevices( + subspace.devices, + queryRunner, + ); + deleteResults.push({ uuid: dto.subspaceUuid }); }