From d23e7d990c15ba0b11cca84e0b7918239662a599 Mon Sep 17 00:00:00 2001 From: Julian Appel Date: Sun, 26 Jul 2026 11:05:26 +0200 Subject: [PATCH] Remove obsolete repository writes --- AGENTS.md | 3 + docs/current-architecture.md | 7 ++ docs/development-workflow.md | 3 + docs/spec/07-implementation-phases-todo.md | 8 +- package.json | 4 +- .../circuit-device-row.repository.ts | 52 ---------- .../repositories/circuit-list.repository.ts | 47 --------- src/db/repositories/circuit.repository.ts | 93 +----------------- .../distribution-board.repository.ts | 46 +-------- src/db/repositories/project.repository.ts | 4 - ...ow-move-project-command.repository.test.ts | 4 +- ...ice-row-project-command.repository.test.ts | 4 +- ...ructure-project-command.repository.test.ts | 4 +- ...circuit-project-command.repository.test.ts | 4 +- ...enumber-project-command.repository.test.ts | 4 +- ...reorder-project-command.repository.test.ts | 4 +- ...ructure-project-command.repository.test.ts | 4 +- tests/distribution-board.repository.test.ts | 98 ------------------- ...gacy-consumer-migration.repository.test.ts | 4 +- tests/project-command.service.test.ts | 4 +- ...ow-sync-project-command.repository.test.ts | 4 +- ...ructure-project-command.repository.test.ts | 4 +- tests/project-history.repository.test.ts | 4 +- tests/project-snapshot.repository.test.ts | 4 +- ...t-state-restore-command.repository.test.ts | 6 +- tests/support/distribution-board-fixture.ts | 27 +++++ 26 files changed, 79 insertions(+), 371 deletions(-) delete mode 100644 tests/distribution-board.repository.test.ts create mode 100644 tests/support/distribution-board-fixture.ts diff --git a/AGENTS.md b/AGENTS.md index a0d5bec..b0da1f6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,6 +21,9 @@ It must support circuits, device rows, project devices, drag-and-drop restructur `src/frontend/components/circuit-grid-*.ts` modules. - Critical multi-write commands use injected transaction repositories with real 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 removed. Retained `consumers` rows, migration mappings and reports are upgrade-only diff --git a/docs/current-architecture.md b/docs/current-architecture.md index 8efd85f..9451835 100644 --- a/docs/current-architecture.md +++ b/docs/current-architecture.md @@ -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. - Angewendete Migrationen werden niemals nachträglich verändert. - `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 Transaktionsgrenzen sollen portabel bleiben; Schema und Betriebsmodell benötigen diff --git a/docs/development-workflow.md b/docs/development-workflow.md index 109ee5e..5728a14 100644 --- a/docs/development-workflow.md +++ b/docs/development-workflow.md @@ -83,6 +83,9 @@ Invoke-WebRequest http://localhost:3000/health ``` 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 diff --git a/docs/spec/07-implementation-phases-todo.md b/docs/spec/07-implementation-phases-todo.md index c6571b7..4c3da03 100644 --- a/docs/spec/07-implementation-phases-todo.md +++ b/docs/spec/07-implementation-phases-todo.md @@ -326,8 +326,9 @@ Implemented foundation: - database contexts can be created independently from the production singleton - SQLite foreign-key enforcement is enabled explicitly for every context -- the distribution-board repository receives its database dependency explicitly -- distribution-board setup has real in-memory SQLite commit and rollback coverage using production migrations +- the read-only distribution-board repository receives its database dependency explicitly +- 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 - 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 @@ -342,6 +343,9 @@ Implemented foundation: - 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 - 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 - retained legacy rows are accessible only through explicit database upgrade tooling - project devices no longer persist duplicate legacy power, phase, cosPhi or remark fields diff --git a/package.json b/package.json index 568f6a8..47a697c 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "build:api": "tsc -p tsconfig.json", "build:web": "next build", "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: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": "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-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:migrate": "drizzle-kit migrate", "db:backup": "tsx scripts/db-backup.ts", diff --git a/src/db/repositories/circuit-device-row.repository.ts b/src/db/repositories/circuit-device-row.repository.ts index 413f296..d9228d3 100644 --- a/src/db/repositories/circuit-device-row.repository.ts +++ b/src/db/repositories/circuit-device-row.repository.ts @@ -1,33 +1,11 @@ -import crypto from "node:crypto"; import { and, asc, eq, inArray } from "drizzle-orm"; import { db } from "../client.js"; import { circuitDeviceRows } from "../schema/circuit-device-rows.js"; import { circuitLists } from "../schema/circuit-lists.js"; import { circuits } from "../schema/circuits.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 { - 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[]) { if (!circuitIds.length) { return []; @@ -83,34 +61,4 @@ export class CircuitDeviceRowRepository { .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)); - } - } diff --git a/src/db/repositories/circuit-list.repository.ts b/src/db/repositories/circuit-list.repository.ts index 5ed3788..87544e1 100644 --- a/src/db/repositories/circuit-list.repository.ts +++ b/src/db/repositories/circuit-list.repository.ts @@ -7,44 +7,6 @@ export class CircuitListRepository { 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) { const [row] = await db .select() @@ -53,13 +15,4 @@ export class CircuitListRepository { .limit(1); return row ?? null; } - - async findByIdByListIdOnly(circuitListId: string) { - const [row] = await db - .select() - .from(circuitLists) - .where(eq(circuitLists.id, circuitListId)) - .limit(1); - return row ?? null; - } } diff --git a/src/db/repositories/circuit.repository.ts b/src/db/repositories/circuit.repository.ts index 453a07a..9f1e3b9 100644 --- a/src/db/repositories/circuit.repository.ts +++ b/src/db/repositories/circuit.repository.ts @@ -1,25 +1,8 @@ -import crypto from "node:crypto"; -import { and, asc, eq, ne } from "drizzle-orm"; +import { asc, eq } from "drizzle-orm"; import { db } from "../client.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 { - 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) { return db .select() @@ -28,79 +11,6 @@ export class CircuitRepository { .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) { return db .select() @@ -108,5 +18,4 @@ export class CircuitRepository { .where(eq(circuits.sectionId, sectionId)) .orderBy(asc(circuits.sortOrder), asc(circuits.equipmentIdentifier)); } - } diff --git a/src/db/repositories/distribution-board.repository.ts b/src/db/repositories/distribution-board.repository.ts index cb9a690..aaa2cc7 100644 --- a/src/db/repositories/distribution-board.repository.ts +++ b/src/db/repositories/distribution-board.repository.ts @@ -1,10 +1,6 @@ -import crypto from "node:crypto"; -import { and, eq } from "drizzle-orm"; +import { eq } from "drizzle-orm"; 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 { createDefaultCircuitSectionValues } from "./circuit-section.repository.js"; export class DistributionBoardRepository { constructor(private readonly database: AppDatabase) {} @@ -16,44 +12,4 @@ export class DistributionBoardRepository { .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); - } } diff --git a/src/db/repositories/project.repository.ts b/src/db/repositories/project.repository.ts index 3af0eed..39976b8 100644 --- a/src/db/repositories/project.repository.ts +++ b/src/db/repositories/project.repository.ts @@ -28,8 +28,4 @@ export class ProjectRepository { const [row] = await db.select().from(projects).where(eq(projects.id, projectId)).limit(1); return row ?? null; } - - async delete(projectId: string) { - await db.delete(projects).where(eq(projects.id, projectId)); - } } diff --git a/tests/circuit-device-row-move-project-command.repository.test.ts b/tests/circuit-device-row-move-project-command.repository.test.ts index 2e25558..cf15965 100644 --- a/tests/circuit-device-row-move-project-command.repository.test.ts +++ b/tests/circuit-device-row-move-project-command.repository.test.ts @@ -8,7 +8,7 @@ import { type DatabaseContext, } from "../src/db/database-context.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 { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; import { circuitSections } from "../src/db/schema/circuit-sections.js"; @@ -39,7 +39,7 @@ function createTestDatabase(): TestFixture { { id: "project-2", name: "Other project" }, ]) .run(); - const boards = new DistributionBoardRepository(context.db); + const boards = new DistributionBoardFixtureRepository(context.db); const board = boards.createWithCircuitListAndDefaultSections( "project-1", "UV-01" diff --git a/tests/circuit-device-row-project-command.repository.test.ts b/tests/circuit-device-row-project-command.repository.test.ts index a7b486c..1bcf1b3 100644 --- a/tests/circuit-device-row-project-command.repository.test.ts +++ b/tests/circuit-device-row-project-command.repository.test.ts @@ -8,7 +8,7 @@ import { type DatabaseContext, } from "../src/db/database-context.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 { circuitSections } from "../src/db/schema/circuit-sections.js"; import { circuits } from "../src/db/schema/circuits.js"; @@ -34,7 +34,7 @@ function createTestDatabase(): DatabaseContext { ]) .run(); - const boards = new DistributionBoardRepository(context.db); + const boards = new DistributionBoardFixtureRepository(context.db); const board = boards.createWithCircuitListAndDefaultSections( "project-1", "UV-01" diff --git a/tests/circuit-device-row-structure-project-command.repository.test.ts b/tests/circuit-device-row-structure-project-command.repository.test.ts index b732e32..c16c6ed 100644 --- a/tests/circuit-device-row-structure-project-command.repository.test.ts +++ b/tests/circuit-device-row-structure-project-command.repository.test.ts @@ -8,7 +8,7 @@ import { type DatabaseContext, } from "../src/db/database-context.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 { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; import { circuitSections } from "../src/db/schema/circuit-sections.js"; @@ -36,7 +36,7 @@ function createTestDatabase(): DatabaseContext { ]) .run(); - const boards = new DistributionBoardRepository(context.db); + const boards = new DistributionBoardFixtureRepository(context.db); const board = boards.createWithCircuitListAndDefaultSections( "project-1", "UV-01" diff --git a/tests/circuit-project-command.repository.test.ts b/tests/circuit-project-command.repository.test.ts index d8eed59..b666004 100644 --- a/tests/circuit-project-command.repository.test.ts +++ b/tests/circuit-project-command.repository.test.ts @@ -8,7 +8,7 @@ import { type DatabaseContext, } from "../src/db/database-context.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 { projectRevisions } from "../src/db/schema/project-revisions.js"; import { circuitSections } from "../src/db/schema/circuit-sections.js"; @@ -38,7 +38,7 @@ function createTestFixture(): TestFixture { ]) .run(); - const repository = new DistributionBoardRepository(context.db); + const repository = new DistributionBoardFixtureRepository(context.db); const board = repository.createWithCircuitListAndDefaultSections( "project-1", "UV-01" diff --git a/tests/circuit-section-renumber-project-command.repository.test.ts b/tests/circuit-section-renumber-project-command.repository.test.ts index f480899..e514b22 100644 --- a/tests/circuit-section-renumber-project-command.repository.test.ts +++ b/tests/circuit-section-renumber-project-command.repository.test.ts @@ -8,7 +8,7 @@ import { type DatabaseContext, } from "../src/db/database-context.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 { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; import { circuitSections } from "../src/db/schema/circuit-sections.js"; @@ -35,7 +35,7 @@ function createTestDatabase(): TestFixture { { id: "project-2", name: "Other project" }, ]) .run(); - const boards = new DistributionBoardRepository(context.db); + const boards = new DistributionBoardFixtureRepository(context.db); const board = boards.createWithCircuitListAndDefaultSections( "project-1", "UV-01" diff --git a/tests/circuit-section-reorder-project-command.repository.test.ts b/tests/circuit-section-reorder-project-command.repository.test.ts index f8064cb..dbd9af8 100644 --- a/tests/circuit-section-reorder-project-command.repository.test.ts +++ b/tests/circuit-section-reorder-project-command.repository.test.ts @@ -8,7 +8,7 @@ import { type DatabaseContext, } from "../src/db/database-context.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 { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; import { circuitSections } from "../src/db/schema/circuit-sections.js"; @@ -37,7 +37,7 @@ function createTestDatabase(): TestFixture { { id: "project-2", name: "Other project" }, ]) .run(); - const boards = new DistributionBoardRepository(context.db); + const boards = new DistributionBoardFixtureRepository(context.db); const board = boards.createWithCircuitListAndDefaultSections( "project-1", "UV-01" diff --git a/tests/circuit-structure-project-command.repository.test.ts b/tests/circuit-structure-project-command.repository.test.ts index 9c35c3b..dff33c9 100644 --- a/tests/circuit-structure-project-command.repository.test.ts +++ b/tests/circuit-structure-project-command.repository.test.ts @@ -8,7 +8,7 @@ import { type DatabaseContext, } from "../src/db/database-context.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 { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; import { circuitSections } from "../src/db/schema/circuit-sections.js"; @@ -45,7 +45,7 @@ function createTestDatabase(): TestFixture { ]) .run(); - const boards = new DistributionBoardRepository(context.db); + const boards = new DistributionBoardFixtureRepository(context.db); const board = boards.createWithCircuitListAndDefaultSections( "project-1", "UV-01" diff --git a/tests/distribution-board.repository.test.ts b/tests/distribution-board.repository.test.ts deleted file mode 100644 index 0de56df..0000000 --- a/tests/distribution-board.repository.test.ts +++ /dev/null @@ -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(); - } - }); -}); diff --git a/tests/legacy-consumer-migration.repository.test.ts b/tests/legacy-consumer-migration.repository.test.ts index b9ed99e..ae4f874 100644 --- a/tests/legacy-consumer-migration.repository.test.ts +++ b/tests/legacy-consumer-migration.repository.test.ts @@ -7,7 +7,7 @@ import { createDatabaseContext, type DatabaseContext, } 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 { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; import { circuitSections } from "../src/db/schema/circuit-sections.js"; @@ -23,7 +23,7 @@ function createTestDatabase() { migrationsFolder: path.resolve("src", "db", "migrations"), }); context.db.insert(projects).values({ id: "project-1", name: "Test project" }).run(); - const board = new DistributionBoardRepository( + const board = new DistributionBoardFixtureRepository( context.db ).createWithCircuitListAndDefaultSections("project-1", "UV-01"); const [section] = context.db diff --git a/tests/project-command.service.test.ts b/tests/project-command.service.test.ts index a91b2a1..fc7802a 100644 --- a/tests/project-command.service.test.ts +++ b/tests/project-command.service.test.ts @@ -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 { 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 { 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 { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js"; import { ProjectLocationStructureProjectCommandRepository } from "../src/db/repositories/project-location-structure-project-command.repository.js"; @@ -70,7 +70,7 @@ function createTestDatabase(): DatabaseContext { .insert(projects) .values({ id: "project-1", name: "Test project" }) .run(); - const board = new DistributionBoardRepository( + const board = new DistributionBoardFixtureRepository( context.db ).createWithCircuitListAndDefaultSections("project-1", "UV-01"); const section = context.db diff --git a/tests/project-device-row-sync-project-command.repository.test.ts b/tests/project-device-row-sync-project-command.repository.test.ts index de21da7..75d56a8 100644 --- a/tests/project-device-row-sync-project-command.repository.test.ts +++ b/tests/project-device-row-sync-project-command.repository.test.ts @@ -7,7 +7,7 @@ import { createDatabaseContext, type DatabaseContext, } 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 { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js"; import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; @@ -37,7 +37,7 @@ function createTestDatabase(): TestFixture { { id: "project-2", name: "Other project" }, ]) .run(); - const boards = new DistributionBoardRepository(context.db); + const boards = new DistributionBoardFixtureRepository(context.db); const board = boards.createWithCircuitListAndDefaultSections( "project-1", "UV-01" diff --git a/tests/project-device-structure-project-command.repository.test.ts b/tests/project-device-structure-project-command.repository.test.ts index 817a53f..0bbd5bf 100644 --- a/tests/project-device-structure-project-command.repository.test.ts +++ b/tests/project-device-structure-project-command.repository.test.ts @@ -7,7 +7,7 @@ import { createDatabaseContext, type DatabaseContext, } 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 { ProjectHistoryRepository } from "../src/db/repositories/project-history.repository.js"; import { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; @@ -53,7 +53,7 @@ function createTestDatabase(): DatabaseContext { { id: "project-2", name: "Other project" }, ]) .run(); - const boards = new DistributionBoardRepository(context.db); + const boards = new DistributionBoardFixtureRepository(context.db); const board = boards.createWithCircuitListAndDefaultSections( "project-1", "UV-01" diff --git a/tests/project-history.repository.test.ts b/tests/project-history.repository.test.ts index 6d13a1a..056d929 100644 --- a/tests/project-history.repository.test.ts +++ b/tests/project-history.repository.test.ts @@ -9,7 +9,7 @@ import { } from "../src/db/database-context.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 { 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 { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; import { circuitSections } from "../src/db/schema/circuit-sections.js"; @@ -30,7 +30,7 @@ function createTestDatabase(): DatabaseContext { .insert(projects) .values({ id: "project-1", name: "Test project" }) .run(); - const board = new DistributionBoardRepository( + const board = new DistributionBoardFixtureRepository( context.db ).createWithCircuitListAndDefaultSections("project-1", "UV-01"); const section = context.db diff --git a/tests/project-snapshot.repository.test.ts b/tests/project-snapshot.repository.test.ts index 53d5e25..8936e77 100644 --- a/tests/project-snapshot.repository.test.ts +++ b/tests/project-snapshot.repository.test.ts @@ -8,7 +8,7 @@ import { createDatabaseContext, type DatabaseContext, } 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 { circuitDeviceRows } from "../src/db/schema/circuit-device-rows.js"; import { circuitLists } from "../src/db/schema/circuit-lists.js"; @@ -37,7 +37,7 @@ function createTestDatabase(): DatabaseContext { threePhaseVoltageV: 400, }) .run(); - const board = new DistributionBoardRepository( + const board = new DistributionBoardFixtureRepository( context.db ).createWithCircuitListAndDefaultSections("project-1", "UV-01"); const list = context.db diff --git a/tests/project-state-restore-command.repository.test.ts b/tests/project-state-restore-command.repository.test.ts index d842ff3..a3fdf8c 100644 --- a/tests/project-state-restore-command.repository.test.ts +++ b/tests/project-state-restore-command.repository.test.ts @@ -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 { 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 { 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 { 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"; @@ -50,7 +50,7 @@ function createTestDatabase(): DatabaseContext { .insert(projects) .values({ id: "project-1", name: "Ausgangsprojekt" }) .run(); - const board = new DistributionBoardRepository( + const board = new DistributionBoardFixtureRepository( context.db ).createWithCircuitListAndDefaultSections("project-1", "UV-01"); const list = context.db @@ -194,7 +194,7 @@ function changeCompleteProjectState(context: DatabaseContext) { simultaneityFactor: 1, }) .run(); - new DistributionBoardRepository( + new DistributionBoardFixtureRepository( context.db ).createWithCircuitListAndDefaultSections("project-1", "UV-02"); } diff --git a/tests/support/distribution-board-fixture.ts b/tests/support/distribution-board-fixture.ts new file mode 100644 index 0000000..9e51a22 --- /dev/null +++ b/tests/support/distribution-board-fixture.ts @@ -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; + } +}