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
|
|
@ -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.");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue