From 91abfb41ab63b95686c2518ab26ccf2908d3d857 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Wed, 7 May 2025 12:17:17 +0300 Subject: [PATCH] Implement month-based date formatting and filtering in PowerClamp service --- libs/common/src/helper/date-format.ts | 24 ++++++++++++++ src/power-clamp/dto/get-power-clamp.dto.ts | 14 ++------ .../services/power-clamp.service.ts | 32 ++++++++++++++----- src/space/services/space-device.service.ts | 4 +-- 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/libs/common/src/helper/date-format.ts b/libs/common/src/helper/date-format.ts index 38c15b8..6366849 100644 --- a/libs/common/src/helper/date-format.ts +++ b/libs/common/src/helper/date-format.ts @@ -12,3 +12,27 @@ export function toDDMMYYYY(dateString?: string | null): string | null { const [year, month, day] = dateString.split('-'); return `${day}-${month}-${year}`; } +export function toMMYYYY(dateString?: string | null): string | null { + if (!dateString) return null; + + // Ensure dateString is valid format YYYY-MM + const regex = /^\d{4}-\d{2}$/; + if (!regex.test(dateString)) { + throw new Error( + `Invalid date format: ${dateString}. Expected format is YYYY-MM`, + ); + } + + const [year, month] = dateString.split('-'); + return `${month}-${year}`; +} +export function filterByMonth(data: any[], monthDate: string) { + const [year, month] = monthDate.split('-').map(Number); + + return data.filter((item) => { + const itemDate = new Date(item.date); + return ( + itemDate.getUTCFullYear() === year && itemDate.getUTCMonth() + 1 === month + ); + }); +} diff --git a/src/power-clamp/dto/get-power-clamp.dto.ts b/src/power-clamp/dto/get-power-clamp.dto.ts index f4bb82e..d53b681 100644 --- a/src/power-clamp/dto/get-power-clamp.dto.ts +++ b/src/power-clamp/dto/get-power-clamp.dto.ts @@ -35,19 +35,11 @@ export class GetPowerClampDto { } export class GetPowerClampBySpaceDto { @ApiPropertyOptional({ - description: 'Input date in ISO format (YYYY-MM-DD) to filter the data', - example: '2025-04-23', + description: 'monthDate must be in YYYY-MM format', + example: '2025-04', required: true, }) @IsDateString() @IsNotEmpty() - public startDate: string; - @ApiPropertyOptional({ - description: 'Input date in ISO format (YYYY-MM-DD) to filter the data', - example: '2025-05-23', - required: true, - }) - @IsDateString() - @IsNotEmpty() - public endDate: string; + public monthDate: string; } diff --git a/src/power-clamp/services/power-clamp.service.ts b/src/power-clamp/services/power-clamp.service.ts index 1124aed..b502186 100644 --- a/src/power-clamp/services/power-clamp.service.ts +++ b/src/power-clamp/services/power-clamp.service.ts @@ -18,7 +18,8 @@ import { SpaceDeviceService } from 'src/space/services'; import { SqlLoaderService } from '@app/common/helper/services/sql-loader.service'; import { DataSource } from 'typeorm'; import { SQL_PROCEDURES_PATH } from '@app/common/constants/sql-query-path'; -import { toDDMMYYYY } from '@app/common/helper/date-format'; +import { filterByMonth, toMMYYYY } from '@app/common/helper/date-format'; +import { ProductType } from '@app/common/constants/product-type.enum'; @Injectable() export class PowerClampService { @@ -36,25 +37,40 @@ export class PowerClampService { params: SpaceParamsDto, query: GetPowerClampBySpaceDto, ) { - const { startDate, endDate } = query; + const { monthDate } = query; const { spaceUuid } = params; try { const devices = await this.spaceDeviceService.getAllDevicesBySpace(spaceUuid); + console.log('devices', devices); - const deviceUuids = devices.map((device) => device.uuid).join(','); + const deviceUuids = devices + .filter((device) => device.productDevice.prodType === ProductType.PC) + .map((device) => device.uuid) + .join(','); + console.log('deviceUuids', deviceUuids); + + const formattedMonthDate = toMMYYYY(monthDate); - const formattedStartDate = toDDMMYYYY(startDate); - const formattedEndDate = toDDMMYYYY(endDate); const data = await this.executeProcedure( - 'fact_monthly_space_energy_consumed_procedure', - [formattedStartDate, formattedEndDate, deviceUuids], + 'fact_daily_space_energy_consumed_procedure', + [formattedMonthDate, deviceUuids], ); + // Format date to YYYY-MM-DD + const formattedData = data.map((item) => ({ + ...item, + date: new Date(item.date).toLocaleDateString('en-CA'), // YYYY-MM-DD + })); + + const filteredData = monthDate + ? filterByMonth(formattedData, monthDate) + : formattedData; + return this.buildResponse( `Power clamp data for space ${spaceUuid} fetched successfully`, - data, + filteredData, ); } catch (error) { throw new HttpException( diff --git a/src/space/services/space-device.service.ts b/src/space/services/space-device.service.ts index 5f2b94d..b257b1e 100644 --- a/src/space/services/space-device.service.ts +++ b/src/space/services/space-device.service.ts @@ -133,7 +133,7 @@ export class SpaceDeviceService { async getAllDevicesBySpace(spaceUuid: string): Promise { const space = await this.spaceRepository.findOne({ where: { uuid: spaceUuid }, - relations: ['children', 'devices'], + relations: ['children', 'devices', 'devices.productDevice'], }); if (!space) { @@ -146,7 +146,7 @@ export class SpaceDeviceService { const fetchChildren = async (parentSpace: SpaceEntity) => { const children = await this.spaceRepository.find({ where: { parent: { uuid: parentSpace.uuid } }, - relations: ['children', 'devices'], + relations: ['children', 'devices', 'devices.productDevice'], }); for (const child of children) {