Make circuit reordering atomic

This commit is contained in:
2026-07-23 17:30:40 +02:00
parent 7d276d1139
commit b0fc2b4fbf
4 changed files with 105 additions and 34 deletions
+40
View File
@@ -137,6 +137,46 @@ export class CircuitRepository {
.orderBy(asc(circuits.sortOrder), asc(circuits.equipmentIdentifier));
}
updateSortOrdersSafely(sectionId: string, orderedCircuitIds: string[]) {
if (orderedCircuitIds.length === 0) {
return;
}
if (new Set(orderedCircuitIds).size !== orderedCircuitIds.length) {
throw new Error("Stromkreise dürfen in der Reihenfolge nicht mehrfach vorkommen.");
}
db.transaction((tx) => {
const sectionCircuits = tx
.select({ id: circuits.id })
.from(circuits)
.where(eq(circuits.sectionId, sectionId))
.all();
const sectionCircuitIds = new Set(sectionCircuits.map((circuit) => circuit.id));
if (
sectionCircuits.length !== orderedCircuitIds.length ||
orderedCircuitIds.some((circuitId) => !sectionCircuitIds.has(circuitId))
) {
throw new Error("Die Reihenfolge muss alle Stromkreise des Bereichs enthalten.");
}
for (let index = 0; index < orderedCircuitIds.length; index += 1) {
const result = tx
.update(circuits)
.set({ sortOrder: (index + 1) * 10 })
.where(
and(
eq(circuits.sectionId, sectionId),
eq(circuits.id, orderedCircuitIds[index])
)
)
.run();
if (result.changes !== 1) {
throw new Error("Ein Stromkreis wurde vor Abschluss der Sortierung verändert.");
}
}
});
}
async updateEquipmentIdentifiersSafely(
circuitListId: string,
updates: Array<{ id: string; equipmentIdentifier: string }>,