removed get spaces from community

This commit is contained in:
hannathkadher
2024-10-29 18:13:13 +04:00
parent 9bd598da31
commit a486b24ef8
8 changed files with 38 additions and 151 deletions

View File

@ -10,7 +10,7 @@ export class ControllerRoute {
}; };
static COMMUNITY = class { static COMMUNITY = class {
public static readonly ROUTE = 'community'; public static readonly ROUTE = 'communities';
static ACTIONS = class { static ACTIONS = class {
public static readonly GET_COMMUNITY_BY_ID_SUMMARY = public static readonly GET_COMMUNITY_BY_ID_SUMMARY =
'Get community by community community uuid'; 'Get community by community community uuid';
@ -40,7 +40,7 @@ export class ControllerRoute {
}; };
static COMMUNITY_SPACE = class { static COMMUNITY_SPACE = class {
public static readonly ROUTE = 'community/:communityUuid/space'; public static readonly ROUTE = 'communities/:communityUuid/space';
static ACTIONS = class { static ACTIONS = class {
public static readonly GET_COMMUNITY_SPACES_HIERARCHY_SUMMARY = public static readonly GET_COMMUNITY_SPACES_HIERARCHY_SUMMARY =
'Fetch hierarchical structure of spaces within a community.'; 'Fetch hierarchical structure of spaces within a community.';
@ -111,6 +111,12 @@ export class ControllerRoute {
'Generate a new invitation code for a specific space'; 'Generate a new invitation code for a specific space';
public static readonly CREATE_INVITATION_CODE_SPACE_DESCRIPTION = public static readonly CREATE_INVITATION_CODE_SPACE_DESCRIPTION =
'This endpoint generates a new 6-character invitation code for a space identified by its UUID and stores it in the space entity'; 'This endpoint generates a new 6-character invitation code for a space identified by its UUID and stores it in the space entity';
public static readonly GET_COMMUNITY_SPACES_HIERARCHY_SUMMARY =
'Fetch hierarchical structure of spaces within a community.';
public static readonly GET_COMMUNITY_SPACES_HIERARCHY_DESCRIPTION =
'retrieves all the spaces associated with a given community, organized into a hierarchical structure.';
}; };
}; };

View File

@ -8,17 +8,14 @@ import { SpaceTypeRepository } from '@app/common/modules/space/repositories';
import { UserSpaceRepository } from '@app/common/modules/user/repositories'; import { UserSpaceRepository } from '@app/common/modules/user/repositories';
import { UserRepositoryModule } from '@app/common/modules/user/user.repository.module'; import { UserRepositoryModule } from '@app/common/modules/user/user.repository.module';
import { SpacePermissionService } from '@app/common/helper/services'; import { SpacePermissionService } from '@app/common/helper/services';
import { CommunitySpaceService } from './services';
import { CommunitySpaceController } from './controllers';
import { CommunityRepository } from '@app/common/modules/community/repositories'; import { CommunityRepository } from '@app/common/modules/community/repositories';
import { TuyaService } from '@app/common/integrations/tuya/tuya.service'; import { TuyaService } from '@app/common/integrations/tuya/tuya.service';
@Module({ @Module({
imports: [ConfigModule, SpaceRepositoryModule, UserRepositoryModule], imports: [ConfigModule, SpaceRepositoryModule, UserRepositoryModule],
controllers: [CommunityController, CommunitySpaceController], controllers: [CommunityController],
providers: [ providers: [
CommunityService, CommunityService,
CommunitySpaceService,
SpaceRepository, SpaceRepository,
SpaceTypeRepository, SpaceTypeRepository,
UserSpaceRepository, UserSpaceRepository,

View File

@ -1,36 +0,0 @@
import { Controller, Get, Param, UseGuards } from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import { GetCommunityParams } from '../dtos/get.community.dto';
// import { CheckUserCommunityGuard } from 'src/guards/user.community.guard';
import { JwtAuthGuard } from '@app/common/guards/jwt.auth.guard';
import { ControllerRoute } from '@app/common/constants/controller-route';
import { BaseResponseDto } from '@app/common/dto/base.response.dto';
import { CommunitySpaceService } from '../services';
@ApiTags('Community Module')
@Controller({
version: '1',
path: ControllerRoute.COMMUNITY_SPACE.ROUTE,
})
export class CommunitySpaceController {
constructor(private readonly communitySpaceService: CommunitySpaceService) {}
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@ApiOperation({
summary:
ControllerRoute.COMMUNITY_SPACE.ACTIONS
.GET_COMMUNITY_SPACES_HIERARCHY_SUMMARY,
description:
ControllerRoute.COMMUNITY_SPACE.ACTIONS
.GET_COMMUNITY_SPACES_HIERARCHY_DESCRIPTION,
})
@Get()
async getCommunityByUuid(
@Param() params: GetCommunityParams,
): Promise<BaseResponseDto> {
return await this.communitySpaceService.getSpacesHierarchyForCommunity(
params.communityUuid,
);
}
}

View File

@ -1,2 +1 @@
export * from './community.controller'; export * from './community.controller';
export * from './community-spaces.controller';

View File

@ -1,79 +0,0 @@
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { SpaceRepository } from '@app/common/modules/space/repositories';
import { BaseResponseDto } from '@app/common/dto/base.response.dto';
import { CommunityRepository } from '@app/common/modules/community/repositories';
import { SuccessResponseDto } from '@app/common/dto/success.response.dto';
import { SpaceEntity } from '@app/common/modules/space/entities';
@Injectable()
export class CommunitySpaceService {
constructor(
private readonly spaceRepository: SpaceRepository,
private readonly communityRepository: CommunityRepository,
) {}
async getSpacesHierarchyForCommunity(
communityId: string,
): Promise<BaseResponseDto> {
const community = await this.communityRepository.findOne({
where: { uuid: communityId },
});
// If the community doesn't exist, throw a 404 error
if (!community) {
throw new HttpException(
`Community with ID ${communityId} not found`,
HttpStatus.NOT_FOUND,
);
}
try {
// Get all spaces related to the community, including the parent-child relations
const spaces = await this.spaceRepository.find({
where: { community: { uuid: communityId } },
relations: ['parent', 'children'], // Include parent and children relations
});
// Organize spaces into a hierarchical structure
const spaceHierarchy = this.buildSpaceHierarchy(spaces);
return new SuccessResponseDto({
message: `Spaces in community ${communityId} successfully fetched in hierarchy`,
data: spaceHierarchy,
statusCode: HttpStatus.OK,
});
} catch (error) {
throw new HttpException(
'An error occurred while fetching the spaces',
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
private buildSpaceHierarchy(spaces: SpaceEntity[]): SpaceEntity[] {
const map = new Map<string, SpaceEntity>();
// Step 1: Create a map of spaces by UUID
spaces.forEach((space) => {
map.set(
space.uuid,
this.spaceRepository.create({
...space,
children: [], // Add children if needed
}),
);
});
// Step 2: Organize the hierarchy
const rootSpaces: SpaceEntity[] = [];
spaces.forEach((space) => {
if (space.parent && space.parent.uuid) {
const parent = map.get(space.parent.uuid);
parent?.children?.push(map.get(space.uuid));
} else {
rootSpaces.push(map.get(space.uuid));
}
});
return rootSpaces; // Return the root spaces with children nested within them
}
}

View File

@ -1,2 +1 @@
export * from './community.service'; export * from './community.service';
export * from './community-space.service';

View File

@ -9,13 +9,11 @@ import {
Param, Param,
Post, Post,
Put, Put,
Query,
UseGuards, UseGuards,
} from '@nestjs/common'; } from '@nestjs/common';
import { JwtAuthGuard } from '@app/common/guards/jwt.auth.guard'; import { JwtAuthGuard } from '@app/common/guards/jwt.auth.guard';
import { AddSpaceDto, CommunitySpaceParam } from '../dtos'; import { AddSpaceDto, CommunitySpaceParam } from '../dtos';
import { BaseResponseDto } from '@app/common/dto/base.response.dto'; import { BaseResponseDto } from '@app/common/dto/base.response.dto';
import { PaginationRequestGetListDto } from '@app/common/dto/pagination.request.dto';
import { GetSpaceParam } from '../dtos/get.space.param'; import { GetSpaceParam } from '../dtos/get.space.param';
@ApiTags('Space Module') @ApiTags('Space Module')
@ -46,15 +44,18 @@ export class SpaceController {
@ApiBearerAuth() @ApiBearerAuth()
@UseGuards(JwtAuthGuard) @UseGuards(JwtAuthGuard)
@ApiOperation({ @ApiOperation({
summary: ControllerRoute.SPACE.ACTIONS.LIST_SPACE_SUMMARY, summary:
description: ControllerRoute.SPACE.ACTIONS.LIST_SPACE_DESCRIPTION, ControllerRoute.SPACE.ACTIONS.GET_COMMUNITY_SPACES_HIERARCHY_SUMMARY,
description:
ControllerRoute.SPACE.ACTIONS.GET_COMMUNITY_SPACES_HIERARCHY_DESCRIPTION,
}) })
@Get() @Get()
async list( async getHierarchy(
@Param() communitySpaceParam: CommunitySpaceParam, @Param() param: CommunitySpaceParam,
@Query() query: PaginationRequestGetListDto,
): Promise<BaseResponseDto> { ): Promise<BaseResponseDto> {
return this.spaceService.list(communitySpaceParam.communityUuid, query); return this.spaceService.getSpacesHierarchyForCommunity(
param.communityUuid,
);
} }
@ApiBearerAuth() @ApiBearerAuth()

View File

@ -10,12 +10,6 @@ import { SuccessResponseDto } from '@app/common/dto/success.response.dto';
import { BaseResponseDto } from '@app/common/dto/base.response.dto'; import { BaseResponseDto } from '@app/common/dto/base.response.dto';
import { CommunityRepository } from '@app/common/modules/community/repositories'; import { CommunityRepository } from '@app/common/modules/community/repositories';
import { SpaceEntity } from '@app/common/modules/space/entities'; import { SpaceEntity } from '@app/common/modules/space/entities';
import {
TypeORMCustomModel,
TypeORMCustomModelFindAllQuery,
} from '@app/common/models/typeOrmCustom.model';
import { SpaceDto } from '@app/common/modules/space/dtos';
import { PageResponse } from '@app/common/dto/pagination.response.dto';
import { generateRandomString } from '@app/common/helper/randomString'; import { generateRandomString } from '@app/common/helper/randomString';
@Injectable() @Injectable()
@ -76,34 +70,40 @@ export class SpaceService {
} }
} }
async list( async getSpacesHierarchyForCommunity(
communityId: string, communityUuid: string,
pageable: Partial<TypeORMCustomModelFindAllQuery>,
): Promise<BaseResponseDto> { ): Promise<BaseResponseDto> {
const community = await this.communityRepository.findOne({ const community = await this.communityRepository.findOne({
where: { uuid: communityId }, where: { uuid: communityUuid },
}); });
// If the community doesn't exist, throw a 404 error // If the community doesn't exist, throw a 404 error
if (!community) { if (!community) {
throw new HttpException( throw new HttpException(
`Community with ID ${communityId} not found`, `Community with ID ${communityUuid} not found`,
HttpStatus.NOT_FOUND, HttpStatus.NOT_FOUND,
); );
} }
try { try {
pageable.modelName = 'space'; // Get all spaces related to the community, including the parent-child relations
pageable.where = { const spaces = await this.spaceRepository.find({
community: { uuid: communityId }, where: { community: { uuid: communityUuid } },
}; relations: ['parent', 'children'], // Include parent and children relations
});
const customModel = TypeORMCustomModel(this.spaceRepository); // Organize spaces into a hierarchical structure
const spaceHierarchy = this.buildSpaceHierarchy(spaces);
const { baseResponseDto, paginationResponseDto } = return new SuccessResponseDto({
await customModel.findAll(pageable); message: `Spaces in community ${communityUuid} successfully fetched in hierarchy`,
return new PageResponse<SpaceDto>(baseResponseDto, paginationResponseDto); data: spaceHierarchy,
statusCode: HttpStatus.OK,
});
} catch (error) { } catch (error) {
throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR); throw new HttpException(
'An error occurred while fetching the spaces',
HttpStatus.INTERNAL_SERVER_ERROR,
);
} }
} }