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.'; '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 { ProductEntity } from '../modules/product/entities';
import { DeviceEntity } from '../modules/device/entities'; import { DeviceEntity } from '../modules/device/entities';
import { PermissionTypeEntity } from '../modules/permission/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 { UserSpaceEntity } from '../modules/user/entities';
import { DeviceUserPermissionEntity } from '../modules/device/entities'; import { DeviceUserPermissionEntity } from '../modules/device/entities';
import { UserRoleEntity } from '../modules/user/entities'; import { UserRoleEntity } from '../modules/user/entities';
@ -45,6 +45,7 @@ import { SceneEntity, SceneIconEntity } from '../modules/scene/entities';
PermissionTypeEntity, PermissionTypeEntity,
CommunityEntity, CommunityEntity,
SpaceEntity, SpaceEntity,
SpaceLinkEntity,
SubspaceEntity, SubspaceEntity,
UserSpaceEntity, UserSpaceEntity,
DeviceUserPermissionEntity, DeviceUserPermissionEntity,

View File

@ -1,2 +1,3 @@
export * from './space.entity'; export * from './space.entity';
export * from './subspace.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 { DeviceEntity } from '../../device/entities';
import { CommunityEntity } from '../../community/entities'; import { CommunityEntity } from '../../community/entities';
import { SubspaceEntity } from './subspace.entity'; import { SubspaceEntity } from './subspace.entity';
import { SpaceLinkEntity } from './space-link.entity';
@Entity({ name: 'space' }) @Entity({ name: 'space' })
@Unique(['invitationCode']) @Unique(['invitationCode'])
@ -70,6 +71,22 @@ export class SpaceEntity extends AbstractEntity<SpaceDto> {
) )
devices: DeviceEntity[]; 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>) { constructor(partial: Partial<SpaceEntity>) {
super(); super();
Object.assign(this, partial); Object.assign(this, partial);

View File

@ -1,6 +1,6 @@
import { DataSource, Repository } from 'typeorm'; import { DataSource, Repository } from 'typeorm';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { SpaceEntity, SubspaceEntity } from '../entities'; import { SpaceEntity, SpaceLinkEntity, SubspaceEntity } from '../entities';
@Injectable() @Injectable()
export class SpaceRepository extends Repository<SpaceEntity> { export class SpaceRepository extends Repository<SpaceEntity> {
@ -14,3 +14,10 @@ export class SubspaceRepository extends Repository<SubspaceEntity> {
super(SubspaceEntity, dataSource.createEntityManager()); 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 { VisitorPasswordModule } from './vistor-password/visitor-password.module';
import { ScheduleModule } from './schedule/schedule.module'; import { ScheduleModule } from './schedule/schedule.module';
import { SpaceModule } from './space/space.module'; import { SpaceModule } from './space/space.module';
import { ProductModule } from './product';
@Module({ @Module({
imports: [ imports: [
ConfigModule.forRoot({ ConfigModule.forRoot({
@ -46,6 +47,7 @@ import { SpaceModule } from './space/space.module';
TimeZoneModule, TimeZoneModule,
VisitorPasswordModule, VisitorPasswordModule,
ScheduleModule, ScheduleModule,
ProductModule,
], ],
providers: [ providers: [
{ {

View File

@ -2,6 +2,7 @@ import { ApiProperty } from '@nestjs/swagger';
import { import {
IsBoolean, IsBoolean,
IsNotEmpty, IsNotEmpty,
IsNumber,
IsOptional, IsOptional,
IsString, IsString,
IsUUID, IsUUID,
@ -25,6 +26,10 @@ export class AddSpaceDto {
@IsOptional() @IsOptional()
parentUuid?: string; parentUuid?: string;
@IsString()
@IsNotEmpty()
public icon: string;
@ApiProperty({ @ApiProperty({
description: 'Indicates whether the space is private or public', description: 'Indicates whether the space is private or public',
example: false, example: false,
@ -32,6 +37,19 @@ export class AddSpaceDto {
}) })
@IsBoolean() @IsBoolean()
isPrivate: boolean; 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 { 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 { import {
BadRequestException, BadRequestException,
HttpException, HttpException,
@ -16,6 +19,7 @@ import { generateRandomString } from '@app/common/helper/randomString';
export class SpaceService { export class SpaceService {
constructor( constructor(
private readonly spaceRepository: SpaceRepository, private readonly spaceRepository: SpaceRepository,
private readonly spaceLinkRepository: SpaceLinkRepository,
private readonly communityRepository: CommunityRepository, private readonly communityRepository: CommunityRepository,
) {} ) {}
@ -25,7 +29,7 @@ export class SpaceService {
): Promise<BaseResponseDto> { ): Promise<BaseResponseDto> {
let parent: SpaceEntity | null = null; let parent: SpaceEntity | null = null;
const { parentUuid } = addSpaceDto; const { parentUuid, direction } = addSpaceDto;
const community = await this.communityRepository.findOne({ const community = await this.communityRepository.findOne({
where: { uuid: communityId }, where: { uuid: communityId },
}); });
@ -60,6 +64,16 @@ export class SpaceService {
await this.spaceRepository.save(newSpace); 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({ return new SuccessResponseDto({
statusCode: HttpStatus.CREATED, statusCode: HttpStatus.CREATED,
data: newSpace, data: newSpace,
@ -88,7 +102,7 @@ export class SpaceService {
// Get all spaces related to the community, including the parent-child relations // Get all spaces related to the community, including the parent-child relations
const spaces = await this.spaceRepository.find({ const spaces = await this.spaceRepository.find({
where: { community: { uuid: communityUuid } }, 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 // Organize spaces into a hierarchical structure

View File

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