added space link entity

This commit is contained in:
hannathkadher
2024-11-20 09:11:22 +04:00
parent 891129e7e3
commit 857b02b97b
10 changed files with 102 additions and 5 deletions

View File

@ -235,4 +235,13 @@ export class ControllerRoute {
'Removes the association of a device from a specific subspace, making it no longer managed within that subspace.';
};
};
static PRODUCT = class {
public static readonly ROUTE = 'products';
static ACTIONS = class {
public static readonly LIST_PRODUCT_SUMMARY = 'Retrieve all products';
public static readonly LIST_PRODUCT_DESCRIPTION =
'Fetches a list of all products along with their associated device details';
};
};
}

View File

@ -8,7 +8,7 @@ import { UserOtpEntity } from '../modules/user/entities';
import { ProductEntity } from '../modules/product/entities';
import { DeviceEntity } from '../modules/device/entities';
import { PermissionTypeEntity } from '../modules/permission/entities';
import { SpaceEntity, SubspaceEntity } from '../modules/space/entities';
import { SpaceEntity, SpaceLinkEntity, SubspaceEntity } from '../modules/space/entities';
import { UserSpaceEntity } from '../modules/user/entities';
import { DeviceUserPermissionEntity } from '../modules/device/entities';
import { UserRoleEntity } from '../modules/user/entities';
@ -45,6 +45,7 @@ import { SceneEntity, SceneIconEntity } from '../modules/scene/entities';
PermissionTypeEntity,
CommunityEntity,
SpaceEntity,
SpaceLinkEntity,
SubspaceEntity,
UserSpaceEntity,
DeviceUserPermissionEntity,

View File

@ -1,2 +1,3 @@
export * from './space.entity';
export * from './subspace.entity';
export * from './space-link.entity';

View File

@ -0,0 +1,26 @@
import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm';
import { AbstractEntity } from '../../abstract/entities/abstract.entity';
import { SpaceEntity } from './space.entity';
@Entity({ name: 'space_link' })
export class SpaceLinkEntity extends AbstractEntity {
@ManyToOne(() => SpaceEntity, { nullable: false, onDelete: 'CASCADE' })
@JoinColumn({ name: 'start_space_id' })
public startSpace: SpaceEntity;
@ManyToOne(() => SpaceEntity, { nullable: false, onDelete: 'CASCADE' })
@JoinColumn({ name: 'end_space_id' })
public endSpace: SpaceEntity;
@Column({
type: 'varchar',
length: 10,
nullable: false,
})
direction: string;
constructor(partial: Partial<SpaceLinkEntity>) {
super();
Object.assign(this, partial);
}
}

View File

