diff --git a/src/device/services/device.service.ts b/src/device/services/device.service.ts index 49a6a86..9a67d65 100644 --- a/src/device/services/device.service.ts +++ b/src/device/services/device.service.ts @@ -1021,10 +1021,13 @@ export class DeviceService { } } - const spaceHierarchy = await this.getFullSpaceHierarchy( + const spaceHierarchy = await this.getParentHierarchy( device?.spaceDevice, ); - const orderedHierarchy = spaceHierarchy.reverse(); + const orderedHierarchy = [ + device?.spaceDevice, + ...spaceHierarchy.reverse(), + ]; return { spaces: orderedHierarchy.map((space) => ({ @@ -1515,4 +1518,32 @@ export class DeviceService { } return project; } + + async getParentHierarchy( + space: SpaceEntity, + ): Promise<{ uuid: string; spaceName: string }[]> { + try { + const targetSpace = await this.spaceRepository.findOne({ + where: { uuid: space.uuid }, + relations: ['parent'], + }); + + if (!targetSpace) { + throw new HttpException('Space not found', HttpStatus.NOT_FOUND); + } + + const ancestors = await this.fetchAncestors(targetSpace); + + return ancestors.map((parentSpace) => ({ + uuid: parentSpace.uuid, + spaceName: parentSpace.spaceName, + })); + } catch (error) { + console.error('Error fetching parent hierarchy:', error.message); + throw new HttpException( + 'Error fetching parent hierarchy', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } } diff --git a/src/space/services/space-device.service.ts b/src/space/services/space-device.service.ts index 490cca7..773c7d5 100644 --- a/src/space/services/space-device.service.ts +++ b/src/space/services/space-device.service.ts @@ -32,10 +32,10 @@ export class SpaceDeviceService { ); } - // Fetch space hierarchy **once** and reverse it to get an ordered hierarchy const spaceHierarchy = - await this.validationService.getFullSpaceHierarchy(space); - const orderedHierarchy = spaceHierarchy.reverse(); + await this.validationService.getParentHierarchy(space); + + const orderedHierarchy = [space, ...spaceHierarchy.reverse()]; // Fetch Tuya details for each device in parallel using Promise.allSettled const deviceDetailsPromises = space.devices.map((device) => diff --git a/src/space/services/space-validation.service.ts b/src/space/services/space-validation.service.ts index 9dc614b..0358fc2 100644 --- a/src/space/services/space-validation.service.ts +++ b/src/space/services/space-validation.service.ts @@ -222,4 +222,32 @@ export class ValidationService { return descendants; } + + async getParentHierarchy( + space: SpaceEntity, + ): Promise<{ uuid: string; spaceName: string }[]> { + try { + const targetSpace = await this.spaceRepository.findOne({ + where: { uuid: space.uuid }, + relations: ['parent'], + }); + + if (!targetSpace) { + throw new HttpException('Space not found', HttpStatus.NOT_FOUND); + } + + const ancestors = await this.fetchAncestors(targetSpace); + + return ancestors.map((parentSpace) => ({ + uuid: parentSpace.uuid, + spaceName: parentSpace.spaceName, + })); + } catch (error) { + console.error('Error fetching parent hierarchy:', error.message); + throw new HttpException( + 'Error fetching parent hierarchy', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } }