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,
|
||||
InviteUserSpaceEntity,
|
||||
} from '../modules/Invite-user/entities';
|
||||
import { SpaceDailyOccupancyDurationEntity } from '../modules/occupancy/entities';
|
||||
import {
|
||||
PowerClampDailyEntity,
|
||||
PowerClampHourlyEntity,
|
||||
@ -46,7 +47,6 @@ import {
|
||||
SubspaceModelProductAllocationEntity,
|
||||
} from '../modules/space-model/entities';
|
||||
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 { SpaceEntity } from '../modules/space/entities/space.entity';
|
||||
import { SubspaceProductAllocationEntity } from '../modules/space/entities/subspace/subspace-product-allocation.entity';
|
||||
@ -58,7 +58,6 @@ import {
|
||||
UserSpaceEntity,
|
||||
} from '../modules/user/entities';
|
||||
import { VisitorPasswordEntity } from '../modules/visitor-password/entities';
|
||||
import { SpaceDailyOccupancyDurationEntity } from '../modules/occupancy/entities';
|
||||
@Module({
|
||||
imports: [
|
||||
TypeOrmModule.forRootAsync({
|
||||
@ -87,7 +86,6 @@ import { SpaceDailyOccupancyDurationEntity } from '../modules/occupancy/entities
|
||||
PermissionTypeEntity,
|
||||
CommunityEntity,
|
||||
SpaceEntity,
|
||||
SpaceLinkEntity,
|
||||
SubspaceEntity,
|
||||
UserSpaceEntity,
|
||||
DeviceUserPermissionEntity,
|
||||
|
@ -1,32 +1,3 @@
|
||||
import { Column, Entity, JoinColumn, ManyToOne } from 'typeorm';
|
||||
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 {
|
||||
@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);
|
||||
}
|
||||
}
|
||||
export class SpaceLinkEntity extends AbstractEntity {}
|
||||
|
@ -1,7 +1,6 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { DataSource, Repository } from 'typeorm';
|
||||
import { InviteSpaceEntity } from '../entities/invite-space.entity';
|
||||
import { SpaceLinkEntity } from '../entities/space-link.entity';
|
||||
import { SpaceProductAllocationEntity } from '../entities/space-product-allocation.entity';
|
||||
import { SpaceEntity } from '../entities/space.entity';
|
||||
|
||||
@ -13,11 +12,7 @@ export class SpaceRepository extends Repository<SpaceEntity> {
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class SpaceLinkRepository extends Repository<SpaceLinkEntity> {
|
||||
constructor(private dataSource: DataSource) {
|
||||
super(SpaceLinkEntity, dataSource.createEntityManager());
|
||||
}
|
||||
}
|
||||
export class SpaceLinkRepository {}
|
||||
|
||||
@Injectable()
|
||||
export class InviteSpaceRepository extends Repository<InviteSpaceEntity> {
|
||||
|
@ -78,6 +78,7 @@ import { AqiDataService } from '@app/common/helper/services/aqi.data.service';
|
||||
ProjectRepository,
|
||||
SpaceService,
|
||||
InviteSpaceRepository,
|
||||
// Todo: find out why this is needed
|
||||
SpaceLinkService,
|
||||
SubSpaceService,
|
||||
ValidationService,
|
||||
|
@ -71,7 +71,6 @@ import {
|
||||
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 {
|
||||
SpaceLinkService,
|
||||
SpaceService,
|
||||
SpaceUserService,
|
||||
SubspaceDeviceService,
|
||||
@ -115,7 +114,6 @@ import { UserService, UserSpaceService } from 'src/users/services';
|
||||
TimeZoneRepository,
|
||||
SpaceService,
|
||||
InviteSpaceRepository,
|
||||
SpaceLinkService,
|
||||
SubSpaceService,
|
||||
ValidationService,
|
||||
NewTagService,
|
||||
|
@ -1,4 +1,5 @@
|
||||
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 { PowerClampService } from '@app/common/helper/services/power.clamp.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 {
|
||||
SpaceDeviceService,
|
||||
SpaceLinkService,
|
||||
SpaceService,
|
||||
SubspaceDeviceService,
|
||||
SubSpaceService,
|
||||
@ -60,7 +60,6 @@ import { SubspaceProductAllocationService } from 'src/space/services/subspace/su
|
||||
import { TagService } from 'src/tags/services';
|
||||
import { PowerClampController } from './controllers';
|
||||
import { PowerClampService as PowerClamp } from './services/power-clamp.service';
|
||||
import { AqiDataService } from '@app/common/helper/services/aqi.data.service';
|
||||
@Module({
|
||||
imports: [ConfigModule],
|
||||
controllers: [PowerClampController],
|
||||
@ -90,7 +89,6 @@ import { AqiDataService } from '@app/common/helper/services/aqi.data.service';
|
||||
SceneRepository,
|
||||
AutomationRepository,
|
||||
InviteSpaceRepository,
|
||||
SpaceLinkService,
|
||||
SubSpaceService,
|
||||
TagService,
|
||||
SpaceModelService,
|
||||
|
@ -54,7 +54,6 @@ import {
|
||||
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 {
|
||||
SpaceLinkService,
|
||||
SpaceService,
|
||||
SubspaceDeviceService,
|
||||
SubSpaceService,
|
||||
@ -87,7 +86,6 @@ const CommandHandlers = [CreateOrphanSpaceHandler];
|
||||
UserRepository,
|
||||
SpaceService,
|
||||
InviteSpaceRepository,
|
||||
SpaceLinkService,
|
||||
SubSpaceService,
|
||||
ValidationService,
|
||||
TagService,
|
||||
|
@ -46,7 +46,6 @@ import { CommunityService } from 'src/community/services';
|
||||
import { DeviceService } from 'src/device/services';
|
||||
import { SceneService } from 'src/scene/services';
|
||||
import {
|
||||
SpaceLinkService,
|
||||
SpaceService,
|
||||
SubspaceDeviceService,
|
||||
SubSpaceService,
|
||||
@ -92,7 +91,6 @@ const CommandHandlers = [
|
||||
DeviceRepository,
|
||||
TuyaService,
|
||||
CommunityRepository,
|
||||
SpaceLinkService,
|
||||
SpaceLinkRepository,
|
||||
InviteSpaceRepository,
|
||||
NewTagService,
|
||||
|
@ -5,11 +5,7 @@ import { DeviceService } from 'src/device/services';
|
||||
import { UserSpaceService } from 'src/users/services';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { DisableSpaceCommand } from '../commands';
|
||||
import {
|
||||
SpaceLinkService,
|
||||
SpaceSceneService,
|
||||
SubSpaceService,
|
||||
} from '../services';
|
||||
import { SpaceSceneService, SubSpaceService } from '../services';
|
||||
|
||||
@CommandHandler(DisableSpaceCommand)
|
||||
export class DisableSpaceHandler
|
||||
@ -19,7 +15,6 @@ export class DisableSpaceHandler
|
||||
private readonly subSpaceService: SubSpaceService,
|
||||
private readonly userService: UserSpaceService,
|
||||
private readonly deviceService: DeviceService,
|
||||
private readonly spaceLinkService: SpaceLinkService,
|
||||
private readonly sceneService: SpaceSceneService,
|
||||
private readonly dataSource: DataSource,
|
||||
) {}
|
||||
@ -39,8 +34,6 @@ export class DisableSpaceHandler
|
||||
'subspaces',
|
||||
'parent',
|
||||
'devices',
|
||||
'outgoingConnections',
|
||||
'incomingConnections',
|
||||
'scenes',
|
||||
'children',
|
||||
'userSpaces',
|
||||
@ -79,7 +72,6 @@ export class DisableSpaceHandler
|
||||
orphanSpace,
|
||||
queryRunner,
|
||||
),
|
||||
this.spaceLinkService.deleteSpaceLink(space, queryRunner),
|
||||
this.sceneService.deleteScenes(space, queryRunner),
|
||||
];
|
||||
|
||||
|
@ -1,121 +1,6 @@
|
||||
import { SpaceLinkEntity } from '@app/common/modules/space/entities/space-link.entity';
|
||||
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';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
// todo: find out why we need to import this
|
||||
// in community module in order for the whole system to work
|
||||
@Injectable()
|
||||
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,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
export class SpaceLinkService {}
|
||||
|
@ -226,12 +226,7 @@ export class SpaceService {
|
||||
'children.disabled = :disabled',
|
||||
{ disabled: false },
|
||||
)
|
||||
// .leftJoinAndSelect(
|
||||
// 'space.incomingConnections',
|
||||
// 'incomingConnections',
|
||||
// 'incomingConnections.disabled = :incomingConnectionDisabled',
|
||||
// { incomingConnectionDisabled: false },
|
||||
// )
|
||||
|
||||
.leftJoinAndSelect('space.productAllocations', 'productAllocations')
|
||||
.leftJoinAndSelect('productAllocations.tag', 'tag')
|
||||
.leftJoinAndSelect('productAllocations.product', 'product')
|
||||
|
@ -79,7 +79,6 @@ import { SpaceValidationController } from './controllers/space-validation.contro
|
||||
import { DisableSpaceHandler } from './handlers';
|
||||
import {
|
||||
SpaceDeviceService,
|
||||
SpaceLinkService,
|
||||
SpaceSceneService,
|
||||
SpaceService,
|
||||
SpaceUserService,
|
||||
@ -110,7 +109,6 @@ export const CommandHandlers = [DisableSpaceHandler];
|
||||
ProductRepository,
|
||||
SubSpaceService,
|
||||
SpaceDeviceService,
|
||||
SpaceLinkService,
|
||||
SubspaceDeviceService,
|
||||
SpaceRepository,
|
||||
SubspaceRepository,
|
||||
|
Reference in New Issue
Block a user