diff --git a/libs/common/src/dto/pagination.request.dto.ts b/libs/common/src/dto/pagination.request.dto.ts index a2d011f..e20501a 100644 --- a/libs/common/src/dto/pagination.request.dto.ts +++ b/libs/common/src/dto/pagination.request.dto.ts @@ -1,11 +1,24 @@ -import { IsDate, IsOptional } from 'class-validator'; +import { IsBoolean, IsDate, IsOptional } from 'class-validator'; import { IsPageRequestParam } from '../validators/is-page-request-param.validator'; import { ApiProperty } from '@nestjs/swagger'; import { IsSizeRequestParam } from '../validators/is-size-request-param.validator'; import { Transform } from 'class-transformer'; import { parseToDate } from '../util/parseToDate'; +import { BooleanValues } from '../constants/boolean-values.enum'; export class PaginationRequestGetListDto { + @ApiProperty({ + example: true, + description: 'include spaces', + required: false, + default: false, + }) + @IsOptional() + @IsBoolean() + @Transform((value) => { + return value.obj.includeSpaces === BooleanValues.TRUE; + }) + public includeSpaces?: boolean = false; @IsOptional() @IsPageRequestParam({ message: 'Page must be bigger than 0', diff --git a/libs/common/src/models/typeOrmCustom.model.ts b/libs/common/src/models/typeOrmCustom.model.ts index 043b13c..a7b97b0 100644 --- a/libs/common/src/models/typeOrmCustom.model.ts +++ b/libs/common/src/models/typeOrmCustom.model.ts @@ -16,6 +16,7 @@ export interface TypeORMCustomModelFindAllQuery { where?: { [key: string]: unknown }; select?: string[]; includeDisable?: boolean | string; + includeSpaces?: boolean; } interface CustomFindAllQuery { page?: number; diff --git a/src/community/community.module.ts b/src/community/community.module.ts index a87ef85..d57d377 100644 --- a/src/community/community.module.ts +++ b/src/community/community.module.ts @@ -3,13 +3,49 @@ import { CommunityService } from './services/community.service'; import { CommunityController } from './controllers/community.controller'; import { ConfigModule } from '@nestjs/config'; import { SpaceRepositoryModule } from '@app/common/modules/space/space.repository.module'; -import { SpaceRepository } from '@app/common/modules/space/repositories'; +import { + InviteSpaceRepository, + SpaceLinkRepository, + SpaceProductAllocationRepository, + SpaceRepository, + TagRepository, +} from '@app/common/modules/space/repositories'; import { UserSpaceRepository } from '@app/common/modules/user/repositories'; import { UserRepositoryModule } from '@app/common/modules/user/user.repository.module'; import { SpacePermissionService } from '@app/common/helper/services'; import { CommunityRepository } from '@app/common/modules/community/repositories'; import { TuyaService } from '@app/common/integrations/tuya/services/tuya.service'; import { ProjectRepository } from '@app/common/modules/project/repositiories'; +import { + SpaceLinkService, + SpaceService, + SubspaceDeviceService, + SubSpaceService, + ValidationService, +} from 'src/space/services'; +import { TagService as NewTagService } from 'src/tags/services'; +import { TagService } from 'src/space/services/tag'; +import { + SpaceModelService, + SubSpaceModelService, +} from 'src/space-model/services'; +import { SpaceProductAllocationService } from 'src/space/services/space-product-allocation.service'; +import { + SubspaceProductAllocationRepository, + SubspaceRepository, +} from '@app/common/modules/space/repositories/subspace.repository'; +import { SubspaceProductAllocationService } from 'src/space/services/subspace/subspace-product-allocation.service'; +import { + SpaceModelProductAllocationRepoitory, + SpaceModelRepository, + SubspaceModelProductAllocationRepoitory, + SubspaceModelRepository, +} from '@app/common/modules/space-model'; +import { DeviceRepository } from '@app/common/modules/device/repositories'; +import { NewTagRepository } from '@app/common/modules/tag/repositories/tag-repository'; +import { ProductRepository } from '@app/common/modules/product/repositories'; +import { SpaceModelProductAllocationService } from 'src/space-model/services/space-model-product-allocation.service'; +import { SubspaceModelProductAllocationService } from 'src/space-model/services/subspace/subspace-model-product-allocation.service'; @Module({ imports: [ConfigModule, SpaceRepositoryModule, UserRepositoryModule], @@ -22,6 +58,32 @@ import { ProjectRepository } from '@app/common/modules/project/repositiories'; CommunityRepository, SpacePermissionService, ProjectRepository, + SpaceService, + InviteSpaceRepository, + SpaceLinkService, + SubSpaceService, + ValidationService, + NewTagService, + SpaceModelService, + SpaceProductAllocationService, + SpaceLinkRepository, + SubspaceRepository, + TagService, + SubspaceDeviceService, + SubspaceProductAllocationService, + SpaceModelRepository, + DeviceRepository, + NewTagRepository, + ProductRepository, + SubSpaceModelService, + SpaceModelProductAllocationService, + SpaceProductAllocationRepository, + SubspaceProductAllocationRepository, + TagRepository, + SubspaceModelRepository, + SubspaceModelProductAllocationService, + SpaceModelProductAllocationRepoitory, + SubspaceModelProductAllocationRepoitory, ], exports: [CommunityService, SpacePermissionService], }) diff --git a/src/community/services/community.service.ts b/src/community/services/community.service.ts index 12d6155..a627673 100644 --- a/src/community/services/community.service.ts +++ b/src/community/services/community.service.ts @@ -14,12 +14,14 @@ import { TuyaService } from '@app/common/integrations/tuya/services/tuya.service import { ProjectRepository } from '@app/common/modules/project/repositiories'; import { ORPHAN_COMMUNITY_NAME } from '@app/common/constants/orphan-constant'; import { Not } from 'typeorm'; +import { SpaceService } from 'src/space/services'; @Injectable() export class CommunityService { constructor( private readonly communityRepository: CommunityRepository, private readonly projectRepository: ProjectRepository, + private readonly spaceService: SpaceService, private readonly tuyaService: TuyaService, ) {} @@ -98,6 +100,30 @@ export class CommunityService { const { baseResponseDto, paginationResponseDto } = await customModel.findAll(pageable); + if (pageable.includeSpaces) { + const communitiesWithSpaces = await Promise.all( + baseResponseDto.data.map(async (community: CommunityDto) => { + const spaces = + await this.spaceService.getSpacesHierarchyForCommunity( + { + communityUuid: community.uuid, + projectUuid: param.projectUuid, + }, + { + onlyWithDevices: false, + }, + ); + + return { + ...community, + spaces: spaces.data, + }; + }), + ); + + baseResponseDto.data = communitiesWithSpaces; + } + return new PageResponse( baseResponseDto, paginationResponseDto, diff --git a/src/invite-user/invite-user.module.ts b/src/invite-user/invite-user.module.ts index 7efbe2f..4eed818 100644 --- a/src/invite-user/invite-user.module.ts +++ b/src/invite-user/invite-user.module.ts @@ -13,11 +13,21 @@ import { InviteUserSpaceRepository, } from '@app/common/modules/Invite-user/repositiories'; import { EmailService } from '@app/common/util/email.service'; -import { SpaceUserService, ValidationService } from 'src/space/services'; +import { + SpaceLinkService, + SpaceService, + SpaceUserService, + SubspaceDeviceService, + SubSpaceService, + ValidationService, +} from 'src/space/services'; import { CommunityService } from 'src/community/services'; import { InviteSpaceRepository, + SpaceLinkRepository, + SpaceProductAllocationRepository, SpaceRepository, + TagRepository, } from '@app/common/modules/space'; import { SpaceModelRepository } from '@app/common/modules/space-model'; import { CommunityRepository } from '@app/common/modules/community/repositories'; @@ -34,9 +44,31 @@ import { ProjectUserService } from 'src/project/services/project-user.service'; import { RoleTypeRepository } from '@app/common/modules/role-type/repositories'; import { RegionRepository } from '@app/common/modules/region/repositories'; import { TimeZoneRepository } from '@app/common/modules/timezone/repositories'; +import { CommunityModule } from 'src/community/community.module'; +import { TagService as NewTagService } from 'src/tags/services'; +import { TagService } from 'src/space/services/tag'; +import { + SpaceModelService, + SubSpaceModelService, +} from 'src/space-model/services'; +import { SpaceProductAllocationService } from 'src/space/services/space-product-allocation.service'; +import { + SubspaceProductAllocationRepository, + SubspaceRepository, +} from '@app/common/modules/space/repositories/subspace.repository'; +import { SubspaceProductAllocationService } from 'src/space/services/subspace/subspace-product-allocation.service'; +import { + SpaceModelProductAllocationRepoitory, + SubspaceModelProductAllocationRepoitory, + SubspaceModelRepository, +} from '@app/common/modules/space-model'; +import { NewTagRepository } from '@app/common/modules/tag/repositories/tag-repository'; +import { ProductRepository } from '@app/common/modules/product/repositories'; +import { SpaceModelProductAllocationService } from 'src/space-model/services/space-model-product-allocation.service'; +import { SubspaceModelProductAllocationService } from 'src/space-model/services/subspace/subspace-model-product-allocation.service'; @Module({ - imports: [ConfigModule, InviteUserRepositoryModule], + imports: [ConfigModule, InviteUserRepositoryModule, CommunityModule], controllers: [InviteUserController], providers: [ InviteUserService, @@ -64,6 +96,32 @@ import { TimeZoneRepository } from '@app/common/modules/timezone/repositories'; UserService, RegionRepository, TimeZoneRepository, + SpaceService, + InviteSpaceRepository, + SpaceLinkService, + SubSpaceService, + ValidationService, + NewTagService, + SpaceModelService, + SpaceProductAllocationService, + SpaceLinkRepository, + SubspaceRepository, + TagService, + SubspaceDeviceService, + SubspaceProductAllocationService, + SpaceModelRepository, + DeviceRepository, + NewTagRepository, + ProductRepository, + SubSpaceModelService, + SpaceModelProductAllocationService, + SpaceProductAllocationRepository, + SubspaceProductAllocationRepository, + TagRepository, + SubspaceModelRepository, + SubspaceModelProductAllocationService, + SpaceModelProductAllocationRepoitory, + SubspaceModelProductAllocationRepoitory, ], exports: [InviteUserService], }) diff --git a/src/space-model/space-model.module.ts b/src/space-model/space-model.module.ts index 41aebed..3f22918 100644 --- a/src/space-model/space-model.module.ts +++ b/src/space-model/space-model.module.ts @@ -57,6 +57,7 @@ import { SceneRepository, } from '@app/common/modules/scene/repositories'; import { AutomationRepository } from '@app/common/modules/automation/repositories'; +import { CommunityModule } from 'src/community/community.module'; const CommandHandlers = [ PropogateUpdateSpaceModelHandler, @@ -65,7 +66,7 @@ const CommandHandlers = [ ]; @Module({ - imports: [ConfigModule, SpaceRepositoryModule, CqrsModule], + imports: [ConfigModule, SpaceRepositoryModule, CqrsModule, CommunityModule], controllers: [SpaceModelController], providers: [ ...CommandHandlers, diff --git a/src/space/services/space-validation.service.ts b/src/space/services/space-validation.service.ts index e134b5d..80dd700 100644 --- a/src/space/services/space-validation.service.ts +++ b/src/space/services/space-validation.service.ts @@ -1,8 +1,10 @@ import { SpaceRepository } from '@app/common/modules/space/repositories'; import { BadRequestException, + forwardRef, HttpException, HttpStatus, + Inject, Injectable, } from '@nestjs/common'; import { CommunityService } from '../../community/services'; @@ -29,6 +31,7 @@ import { ProjectEntity } from '@app/common/modules/project/entities'; export class ValidationService { constructor( private readonly projectService: ProjectService, + @Inject(forwardRef(() => CommunityService)) private readonly communityService: CommunityService, private readonly spaceRepository: SpaceRepository, private readonly projectRepository: ProjectRepository,