mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-07-16 02:36:19 +00:00
added community space
This commit is contained in:
@ -38,4 +38,15 @@ export class ControllerRoute {
|
||||
'Create community in the database and return in model';
|
||||
};
|
||||
};
|
||||
|
||||
static COMMUNITYSPACE = class {
|
||||
public static readonly ROUTE = 'communities/:id/spaces';
|
||||
static ACTIONS = class {
|
||||
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.';
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -3,9 +3,9 @@ import { InternalServerErrorException } from '@nestjs/common';
|
||||
import { BaseResponseDto } from '../dto/base.response.dto';
|
||||
import { PageResponseDto } from '../dto/pagination.response.dto';
|
||||
import { buildTypeORMSortQuery } from '../util/buildTypeORMSortQuery';
|
||||
import { getPaginationResponseDto } from '../util/getPaginationResponseDto';
|
||||
import { buildTypeORMWhereClause } from '../util/buildTypeORMWhereClause';
|
||||
import { buildTypeORMIncludeQuery } from '../util/buildTypeORMIncludeQuery';
|
||||
import { buildTypeORMWhereClause } from '../util/buildTypeORMWhereClause';
|
||||
import { getPaginationResponseDto } from '../util/getPaginationResponseDto';
|
||||
|
||||
export interface TypeORMCustomModelFindAllQuery {
|
||||
page: number | undefined;
|
||||
@ -101,7 +101,7 @@ export function TypeORMCustomModel(repository: Repository<any>) {
|
||||
|
||||
// Ensure the whereClause is passed directly to findAndCount
|
||||
const [data, count] = await repository.findAndCount({
|
||||
where: whereClause.where || whereClause, // Don't wrap this under another 'where'
|
||||
where: whereClause,
|
||||
take: size,
|
||||
skip: skip,
|
||||
order: order,
|
||||
|
@ -3,7 +3,6 @@ import { AbstractEntity } from '../../abstract/entities/abstract.entity';
|
||||
import { CommunityDto } from '../dtos';
|
||||
import { RegionEntity } from '../../region/entities';
|
||||
import { SpaceEntity } from '../../space/entities';
|
||||
import { RoleEntity } from '../../role/entities';
|
||||
|
||||
@Entity({ name: 'community' })
|
||||
@Unique(['name'])
|
||||
@ -32,7 +31,4 @@ export class CommunityEntity extends AbstractEntity<CommunityDto> {
|
||||
|
||||
@OneToMany(() => SpaceEntity, (space) => space.community)
|
||||
spaces: SpaceEntity[];
|
||||
|
||||
@OneToMany(() => RoleEntity, (role) => role.community)
|
||||
roles: RoleEntity[];
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ import { Column, Entity, OneToMany } from 'typeorm';
|
||||
import { RegionDto } from '../dtos';
|
||||
import { AbstractEntity } from '../../abstract/entities/abstract.entity';
|
||||
import { UserEntity } from '../../user/entities';
|
||||
import { CommunityEntity } from '../../community/entities';
|
||||
|
||||
@Entity({ name: 'region' })
|
||||
export class RegionEntity extends AbstractEntity<RegionDto> {
|
||||
@ -13,6 +14,9 @@ export class RegionEntity extends AbstractEntity<RegionDto> {
|
||||
@OneToMany(() => UserEntity, (user) => user.region)
|
||||
users: UserEntity[];
|
||||
|
||||
@OneToMany(() => CommunityEntity, (community) => community.region)
|
||||
communities: CommunityEntity[];
|
||||
|
||||
constructor(partial: Partial<RegionEntity>) {
|
||||
super();
|
||||
Object.assign(this, partial);
|
||||
|
@ -1,8 +1,16 @@
|
||||
import { Column, Entity, ManyToOne, OneToMany, Unique } from 'typeorm';
|
||||
import {
|
||||
Column,
|
||||
Entity,
|
||||
JoinColumn,
|
||||
ManyToOne,
|
||||
OneToMany,
|
||||
Unique,
|
||||
} from 'typeorm';
|
||||
import { SpaceDto, SpaceTypeDto } from '../dtos';
|
||||
import { AbstractEntity } from '../../abstract/entities/abstract.entity';
|
||||
import { UserSpaceEntity } from '../../user/entities';
|
||||
import { DeviceEntity } from '../../device/entities';
|
||||
import { CommunityEntity } from '../../community/entities';
|
||||
|
||||
@Entity({ name: 'space-type' })
|
||||
export class SpaceTypeEntity extends AbstractEntity<SpaceTypeDto> {
|
||||
@ -45,6 +53,13 @@ export class SpaceEntity extends AbstractEntity<SpaceDto> {
|
||||
})
|
||||
public spaceName: string;
|
||||
|
||||
@ManyToOne(() => CommunityEntity, (community) => community.spaces, {
|
||||
nullable: false,
|
||||
onDelete: 'CASCADE',
|
||||
})
|
||||
@JoinColumn({ name: 'community_id' })
|
||||
community: CommunityEntity;
|
||||
|
||||
@Column({
|
||||
nullable: true,
|
||||
})
|
||||
|
42
libs/common/src/util/buildTypeORMIncludeQuery.ts
Normal file
42
libs/common/src/util/buildTypeORMIncludeQuery.ts
Normal file
@ -0,0 +1,42 @@
|
||||
type TypeORMIncludeQuery = string[];
|
||||
|
||||
const mappingInclude: { [key: string]: any } = {
|
||||
roles: {
|
||||
role: true,
|
||||
},
|
||||
users: {
|
||||
user: true,
|
||||
},
|
||||
community: {
|
||||
community: true,
|
||||
},
|
||||
space: {
|
||||
space: true,
|
||||
},
|
||||
};
|
||||
|
||||
export function buildTypeORMIncludeQuery(
|
||||
modelName: string,
|
||||
includeParam?: string,
|
||||
): TypeORMIncludeQuery | undefined {
|
||||
if (includeParam) {
|
||||
const relations: TypeORMIncludeQuery = [];
|
||||
const fieldsToInclude: string[] = includeParam.split(',');
|
||||
|
||||
fieldsToInclude.forEach((field: string) => {
|
||||
if (mappingInclude[field]) {
|
||||
relations.push(field); // Push mapped field
|
||||
} else {
|
||||
console.warn(
|
||||
`Field ${field} not found in mappingInclude for ${modelName}`,
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
console.log(`Including relations for ${modelName}:`, relations);
|
||||
|
||||
return relations;
|
||||
}
|
||||
|
||||
return undefined; // If no includes, return undefined
|
||||
}
|
18
libs/common/src/util/buildTypeORMSortQuery.ts
Normal file
18
libs/common/src/util/buildTypeORMSortQuery.ts
Normal file
@ -0,0 +1,18 @@
|
||||
type TypeORMSortQuery = { [key: string]: 'ASC' | 'DESC' };
|
||||
|
||||
export function buildTypeORMSortQuery(
|
||||
sortParam: string | undefined,
|
||||
): TypeORMSortQuery {
|
||||
// sortParam format: userId:asc,createdDate:desc
|
||||
if (!sortParam) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const conditions: string[] = sortParam.split(',');
|
||||
|
||||
return conditions.reduce((acc: TypeORMSortQuery, condition) => {
|
||||
const [field, direction] = condition.split(':').map((str) => str.trim());
|
||||
acc[field] = direction.toUpperCase() === 'DESC' ? 'DESC' : 'ASC';
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
10
libs/common/src/util/buildTypeORMWhereClause.ts
Normal file
10
libs/common/src/util/buildTypeORMWhereClause.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import { FindOptionsWhere } from 'typeorm';
|
||||
|
||||
export function buildTypeORMWhereClause({
|
||||
where,
|
||||
}: {
|
||||
where?: FindOptionsWhere<any> | FindOptionsWhere<any>[]; // Accepts both object and array formats
|
||||
}): FindOptionsWhere<any> | FindOptionsWhere<any>[] {
|
||||
// Return the 'where' clause directly, without wrapping
|
||||
return where || {}; // If 'where' is undefined, return an empty object
|
||||
}
|
21
libs/common/src/util/getPaginationResponseDto.ts
Normal file
21
libs/common/src/util/getPaginationResponseDto.ts
Normal file
@ -0,0 +1,21 @@
|
||||
import { PageResponseDto } from '../dto/pagination.response.dto';
|
||||
|
||||
export function getPaginationResponseDto(
|
||||
count: number,
|
||||
page: number,
|
||||
size: number,
|
||||
): PageResponseDto {
|
||||
const totalItem = count;
|
||||
const totalPage = Math.ceil(totalItem / size);
|
||||
const hasNext = page < totalPage ? true : false;
|
||||
const hasPrevious = page === 1 || page > totalPage ? false : true;
|
||||
|
||||
return {
|
||||
hasNext,
|
||||
hasPrevious,
|
||||
page,
|
||||
size,
|
||||
totalItem,
|
||||
totalPage,
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user