@ -12,6 +12,7 @@ import { UserSpaceEntity } from '../../user/entities';
import { DeviceEntity } from '../../device/entities';
import { CommunityEntity } from '../../community/entities';
import { SubspaceEntity } from './subspace.entity';
import { SpaceLinkEntity } from './space-link.entity';
@Entity({ name: 'space' })
@Unique(['invitationCode'])
@ -70,6 +71,22 @@ export class SpaceEntity extends AbstractEntity<SpaceDto> {
)
devices: DeviceEntity[];
@OneToMany(() => SpaceLinkEntity, (connection) => connection.startSpace, {
nullable: true,
})
public outgoingConnections: SpaceLinkEntity[];
@OneToMany(() => SpaceLinkEntity, (connection) => connection.endSpace, {
nullable: true,
})
public incomingConnections: SpaceLinkEntity[];
@Column({
nullable: true,
type: 'text',
})
public icon: string;
constructor(partial: Partial<SpaceEntity>) {
super();
Object.assign(this, partial);

View File

@ -1,6 +1,6 @@
import { DataSource, Repository } from 'typeorm';
import { Injectable } from '@nestjs/common';
import { SpaceEntity, SubspaceEntity } from '../entities';
import { SpaceEntity, SpaceLinkEntity, SubspaceEntity } from '../entities';
@Injectable()
export class SpaceRepository extends Repository<SpaceEntity> {
@ -14,3 +14,10 @@ export class SubspaceRepository extends Repository<SubspaceEntity> {
super(SubspaceEntity, dataSource.createEntityManager());
}
}
@Injectable()
export class SpaceLinkRepository extends Repository<SpaceLinkEntity> {
constructor(private dataSource: DataSource) {
super(SpaceLinkEntity, dataSource.createEntityManager());
}
}

View File

@ -21,6 +21,7 @@ import { TimeZoneModule } from './timezone/timezone.module';
import { VisitorPasswordModule } from './vistor-password/visitor-password.module';
import { ScheduleModule } from './schedule/schedule.module';
import { SpaceModule } from './space/space.module';
import { ProductModule } from './product';
@Module({
imports: [
ConfigModule.forRoot({
@ -46,6 +47,7 @@ import { SpaceModule } from './space/space.module';
TimeZoneModule,
VisitorPasswordModule,
ScheduleModule,
ProductModule,
],
providers: [
{

View File

@ -2,6 +2,7 @@ import { ApiProperty } from '@nestjs/swagger';
import {
IsBoolean,
IsNotEmpty,
IsNumber,
IsOptional,
IsString,
IsUUID,
@ -25,6 +26,10 @@ export class AddSpaceDto {
@IsOptional()
parentUuid?: string;
@IsString()
@IsNotEmpty()
public icon: string;
@ApiProperty({
description: 'Indicates whether the space is private or public',
example: false,
@ -32,6 +37,19 @@ export class AddSpaceDto {
})
@IsBoolean()
isPrivate: boolean;
@ApiProperty({ description: 'X position on canvas', example: 120 })
@IsNumber()
x: number;
@ApiProperty({ description: 'Y position on canvas', example: 200 })
@IsNumber()
y: number;
@ApiProperty({ description: 'Y position on canvas', example: 200 })
@IsString()
@IsOptional()
direction: string;
}
export class AddUserSpaceDto {

View File

@ -1,4 +1,7 @@
import { SpaceRepository } from '@app/common/modules/space/repositories';
import {
SpaceLinkRepository,
SpaceRepository,
} from '@app/common/modules/space/repositories';
import {
BadRequestException,
HttpException,
@ -16,6 +19,7 @@ import { generateRandomString } from '@app/common/helper/randomString';
export class SpaceService {
constructor(
private readonly spaceRepository: SpaceRepository,
private readonly spaceLinkRepository: SpaceLinkRepository,
private readonly communityRepository: CommunityRepository,
) {}
@ -25,7 +29,7 @@ export class SpaceService {
): Promise<BaseResponseDto> {
let parent: SpaceEntity | null = null;
const { parentUuid } = addSpaceDto;
const { parentUuid, direction } = addSpaceDto;
const community = await this.communityRepository.findOne({
where: { uuid: communityId },
});
@ -60,6 +64,16 @@ export class SpaceService {
await this.spaceRepository.save(newSpace);
if (direction && parent) {
const spaceLink = await this.spaceLinkRepository.create({
direction,
endSpace: newSpace,
startSpace: parent,
});
await this.spaceLinkRepository.save(spaceLink);
}
return new SuccessResponseDto({
statusCode: HttpStatus.CREATED,
data: newSpace,
@ -88,7 +102,7 @@ export class SpaceService {
// Get all spaces related to the community, including the parent-child relations
const spaces = await this.spaceRepository.find({
where: { community: { uuid: communityUuid } },
relations: ['parent', 'children'], // Include parent and children relations
relations: ['parent', 'children', 'incomingConnections'], // Include parent and children relations
});
// Organize spaces into a hierarchical structure

View File

@ -20,6 +20,7 @@ import {
import {
SpaceRepository,
SubspaceRepository,
SpaceLinkRepository,
} from '@app/common/modules/space/repositories';
import { CommunityRepository } from '@app/common/modules/community/repositories';
import {
@ -59,6 +60,7 @@ import { DeviceStatusLogRepository } from '@app/common/modules/device-status-log
DeviceRepository,
CommunityRepository,
SubspaceRepository,
SpaceLinkRepository,
UserSpaceRepository,
UserRepository,
SpaceUserService,