Create clean release database baseline
This commit is contained in:
@@ -1,26 +0,0 @@
|
||||
import { db } from "../src/db/client.js";
|
||||
import { CircuitListRepository } from "../src/db/repositories/circuit-list.repository.js";
|
||||
import { CircuitSectionRepository } from "../src/db/repositories/circuit-section.repository.js";
|
||||
import { ProjectRepository } from "../src/db/repositories/project.repository.js";
|
||||
|
||||
const projectRepository = new ProjectRepository(db);
|
||||
const circuitListRepository = new CircuitListRepository(db);
|
||||
const circuitSectionRepository = new CircuitSectionRepository(db);
|
||||
|
||||
async function run() {
|
||||
const projects = await projectRepository.list();
|
||||
let totalLists = 0;
|
||||
for (const project of projects) {
|
||||
const lists = await circuitListRepository.listByProject(project.id);
|
||||
for (const list of lists) {
|
||||
await circuitSectionRepository.createDefaults(list.id);
|
||||
totalLists += 1;
|
||||
}
|
||||
}
|
||||
console.log(`Section backfill done for ${totalLists} circuit list(s).`);
|
||||
}
|
||||
|
||||
run().catch((error) => {
|
||||
console.error("Section backfill failed:", error);
|
||||
process.exit(1);
|
||||
});
|
||||
@@ -1,61 +0,0 @@
|
||||
import { db } from "../src/db/client.js";
|
||||
import { CircuitRepository } from "../src/db/repositories/circuit.repository.js";
|
||||
import { CircuitListRepository } from "../src/db/repositories/circuit-list.repository.js";
|
||||
import { CircuitSectionRepository } from "../src/db/repositories/circuit-section.repository.js";
|
||||
import { LegacyConsumerMigrationRepository } from "../src/db/repositories/legacy-consumer-migration.repository.js";
|
||||
import { ProjectRepository } from "../src/db/repositories/project.repository.js";
|
||||
import { RoomRepository } from "../src/db/repositories/room.repository.js";
|
||||
import { LegacyConsumerMigrationService } from "../src/domain/services/legacy-consumer-migration.service.js";
|
||||
|
||||
const projectRepository = new ProjectRepository(db);
|
||||
const circuitListRepository = new CircuitListRepository(db);
|
||||
const migrationRepository = new LegacyConsumerMigrationRepository(db);
|
||||
const migrationService = new LegacyConsumerMigrationService({
|
||||
circuitListReader: circuitListRepository,
|
||||
sectionStore: new CircuitSectionRepository(db),
|
||||
circuitReader: new CircuitRepository(db),
|
||||
roomReader: new RoomRepository(db),
|
||||
migrationStore: migrationRepository,
|
||||
});
|
||||
|
||||
async function run() {
|
||||
const projects = await projectRepository.list();
|
||||
const reports = [];
|
||||
|
||||
for (const project of projects) {
|
||||
const lists = await circuitListRepository.listByProject(project.id);
|
||||
for (const list of lists) {
|
||||
const report = await migrationService.migrateCircuitList(project.id, list.id);
|
||||
reports.push({
|
||||
projectId: project.id,
|
||||
circuitListId: list.id,
|
||||
legacyConsumerCount: report.legacyConsumerCount,
|
||||
createdCircuitCount: report.createdCircuitCount,
|
||||
createdDeviceRowCount: report.createdDeviceRowCount,
|
||||
generatedIdentifiers: report.generatedIdentifiers.length,
|
||||
unassignedRows: report.unassignedRows.length,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const unmigratedConsumers =
|
||||
await migrationRepository.listUnmigratedConsumers();
|
||||
if (unmigratedConsumers.length > 0) {
|
||||
const withoutCircuitList = unmigratedConsumers.filter(
|
||||
(consumer) => !consumer.circuitListId
|
||||
).length;
|
||||
throw new Error(
|
||||
`Cutover verification failed: ${unmigratedConsumers.length} legacy consumer(s) remain unmigrated` +
|
||||
` (${withoutCircuitList} without a circuit list).`
|
||||
);
|
||||
}
|
||||
|
||||
console.log("Legacy consumer migration summary:");
|
||||
console.table(reports);
|
||||
console.log("Cutover verification passed: all legacy consumers are mapped.");
|
||||
}
|
||||
|
||||
run().catch((error) => {
|
||||
console.error("Legacy consumer migration failed:", error);
|
||||
process.exit(1);
|
||||
});
|
||||
@@ -12,8 +12,6 @@ const requiredTables = [
|
||||
"circuit_protection_devices",
|
||||
"distribution_board_components",
|
||||
"distribution_board_component_protection_devices",
|
||||
"legacy_consumer_circuit_migrations",
|
||||
"legacy_consumer_migration_reports",
|
||||
];
|
||||
|
||||
const tablePlaceholders = requiredTables.map(() => "?").join(", ");
|
||||
@@ -57,6 +55,14 @@ const circuitColumns = new Set(
|
||||
db.prepare("PRAGMA table_info(circuits)").all().map((column) => column.name)
|
||||
);
|
||||
const missingCircuitColumns = requiredCircuitColumns.filter((name) => !circuitColumns.has(name));
|
||||
const removedCircuitColumns = [
|
||||
"protection_type",
|
||||
"protection_rated_current",
|
||||
"protection_characteristic",
|
||||
];
|
||||
const remainingRemovedCircuitColumns = removedCircuitColumns.filter((name) =>
|
||||
circuitColumns.has(name)
|
||||
);
|
||||
const requiredCircuitSectionColumns = ["category", "group_number"];
|
||||
const circuitSectionColumns = new Set(
|
||||
db
|
||||
@@ -164,6 +170,14 @@ if (missingCircuitColumns.length > 0) {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (remainingRemovedCircuitColumns.length > 0) {
|
||||
console.error(
|
||||
"Transitional circuit protection columns still present:",
|
||||
remainingRemovedCircuitColumns.join(", ")
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (missingCircuitSectionColumns.length > 0) {
|
||||
console.error(
|
||||
"Missing circuit-section columns:",
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
import { readdirSync } from "node:fs";
|
||||
import { spawnSync } from "node:child_process";
|
||||
import path from "node:path";
|
||||
|
||||
const testFiles = readdirSync(path.resolve("tests"), {
|
||||
withFileTypes: true,
|
||||
})
|
||||
.filter((entry) => entry.isFile() && entry.name.endsWith(".test.ts"))
|
||||
.map((entry) => path.join("tests", entry.name))
|
||||
.sort();
|
||||
|
||||
if (testFiles.length === 0) {
|
||||
throw new Error("No TypeScript test files found.");
|
||||
}
|
||||
|
||||
const watch = process.argv.includes("--watch");
|
||||
const result = spawnSync(
|
||||
process.execPath,
|
||||
[
|
||||
"--import",
|
||||
"tsx",
|
||||
"--test",
|
||||
"--test-concurrency=1",
|
||||
...(watch ? ["--watch"] : []),
|
||||
...testFiles,
|
||||
],
|
||||
{ stdio: "inherit" }
|
||||
);
|
||||
|
||||
process.exit(result.status ?? 1);
|
||||
Reference in New Issue
Block a user