mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-07-14 18:05:48 +00:00
removed get spaces from community
This commit is contained in:
@ -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.';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,2 +1 @@
|
|||||||
export * from './community.controller';
|
export * from './community.controller';
|
||||||
export * from './community-spaces.controller';
|
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,2 +1 @@
|
|||||||
export * from './community.service';
|
export * from './community.service';
|
||||||
export * from './community-space.service';
|
|
||||||
|
@ -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()
|
||||||
|
@ -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,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user