Persist project device synchronization

This commit is contained in:
2026-07-24 11:47:03 +02:00
parent e930cb75b8
commit 3977a6e6e1
20 changed files with 300 additions and 747 deletions
@@ -1,7 +1,3 @@
import { db } from "../../db/client.js";
import { ProjectDeviceRowSyncRepository } from "../../db/repositories/project-device-row-sync.repository.js";
import { ProjectDeviceSyncService } from "../../domain/services/project-device-sync.service.js";
export const projectDeviceSyncService = new ProjectDeviceSyncService({
deviceRowSyncStore: new ProjectDeviceRowSyncRepository(db),
});
export const projectDeviceSyncService = new ProjectDeviceSyncService();
@@ -14,8 +14,6 @@ import {
createProjectDeviceCommandSchema,
disconnectProjectDeviceRowsSchema,
projectDeviceStructureCommandSchema,
reconnectProjectDeviceRowsSchema,
restoreProjectDeviceRowsSchema,
synchronizeProjectDeviceRowsSchema,
updateProjectDeviceCommandSchema,
} from "../../shared/validation/project-device.schemas.js";
@@ -218,32 +216,25 @@ export async function synchronizeProjectDeviceRows(req: Request, res: Response)
return res.status(400).json({ error: parsed.error.flatten() });
}
try {
const result = await projectDeviceSyncService.synchronize(
const command = await projectDeviceSyncService.createSynchronizeCommand(
projectId,
projectDeviceId,
parsed.data.rowIds,
parsed.data.fields
);
return res.json(result);
const result = projectCommandService.executeUser({
projectId,
expectedRevision: parsed.data.expectedRevision,
description: "Projektgerät in Stromkreiszeilen synchronisieren",
command,
});
const preview = await projectDeviceSyncService.getPreview(
projectId,
projectDeviceId
);
return res.json({ ...result, preview });
} catch (error) {
return res.status(400).json({ error: error instanceof Error ? error.message : "Failed to synchronize rows." });
}
}
export async function restoreProjectDeviceRows(req: Request, res: Response) {
const { projectId, projectDeviceId } = req.params;
if (typeof projectId !== "string" || typeof projectDeviceId !== "string") {
return res.status(400).json({ error: "Invalid parameters" });
}
const parsed = restoreProjectDeviceRowsSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({ error: parsed.error.flatten() });
}
try {
const preview = await projectDeviceSyncService.restore(projectId, projectDeviceId, parsed.data.rows);
return res.json(preview);
} catch (error) {
return res.status(400).json({ error: error instanceof Error ? error.message : "Failed to restore rows." });
return respondWithProjectCommandError(error, res);
}
}
@@ -257,26 +248,23 @@ export async function disconnectProjectDeviceRows(req: Request, res: Response) {
return res.status(400).json({ error: parsed.error.flatten() });
}
try {
const result = await projectDeviceSyncService.disconnect(projectId, projectDeviceId, parsed.data.rowIds);
return res.json(result);
const command = await projectDeviceSyncService.createDisconnectCommand(
projectId,
projectDeviceId,
parsed.data.rowIds
);
const result = projectCommandService.executeUser({
projectId,
expectedRevision: parsed.data.expectedRevision,
description: "Projektgerät-Verknüpfungen trennen",
command,
});
const preview = await projectDeviceSyncService.getPreview(
projectId,
projectDeviceId
);
return res.json({ ...result, preview });
} catch (error) {
return res.status(400).json({ error: error instanceof Error ? error.message : "Failed to disconnect rows." });
}
}
export async function reconnectProjectDeviceRows(req: Request, res: Response) {
const { projectId, projectDeviceId } = req.params;
if (typeof projectId !== "string" || typeof projectDeviceId !== "string") {
return res.status(400).json({ error: "Invalid parameters" });
}
const parsed = reconnectProjectDeviceRowsSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({ error: parsed.error.flatten() });
}
try {
const preview = await projectDeviceSyncService.reconnect(projectId, projectDeviceId, parsed.data.rowIds);
return res.json(preview);
} catch (error) {
return res.status(400).json({ error: error instanceof Error ? error.message : "Failed to reconnect rows." });
return respondWithProjectCommandError(error, res);
}
}
@@ -6,8 +6,6 @@ import {
disconnectProjectDeviceRows,
getProjectDeviceSyncPreview,
listProjectDevicesByProject,
reconnectProjectDeviceRows,
restoreProjectDeviceRows,
synchronizeProjectDeviceRows,
updateProjectDevice,
} from "../controllers/project-device.controller.js";
@@ -19,8 +17,6 @@ projectDeviceRouter.post("/projects/:projectId", createProjectDevice);
projectDeviceRouter.post("/projects/:projectId/import-global/:globalDeviceId", copyGlobalDeviceToProject);
projectDeviceRouter.get("/projects/:projectId/:projectDeviceId/links", getProjectDeviceSyncPreview);
projectDeviceRouter.post("/projects/:projectId/:projectDeviceId/synchronize", synchronizeProjectDeviceRows);
projectDeviceRouter.post("/projects/:projectId/:projectDeviceId/restore", restoreProjectDeviceRows);
projectDeviceRouter.post("/projects/:projectId/:projectDeviceId/disconnect", disconnectProjectDeviceRows);
projectDeviceRouter.post("/projects/:projectId/:projectDeviceId/reconnect", reconnectProjectDeviceRows);
projectDeviceRouter.put("/projects/:projectId/:projectDeviceId", updateProjectDevice);
projectDeviceRouter.delete("/projects/:projectId/:projectDeviceId", deleteProjectDevice);