From 857b02b97b10bd6112c2a7e1250d3a1a8b484614 Mon Sep 17 00:00:00 2001 From: hannathkadher Date: Wed, 20 Nov 2024 09:11:22 +0400 Subject: [PATCH] added space link entity --- libs/common/src/constants/controller-route.ts | 9 +++++++ libs/common/src/database/database.module.ts | 3 ++- .../src/modules/space/entities/index.ts | 1 + .../space/entities/space-link.entity.ts | 26 +++++++++++++++++++ .../modules/space/entities/space.entity.ts | 17 ++++++++++++ .../space/repositories/space.repository.ts | 9 ++++++- src/app.module.ts | 2 ++ src/space/dtos/add.space.dto.ts | 18 +++++++++++++ src/space/services/space.service.ts | 20 +++++++++++--- src/space/space.module.ts | 2 ++ 10 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 libs/common/src/modules/space/entities/space-link.entity.ts diff --git a/libs/common/src/constants/controller-route.ts b/libs/common/src/constants/controller-route.ts index 7f84bcc..fdf0435 100644 --- a/libs/common/src/constants/controller-route.ts +++ b/libs/common/src/constants/controller-route.ts @@ -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'; + }; + }; } diff --git a/libs/common/src/database/database.module.ts b/libs/common/src/database/database.module.ts index 1f30866..904cac7 100644 --- a/libs/common/src/database/database.module.ts +++ b/libs/common/src/database/database.module.ts @@ -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, diff --git a/libs/common/src/modules/space/entities/index.ts b/libs/common/src/modules/space/entities/index.ts index e551c0a..f720cf4 100644 --- a/libs/common/src/modules/space/entities/index.ts +++ b/libs/common/src/modules/space/entities/index.ts @@ -1,2 +1,3 @@ export * from './space.entity'; export * from './subspace.entity'; +export * from './space-link.entity'; diff --git a/libs/common/src/modules/space/entities/space-link.entity.ts b/libs/common/src/modules/space/entities/space-link.entity.ts new file mode 100644 index 0000000..6e2524f --- /dev/null +++ b/libs/common/src/modules/space/entities/space-link.entity.ts @@ -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) { + super(); + Object.assign(this, partial); + } +} diff --git a/libs/common/src/modules/space/entities/space.entity.ts b/libs/common/src/modules/space/entities/space.entity.ts index 04ebf83..f7034e3 100644 --- a/libs/common/src/modules/space/entities/space.entity.ts +++ b/libs/common/src/modules/space/entities/space.entity.ts @@ -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 { ) 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) { super(); Object.assign(this, partial); diff --git a/libs/common/src/modules/space/repositories/space.repository.ts b/libs/common/src/modules/space/repositories/space.repository.ts index 2806c0e..01e8c2d 100644 --- a/libs/common/src/modules/space/repositories/space.repository.ts +++ b/libs/common/src/modules/space/repositories/space.repository.ts @@ -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 { @@ -14,3 +14,10 @@ export class SubspaceRepository extends Repository { super(SubspaceEntity, dataSource.createEntityManager()); } } + +@Injectable() +export class SpaceLinkRepository extends Repository { + constructor(private dataSource: DataSource) { + super(SpaceLinkEntity, dataSource.createEntityManager()); + } +} diff --git a/src/app.module.ts b/src/app.module.ts index 820602b..609147c 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -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: [ { diff --git a/src/space/dtos/add.space.dto.ts b/src/space/dtos/add.space.dto.ts index a33bb34..e59d9d1 100644 --- a/src/space/dtos/add.space.dto.ts +++ b/src/space/dtos/add.space.dto.ts @@ -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 { diff --git a/src/space/services/space.service.ts b/src/space/services/space.service.ts index 78d45d7..864ffbb 100644 --- a/src/space/services/space.service.ts +++ b/src/space/services/space.service.ts @@ -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 { 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 diff --git a/src/space/space.module.ts b/src/space/space.module.ts index cf6b766..2d95d7a 100644 --- a/src/space/space.module.ts +++ b/src/space/space.module.ts @@ -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,