mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-07-16 18:56:22 +00:00
refactor: remove space link
This commit is contained in:
@ -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,
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -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> {
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -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,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -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')
|
||||||
|
@ -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,
|
||||||
|
Reference in New Issue
Block a user