refactor: remove space link

This commit is contained in:
Mhd Zayd Skaff
2025-06-17 16:41:06 +03:00
parent 63fe4fa8cb
commit 9896bb5136
12 changed files with 11 additions and 184 deletions

View File

@ -25,6 +25,7 @@ import {
InviteUserEntity, InviteUserEntity,
InviteUserSpaceEntity, InviteUserSpaceEntity,
} from '../modules/Invite-user/entities'; } from '../modules/Invite-user/entities';
import { SpaceDailyOccupancyDurationEntity } from '../modules/occupancy/entities';
import { import {
PowerClampDailyEntity, PowerClampDailyEntity,
PowerClampHourlyEntity, PowerClampHourlyEntity,
@ -46,7 +47,6 @@ import {
SubspaceModelProductAllocationEntity, SubspaceModelProductAllocationEntity,
} from '../modules/space-model/entities'; } from '../modules/space-model/entities';
import { InviteSpaceEntity } from '../modules/space/entities/invite-space.entity'; import { InviteSpaceEntity } from '../modules/space/entities/invite-space.entity';
import { SpaceLinkEntity } from '../modules/space/entities/space-link.entity';
import { SpaceProductAllocationEntity } from '../modules/space/entities/space-product-allocation.entity'; import { SpaceProductAllocationEntity } from '../modules/space/entities/space-product-allocation.entity';
import { SpaceEntity } from '../modules/space/entities/space.entity'; import { SpaceEntity } from '../modules/space/entities/space.entity';
import { SubspaceProductAllocationEntity } from '../modules/space/entities/subspace/subspace-product-allocation.entity'; import { SubspaceProductAllocationEntity } from '../modules/space/entities/subspace/subspace-product-allocation.entity';
@ -58,7 +58,6 @@ import {
UserSpaceEntity, UserSpaceEntity,
} from '../modules/user/entities'; } from '../modules/user/entities';
import { VisitorPasswordEntity } from '../modules/visitor-password/entities'; import { VisitorPasswordEntity } from '../modules/visitor-password/entities';
import { SpaceDailyOccupancyDurationEntity } from '../modules/occupancy/entities';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forRootAsync({ TypeOrmModule.forRootAsync({
@ -87,7 +86,6 @@ import { SpaceDailyOccupancyDurationEntity } from '../modules/occupancy/entities
PermissionTypeEntity, PermissionTypeEntity,
CommunityEntity, CommunityEntity,
SpaceEntity, SpaceEntity,
SpaceLinkEntity,
SubspaceEntity, SubspaceEntity,
UserSpaceEntity, UserSpaceEntity,
DeviceUserPermissionEntity, DeviceUserPermissionEntity,

View File

@ -1,32 +1,3 @@
import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm';
import { AbstractEntity } from '../../abstract/entities/abstract.entity'; import { AbstractEntity } from '../../abstract/entities/abstract.entity';
import { SpaceEntity } from './space.entity';
import { Direction } from '@app/common/constants/direction.enum';
@Entity({ name: 'space-link' }) export class SpaceLinkEntity extends AbstractEntity {}
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({
nullable: false,
default: false,
})
public disabled: boolean;
@Column({
nullable: false,
enum: Object.values(Direction),
})
direction: string;
constructor(partial: Partial<SpaceLinkEntity>) {
super();
Object.assign(this, partial);
}
}

View File

@ -1,7 +1,6 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { DataSource, Repository } from 'typeorm'; import { DataSource, Repository } from 'typeorm';
import { InviteSpaceEntity } from '../entities/invite-space.entity'; import { InviteSpaceEntity } from '../entities/invite-space.entity';
import { SpaceLinkEntity } from '../entities/space-link.entity';
import { SpaceProductAllocationEntity } from '../entities/space-product-allocation.entity'; import { SpaceProductAllocationEntity } from '../entities/space-product-allocation.entity';
import { SpaceEntity } from '../entities/space.entity'; import { SpaceEntity } from '../entities/space.entity';
@ -13,11 +12,7 @@ export class SpaceRepository extends Repository<SpaceEntity> {
} }
@Injectable() @Injectable()
export class SpaceLinkRepository extends Repository<SpaceLinkEntity> { export class SpaceLinkRepository {}
constructor(private dataSource: DataSource) {
super(SpaceLinkEntity, dataSource.createEntityManager());
}
}
@Injectable() @Injectable()
export class InviteSpaceRepository extends Repository<InviteSpaceEntity> { export class InviteSpaceRepository extends Repository<InviteSpaceEntity> {

View File

@ -78,6 +78,7 @@ import { AqiDataService } from '@app/common/helper/services/aqi.data.service';
ProjectRepository, ProjectRepository,
SpaceService, SpaceService,
InviteSpaceRepository, InviteSpaceRepository,
// Todo: find out why this is needed
SpaceLinkService, SpaceLinkService,
SubSpaceService, SubSpaceService,
ValidationService, ValidationService,

View File

@ -71,7 +71,6 @@ import {
import { SpaceModelProductAllocationService } from 'src/space-model/services/space-model-product-allocation.service'; import { SpaceModelProductAllocationService } from 'src/space-model/services/space-model-product-allocation.service';
import { SubspaceModelProductAllocationService } from 'src/space-model/services/subspace/subspace-model-product-allocation.service'; import { SubspaceModelProductAllocationService } from 'src/space-model/services/subspace/subspace-model-product-allocation.service';
import { import {
SpaceLinkService,
SpaceService, SpaceService,
SpaceUserService, SpaceUserService,
SubspaceDeviceService, SubspaceDeviceService,
@ -115,7 +114,6 @@ import { UserService, UserSpaceService } from 'src/users/services';
TimeZoneRepository, TimeZoneRepository,
SpaceService, SpaceService,
InviteSpaceRepository, InviteSpaceRepository,
SpaceLinkService,
SubSpaceService, SubSpaceService,
ValidationService, ValidationService,
NewTagService, NewTagService,

View File

@ -1,4 +1,5 @@
import { DeviceStatusFirebaseService } from '@app/common/firebase/devices-status/services/devices-status.service'; import { DeviceStatusFirebaseService } from '@app/common/firebase/devices-status/services/devices-status.service';
import { AqiDataService } from '@app/common/helper/services/aqi.data.service';
import { OccupancyService } from '@app/common/helper/services/occupancy.service'; import { OccupancyService } from '@app/common/helper/services/occupancy.service';
import { PowerClampService } from '@app/common/helper/services/power.clamp.service'; import { PowerClampService } from '@app/common/helper/services/power.clamp.service';
import { SqlLoaderService } from '@app/common/helper/services/sql-loader.service'; import { SqlLoaderService } from '@app/common/helper/services/sql-loader.service';
@ -49,7 +50,6 @@ import { SpaceModelProductAllocationService } from 'src/space-model/services/spa
import { SubspaceModelProductAllocationService } from 'src/space-model/services/subspace/subspace-model-product-allocation.service'; import { SubspaceModelProductAllocationService } from 'src/space-model/services/subspace/subspace-model-product-allocation.service';
import { import {
SpaceDeviceService, SpaceDeviceService,
SpaceLinkService,
SpaceService, SpaceService,
SubspaceDeviceService, SubspaceDeviceService,
SubSpaceService, SubSpaceService,
@ -60,7 +60,6 @@ import { SubspaceProductAllocationService } from 'src/space/services/subspace/su
import { TagService } from 'src/tags/services'; import { TagService } from 'src/tags/services';
import { PowerClampController } from './controllers'; import { PowerClampController } from './controllers';
import { PowerClampService as PowerClamp } from './services/power-clamp.service'; import { PowerClampService as PowerClamp } from './services/power-clamp.service';
import { AqiDataService } from '@app/common/helper/services/aqi.data.service';
@Module({ @Module({
imports: [ConfigModule], imports: [ConfigModule],
controllers: [PowerClampController], controllers: [PowerClampController],
@ -90,7 +89,6 @@ import { AqiDataService } from '@app/common/helper/services/aqi.data.service';
SceneRepository, SceneRepository,
AutomationRepository, AutomationRepository,
InviteSpaceRepository, InviteSpaceRepository,
SpaceLinkService,
SubSpaceService, SubSpaceService,
TagService, TagService,
SpaceModelService, SpaceModelService,

View File

@ -54,7 +54,6 @@ import {
import { SpaceModelProductAllocationService } from 'src/space-model/services/space-model-product-allocation.service'; import { SpaceModelProductAllocationService } from 'src/space-model/services/space-model-product-allocation.service';
import { SubspaceModelProductAllocationService } from 'src/space-model/services/subspace/subspace-model-product-allocation.service'; import { SubspaceModelProductAllocationService } from 'src/space-model/services/subspace/subspace-model-product-allocation.service';
import { import {
SpaceLinkService,
SpaceService, SpaceService,
SubspaceDeviceService, SubspaceDeviceService,
SubSpaceService, SubSpaceService,
@ -87,7 +86,6 @@ const CommandHandlers = [CreateOrphanSpaceHandler];
UserRepository, UserRepository,
SpaceService, SpaceService,
InviteSpaceRepository, InviteSpaceRepository,
SpaceLinkService,
SubSpaceService, SubSpaceService,
ValidationService, ValidationService,
TagService, TagService,

View File

@ -46,7 +46,6 @@ import { CommunityService } from 'src/community/services';
import { DeviceService } from 'src/device/services'; import { DeviceService } from 'src/device/services';
import { SceneService } from 'src/scene/services'; import { SceneService } from 'src/scene/services';
import { import {
SpaceLinkService,
SpaceService, SpaceService,
SubspaceDeviceService, SubspaceDeviceService,
SubSpaceService, SubSpaceService,
@ -92,7 +91,6 @@ const CommandHandlers = [
DeviceRepository, DeviceRepository,
TuyaService, TuyaService,
CommunityRepository, CommunityRepository,
SpaceLinkService,
SpaceLinkRepository, SpaceLinkRepository,
InviteSpaceRepository, InviteSpaceRepository,
NewTagService, NewTagService,

View File

@ -5,11 +5,7 @@ import { DeviceService } from 'src/device/services';
import { UserSpaceService } from 'src/users/services'; import { UserSpaceService } from 'src/users/services';
import { DataSource } from 'typeorm'; import { DataSource } from 'typeorm';
import { DisableSpaceCommand } from '../commands'; import { DisableSpaceCommand } from '../commands';
import { import { SpaceSceneService, SubSpaceService } from '../services';
SpaceLinkService,
SpaceSceneService,
SubSpaceService,
} from '../services';
@CommandHandler(DisableSpaceCommand) @CommandHandler(DisableSpaceCommand)
export class DisableSpaceHandler export class DisableSpaceHandler
@ -19,7 +15,6 @@ export class DisableSpaceHandler
private readonly subSpaceService: SubSpaceService, private readonly subSpaceService: SubSpaceService,
private readonly userService: UserSpaceService, private readonly userService: UserSpaceService,
private readonly deviceService: DeviceService, private readonly deviceService: DeviceService,
private readonly spaceLinkService: SpaceLinkService,
private readonly sceneService: SpaceSceneService, private readonly sceneService: SpaceSceneService,
private readonly dataSource: DataSource, private readonly dataSource: DataSource,
) {} ) {}
@ -39,8 +34,6 @@ export class DisableSpaceHandler
'subspaces', 'subspaces',
'parent', 'parent',
'devices', 'devices',
'outgoingConnections',
'incomingConnections',
'scenes', 'scenes',
'children', 'children',
'userSpaces', 'userSpaces',
@ -79,7 +72,6 @@ export class DisableSpaceHandler
orphanSpace, orphanSpace,
queryRunner, queryRunner,
), ),
this.spaceLinkService.deleteSpaceLink(space, queryRunner),
this.sceneService.deleteScenes(space, queryRunner), this.sceneService.deleteScenes(space, queryRunner),
]; ];

View File

@ -1,121 +1,6 @@
import { SpaceLinkEntity } from '@app/common/modules/space/entities/space-link.entity'; import { Injectable } from '@nestjs/common';
import { SpaceEntity } from '@app/common/modules/space/entities/space.entity';
import { SpaceLinkRepository } from '@app/common/modules/space/repositories';
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { QueryRunner } from 'typeorm';
// todo: find out why we need to import this
// in community module in order for the whole system to work
@Injectable() @Injectable()
export class SpaceLinkService { export class SpaceLinkService {}
constructor(private readonly spaceLinkRepository: SpaceLinkRepository) {}
async saveSpaceLink(
startSpaceId: string,
endSpaceId: string,
direction: string,
queryRunner: QueryRunner,
): Promise<void> {
try {
// Check if a link between the startSpace and endSpace already exists
const existingLink = await queryRunner.manager.findOne(SpaceLinkEntity, {
where: {
startSpace: { uuid: startSpaceId },
endSpace: { uuid: endSpaceId },
disabled: false,
},
});
if (existingLink) {
// Update the direction if the link exists
existingLink.direction = direction;
await queryRunner.manager.save(SpaceLinkEntity, existingLink);
return;
}
const existingEndSpaceLink = await queryRunner.manager.findOne(
SpaceLinkEntity,
{
where: { endSpace: { uuid: endSpaceId } },
},
);
if (
existingEndSpaceLink &&
existingEndSpaceLink.startSpace.uuid !== startSpaceId
) {
throw new Error(
`Space with ID ${endSpaceId} is already an endSpace in another link and cannot be reused.`,
);
}
// Find start space
const startSpace = await queryRunner.manager.findOne(SpaceEntity, {
where: { uuid: startSpaceId },
});
if (!startSpace) {
throw new HttpException(
`Start space with ID ${startSpaceId} not found.`,
HttpStatus.NOT_FOUND,
);
}
// Find end space
const endSpace = await queryRunner.manager.findOne(SpaceEntity, {
where: { uuid: endSpaceId },
});
if (!endSpace) {
throw new HttpException(
`End space with ID ${endSpaceId} not found.`,
HttpStatus.NOT_FOUND,
);
}
// Create and save the space link
const spaceLink = this.spaceLinkRepository.create({
startSpace,
endSpace,
direction,
});
await queryRunner.manager.save(SpaceLinkEntity, spaceLink);
} catch (error) {
throw new HttpException(
error.message ||
`Failed to save space link. Internal Server Error: ${error.message}`,
error.status || HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
async deleteSpaceLink(
space: SpaceEntity,
queryRunner: QueryRunner,
): Promise<void> {
try {
const spaceLinks = await queryRunner.manager.find(SpaceLinkEntity, {
where: [
{ startSpace: space, disabled: false },
{ endSpace: space, disabled: false },
],
});
if (spaceLinks.length === 0) {
return;
}
const linkIds = spaceLinks.map((link) => link.uuid);
await queryRunner.manager
.createQueryBuilder()
.update(SpaceLinkEntity)
.set({ disabled: true })
.whereInIds(linkIds)
.execute();
} catch (error) {
throw new HttpException(
`Failed to disable space links for the given space: ${error.message}`,
HttpStatus.INTERNAL_SERVER_ERROR,
);
}
}
}

View File

@ -226,12 +226,7 @@ export class SpaceService {
'children.disabled = :disabled', 'children.disabled = :disabled',
{ disabled: false }, { disabled: false },
) )
// .leftJoinAndSelect(
// 'space.incomingConnections',
// 'incomingConnections',
// 'incomingConnections.disabled = :incomingConnectionDisabled',
// { incomingConnectionDisabled: false },
// )
.leftJoinAndSelect('space.productAllocations', 'productAllocations') .leftJoinAndSelect('space.productAllocations', 'productAllocations')
.leftJoinAndSelect('productAllocations.tag', 'tag') .leftJoinAndSelect('productAllocations.tag', 'tag')
.leftJoinAndSelect('productAllocations.product', 'product') .leftJoinAndSelect('productAllocations.product', 'product')

View File

@ -79,7 +79,6 @@ import { SpaceValidationController } from './controllers/space-validation.contro
import { DisableSpaceHandler } from './handlers'; import { DisableSpaceHandler } from './handlers';
import { import {
SpaceDeviceService, SpaceDeviceService,
SpaceLinkService,
SpaceSceneService, SpaceSceneService,
SpaceService, SpaceService,
SpaceUserService, SpaceUserService,
@ -110,7 +109,6 @@ export const CommandHandlers = [DisableSpaceHandler];
ProductRepository, ProductRepository,
SubSpaceService, SubSpaceService,
SpaceDeviceService, SpaceDeviceService,
SpaceLinkService,
SubspaceDeviceService, SubspaceDeviceService,
SpaceRepository, SpaceRepository,
SubspaceRepository, SubspaceRepository,