forked from jappel/leistungsbilanz-ts
Add Revit initial import planning
This commit is contained in:
parent
c634570018
commit
c9e5fdd876
10 changed files with 345 additions and 4 deletions
|
|
@ -12,6 +12,7 @@ import { ProjectDeviceRepository } from "../../db/repositories/project-device.re
|
|||
import { ProjectRepository } from "../../db/repositories/project.repository.js";
|
||||
import { RoomRepository } from "../../db/repositories/room.repository.js";
|
||||
import { ExternalCsvConfigurationRepository } from "../../db/repositories/external-csv-configuration.repository.js";
|
||||
import { ExternalModelStateRepository } from "../../db/repositories/external-model-state.repository.js";
|
||||
|
||||
export const circuitDeviceRowRepository =
|
||||
new CircuitDeviceRowRepository(db);
|
||||
|
|
@ -31,3 +32,4 @@ export const projectRepository = new ProjectRepository(db);
|
|||
export const roomRepository = new RoomRepository(db);
|
||||
export const externalCsvConfigurationRepository =
|
||||
new ExternalCsvConfigurationRepository(db);
|
||||
export const externalModelStateRepository = new ExternalModelStateRepository(db);
|
||||
|
|
|
|||
|
|
@ -3,12 +3,21 @@ import type { Request, Response } from "express";
|
|||
import { assertExternalCsvConfiguration } from "../../external-model/csv/external-csv-configuration.js";
|
||||
import { ExternalCsvParseError } from "../../external-model/csv/external-csv-transport.js";
|
||||
import { createExternalCsvPreview } from "../../external-model/application/external-csv-preview.js";
|
||||
import { createExternalInitialImportPlan } from "../../external-model/application/external-initial-import-plan.js";
|
||||
import { createExternalCsvConfigurationUpdateProjectCommand } from "../../domain/models/external-csv-configuration-project-command.model.js";
|
||||
import {
|
||||
previewExternalCsvSchema,
|
||||
planExternalInitialImportSchema,
|
||||
updateExternalCsvConfigurationSchema,
|
||||
} from "../../shared/validation/external-csv.schemas.js";
|
||||
import { externalCsvConfigurationRepository } from "../composition/application-repositories.js";
|
||||
import {
|
||||
distributionBoardRepository,
|
||||
externalCsvConfigurationRepository,
|
||||
externalModelStateRepository,
|
||||
floorRepository,
|
||||
projectDeviceRepository,
|
||||
roomRepository,
|
||||
} from "../composition/application-repositories.js";
|
||||
import { projectCommandService } from "../composition/project-command-stores.js";
|
||||
import { respondWithProjectCommandError } from "./project-command.controller.js";
|
||||
|
||||
|
|
@ -93,6 +102,58 @@ export function previewExternalCsv(req: Request, res: Response) {
|
|||
}
|
||||
}
|
||||
|
||||
export async function planExternalInitialImport(req: Request, res: Response) {
|
||||
const projectId = getProjectId(req, res);
|
||||
if (!projectId) return;
|
||||
const parsed = planExternalInitialImportSchema.safeParse(req.body);
|
||||
if (!parsed.success) {
|
||||
return res.status(400).json({ error: parsed.error.flatten() });
|
||||
}
|
||||
const stored = externalCsvConfigurationRepository.getByProject(projectId);
|
||||
if (!stored.projectExists) {
|
||||
return res.status(404).json({ error: "Project not found" });
|
||||
}
|
||||
if (!stored.configuration) {
|
||||
return res.status(409).json({
|
||||
error: "Für das Projekt ist noch keine Revit-CSV-Konfiguration gespeichert.",
|
||||
code: "EXTERNAL_CSV_CONFIGURATION_REQUIRED",
|
||||
});
|
||||
}
|
||||
const externalState = externalModelStateRepository.getByProject(projectId);
|
||||
if (externalState.state.source !== null) {
|
||||
return res.status(409).json({
|
||||
error: "Für dieses Projekt wurde bereits ein Revit-Modell importiert.",
|
||||
code: "EXTERNAL_INITIAL_IMPORT_ALREADY_APPLIED",
|
||||
});
|
||||
}
|
||||
try {
|
||||
const bytes = decodeBase64(parsed.data.contentBase64);
|
||||
const [floors, rooms, distributionBoards, projectDevices] = await Promise.all([
|
||||
floorRepository.listByProject(projectId),
|
||||
roomRepository.listByProject(projectId),
|
||||
distributionBoardRepository.listByProject(projectId),
|
||||
projectDeviceRepository.listByProject(projectId),
|
||||
]);
|
||||
return res.json(createExternalInitialImportPlan({
|
||||
fileName: parsed.data.fileName,
|
||||
bytes,
|
||||
configurationVersion: stored.configuration.configurationVersion,
|
||||
configuration: stored.configuration.configuration,
|
||||
floors,
|
||||
rooms,
|
||||
distributionBoards,
|
||||
projectDevices,
|
||||
}));
|
||||
} catch (error) {
|
||||
if (error instanceof ExternalCsvParseError) {
|
||||
return res.status(400).json({ error: error.message, code: error.code });
|
||||
}
|
||||
return res.status(400).json({
|
||||
error: error instanceof Error ? error.message : "Erstimport-Planung fehlgeschlagen.",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function decodeBase64(value: string) {
|
||||
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(value) || value.length % 4 !== 0) {
|
||||
throw new Error("CSV-Inhalt ist nicht gültig Base64-kodiert.");
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ import {
|
|||
import {
|
||||
getExternalCsvConfiguration,
|
||||
previewExternalCsv,
|
||||
planExternalInitialImport,
|
||||
updateExternalCsvConfiguration,
|
||||
} from "../controllers/external-csv.controller.js";
|
||||
|
||||
|
|
@ -52,6 +53,10 @@ projectRouter.post("/:projectId/import", importProjectTransfer);
|
|||
projectRouter.get("/:projectId/external-csv/configuration", getExternalCsvConfiguration);
|
||||
projectRouter.put("/:projectId/external-csv/configuration", updateExternalCsvConfiguration);
|
||||
projectRouter.post("/:projectId/external-csv/preview", previewExternalCsv);
|
||||
projectRouter.post(
|
||||
"/:projectId/external-csv/initial-import/plan",
|
||||
planExternalInitialImport
|
||||
);
|
||||
projectRouter.get("/:projectId/history", getProjectHistory);
|
||||
projectRouter.get("/:projectId/history/revisions", listProjectRevisions);
|
||||
projectRouter.post("/:projectId/commands", executeProjectCommand);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue