From a9be4d315a4a233d5d7cee7bf86330733fa6e155 Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Sun, 14 Apr 2024 10:31:49 +0300 Subject: [PATCH] Add endpoint to rename building by UUID --- .../controllers/building.controller.ts | 26 ++++++++++ src/building/dtos/update.building.dto.ts | 16 ++++++ src/building/interface/building.interface.ts | 5 ++ src/building/services/building.service.ts | 52 ++++++++++++++++++- 4 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 src/building/dtos/update.building.dto.ts diff --git a/src/building/controllers/building.controller.ts b/src/building/controllers/building.controller.ts index 17e01d4..01d278c 100644 --- a/src/building/controllers/building.controller.ts +++ b/src/building/controllers/building.controller.ts @@ -7,6 +7,7 @@ import { HttpStatus, Param, Post, + Put, Query, UseGuards, } from '@nestjs/common'; @@ -14,6 +15,7 @@ import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; import { JwtAuthGuard } from '../../../libs/common/src/guards/jwt.auth.guard'; import { AddBuildingDto } from '../dtos/add.building.dto'; import { GetBuildingChildDto } from '../dtos/get.building.dto'; +import { UpdateBuildingNameDto } from '../dtos/update.building.dto'; @ApiTags('Building Module') @Controller({ @@ -101,4 +103,28 @@ export class BuildingController { } } } + @ApiBearerAuth() + @UseGuards(JwtAuthGuard) + @Put('rename/:buildingUuid') + async renameBuildingByUuid( + @Param('buildingUuid') buildingUuid: string, + @Body() updateBuildingDto: UpdateBuildingNameDto, + ) { + try { + const building = await this.buildingService.renameBuildingByUuid( + buildingUuid, + updateBuildingDto, + ); + return building; + } catch (error) { + if (error.status === 404) { + throw new HttpException('Building not found', HttpStatus.NOT_FOUND); + } else { + throw new HttpException( + error.message || 'Internal server error', + error.status || HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } + } } diff --git a/src/building/dtos/update.building.dto.ts b/src/building/dtos/update.building.dto.ts new file mode 100644 index 0000000..0f07cbe --- /dev/null +++ b/src/building/dtos/update.building.dto.ts @@ -0,0 +1,16 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class UpdateBuildingNameDto { + @ApiProperty({ + description: 'buildingName', + required: true, + }) + @IsString() + @IsNotEmpty() + public buildingName: string; + + constructor(dto: Partial) { + Object.assign(this, dto); + } +} diff --git a/src/building/interface/building.interface.ts b/src/building/interface/building.interface.ts index 92852a7..4bdf760 100644 --- a/src/building/interface/building.interface.ts +++ b/src/building/interface/building.interface.ts @@ -19,3 +19,8 @@ export interface BuildingParentInterface { type: string; parent?: BuildingParentInterface; } +export interface RenameBuildingByUuidInterface { + uuid: string; + name: string; + type: string; +} diff --git a/src/building/services/building.service.ts b/src/building/services/building.service.ts index fbaf8cb..528d7e4 100644 --- a/src/building/services/building.service.ts +++ b/src/building/services/building.service.ts @@ -1,14 +1,21 @@ import { GetBuildingChildDto } from '../dtos/get.building.dto'; import { SpaceTypeRepository } from '../../../libs/common/src/modules/space-type/repositories/space.type.repository'; -import { Injectable, HttpException, HttpStatus } from '@nestjs/common'; +import { + Injectable, + HttpException, + HttpStatus, + BadRequestException, +} from '@nestjs/common'; import { SpaceRepository } from '@app/common/modules/space/repositories'; import { AddBuildingDto } from '../dtos'; import { BuildingChildInterface, BuildingParentInterface, GetBuildingByUuidInterface, + RenameBuildingByUuidInterface, } from '../interface/building.interface'; import { SpaceEntity } from '@app/common/modules/space/entities'; +import { UpdateBuildingNameDto } from '../dtos/update.building.dto'; @Injectable() export class BuildingService { @@ -179,4 +186,47 @@ export class BuildingService { ); } } + + async renameBuildingByUuid( + buildingUuid: string, + updateBuildingNameDto: UpdateBuildingNameDto, + ): Promise { + try { + const building = await this.spaceRepository.findOneOrFail({ + where: { uuid: buildingUuid }, + relations: ['spaceType'], + }); + + if ( + !building || + !building.spaceType || + building.spaceType.type !== 'building' + ) { + throw new BadRequestException('Invalid building UUID'); + } + + await this.spaceRepository.update( + { uuid: buildingUuid }, + { spaceName: updateBuildingNameDto.buildingName }, + ); + + // Fetch the updated building + const updatedBuilding = await this.spaceRepository.findOneOrFail({ + where: { uuid: buildingUuid }, + relations: ['spaceType'], + }); + + return { + uuid: updatedBuilding.uuid, + name: updatedBuilding.spaceName, + type: updatedBuilding.spaceType.type, + }; + } catch (err) { + if (err instanceof BadRequestException) { + throw err; // Re-throw BadRequestException + } else { + throw new HttpException('Building not found', HttpStatus.NOT_FOUND); + } + } + } }