From c12b11b81d922c7fb88cf1b6b26d7e5033e8c26f Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Tue, 16 Apr 2024 15:33:28 +0300 Subject: [PATCH] Add UserSpaceRepositoryModule and UserSpaceRepository to BuildingModule --- src/building/building.module.ts | 16 +++++++- .../controllers/building.controller.ts | 23 +++++++++++- src/building/dtos/get.building.dto.ts | 10 +++++ src/building/interface/building.interface.ts | 5 +++ src/building/services/building.service.ts | 37 +++++++++++++++++++ 5 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/building/building.module.ts b/src/building/building.module.ts index 7574f81..5507453 100644 --- a/src/building/building.module.ts +++ b/src/building/building.module.ts @@ -6,11 +6,23 @@ import { SpaceRepositoryModule } from '@app/common/modules/space/space.repositor import { SpaceRepository } from '@app/common/modules/space/repositories'; import { SpaceTypeRepositoryModule } from '@app/common/modules/space-type/space.type.repository.module'; import { SpaceTypeRepository } from '@app/common/modules/space-type/repositories'; +import { UserSpaceRepositoryModule } from '@app/common/modules/user-space/user.space.repository.module'; +import { UserSpaceRepository } from '@app/common/modules/user-space/repositories'; @Module({ - imports: [ConfigModule, SpaceRepositoryModule, SpaceTypeRepositoryModule], + imports: [ + ConfigModule, + SpaceRepositoryModule, + SpaceTypeRepositoryModule, + UserSpaceRepositoryModule, + ], controllers: [BuildingController], - providers: [BuildingService, SpaceRepository, SpaceTypeRepository], + providers: [ + BuildingService, + SpaceRepository, + SpaceTypeRepository, + UserSpaceRepository, + ], exports: [BuildingService], }) export class BuildingModule {} diff --git a/src/building/controllers/building.controller.ts b/src/building/controllers/building.controller.ts index ec4a616..9e7a873 100644 --- a/src/building/controllers/building.controller.ts +++ b/src/building/controllers/building.controller.ts @@ -10,11 +10,15 @@ import { Put, Query, UseGuards, + ValidationPipe, } from '@nestjs/common'; 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 { + GetBuildingByUserIdDto, + GetBuildingChildDto, +} from '../dtos/get.building.dto'; import { UpdateBuildingNameDto } from '../dtos/update.building.dto'; import { CheckCommunityTypeGuard } from 'src/guards/community.type.guard'; @@ -92,6 +96,23 @@ export class BuildingController { ); } } + + @ApiBearerAuth() + @UseGuards(JwtAuthGuard) + @Get() + async getBuildingsByUserId( + @Query(ValidationPipe) dto: GetBuildingByUserIdDto, + ) { + try { + return await this.buildingService.getBuildingsByUserId(dto.userUuid); + } catch (error) { + throw new HttpException( + error.message || 'Internal server error', + error.status || HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } + @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Put('rename/:buildingUuid') diff --git a/src/building/dtos/get.building.dto.ts b/src/building/dtos/get.building.dto.ts index f762469..720201a 100644 --- a/src/building/dtos/get.building.dto.ts +++ b/src/building/dtos/get.building.dto.ts @@ -49,3 +49,13 @@ export class GetBuildingChildDto { }) public includeSubSpaces: boolean = false; } + +export class GetBuildingByUserIdDto { + @ApiProperty({ + description: 'userUuid', + required: true, + }) + @IsString() + @IsNotEmpty() + public userUuid: string; +} diff --git a/src/building/interface/building.interface.ts b/src/building/interface/building.interface.ts index 4bdf760..1127456 100644 --- a/src/building/interface/building.interface.ts +++ b/src/building/interface/building.interface.ts @@ -24,3 +24,8 @@ export interface RenameBuildingByUuidInterface { name: string; type: string; } +export interface GetBuildingByUserUuidInterface { + uuid: string; + name: string; + type: string; +} diff --git a/src/building/services/building.service.ts b/src/building/services/building.service.ts index 7bfd33c..726697b 100644 --- a/src/building/services/building.service.ts +++ b/src/building/services/building.service.ts @@ -11,17 +11,20 @@ import { AddBuildingDto } from '../dtos'; import { BuildingChildInterface, BuildingParentInterface, + GetBuildingByUserUuidInterface, GetBuildingByUuidInterface, RenameBuildingByUuidInterface, } from '../interface/building.interface'; import { SpaceEntity } from '@app/common/modules/space/entities'; import { UpdateBuildingNameDto } from '../dtos/update.building.dto'; +import { UserSpaceRepository } from '@app/common/modules/user-space/repositories'; @Injectable() export class BuildingService { constructor( private readonly spaceRepository: SpaceRepository, private readonly spaceTypeRepository: SpaceTypeRepository, + private readonly userSpaceRepository: UserSpaceRepository, ) {} async addBuilding(addBuildingDto: AddBuildingDto) { @@ -210,6 +213,40 @@ export class BuildingService { } } + async getBuildingsByUserId( + userUuid: string, + ): Promise { + try { + const buildings = await this.userSpaceRepository.find({ + relations: ['space', 'space.spaceType'], + where: { + user: { uuid: userUuid }, + space: { spaceType: { type: 'building' } }, + }, + }); + + if (buildings.length === 0) { + throw new HttpException( + 'this user has no buildings', + HttpStatus.NOT_FOUND, + ); + } + const spaces = buildings.map((building) => ({ + uuid: building.space.uuid, + name: building.space.spaceName, + type: building.space.spaceType.type, + })); + + return spaces; + } catch (err) { + if (err instanceof HttpException) { + throw err; + } else { + throw new HttpException('user not found', HttpStatus.NOT_FOUND); + } + } + } + async renameBuildingByUuid( buildingUuid: string, updateBuildingNameDto: UpdateBuildingNameDto,