import { circuitDeviceRowUpdateCommandType } from "../../domain/models/circuit-device-row-project-command.model.js"; import { assertCircuitListBulkUpdateProjectCommand, createCircuitListBulkUpdateProjectCommand, type CircuitListBulkUpdateEntry, } from "../../domain/models/circuit-list-bulk-update-project-command.model.js"; import { circuitUpdateCommandType } from "../../domain/models/circuit-project-command.model.js"; import type { CircuitListBulkUpdateProjectCommandStore, ExecuteCircuitListBulkUpdateCommandInput, } from "../../domain/ports/circuit-list-bulk-update-project-command.store.js"; import type { AppDatabase } from "../database-context.js"; import { applyCircuitDeviceRowUpdateCommand } from "./circuit-device-row-project-command.repository.js"; import { applyCircuitUpdateCommand } from "./circuit-project-command.repository.js"; import { applyCircuitProtectionUpdateCommand } from "./circuit-protection-project-command.repository.js"; import { executeProjectCommandTransactionWithAppliedForward } from "./project-command-transaction.persistence.js"; export class CircuitListBulkUpdateProjectCommandRepository implements CircuitListBulkUpdateProjectCommandStore { constructor(private readonly database: AppDatabase) {} // Applies every update with the same rules as its single command inside // one transaction. Any rejected update rolls the whole edit back. execute(input: ExecuteCircuitListBulkUpdateCommandInput) { assertCircuitListBulkUpdateProjectCommand(input.command); return executeProjectCommandTransactionWithAppliedForward( this.database, input, (tx) => { const forward: CircuitListBulkUpdateEntry[] = []; const inverse: CircuitListBulkUpdateEntry[] = []; for (const update of input.command.payload.updates) { const applied = applyBulkUpdateEntry(tx, input, update); forward.push(applied.forward); inverse.unshift(applied.inverse); } return { forward: createCircuitListBulkUpdateProjectCommand(forward), inverse: createCircuitListBulkUpdateProjectCommand(inverse), }; } ); } } function applyBulkUpdateEntry( tx: AppDatabase, input: ExecuteCircuitListBulkUpdateCommandInput, update: CircuitListBulkUpdateEntry ): { forward: CircuitListBulkUpdateEntry; inverse: CircuitListBulkUpdateEntry } { const context = { projectId: input.projectId, source: input.source }; if (update.type === circuitUpdateCommandType) { return applyCircuitUpdateCommand(tx, { ...context, command: update }); } if (update.type === circuitDeviceRowUpdateCommandType) { return applyCircuitDeviceRowUpdateCommand(tx, { ...context, command: update, }); } return { forward: update, inverse: applyCircuitProtectionUpdateCommand(tx, { ...context, command: update, }), }; }