Include components in project snapshots
This commit is contained in:
@@ -9,6 +9,7 @@ import {
|
||||
legacyProjectStateSnapshotSchemaVersion,
|
||||
previousProjectStateSnapshotSchemaVersion,
|
||||
projectStateSnapshotSchemaVersion,
|
||||
simultaneityFactorProjectStateSnapshotSchemaVersion,
|
||||
supplyTypesProjectStateSnapshotSchemaVersion,
|
||||
voltageProjectStateSnapshotSchemaVersion,
|
||||
} from "../../domain/models/project-state-snapshot.model.js";
|
||||
@@ -152,6 +153,8 @@ export class ProjectSnapshotRepository implements ProjectSnapshotStore {
|
||||
supplyTypesProjectStateSnapshotSchemaVersion &&
|
||||
stored.schemaVersion !==
|
||||
voltageProjectStateSnapshotSchemaVersion &&
|
||||
stored.schemaVersion !==
|
||||
simultaneityFactorProjectStateSnapshotSchemaVersion &&
|
||||
stored.schemaVersion !== projectStateSnapshotSchemaVersion
|
||||
) {
|
||||
throw new Error("Project snapshot schema version is not supported.");
|
||||
|
||||
@@ -15,9 +15,12 @@ import type {
|
||||
import type { AppDatabase } from "../database-context.js";
|
||||
import { circuitDeviceRows } from "../schema/circuit-device-rows.js";
|
||||
import { circuitLists } from "../schema/circuit-lists.js";
|
||||
import { circuitProtectionDevices } from "../schema/circuit-protection-devices.js";
|
||||
import { circuitSections } from "../schema/circuit-sections.js";
|
||||
import { circuits } from "../schema/circuits.js";
|
||||
import { consumers } from "../schema/consumers.js";
|
||||
import { distributionBoardComponentProtectionDevices } from "../schema/distribution-board-component-protection-devices.js";
|
||||
import { distributionBoardComponents } from "../schema/distribution-board-components.js";
|
||||
import { distributionBoards } from "../schema/distribution-boards.js";
|
||||
import { floors } from "../schema/floors.js";
|
||||
import { legacyConsumerCircuitMigrations } from "../schema/legacy-consumer-circuit-migrations.js";
|
||||
@@ -141,6 +144,17 @@ function canonicalProjectState(state: ProjectStateSnapshot) {
|
||||
distributionBoards: byId(state.distributionBoards),
|
||||
circuitLists: byId(state.circuitLists),
|
||||
circuitSections: byId(state.circuitSections),
|
||||
distributionBoardComponents: byId(
|
||||
state.distributionBoardComponents
|
||||
),
|
||||
circuitProtectionDevices: byKey(
|
||||
state.circuitProtectionDevices,
|
||||
"circuitId"
|
||||
),
|
||||
distributionBoardComponentProtectionDevices: byKey(
|
||||
state.distributionBoardComponentProtectionDevices,
|
||||
"componentId"
|
||||
),
|
||||
circuits: byId(
|
||||
state.circuits.map((circuit) => ({
|
||||
...circuit,
|
||||
@@ -159,6 +173,15 @@ function byId<T extends { id: string }>(entries: readonly T[]) {
|
||||
);
|
||||
}
|
||||
|
||||
function byKey<
|
||||
TKey extends string,
|
||||
TEntry extends Record<TKey, string>,
|
||||
>(entries: readonly TEntry[], key: TKey) {
|
||||
return [...entries].sort((left, right) =>
|
||||
left[key].localeCompare(right[key])
|
||||
);
|
||||
}
|
||||
|
||||
function replaceProjectState(
|
||||
database: AppDatabase,
|
||||
state: ProjectStateSnapshot
|
||||
@@ -214,6 +237,21 @@ function replaceProjectState(
|
||||
isReserve: circuit.isReserve ? 1 : 0,
|
||||
}))
|
||||
);
|
||||
insertMany(
|
||||
database,
|
||||
distributionBoardComponents,
|
||||
state.distributionBoardComponents
|
||||
);
|
||||
insertMany(
|
||||
database,
|
||||
circuitProtectionDevices,
|
||||
state.circuitProtectionDevices
|
||||
);
|
||||
insertMany(
|
||||
database,
|
||||
distributionBoardComponentProtectionDevices,
|
||||
state.distributionBoardComponentProtectionDevices
|
||||
);
|
||||
insertMany(
|
||||
database,
|
||||
circuitDeviceRows,
|
||||
|
||||
@@ -9,8 +9,11 @@ import {
|
||||
import type { AppDatabase } from "../database-context.js";
|
||||
import { circuitDeviceRows } from "../schema/circuit-device-rows.js";
|
||||
import { circuitLists } from "../schema/circuit-lists.js";
|
||||
import { circuitProtectionDevices } from "../schema/circuit-protection-devices.js";
|
||||
import { circuitSections } from "../schema/circuit-sections.js";
|
||||
import { circuits } from "../schema/circuits.js";
|
||||
import { distributionBoardComponentProtectionDevices } from "../schema/distribution-board-component-protection-devices.js";
|
||||
import { distributionBoardComponents } from "../schema/distribution-board-components.js";
|
||||
import { distributionBoards } from "../schema/distribution-boards.js";
|
||||
import { floors } from "../schema/floors.js";
|
||||
import { projectDevices } from "../schema/project-devices.js";
|
||||
@@ -69,6 +72,8 @@ export function readProjectStateSnapshot(
|
||||
displayName: circuitSections.displayName,
|
||||
prefix: circuitSections.prefix,
|
||||
sortOrder: circuitSections.sortOrder,
|
||||
category: circuitSections.category,
|
||||
groupNumber: circuitSections.groupNumber,
|
||||
})
|
||||
.from(circuitSections)
|
||||
.innerJoin(
|
||||
@@ -82,6 +87,56 @@ export function readProjectStateSnapshot(
|
||||
asc(circuitSections.id)
|
||||
)
|
||||
.all();
|
||||
const componentRows = database
|
||||
.select({ component: distributionBoardComponents })
|
||||
.from(distributionBoardComponents)
|
||||
.innerJoin(
|
||||
circuitLists,
|
||||
eq(circuitLists.id, distributionBoardComponents.circuitListId)
|
||||
)
|
||||
.where(eq(circuitLists.projectId, projectId))
|
||||
.orderBy(
|
||||
asc(distributionBoardComponents.circuitListId),
|
||||
asc(distributionBoardComponents.placement),
|
||||
asc(distributionBoardComponents.sortOrder),
|
||||
asc(distributionBoardComponents.id)
|
||||
)
|
||||
.all()
|
||||
.map((row) => row.component);
|
||||
const circuitProtectionRows = database
|
||||
.select({ protection: circuitProtectionDevices })
|
||||
.from(circuitProtectionDevices)
|
||||
.innerJoin(
|
||||
circuits,
|
||||
eq(circuits.id, circuitProtectionDevices.circuitId)
|
||||
)
|
||||
.innerJoin(circuitLists, eq(circuitLists.id, circuits.circuitListId))
|
||||
.where(eq(circuitLists.projectId, projectId))
|
||||
.orderBy(asc(circuitProtectionDevices.circuitId))
|
||||
.all()
|
||||
.map((row) => row.protection);
|
||||
const componentProtectionRows = database
|
||||
.select({
|
||||
protection: distributionBoardComponentProtectionDevices,
|
||||
})
|
||||
.from(distributionBoardComponentProtectionDevices)
|
||||
.innerJoin(
|
||||
distributionBoardComponents,
|
||||
eq(
|
||||
distributionBoardComponents.id,
|
||||
distributionBoardComponentProtectionDevices.componentId
|
||||
)
|
||||
)
|
||||
.innerJoin(
|
||||
circuitLists,
|
||||
eq(circuitLists.id, distributionBoardComponents.circuitListId)
|
||||
)
|
||||
.where(eq(circuitLists.projectId, projectId))
|
||||
.orderBy(
|
||||
asc(distributionBoardComponentProtectionDevices.componentId)
|
||||
)
|
||||
.all()
|
||||
.map((row) => row.protection);
|
||||
const circuitRows = database
|
||||
.select({
|
||||
id: circuits.id,
|
||||
@@ -190,6 +245,10 @@ export function readProjectStateSnapshot(
|
||||
distributionBoards: boardRows,
|
||||
circuitLists: listRows,
|
||||
circuitSections: sectionRows,
|
||||
distributionBoardComponents: componentRows,
|
||||
circuitProtectionDevices: circuitProtectionRows,
|
||||
distributionBoardComponentProtectionDevices:
|
||||
componentProtectionRows,
|
||||
circuits: circuitRows.map((circuit) => ({
|
||||
...circuit,
|
||||
isReserve: Boolean(circuit.isReserve),
|
||||
|
||||
@@ -10,8 +10,11 @@ import type { ProjectTransferStore } from "../../domain/ports/project-transfer.s
|
||||
import type { AppDatabase } from "../database-context.js";
|
||||
import { circuitDeviceRows } from "../schema/circuit-device-rows.js";
|
||||
import { circuitLists } from "../schema/circuit-lists.js";
|
||||
import { circuitProtectionDevices } from "../schema/circuit-protection-devices.js";
|
||||
import { circuitSections } from "../schema/circuit-sections.js";
|
||||
import { circuits } from "../schema/circuits.js";
|
||||
import { distributionBoardComponentProtectionDevices } from "../schema/distribution-board-component-protection-devices.js";
|
||||
import { distributionBoardComponents } from "../schema/distribution-board-components.js";
|
||||
import { distributionBoards } from "../schema/distribution-boards.js";
|
||||
import { floors } from "../schema/floors.js";
|
||||
import { projectDevices } from "../schema/project-devices.js";
|
||||
@@ -127,6 +130,21 @@ function insertProjectState(
|
||||
isReserve: circuit.isReserve ? 1 : 0,
|
||||
}))
|
||||
);
|
||||
insertMany(
|
||||
database,
|
||||
distributionBoardComponents,
|
||||
state.distributionBoardComponents
|
||||
);
|
||||
insertMany(
|
||||
database,
|
||||
circuitProtectionDevices,
|
||||
state.circuitProtectionDevices
|
||||
);
|
||||
insertMany(
|
||||
database,
|
||||
distributionBoardComponentProtectionDevices,
|
||||
state.distributionBoardComponentProtectionDevices
|
||||
);
|
||||
insertMany(
|
||||
database,
|
||||
circuitDeviceRows,
|
||||
|
||||
Reference in New Issue
Block a user