Persist circuit structure edits
This commit is contained in:
@@ -1,14 +1,9 @@
|
||||
import { CircuitDeviceRowRepository } from "../../db/repositories/circuit-device-row.repository.js";
|
||||
import type { CircuitDeviceRowTransactionStore } from "../ports/circuit-device-row-transaction.store.js";
|
||||
import type { CircuitSectionTransactionStore } from "../ports/circuit-section-transaction.store.js";
|
||||
import { CircuitListRepository } from "../../db/repositories/circuit-list.repository.js";
|
||||
import { CircuitRepository } from "../../db/repositories/circuit.repository.js";
|
||||
import { CircuitSectionRepository } from "../../db/repositories/circuit-section.repository.js";
|
||||
import { ProjectDeviceRepository } from "../../db/repositories/project-device.repository.js";
|
||||
import type {
|
||||
CreateCircuitDeviceRowInput,
|
||||
CreateCircuitInput,
|
||||
CreateCircuitWithDeviceRowsInput,
|
||||
MoveCircuitDeviceRowInput,
|
||||
MoveCircuitDeviceRowsBulkInput,
|
||||
ReorderSectionCircuitsInput,
|
||||
@@ -19,30 +14,24 @@ import { CircuitNumberingService } from "./circuit-numbering.service.js";
|
||||
export class CircuitWriteService {
|
||||
private readonly circuitRepository: CircuitRepository;
|
||||
private readonly circuitSectionRepository: CircuitSectionRepository;
|
||||
private readonly circuitListRepository: CircuitListRepository;
|
||||
private readonly deviceRowRepository: CircuitDeviceRowRepository;
|
||||
private readonly deviceRowTransactionStore?: CircuitDeviceRowTransactionStore;
|
||||
private readonly circuitSectionTransactionStore?: CircuitSectionTransactionStore;
|
||||
private readonly projectDeviceRepository: ProjectDeviceRepository;
|
||||
private readonly numberingService: CircuitNumberingService;
|
||||
|
||||
constructor(deps?: {
|
||||
circuitRepository?: CircuitRepository;
|
||||
circuitSectionRepository?: CircuitSectionRepository;
|
||||
circuitListRepository?: CircuitListRepository;
|
||||
deviceRowRepository?: CircuitDeviceRowRepository;
|
||||
deviceRowTransactionStore?: CircuitDeviceRowTransactionStore;
|
||||
circuitSectionTransactionStore?: CircuitSectionTransactionStore;
|
||||
projectDeviceRepository?: ProjectDeviceRepository;
|
||||
numberingService?: CircuitNumberingService;
|
||||
}) {
|
||||
this.circuitRepository = deps?.circuitRepository ?? new CircuitRepository();
|
||||
this.circuitSectionRepository = deps?.circuitSectionRepository ?? new CircuitSectionRepository();
|
||||
this.circuitListRepository = deps?.circuitListRepository ?? new CircuitListRepository();
|
||||
this.deviceRowRepository = deps?.deviceRowRepository ?? new CircuitDeviceRowRepository();
|
||||
this.deviceRowTransactionStore = deps?.deviceRowTransactionStore;
|
||||
this.circuitSectionTransactionStore = deps?.circuitSectionTransactionStore;
|
||||
this.projectDeviceRepository = deps?.projectDeviceRepository ?? new ProjectDeviceRepository();
|
||||
this.numberingService = deps?.numberingService ?? new CircuitNumberingService();
|
||||
}
|
||||
|
||||
@@ -58,36 +47,6 @@ export class CircuitWriteService {
|
||||
return section;
|
||||
}
|
||||
|
||||
// Enforces BMK uniqueness inside one circuit list.
|
||||
private async assertUniqueEquipmentIdentifier(
|
||||
circuitListId: string,
|
||||
equipmentIdentifier: string,
|
||||
excludeCircuitId?: string
|
||||
) {
|
||||
const exists = await this.circuitRepository.existsByEquipmentIdentifier(
|
||||
circuitListId,
|
||||
equipmentIdentifier,
|
||||
excludeCircuitId
|
||||
);
|
||||
if (exists) {
|
||||
throw new Error("Duplicate equipmentIdentifier in circuit list.");
|
||||
}
|
||||
}
|
||||
|
||||
// Validates linked project-device id against owning project of the circuit list.
|
||||
private async assertValidLinkedProjectDeviceForProject(
|
||||
projectId: string,
|
||||
linkedProjectDeviceId?: string
|
||||
) {
|
||||
if (!linkedProjectDeviceId) {
|
||||
return;
|
||||
}
|
||||
const device = await this.projectDeviceRepository.findById(projectId, linkedProjectDeviceId);
|
||||
if (!device) {
|
||||
throw new Error("Invalid linked project device id.");
|
||||
}
|
||||
}
|
||||
|
||||
private getDeviceRowTransactionStore() {
|
||||
if (!this.deviceRowTransactionStore) {
|
||||
throw new Error("Circuit device-row transactions are not configured.");
|
||||
@@ -102,92 +61,6 @@ export class CircuitWriteService {
|
||||
return this.circuitSectionTransactionStore;
|
||||
}
|
||||
|
||||
private async assertValidLinkedProjectDevice(circuitId: string, linkedProjectDeviceId?: string) {
|
||||
if (!linkedProjectDeviceId) {
|
||||
return;
|
||||
}
|
||||
const circuit = await this.circuitRepository.findById(circuitId);
|
||||
if (!circuit) {
|
||||
throw new Error("Invalid circuit id.");
|
||||
}
|
||||
const list = await this.circuitListRepository.findByIdByListIdOnly(circuit.circuitListId);
|
||||
if (!list) {
|
||||
throw new Error("Circuit list not found.");
|
||||
}
|
||||
await this.assertValidLinkedProjectDeviceForProject(list.projectId, linkedProjectDeviceId);
|
||||
}
|
||||
|
||||
async createCircuit(projectId: string, circuitListId: string, input: CreateCircuitInput) {
|
||||
const list = await this.circuitListRepository.findById(projectId, circuitListId);
|
||||
if (!list) {
|
||||
throw new Error("Circuit list not found in project.");
|
||||
}
|
||||
await this.assertSectionInList(input.sectionId, circuitListId);
|
||||
await this.assertUniqueEquipmentIdentifier(circuitListId, input.equipmentIdentifier);
|
||||
const id = await this.circuitRepository.create({
|
||||
circuitListId,
|
||||
sectionId: input.sectionId,
|
||||
equipmentIdentifier: input.equipmentIdentifier,
|
||||
displayName: input.displayName,
|
||||
sortOrder: input.sortOrder,
|
||||
protectionType: input.protectionType,
|
||||
protectionRatedCurrent: input.protectionRatedCurrent,
|
||||
protectionCharacteristic: input.protectionCharacteristic,
|
||||
cableType: input.cableType,
|
||||
cableCrossSection: input.cableCrossSection,
|
||||
cableLength: input.cableLength,
|
||||
rcdAssignment: input.rcdAssignment,
|
||||
terminalDesignation: input.terminalDesignation,
|
||||
voltage: input.voltage,
|
||||
controlRequirement: input.controlRequirement,
|
||||
status: input.status,
|
||||
isReserve: input.isReserve ?? true,
|
||||
remark: input.remark,
|
||||
});
|
||||
return this.circuitRepository.findById(id);
|
||||
}
|
||||
|
||||
async createCircuitWithDeviceRows(
|
||||
projectId: string,
|
||||
circuitListId: string,
|
||||
input: CreateCircuitWithDeviceRowsInput
|
||||
) {
|
||||
const list = await this.circuitListRepository.findById(projectId, circuitListId);
|
||||
if (!list) {
|
||||
throw new Error("Circuit list not found in project.");
|
||||
}
|
||||
await this.assertSectionInList(input.circuit.sectionId, circuitListId);
|
||||
await this.assertUniqueEquipmentIdentifier(
|
||||
circuitListId,
|
||||
input.circuit.equipmentIdentifier
|
||||
);
|
||||
for (const row of input.deviceRows) {
|
||||
await this.assertValidLinkedProjectDeviceForProject(
|
||||
list.projectId,
|
||||
row.linkedProjectDeviceId
|
||||
);
|
||||
}
|
||||
|
||||
const created = this.getDeviceRowTransactionStore().createCircuitWithDeviceRows({
|
||||
circuit: {
|
||||
circuitListId,
|
||||
...input.circuit,
|
||||
},
|
||||
deviceRows: input.deviceRows,
|
||||
});
|
||||
const circuit = await this.circuitRepository.findById(created.circuitId);
|
||||
const deviceRows = await Promise.all(
|
||||
created.rowIds.map((rowId) => this.deviceRowRepository.findById(rowId))
|
||||
);
|
||||
if (!circuit || deviceRows.some((row) => !row)) {
|
||||
throw new Error("Der angelegte Stromkreis konnte nicht geladen werden.");
|
||||
}
|
||||
return {
|
||||
circuit,
|
||||
deviceRows,
|
||||
};
|
||||
}
|
||||
|
||||
async deleteCircuit(circuitId: string) {
|
||||
const current = await this.circuitRepository.findById(circuitId);
|
||||
if (!current) {
|
||||
@@ -196,50 +69,6 @@ export class CircuitWriteService {
|
||||
await this.circuitRepository.delete(circuitId);
|
||||
}
|
||||
|
||||
async createDeviceRow(circuitId: string, input: CreateCircuitDeviceRowInput) {
|
||||
const circuit = await this.circuitRepository.findById(circuitId);
|
||||
if (!circuit) {
|
||||
throw new Error("Invalid circuit id.");
|
||||
}
|
||||
await this.assertValidLinkedProjectDevice(circuitId, input.linkedProjectDeviceId);
|
||||
|
||||
const rowId = this.getDeviceRowTransactionStore().createInCircuit({
|
||||
circuitId,
|
||||
linkedProjectDeviceId: input.linkedProjectDeviceId,
|
||||
sortOrder: input.sortOrder,
|
||||
name: input.name,
|
||||
displayName: input.displayName,
|
||||
phaseType: input.phaseType,
|
||||
connectionKind: input.connectionKind,
|
||||
costGroup: input.costGroup,
|
||||
category: input.category,
|
||||
level: input.level,
|
||||
roomId: input.roomId,
|
||||
roomNumberSnapshot: input.roomNumberSnapshot,
|
||||
roomNameSnapshot: input.roomNameSnapshot,
|
||||
quantity: input.quantity,
|
||||
powerPerUnit: input.powerPerUnit,
|
||||
simultaneityFactor: input.simultaneityFactor,
|
||||
cosPhi: input.cosPhi,
|
||||
remark: input.remark,
|
||||
overriddenFields: input.overriddenFields,
|
||||
});
|
||||
|
||||
return this.deviceRowRepository.findById(rowId);
|
||||
}
|
||||
|
||||
async deleteDeviceRow(rowId: string) {
|
||||
const current = await this.deviceRowRepository.findById(rowId);
|
||||
if (!current) {
|
||||
throw new Error("Invalid device row id.");
|
||||
}
|
||||
const circuit = await this.circuitRepository.findById(current.circuitId);
|
||||
if (!circuit) {
|
||||
throw new Error("Invalid circuit id.");
|
||||
}
|
||||
this.getDeviceRowTransactionStore().deleteFromCircuit(rowId, circuit.id);
|
||||
}
|
||||
|
||||
async moveDeviceRow(rowId: string, input: MoveCircuitDeviceRowInput) {
|
||||
const row = await this.deviceRowRepository.findById(rowId);
|
||||
if (!row) {
|
||||
|
||||
Reference in New Issue
Block a user