From 4aa3d04478289f3728fb0a7aef9604b33f5df839 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Tue, 13 May 2025 03:19:21 +0300 Subject: [PATCH] feat: update device and space services to use productType instead of deviceType and add query support for device retrieval by product type --- src/device/dtos/get.device.dto.ts | 2 +- src/device/services/device.service.ts | 6 ++--- .../controllers/space-device.controller.ts | 6 +++-- src/space/dtos/device.space.dto.ts | 13 ++++++++++ src/space/services/space-device.service.ts | 26 ++++++++++++++++--- 5 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 src/space/dtos/device.space.dto.ts diff --git a/src/device/dtos/get.device.dto.ts b/src/device/dtos/get.device.dto.ts index 1ffc109..868b1e1 100644 --- a/src/device/dtos/get.device.dto.ts +++ b/src/device/dtos/get.device.dto.ts @@ -58,7 +58,7 @@ export class GetDevicesBySpaceOrCommunityDto { }) @IsString() @IsNotEmpty() - public deviceType: string; + public productType: string; @IsUUID('4', { message: 'Invalid space UUID format' }) @IsOptional() spaceUuid?: string; diff --git a/src/device/services/device.service.ts b/src/device/services/device.service.ts index 1e0a8a0..717affd 100644 --- a/src/device/services/device.service.ts +++ b/src/device/services/device.service.ts @@ -1729,7 +1729,7 @@ export class DeviceService { query: GetDevicesBySpaceOrCommunityDto, ): Promise { try { - const { spaceUuid, communityUuid, deviceType } = query; + const { spaceUuid, communityUuid, productType } = query; if (!spaceUuid && !communityUuid) { throw new BadRequestException( 'Either spaceUuid or communityUuid must be provided', @@ -1750,12 +1750,12 @@ export class DeviceService { } const devicesFilterd = devices.filter( - (device) => device.productDevice?.prodType === deviceType, + (device) => device.productDevice?.prodType === productType, ); if (devicesFilterd.length === 0) { return new SuccessResponseDto({ - message: `No ${deviceType} devices found for ${spaceUuid ? 'space' : 'community'}`, + message: `No ${productType} devices found for ${spaceUuid ? 'space' : 'community'}`, data: [], statusCode: HttpStatus.CREATED, }); diff --git a/src/space/controllers/space-device.controller.ts b/src/space/controllers/space-device.controller.ts index 7009531..4474d3e 100644 --- a/src/space/controllers/space-device.controller.ts +++ b/src/space/controllers/space-device.controller.ts @@ -1,11 +1,12 @@ import { ControllerRoute } from '@app/common/constants/controller-route'; -import { Controller, Get, Param, UseGuards } from '@nestjs/common'; +import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; import { GetSpaceParam } from '../dtos'; import { BaseResponseDto } from '@app/common/dto/base.response.dto'; import { SpaceDeviceService } from '../services'; import { PermissionsGuard } from 'src/guards/permissions.guard'; import { Permissions } from 'src/decorators/permissions.decorator'; +import { GetDevicesBySpaceDto } from '../dtos/device.space.dto'; @ApiTags('Space Module') @Controller({ @@ -26,7 +27,8 @@ export class SpaceDeviceController { @Get() async listDevicesInSpace( @Param() params: GetSpaceParam, + @Query() query: GetDevicesBySpaceDto, ): Promise { - return await this.spaceDeviceService.listDevicesInSpace(params); + return await this.spaceDeviceService.listDevicesInSpace(params, query); } } diff --git a/src/space/dtos/device.space.dto.ts b/src/space/dtos/device.space.dto.ts new file mode 100644 index 0000000..e49dea1 --- /dev/null +++ b/src/space/dtos/device.space.dto.ts @@ -0,0 +1,13 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsOptional, IsString } from 'class-validator'; + +export class GetDevicesBySpaceDto { + @ApiProperty({ + description: 'Device Product Type', + example: 'PC', + required: false, + }) + @IsString() + @IsOptional() + public productType?: string; +} diff --git a/src/space/services/space-device.service.ts b/src/space/services/space-device.service.ts index b257b1e..49d965d 100644 --- a/src/space/services/space-device.service.ts +++ b/src/space/services/space-device.service.ts @@ -17,6 +17,7 @@ import { DeviceService } from 'src/device/services'; import { SpaceRepository } from '@app/common/modules/space'; import { DeviceEntity } from '@app/common/modules/device/entities'; import { SpaceEntity } from '@app/common/modules/space/entities/space.entity'; +import { GetDevicesBySpaceDto } from '../dtos/device.space.dto'; @Injectable() export class SpaceDeviceService { @@ -27,9 +28,12 @@ export class SpaceDeviceService { private readonly spaceRepository: SpaceRepository, ) {} - async listDevicesInSpace(params: GetSpaceParam): Promise { + async listDevicesInSpace( + params: GetSpaceParam, + query: GetDevicesBySpaceDto, + ): Promise { const { spaceUuid, communityUuid, projectUuid } = params; - + const { productType } = query; try { // Validate community, project, and fetch space including devices in a single query const space = await this.validationService.fetchSpaceDevices(spaceUuid); @@ -51,7 +55,23 @@ export class SpaceDeviceService { const detailedDevices = (await Promise.allSettled(deviceDetailsPromises)) .filter((result) => result.status === 'fulfilled' && result.value) .map((result) => (result as PromiseFulfilledResult).value); - + console.log('detailedDevices', detailedDevices); + if (productType) { + const devicesFilterd = detailedDevices.filter( + (device) => device.productType === productType, + ); + if (devicesFilterd.length === 0) { + return new SuccessResponseDto({ + message: `No ${productType} devices found for ${spaceUuid ? 'space' : 'community'}`, + data: [], + statusCode: HttpStatus.CREATED, + }); + } + return new SuccessResponseDto({ + data: devicesFilterd, + message: 'Successfully retrieved list of devices.', + }); + } return new SuccessResponseDto({ data: detailedDevices, message: 'Successfully retrieved list of devices.',