Remove obsolete repository writes
This commit is contained in:
@@ -21,6 +21,9 @@ It must support circuits, device rows, project devices, drag-and-drop restructur
|
|||||||
`src/frontend/components/circuit-grid-*.ts` modules.
|
`src/frontend/components/circuit-grid-*.ts` modules.
|
||||||
- Critical multi-write commands use injected transaction repositories with real
|
- Critical multi-write commands use injected transaction repositories with real
|
||||||
SQLite commit/rollback tests.
|
SQLite commit/rollback tests.
|
||||||
|
- General Circuit, CircuitDeviceRow, CircuitList and DistributionBoard
|
||||||
|
repositories expose only active reads. Runtime writes belong in typed command
|
||||||
|
repositories; direct integration fixtures belong under `tests/support`.
|
||||||
|
|
||||||
The supported runtime model is Circuit-First. The former Consumer UI and API are
|
The supported runtime model is Circuit-First. The former Consumer UI and API are
|
||||||
removed. Retained `consumers` rows, migration mappings and reports are upgrade-only
|
removed. Retained `consumers` rows, migration mappings and reports are upgrade-only
|
||||||
|
|||||||
@@ -231,6 +231,13 @@ Kopieren in ein Projekt erzeugt ein eigenständiges Projektgerät.
|
|||||||
- `npm run db:backup` erzeugt ein konsistentes und verifiziertes Online-Backup.
|
- `npm run db:backup` erzeugt ein konsistentes und verifiziertes Online-Backup.
|
||||||
- Angewendete Migrationen werden niemals nachträglich verändert.
|
- Angewendete Migrationen werden niemals nachträglich verändert.
|
||||||
- `db:migrate:legacy-consumers` ist Upgrade-Werkzeug, kein Anwendungspfad.
|
- `db:migrate:legacy-consumers` ist Upgrade-Werkzeug, kein Anwendungspfad.
|
||||||
|
- Allgemeine Circuit-, Gerätezeilen-, CircuitList- und DistributionBoard-
|
||||||
|
Repositories stellen im Anwendungspfad nur noch benötigte Leseabfragen bereit.
|
||||||
|
Fachliche Schreibvorgänge liegen in den typisierten Command-Repositories;
|
||||||
|
Upgrade-Schreibvorgänge bleiben in expliziten Migrationsadaptern.
|
||||||
|
- Die vollständige Verteilungs-Testfixture liegt unter
|
||||||
|
`tests/support/distribution-board-fixture.ts` und ist kein exportierter
|
||||||
|
Produktions-Schreibweg.
|
||||||
|
|
||||||
PostgreSQL ist bewusst nicht implementiert. Die Domainregeln und
|
PostgreSQL ist bewusst nicht implementiert. Die Domainregeln und
|
||||||
Transaktionsgrenzen sollen portabel bleiben; Schema und Betriebsmodell benötigen
|
Transaktionsgrenzen sollen portabel bleiben; Schema und Betriebsmodell benötigen
|
||||||
|
|||||||
@@ -83,6 +83,9 @@ Invoke-WebRequest http://localhost:3000/health
|
|||||||
```
|
```
|
||||||
|
|
||||||
Bei sichtbaren Editoränderungen ist außerdem ein kurzer GUI-Test erforderlich.
|
Bei sichtbaren Editoränderungen ist außerdem ein kurzer GUI-Test erforderlich.
|
||||||
|
Testaufbau, der vollständige Projektstrukturen direkt einfügt, gehört nach
|
||||||
|
`tests/support`. Produktions-Repositories dürfen nicht nur für Testfixtures
|
||||||
|
erneut direkte Schreibmethoden erhalten.
|
||||||
|
|
||||||
## Migrationen
|
## Migrationen
|
||||||
|
|
||||||
|
|||||||
@@ -326,8 +326,9 @@ Implemented foundation:
|
|||||||
|
|
||||||
- database contexts can be created independently from the production singleton
|
- database contexts can be created independently from the production singleton
|
||||||
- SQLite foreign-key enforcement is enabled explicitly for every context
|
- SQLite foreign-key enforcement is enabled explicitly for every context
|
||||||
- the distribution-board repository receives its database dependency explicitly
|
- the read-only distribution-board repository receives its database dependency explicitly
|
||||||
- distribution-board setup has real in-memory SQLite commit and rollback coverage using production migrations
|
- distribution-board setup uses its persistent command repository with real
|
||||||
|
in-memory SQLite commit and rollback coverage using production migrations
|
||||||
- database backups use SQLite's online backup API and include committed WAL data
|
- database backups use SQLite's online backup API and include committed WAL data
|
||||||
- every backup is opened independently and checked for integrity and foreign-key violations
|
- every backup is opened independently and checked for integrity and foreign-key violations
|
||||||
- an integration test restores the backup into a separate database and verifies its snapshot contents
|
- an integration test restores the backup into a separate database and verifies its snapshot contents
|
||||||
@@ -342,6 +343,9 @@ Implemented foundation:
|
|||||||
- the legacy consumer migration receives its database dependency at the script entry point
|
- the legacy consumer migration receives its database dependency at the script entry point
|
||||||
- legacy circuit, row, mapping and report writes have real late-failure rollback coverage
|
- legacy circuit, row, mapping and report writes have real late-failure rollback coverage
|
||||||
- circuit and device-row persistence value mapping is separated from the general repositories
|
- circuit and device-row persistence value mapping is separated from the general repositories
|
||||||
|
- obsolete direct Circuit, CircuitDeviceRow, CircuitList, DistributionBoard and
|
||||||
|
Project repository writes are removed; integration fixtures live under
|
||||||
|
`tests/support` instead of production repositories
|
||||||
- the legacy consumer UI and application read/write endpoints are removed after verified data cutover
|
- the legacy consumer UI and application read/write endpoints are removed after verified data cutover
|
||||||
- retained legacy rows are accessible only through explicit database upgrade tooling
|
- retained legacy rows are accessible only through explicit database upgrade tooling
|
||||||
- project devices no longer persist duplicate legacy power, phase, cosPhi or remark fields
|
- project devices no longer persist duplicate legacy power, phase, cosPhi or remark fields
|
||||||
|
|||||||
+2
-2
@@ -14,8 +14,8 @@
|
|||||||
"build:api": "tsc -p tsconfig.json",
|
"build:api": "tsc -p tsconfig.json",
|
||||||
"build:web": "next build",
|
"build:web": "next build",
|
||||||
"start": "node dist/server/index.js",
|
"start": "node dist/server/index.js",
|
||||||
"test": "tsx --test tests/project-device-schema.test.ts tests/project-device-schema-migration.test.ts tests/project-device-placement.service.test.ts tests/project-device-sync.service.test.ts tests/legacy-consumer-migration-planner.test.ts tests/legacy-consumer-migration.repository.test.ts tests/circuit-numbering.service.test.ts tests/circuit-power-calculation.test.ts tests/circuit-tree.controller.test.ts tests/circuit-editor-history.test.ts tests/circuit-grid-insertion.test.ts tests/circuit-grid-safety.test.ts tests/circuit-grid-model.test.ts tests/circuit-structure-command.test.ts tests/circuit-device-row-move-command.test.ts tests/circuit-section-reorder-command.test.ts tests/circuit-section-renumber-command.test.ts tests/circuit-grid-projection.test.ts tests/distribution-board.repository.test.ts tests/distribution-board-structure-project-command.repository.test.ts tests/project-location-structure-project-command.repository.test.ts tests/project-device-project-command.repository.test.ts tests/project-device-structure-project-command.repository.test.ts tests/project-device-row-sync-project-command.repository.test.ts tests/circuit-section-reorder-project-command.repository.test.ts tests/circuit-section-renumber-project-command.repository.test.ts tests/project-command.model.test.ts tests/project-revision.repository.test.ts tests/circuit-project-command.repository.test.ts tests/circuit-structure-project-command.repository.test.ts tests/circuit-device-row-project-command.repository.test.ts tests/circuit-device-row-structure-project-command.repository.test.ts tests/circuit-device-row-move-project-command.repository.test.ts tests/project-history.repository.test.ts tests/project-history-timeline.test.ts tests/project-version-history.test.ts tests/project-settings-project-command.repository.test.ts tests/project-state-snapshot.test.ts tests/project-snapshot-policy.test.ts tests/project-snapshot.repository.test.ts tests/project-state-restore-command.repository.test.ts tests/project-command.service.test.ts tests/database-backup.test.ts",
|
"test": "tsx --test tests/project-device-schema.test.ts tests/project-device-schema-migration.test.ts tests/project-device-placement.service.test.ts tests/project-device-sync.service.test.ts tests/legacy-consumer-migration-planner.test.ts tests/legacy-consumer-migration.repository.test.ts tests/circuit-numbering.service.test.ts tests/circuit-power-calculation.test.ts tests/circuit-tree.controller.test.ts tests/circuit-editor-history.test.ts tests/circuit-grid-insertion.test.ts tests/circuit-grid-safety.test.ts tests/circuit-grid-model.test.ts tests/circuit-structure-command.test.ts tests/circuit-device-row-move-command.test.ts tests/circuit-section-reorder-command.test.ts tests/circuit-section-renumber-command.test.ts tests/circuit-grid-projection.test.ts tests/distribution-board-structure-project-command.repository.test.ts tests/project-location-structure-project-command.repository.test.ts tests/project-device-project-command.repository.test.ts tests/project-device-structure-project-command.repository.test.ts tests/project-device-row-sync-project-command.repository.test.ts tests/circuit-section-reorder-project-command.repository.test.ts tests/circuit-section-renumber-project-command.repository.test.ts tests/project-command.model.test.ts tests/project-revision.repository.test.ts tests/circuit-project-command.repository.test.ts tests/circuit-structure-project-command.repository.test.ts tests/circuit-device-row-project-command.repository.test.ts tests/circuit-device-row-structure-project-command.repository.test.ts tests/circuit-device-row-move-project-command.repository.test.ts tests/project-history.repository.test.ts tests/project-history-timeline.test.ts tests/project-version-history.test.ts tests/project-settings-project-command.repository.test.ts tests/project-state-snapshot.test.ts tests/project-snapshot-policy.test.ts tests/project-snapshot.repository.test.ts tests/project-state-restore-command.repository.test.ts tests/project-command.service.test.ts tests/database-backup.test.ts",
|
||||||
"test:watch": "tsx --watch --test tests/project-device-schema.test.ts tests/project-device-schema-migration.test.ts tests/project-device-placement.service.test.ts tests/project-device-sync.service.test.ts tests/legacy-consumer-migration-planner.test.ts tests/legacy-consumer-migration.repository.test.ts tests/circuit-numbering.service.test.ts tests/circuit-power-calculation.test.ts tests/circuit-tree.controller.test.ts tests/circuit-editor-history.test.ts tests/circuit-grid-insertion.test.ts tests/circuit-grid-safety.test.ts tests/circuit-grid-model.test.ts tests/circuit-structure-command.test.ts tests/circuit-device-row-move-command.test.ts tests/circuit-section-reorder-command.test.ts tests/circuit-section-renumber-command.test.ts tests/circuit-grid-projection.test.ts tests/distribution-board.repository.test.ts tests/distribution-board-structure-project-command.repository.test.ts tests/project-location-structure-project-command.repository.test.ts tests/project-device-project-command.repository.test.ts tests/project-device-structure-project-command.repository.test.ts tests/project-device-row-sync-project-command.repository.test.ts tests/circuit-section-reorder-project-command.repository.test.ts tests/circuit-section-renumber-project-command.repository.test.ts tests/project-command.model.test.ts tests/project-revision.repository.test.ts tests/circuit-project-command.repository.test.ts tests/circuit-structure-project-command.repository.test.ts tests/circuit-device-row-project-command.repository.test.ts tests/circuit-device-row-structure-project-command.repository.test.ts tests/circuit-device-row-move-project-command.repository.test.ts tests/project-history.repository.test.ts tests/project-history-timeline.test.ts tests/project-version-history.test.ts tests/project-settings-project-command.repository.test.ts tests/project-state-snapshot.test.ts tests/project-snapshot-policy.test.ts tests/project-snapshot.repository.test.ts tests/project-state-restore-command.repository.test.ts tests/project-command.service.test.ts tests/database-backup.test.ts",
|
"test:watch": "tsx --watch --test tests/project-device-schema.test.ts tests/project-device-schema-migration.test.ts tests/project-device-placement.service.test.ts tests/project-device-sync.service.test.ts tests/legacy-consumer-migration-planner.test.ts tests/legacy-consumer-migration.repository.test.ts tests/circuit-numbering.service.test.ts tests/circuit-power-calculation.test.ts tests/circuit-tree.controller.test.ts tests/circuit-editor-history.test.ts tests/circuit-grid-insertion.test.ts tests/circuit-grid-safety.test.ts tests/circuit-grid-model.test.ts tests/circuit-structure-command.test.ts tests/circuit-device-row-move-command.test.ts tests/circuit-section-reorder-command.test.ts tests/circuit-section-renumber-command.test.ts tests/circuit-grid-projection.test.ts tests/distribution-board-structure-project-command.repository.test.ts tests/project-location-structure-project-command.repository.test.ts tests/project-device-project-command.repository.test.ts tests/project-device-structure-project-command.repository.test.ts tests/project-device-row-sync-project-command.repository.test.ts tests/circuit-section-reorder-project-command.repository.test.ts tests/circuit-section-renumber-project-command.repository.test.ts tests/project-command.model.test.ts tests/project-revision.repository.test.ts tests/circuit-project-command.repository.test.ts tests/circuit-structure-project-command.repository.test.ts tests/circuit-device-row-project-command.repository.test.ts tests/circuit-device-row-structure-project-command.repository.test.ts tests/circuit-device-row-move-project-command.repository.test.ts tests/project-history.repository.test.ts tests/project-history-timeline.test.ts tests/project-version-history.test.ts tests/project-settings-project-command.repository.test.ts tests/project-state-snapshot.test.ts tests/project-snapshot-policy.test.ts tests/project-snapshot.repository.test.ts tests/project-state-restore-command.repository.test.ts tests/project-command.service.test.ts tests/database-backup.test.ts",
|
||||||
"db:generate": "drizzle-kit generate",
|
"db:generate": "drizzle-kit generate",
|
||||||
"db:migrate": "drizzle-kit migrate",
|
"db:migrate": "drizzle-kit migrate",
|
||||||
"db:backup": "tsx scripts/db-backup.ts",
|
"db:backup": "tsx scripts/db-backup.ts",
|
||||||
|
|||||||
@@ -1,33 +1,11 @@
|
|||||||
import crypto from "node:crypto";
|
|
||||||
import { and, asc, eq, inArray } from "drizzle-orm";
|
import { and, asc, eq, inArray } from "drizzle-orm";
|
||||||
import { db } from "../client.js";
|
import { db } from "../client.js";
|
||||||
import { circuitDeviceRows } from "../schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../schema/circuit-device-rows.js";
|
||||||
import { circuitLists } from "../schema/circuit-lists.js";
|
import { circuitLists } from "../schema/circuit-lists.js";
|
||||||
import { circuits } from "../schema/circuits.js";
|
import { circuits } from "../schema/circuits.js";
|
||||||
import { distributionBoards } from "../schema/distribution-boards.js";
|
import { distributionBoards } from "../schema/distribution-boards.js";
|
||||||
import {
|
|
||||||
toCircuitDeviceRowCreateValues,
|
|
||||||
toCircuitDeviceRowUpdateValues,
|
|
||||||
type CircuitDeviceRowCreateInput,
|
|
||||||
type CircuitDeviceRowUpdateInput,
|
|
||||||
} from "./circuit-device-row.persistence.js";
|
|
||||||
export type {
|
|
||||||
CircuitDeviceRowCreateInput,
|
|
||||||
CircuitDeviceRowUpdateInput,
|
|
||||||
} from "./circuit-device-row.persistence.js";
|
|
||||||
export { toCircuitDeviceRowCreateValues } from "./circuit-device-row.persistence.js";
|
|
||||||
|
|
||||||
export class CircuitDeviceRowRepository {
|
export class CircuitDeviceRowRepository {
|
||||||
async findById(rowId: string) {
|
|
||||||
const [row] = await db.select().from(circuitDeviceRows).where(eq(circuitDeviceRows.id, rowId)).limit(1);
|
|
||||||
return row ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async countByCircuit(circuitId: string) {
|
|
||||||
const rows = await db.select({ id: circuitDeviceRows.id }).from(circuitDeviceRows).where(eq(circuitDeviceRows.circuitId, circuitId));
|
|
||||||
return rows.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
async listByCircuitList(circuitIds: string[]) {
|
async listByCircuitList(circuitIds: string[]) {
|
||||||
if (!circuitIds.length) {
|
if (!circuitIds.length) {
|
||||||
return [];
|
return [];
|
||||||
@@ -83,34 +61,4 @@ export class CircuitDeviceRowRepository {
|
|||||||
.orderBy(asc(distributionBoards.name), asc(circuits.equipmentIdentifier), asc(circuitDeviceRows.sortOrder));
|
.orderBy(asc(distributionBoards.name), asc(circuits.equipmentIdentifier), asc(circuitDeviceRows.sortOrder));
|
||||||
}
|
}
|
||||||
|
|
||||||
async create(input: CircuitDeviceRowCreateInput) {
|
|
||||||
const id = crypto.randomUUID();
|
|
||||||
await db.insert(circuitDeviceRows).values(toCircuitDeviceRowCreateValues(id, input));
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
async update(
|
|
||||||
rowId: string,
|
|
||||||
input: CircuitDeviceRowUpdateInput
|
|
||||||
) {
|
|
||||||
await db
|
|
||||||
.update(circuitDeviceRows)
|
|
||||||
.set(toCircuitDeviceRowUpdateValues(input))
|
|
||||||
.where(eq(circuitDeviceRows.id, rowId));
|
|
||||||
}
|
|
||||||
|
|
||||||
async delete(rowId: string) {
|
|
||||||
await db.delete(circuitDeviceRows).where(eq(circuitDeviceRows.id, rowId));
|
|
||||||
}
|
|
||||||
|
|
||||||
async moveToCircuit(rowId: string, targetCircuitId: string, sortOrder: number) {
|
|
||||||
await db
|
|
||||||
.update(circuitDeviceRows)
|
|
||||||
.set({
|
|
||||||
circuitId: targetCircuitId,
|
|
||||||
sortOrder,
|
|
||||||
})
|
|
||||||
.where(eq(circuitDeviceRows.id, rowId));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,44 +7,6 @@ export class CircuitListRepository {
|
|||||||
return db.select().from(circuitLists).where(eq(circuitLists.projectId, projectId));
|
return db.select().from(circuitLists).where(eq(circuitLists.projectId, projectId));
|
||||||
}
|
}
|
||||||
|
|
||||||
async createForDistributionBoard(input: {
|
|
||||||
projectId: string;
|
|
||||||
distributionBoardId: string;
|
|
||||||
name: string;
|
|
||||||
}) {
|
|
||||||
const entry = {
|
|
||||||
id: input.distributionBoardId,
|
|
||||||
projectId: input.projectId,
|
|
||||||
distributionBoardId: input.distributionBoardId,
|
|
||||||
name: input.name,
|
|
||||||
};
|
|
||||||
await db.insert(circuitLists).values(entry);
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
async findByDistributionBoardId(projectId: string, distributionBoardId: string) {
|
|
||||||
const [row] = await db
|
|
||||||
.select()
|
|
||||||
.from(circuitLists)
|
|
||||||
.where(
|
|
||||||
and(
|
|
||||||
eq(circuitLists.projectId, projectId),
|
|
||||||
eq(circuitLists.distributionBoardId, distributionBoardId)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.limit(1);
|
|
||||||
return row ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async existsInProject(projectId: string, circuitListId: string) {
|
|
||||||
const [row] = await db
|
|
||||||
.select({ id: circuitLists.id })
|
|
||||||
.from(circuitLists)
|
|
||||||
.where(and(eq(circuitLists.projectId, projectId), eq(circuitLists.id, circuitListId)))
|
|
||||||
.limit(1);
|
|
||||||
return Boolean(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
async findById(projectId: string, circuitListId: string) {
|
async findById(projectId: string, circuitListId: string) {
|
||||||
const [row] = await db
|
const [row] = await db
|
||||||
.select()
|
.select()
|
||||||
@@ -53,13 +15,4 @@ export class CircuitListRepository {
|
|||||||
.limit(1);
|
.limit(1);
|
||||||
return row ?? null;
|
return row ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async findByIdByListIdOnly(circuitListId: string) {
|
|
||||||
const [row] = await db
|
|
||||||
.select()
|
|
||||||
.from(circuitLists)
|
|
||||||
.where(eq(circuitLists.id, circuitListId))
|
|
||||||
.limit(1);
|
|
||||||
return row ?? null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +1,8 @@
|
|||||||
import crypto from "node:crypto";
|
import { asc, eq } from "drizzle-orm";
|
||||||
import { and, asc, eq, ne } from "drizzle-orm";
|
|
||||||
import { db } from "../client.js";
|
import { db } from "../client.js";
|
||||||
import { circuits } from "../schema/circuits.js";
|
import { circuits } from "../schema/circuits.js";
|
||||||
import {
|
|
||||||
toCircuitCreateValues,
|
|
||||||
type CircuitCreatePersistenceInput,
|
|
||||||
} from "./circuit.persistence.js";
|
|
||||||
|
|
||||||
export type {
|
|
||||||
CircuitCreatePersistenceInput,
|
|
||||||
} from "./circuit.persistence.js";
|
|
||||||
export {
|
|
||||||
toCircuitCreateValues,
|
|
||||||
} from "./circuit.persistence.js";
|
|
||||||
|
|
||||||
export class CircuitRepository {
|
export class CircuitRepository {
|
||||||
async findById(circuitId: string) {
|
|
||||||
const [row] = await db.select().from(circuits).where(eq(circuits.id, circuitId)).limit(1);
|
|
||||||
return row ?? null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async listByCircuitList(circuitListId: string) {
|
async listByCircuitList(circuitListId: string) {
|
||||||
return db
|
return db
|
||||||
.select()
|
.select()
|
||||||
@@ -28,79 +11,6 @@ export class CircuitRepository {
|
|||||||
.orderBy(asc(circuits.sortOrder), asc(circuits.equipmentIdentifier));
|
.orderBy(asc(circuits.sortOrder), asc(circuits.equipmentIdentifier));
|
||||||
}
|
}
|
||||||
|
|
||||||
async create(input: CircuitCreatePersistenceInput) {
|
|
||||||
const id = crypto.randomUUID();
|
|
||||||
await db.insert(circuits).values(toCircuitCreateValues(id, input));
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
async update(
|
|
||||||
circuitId: string,
|
|
||||||
input: {
|
|
||||||
sectionId: string;
|
|
||||||
equipmentIdentifier: string;
|
|
||||||
displayName?: string;
|
|
||||||
sortOrder: number;
|
|
||||||
protectionType?: string;
|
|
||||||
protectionRatedCurrent?: number;
|
|
||||||
protectionCharacteristic?: string;
|
|
||||||
cableType?: string;
|
|
||||||
cableCrossSection?: string;
|
|
||||||
cableLength?: number;
|
|
||||||
rcdAssignment?: string;
|
|
||||||
terminalDesignation?: string;
|
|
||||||
voltage?: number;
|
|
||||||
controlRequirement?: string;
|
|
||||||
status?: string;
|
|
||||||
isReserve: boolean;
|
|
||||||
remark?: string;
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
await db
|
|
||||||
.update(circuits)
|
|
||||||
.set({
|
|
||||||
sectionId: input.sectionId,
|
|
||||||
equipmentIdentifier: input.equipmentIdentifier,
|
|
||||||
displayName: input.displayName ?? null,
|
|
||||||
sortOrder: input.sortOrder,
|
|
||||||
protectionType: input.protectionType ?? null,
|
|
||||||
protectionRatedCurrent: input.protectionRatedCurrent ?? null,
|
|
||||||
protectionCharacteristic: input.protectionCharacteristic ?? null,
|
|
||||||
cableType: input.cableType ?? null,
|
|
||||||
cableCrossSection: input.cableCrossSection ?? null,
|
|
||||||
cableLength: input.cableLength ?? null,
|
|
||||||
rcdAssignment: input.rcdAssignment ?? null,
|
|
||||||
terminalDesignation: input.terminalDesignation ?? null,
|
|
||||||
voltage: input.voltage ?? null,
|
|
||||||
controlRequirement: input.controlRequirement ?? null,
|
|
||||||
status: input.status ?? null,
|
|
||||||
isReserve: input.isReserve ? 1 : 0,
|
|
||||||
remark: input.remark ?? null,
|
|
||||||
})
|
|
||||||
.where(eq(circuits.id, circuitId));
|
|
||||||
}
|
|
||||||
|
|
||||||
async delete(circuitId: string) {
|
|
||||||
await db.delete(circuits).where(eq(circuits.id, circuitId));
|
|
||||||
}
|
|
||||||
|
|
||||||
async existsByEquipmentIdentifier(circuitListId: string, equipmentIdentifier: string, excludeCircuitId?: string) {
|
|
||||||
const rows = await db
|
|
||||||
.select({ id: circuits.id })
|
|
||||||
.from(circuits)
|
|
||||||
.where(
|
|
||||||
excludeCircuitId
|
|
||||||
? and(
|
|
||||||
eq(circuits.circuitListId, circuitListId),
|
|
||||||
eq(circuits.equipmentIdentifier, equipmentIdentifier),
|
|
||||||
ne(circuits.id, excludeCircuitId)
|
|
||||||
)
|
|
||||||
: and(eq(circuits.circuitListId, circuitListId), eq(circuits.equipmentIdentifier, equipmentIdentifier))
|
|
||||||
)
|
|
||||||
.limit(1);
|
|
||||||
return Boolean(rows.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
async listBySection(sectionId: string) {
|
async listBySection(sectionId: string) {
|
||||||
return db
|
return db
|
||||||
.select()
|
.select()
|
||||||
@@ -108,5 +18,4 @@ export class CircuitRepository {
|
|||||||
.where(eq(circuits.sectionId, sectionId))
|
.where(eq(circuits.sectionId, sectionId))
|
||||||
.orderBy(asc(circuits.sortOrder), asc(circuits.equipmentIdentifier));
|
.orderBy(asc(circuits.sortOrder), asc(circuits.equipmentIdentifier));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
import crypto from "node:crypto";
|
import { eq } from "drizzle-orm";
|
||||||
import { and, eq } from "drizzle-orm";
|
|
||||||
import type { AppDatabase } from "../database-context.js";
|
import type { AppDatabase } from "../database-context.js";
|
||||||
import { circuitLists } from "../schema/circuit-lists.js";
|
|
||||||
import { circuitSections } from "../schema/circuit-sections.js";
|
|
||||||
import { distributionBoards } from "../schema/distribution-boards.js";
|
import { distributionBoards } from "../schema/distribution-boards.js";
|
||||||
import { createDefaultCircuitSectionValues } from "./circuit-section.repository.js";
|
|
||||||
|
|
||||||
export class DistributionBoardRepository {
|
export class DistributionBoardRepository {
|
||||||
constructor(private readonly database: AppDatabase) {}
|
constructor(private readonly database: AppDatabase) {}
|
||||||
@@ -16,44 +12,4 @@ export class DistributionBoardRepository {
|
|||||||
.where(eq(distributionBoards.projectId, projectId));
|
.where(eq(distributionBoards.projectId, projectId));
|
||||||
}
|
}
|
||||||
|
|
||||||
async create(projectId: string, name: string) {
|
|
||||||
const id = crypto.randomUUID();
|
|
||||||
const board = { id, projectId, name };
|
|
||||||
await this.database.insert(distributionBoards).values(board);
|
|
||||||
return board;
|
|
||||||
}
|
|
||||||
|
|
||||||
createWithCircuitListAndDefaultSections(projectId: string, name: string) {
|
|
||||||
const id = crypto.randomUUID();
|
|
||||||
const board = { id, projectId, name };
|
|
||||||
const circuitList = {
|
|
||||||
id,
|
|
||||||
projectId,
|
|
||||||
distributionBoardId: id,
|
|
||||||
name: `${name} Stromkreisliste`,
|
|
||||||
};
|
|
||||||
const sections = createDefaultCircuitSectionValues(id);
|
|
||||||
|
|
||||||
this.database.transaction((tx) => {
|
|
||||||
tx.insert(distributionBoards).values(board).run();
|
|
||||||
tx.insert(circuitLists).values(circuitList).run();
|
|
||||||
tx.insert(circuitSections).values(sections).run();
|
|
||||||
});
|
|
||||||
|
|
||||||
return board;
|
|
||||||
}
|
|
||||||
|
|
||||||
async existsInProject(projectId: string, distributionBoardId: string) {
|
|
||||||
const [row] = await this.database
|
|
||||||
.select({ id: distributionBoards.id })
|
|
||||||
.from(distributionBoards)
|
|
||||||
.where(
|
|
||||||
and(
|
|
||||||
eq(distributionBoards.projectId, projectId),
|
|
||||||
eq(distributionBoards.id, distributionBoardId)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.limit(1);
|
|
||||||
return Boolean(row);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,8 +28,4 @@ export class ProjectRepository {
|
|||||||
const [row] = await db.select().from(projects).where(eq(projects.id, projectId)).limit(1);
|
const [row] = await db.select().from(projects).where(eq(projects.id, projectId)).limit(1);
|
||||||
return row ?? null;
|
return row ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async delete(projectId: string) {
|
|
||||||
await db.delete(projects).where(eq(projects.id, projectId));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { CircuitDeviceRowMoveProjectCommandRepository } from "../src/db/repositories/circuit-device-row-move-project-command.repository.js";
|
import { CircuitDeviceRowMoveProjectCommandRepository } from "../src/db/repositories/circuit-device-row-move-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
||||||
@@ -39,7 +39,7 @@ function createTestDatabase(): TestFixture {
|
|||||||
{ id: "project-2", name: "Other project" },
|
{ id: "project-2", name: "Other project" },
|
||||||
])
|
])
|
||||||
.run();
|
.run();
|
||||||
const boards = new DistributionBoardRepository(context.db);
|
const boards = new DistributionBoardFixtureRepository(context.db);
|
||||||
const board = boards.createWithCircuitListAndDefaultSections(
|
const board = boards.createWithCircuitListAndDefaultSections(
|
||||||
"project-1",
|
"project-1",
|
||||||
"UV-01"
|
"UV-01"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { CircuitDeviceRowProjectCommandRepository } from "../src/db/repositories/circuit-device-row-project-command.repository.js";
|
import { CircuitDeviceRowProjectCommandRepository } from "../src/db/repositories/circuit-device-row-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
||||||
import { circuits } from "../src/db/schema/circuits.js";
|
import { circuits } from "../src/db/schema/circuits.js";
|
||||||
@@ -34,7 +34,7 @@ function createTestDatabase(): DatabaseContext {
|
|||||||
])
|
])
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
const boards = new DistributionBoardRepository(context.db);
|
const boards = new DistributionBoardFixtureRepository(context.db);
|
||||||
const board = boards.createWithCircuitListAndDefaultSections(
|
const board = boards.createWithCircuitListAndDefaultSections(
|
||||||
"project-1",
|
"project-1",
|
||||||
"UV-01"
|
"UV-01"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { CircuitDeviceRowStructureProjectCommandRepository } from "../src/db/repositories/circuit-device-row-structure-project-command.repository.js";
|
import { CircuitDeviceRowStructureProjectCommandRepository } from "../src/db/repositories/circuit-device-row-structure-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
||||||
@@ -36,7 +36,7 @@ function createTestDatabase(): DatabaseContext {
|
|||||||
])
|
])
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
const boards = new DistributionBoardRepository(context.db);
|
const boards = new DistributionBoardFixtureRepository(context.db);
|
||||||
const board = boards.createWithCircuitListAndDefaultSections(
|
const board = boards.createWithCircuitListAndDefaultSections(
|
||||||
"project-1",
|
"project-1",
|
||||||
"UV-01"
|
"UV-01"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { CircuitProjectCommandRepository } from "../src/db/repositories/circuit-project-command.repository.js";
|
import { CircuitProjectCommandRepository } from "../src/db/repositories/circuit-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { projectChangeSets } from "../src/db/schema/project-change-sets.js";
|
import { projectChangeSets } from "../src/db/schema/project-change-sets.js";
|
||||||
import { projectRevisions } from "../src/db/schema/project-revisions.js";
|
import { projectRevisions } from "../src/db/schema/project-revisions.js";
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
||||||
@@ -38,7 +38,7 @@ function createTestFixture(): TestFixture {
|
|||||||
])
|
])
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
const repository = new DistributionBoardRepository(context.db);
|
const repository = new DistributionBoardFixtureRepository(context.db);
|
||||||
const board = repository.createWithCircuitListAndDefaultSections(
|
const board = repository.createWithCircuitListAndDefaultSections(
|
||||||
"project-1",
|
"project-1",
|
||||||
"UV-01"
|
"UV-01"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { CircuitSectionRenumberProjectCommandRepository } from "../src/db/repositories/circuit-section-renumber-project-command.repository.js";
|
import { CircuitSectionRenumberProjectCommandRepository } from "../src/db/repositories/circuit-section-renumber-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
||||||
@@ -35,7 +35,7 @@ function createTestDatabase(): TestFixture {
|
|||||||
{ id: "project-2", name: "Other project" },
|
{ id: "project-2", name: "Other project" },
|
||||||
])
|
])
|
||||||
.run();
|
.run();
|
||||||
const boards = new DistributionBoardRepository(context.db);
|
const boards = new DistributionBoardFixtureRepository(context.db);
|
||||||
const board = boards.createWithCircuitListAndDefaultSections(
|
const board = boards.createWithCircuitListAndDefaultSections(
|
||||||
"project-1",
|
"project-1",
|
||||||
"UV-01"
|
"UV-01"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { CircuitSectionReorderProjectCommandRepository } from "../src/db/repositories/circuit-section-reorder-project-command.repository.js";
|
import { CircuitSectionReorderProjectCommandRepository } from "../src/db/repositories/circuit-section-reorder-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
||||||
@@ -37,7 +37,7 @@ function createTestDatabase(): TestFixture {
|
|||||||
{ id: "project-2", name: "Other project" },
|
{ id: "project-2", name: "Other project" },
|
||||||
])
|
])
|
||||||
.run();
|
.run();
|
||||||
const boards = new DistributionBoardRepository(context.db);
|
const boards = new DistributionBoardFixtureRepository(context.db);
|
||||||
const board = boards.createWithCircuitListAndDefaultSections(
|
const board = boards.createWithCircuitListAndDefaultSections(
|
||||||
"project-1",
|
"project-1",
|
||||||
"UV-01"
|
"UV-01"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { CircuitStructureProjectCommandRepository } from "../src/db/repositories/circuit-structure-project-command.repository.js";
|
import { CircuitStructureProjectCommandRepository } from "../src/db/repositories/circuit-structure-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
||||||
@@ -45,7 +45,7 @@ function createTestDatabase(): TestFixture {
|
|||||||
])
|
])
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
const boards = new DistributionBoardRepository(context.db);
|
const boards = new DistributionBoardFixtureRepository(context.db);
|
||||||
const board = boards.createWithCircuitListAndDefaultSections(
|
const board = boards.createWithCircuitListAndDefaultSections(
|
||||||
"project-1",
|
"project-1",
|
||||||
"UV-01"
|
"UV-01"
|
||||||
|
|||||||
@@ -1,98 +0,0 @@
|
|||||||
import path from "node:path";
|
|
||||||
import assert from "node:assert/strict";
|
|
||||||
import { describe, it } from "node:test";
|
|
||||||
import { eq } from "drizzle-orm";
|
|
||||||
import { migrate } from "drizzle-orm/better-sqlite3/migrator";
|
|
||||||
import {
|
|
||||||
createDatabaseContext,
|
|
||||||
type DatabaseContext,
|
|
||||||
} from "../src/db/database-context.js";
|
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
|
||||||
import { circuitLists } from "../src/db/schema/circuit-lists.js";
|
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
|
||||||
import { distributionBoards } from "../src/db/schema/distribution-boards.js";
|
|
||||||
import { projects } from "../src/db/schema/projects.js";
|
|
||||||
|
|
||||||
function createTestDatabase(): DatabaseContext {
|
|
||||||
const context = createDatabaseContext(":memory:");
|
|
||||||
migrate(context.db, {
|
|
||||||
migrationsFolder: path.resolve("src", "db", "migrations"),
|
|
||||||
});
|
|
||||||
context.db.insert(projects).values({ id: "project-1", name: "Test project" }).run();
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("distribution board repository integration", () => {
|
|
||||||
it("commits board, circuit list and default sections together", () => {
|
|
||||||
const context = createTestDatabase();
|
|
||||||
try {
|
|
||||||
const repository = new DistributionBoardRepository(context.db);
|
|
||||||
const board = repository.createWithCircuitListAndDefaultSections(
|
|
||||||
"project-1",
|
|
||||||
"UV-01"
|
|
||||||
);
|
|
||||||
|
|
||||||
const persistedBoards = context.db
|
|
||||||
.select()
|
|
||||||
.from(distributionBoards)
|
|
||||||
.where(eq(distributionBoards.id, board.id))
|
|
||||||
.all();
|
|
||||||
const persistedLists = context.db
|
|
||||||
.select()
|
|
||||||
.from(circuitLists)
|
|
||||||
.where(eq(circuitLists.distributionBoardId, board.id))
|
|
||||||
.all();
|
|
||||||
const persistedSections = context.db
|
|
||||||
.select()
|
|
||||||
.from(circuitSections)
|
|
||||||
.where(eq(circuitSections.circuitListId, board.id))
|
|
||||||
.all();
|
|
||||||
|
|
||||||
assert.deepEqual(persistedBoards, [board]);
|
|
||||||
assert.equal(persistedLists.length, 1);
|
|
||||||
assert.equal(persistedLists[0].name, "UV-01 Stromkreisliste");
|
|
||||||
assert.deepEqual(
|
|
||||||
persistedSections
|
|
||||||
.sort((left, right) => left.sortOrder - right.sortOrder)
|
|
||||||
.map((section) => [section.key, section.prefix]),
|
|
||||||
[
|
|
||||||
["lighting", "-1F"],
|
|
||||||
["single_phase", "-2F"],
|
|
||||||
["three_phase", "-3F"],
|
|
||||||
["unassigned", "-UF"],
|
|
||||||
]
|
|
||||||
);
|
|
||||||
} finally {
|
|
||||||
context.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it("rolls back board and circuit list when default section creation fails", () => {
|
|
||||||
const context = createTestDatabase();
|
|
||||||
try {
|
|
||||||
context.sqlite.exec(`
|
|
||||||
CREATE TRIGGER fail_default_section_insert
|
|
||||||
BEFORE INSERT ON circuit_sections
|
|
||||||
BEGIN
|
|
||||||
SELECT RAISE(ABORT, 'forced section failure');
|
|
||||||
END;
|
|
||||||
`);
|
|
||||||
const repository = new DistributionBoardRepository(context.db);
|
|
||||||
|
|
||||||
assert.throws(
|
|
||||||
() =>
|
|
||||||
repository.createWithCircuitListAndDefaultSections(
|
|
||||||
"project-1",
|
|
||||||
"UV rollback"
|
|
||||||
),
|
|
||||||
/forced section failure/
|
|
||||||
);
|
|
||||||
|
|
||||||
assert.equal(context.db.select().from(distributionBoards).all().length, 0);
|
|
||||||
assert.equal(context.db.select().from(circuitLists).all().length, 0);
|
|
||||||
assert.equal(context.db.select().from(circuitSections).all().length, 0);
|
|
||||||
} finally {
|
|
||||||
context.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -7,7 +7,7 @@ import {
|
|||||||
createDatabaseContext,
|
createDatabaseContext,
|
||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { LegacyConsumerMigrationRepository } from "../src/db/repositories/legacy-consumer-migration.repository.js";
|
import { LegacyConsumerMigrationRepository } from "../src/db/repositories/legacy-consumer-migration.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
||||||
@@ -23,7 +23,7 @@ function createTestDatabase() {
|
|||||||
migrationsFolder: path.resolve("src", "db", "migrations"),
|
migrationsFolder: path.resolve("src", "db", "migrations"),
|
||||||
});
|
});
|
||||||
context.db.insert(projects).values({ id: "project-1", name: "Test project" }).run();
|
context.db.insert(projects).values({ id: "project-1", name: "Test project" }).run();
|
||||||
const board = new DistributionBoardRepository(
|
const board = new DistributionBoardFixtureRepository(
|
||||||
context.db
|
context.db
|
||||||
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
||||||
const [section] = context.db
|
const [section] = context.db
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { CircuitProjectCommandRepository } from "../src/db/repositories/circuit-
|
|||||||
import { CircuitSectionReorderProjectCommandRepository } from "../src/db/repositories/circuit-section-reorder-project-command.repository.js";
|
import { CircuitSectionReorderProjectCommandRepository } from "../src/db/repositories/circuit-section-reorder-project-command.repository.js";
|
||||||
import { CircuitSectionRenumberProjectCommandRepository } from "../src/db/repositories/circuit-section-renumber-project-command.repository.js";
|
import { CircuitSectionRenumberProjectCommandRepository } from "../src/db/repositories/circuit-section-renumber-project-command.repository.js";
|
||||||
import { CircuitStructureProjectCommandRepository } from "../src/db/repositories/circuit-structure-project-command.repository.js";
|
import { CircuitStructureProjectCommandRepository } from "../src/db/repositories/circuit-structure-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { DistributionBoardStructureProjectCommandRepository } from "../src/db/repositories/distribution-board-structure-project-command.repository.js";
|
import { DistributionBoardStructureProjectCommandRepository } from "../src/db/repositories/distribution-board-structure-project-command.repository.js";
|
||||||
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
||||||
import { ProjectLocationStructureProjectCommandRepository } from "../src/db/repositories/project-location-structure-project-command.repository.js";
|
import { ProjectLocationStructureProjectCommandRepository } from "../src/db/repositories/project-location-structure-project-command.repository.js";
|
||||||
@@ -70,7 +70,7 @@ function createTestDatabase(): DatabaseContext {
|
|||||||
.insert(projects)
|
.insert(projects)
|
||||||
.values({ id: "project-1", name: "Test project" })
|
.values({ id: "project-1", name: "Test project" })
|
||||||
.run();
|
.run();
|
||||||
const board = new DistributionBoardRepository(
|
const board = new DistributionBoardFixtureRepository(
|
||||||
context.db
|
context.db
|
||||||
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
||||||
const section = context.db
|
const section = context.db
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import {
|
|||||||
createDatabaseContext,
|
createDatabaseContext,
|
||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { ProjectDeviceRowSyncProjectCommandRepository } from "../src/db/repositories/project-device-row-sync-project-command.repository.js";
|
import { ProjectDeviceRowSyncProjectCommandRepository } from "../src/db/repositories/project-device-row-sync-project-command.repository.js";
|
||||||
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
@@ -37,7 +37,7 @@ function createTestDatabase(): TestFixture {
|
|||||||
{ id: "project-2", name: "Other project" },
|
{ id: "project-2", name: "Other project" },
|
||||||
])
|
])
|
||||||
.run();
|
.run();
|
||||||
const boards = new DistributionBoardRepository(context.db);
|
const boards = new DistributionBoardFixtureRepository(context.db);
|
||||||
const board = boards.createWithCircuitListAndDefaultSections(
|
const board = boards.createWithCircuitListAndDefaultSections(
|
||||||
"project-1",
|
"project-1",
|
||||||
"UV-01"
|
"UV-01"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import {
|
|||||||
createDatabaseContext,
|
createDatabaseContext,
|
||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { ProjectDeviceStructureProjectCommandRepository } from "../src/db/repositories/project-device-structure-project-command.repository.js";
|
import { ProjectDeviceStructureProjectCommandRepository } from "../src/db/repositories/project-device-structure-project-command.repository.js";
|
||||||
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
@@ -53,7 +53,7 @@ function createTestDatabase(): DatabaseContext {
|
|||||||
{ id: "project-2", name: "Other project" },
|
{ id: "project-2", name: "Other project" },
|
||||||
])
|
])
|
||||||
.run();
|
.run();
|
||||||
const boards = new DistributionBoardRepository(context.db);
|
const boards = new DistributionBoardFixtureRepository(context.db);
|
||||||
const board = boards.createWithCircuitListAndDefaultSections(
|
const board = boards.createWithCircuitListAndDefaultSections(
|
||||||
"project-1",
|
"project-1",
|
||||||
"UV-01"
|
"UV-01"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { CircuitDeviceRowProjectCommandRepository } from "../src/db/repositories/circuit-device-row-project-command.repository.js";
|
import { CircuitDeviceRowProjectCommandRepository } from "../src/db/repositories/circuit-device-row-project-command.repository.js";
|
||||||
import { CircuitProjectCommandRepository } from "../src/db/repositories/circuit-project-command.repository.js";
|
import { CircuitProjectCommandRepository } from "../src/db/repositories/circuit-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
import { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
import { circuitSections } from "../src/db/schema/circuit-sections.js";
|
||||||
@@ -30,7 +30,7 @@ function createTestDatabase(): DatabaseContext {
|
|||||||
.insert(projects)
|
.insert(projects)
|
||||||
.values({ id: "project-1", name: "Test project" })
|
.values({ id: "project-1", name: "Test project" })
|
||||||
.run();
|
.run();
|
||||||
const board = new DistributionBoardRepository(
|
const board = new DistributionBoardFixtureRepository(
|
||||||
context.db
|
context.db
|
||||||
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
||||||
const section = context.db
|
const section = context.db
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
createDatabaseContext,
|
createDatabaseContext,
|
||||||
type DatabaseContext,
|
type DatabaseContext,
|
||||||
} from "../src/db/database-context.js";
|
} from "../src/db/database-context.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { ProjectSnapshotRepository } from "../src/db/repositories/project-snapshot.repository.js";
|
import { ProjectSnapshotRepository } from "../src/db/repositories/project-snapshot.repository.js";
|
||||||
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js";
|
||||||
import { circuitLists } from "../src/db/schema/circuit-lists.js";
|
import { circuitLists } from "../src/db/schema/circuit-lists.js";
|
||||||
@@ -37,7 +37,7 @@ function createTestDatabase(): DatabaseContext {
|
|||||||
threePhaseVoltageV: 400,
|
threePhaseVoltageV: 400,
|
||||||
})
|
})
|
||||||
.run();
|
.run();
|
||||||
const board = new DistributionBoardRepository(
|
const board = new DistributionBoardFixtureRepository(
|
||||||
context.db
|
context.db
|
||||||
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
||||||
const list = context.db
|
const list = context.db
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { CircuitProjectCommandRepository } from "../src/db/repositories/circuit-
|
|||||||
import { CircuitSectionRenumberProjectCommandRepository } from "../src/db/repositories/circuit-section-renumber-project-command.repository.js";
|
import { CircuitSectionRenumberProjectCommandRepository } from "../src/db/repositories/circuit-section-renumber-project-command.repository.js";
|
||||||
import { CircuitSectionReorderProjectCommandRepository } from "../src/db/repositories/circuit-section-reorder-project-command.repository.js";
|
import { CircuitSectionReorderProjectCommandRepository } from "../src/db/repositories/circuit-section-reorder-project-command.repository.js";
|
||||||
import { CircuitStructureProjectCommandRepository } from "../src/db/repositories/circuit-structure-project-command.repository.js";
|
import { CircuitStructureProjectCommandRepository } from "../src/db/repositories/circuit-structure-project-command.repository.js";
|
||||||
import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js";
|
import { DistributionBoardFixtureRepository } from "./support/distribution-board-fixture.js";
|
||||||
import { DistributionBoardStructureProjectCommandRepository } from "../src/db/repositories/distribution-board-structure-project-command.repository.js";
|
import { DistributionBoardStructureProjectCommandRepository } from "../src/db/repositories/distribution-board-structure-project-command.repository.js";
|
||||||
import { ProjectDeviceProjectCommandRepository } from "../src/db/repositories/project-device-project-command.repository.js";
|
import { ProjectDeviceProjectCommandRepository } from "../src/db/repositories/project-device-project-command.repository.js";
|
||||||
import { ProjectDeviceRowSyncProjectCommandRepository } from "../src/db/repositories/project-device-row-sync-project-command.repository.js";
|
import { ProjectDeviceRowSyncProjectCommandRepository } from "../src/db/repositories/project-device-row-sync-project-command.repository.js";
|
||||||
@@ -50,7 +50,7 @@ function createTestDatabase(): DatabaseContext {
|
|||||||
.insert(projects)
|
.insert(projects)
|
||||||
.values({ id: "project-1", name: "Ausgangsprojekt" })
|
.values({ id: "project-1", name: "Ausgangsprojekt" })
|
||||||
.run();
|
.run();
|
||||||
const board = new DistributionBoardRepository(
|
const board = new DistributionBoardFixtureRepository(
|
||||||
context.db
|
context.db
|
||||||
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
).createWithCircuitListAndDefaultSections("project-1", "UV-01");
|
||||||
const list = context.db
|
const list = context.db
|
||||||
@@ -194,7 +194,7 @@ function changeCompleteProjectState(context: DatabaseContext) {
|
|||||||
simultaneityFactor: 1,
|
simultaneityFactor: 1,
|
||||||
})
|
})
|
||||||
.run();
|
.run();
|
||||||
new DistributionBoardRepository(
|
new DistributionBoardFixtureRepository(
|
||||||
context.db
|
context.db
|
||||||
).createWithCircuitListAndDefaultSections("project-1", "UV-02");
|
).createWithCircuitListAndDefaultSections("project-1", "UV-02");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import type { AppDatabase } from "../../src/db/database-context.js";
|
||||||
|
import { circuitLists } from "../../src/db/schema/circuit-lists.js";
|
||||||
|
import { circuitSections } from "../../src/db/schema/circuit-sections.js";
|
||||||
|
import { distributionBoards } from "../../src/db/schema/distribution-boards.js";
|
||||||
|
import { createDistributionBoardStructureSnapshot } from "../../src/domain/models/distribution-board-structure-project-command.model.js";
|
||||||
|
|
||||||
|
export class DistributionBoardFixtureRepository {
|
||||||
|
constructor(private readonly database: AppDatabase) {}
|
||||||
|
|
||||||
|
createWithCircuitListAndDefaultSections(
|
||||||
|
projectId: string,
|
||||||
|
name: string
|
||||||
|
) {
|
||||||
|
const structure = createDistributionBoardStructureSnapshot(
|
||||||
|
projectId,
|
||||||
|
name
|
||||||
|
);
|
||||||
|
this.database.transaction((tx) => {
|
||||||
|
tx.insert(distributionBoards)
|
||||||
|
.values(structure.distributionBoard)
|
||||||
|
.run();
|
||||||
|
tx.insert(circuitLists).values(structure.circuitList).run();
|
||||||
|
tx.insert(circuitSections).values(structure.sections).run();
|
||||||
|
});
|
||||||
|
return structure.distributionBoard;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user