feat: Unterstützung für JSON- und Production-Modus hinzugefügt

- API-Handler `updateDigitalOutputsHandler` überarbeitet:
  - JSON-Dateien werden jetzt korrekt im gültigen Format gespeichert (`{ key: value }`)
  - Schreibzugriff im production-Modus blockiert
  - JS-Mock-Struktur vorbereitet (noch nicht aktiv getestet)

- Verzeichnisstruktur vereinheitlicht:
  - JSON-Mocks unter `/mocks/api/SERVICE/`
  - CGI-Platzhalter unter `/public/CPL/`
  - JSMock-Ordner für CPL-Simulation vorbereitet (`/mocks/js-simulator/`)

- README.md um Betriebsmodi erweitert (`NEXT_PUBLIC_CPL_MODE` mit `json`, `jsmock`, `production`)
- `.env`-Dateien angepasst zur besseren Modussteuerung
This commit is contained in:
ISA
2025-06-18 14:06:23 +02:00
parent 4b7d93c64e
commit 3e6c973f3b
13 changed files with 129 additions and 78 deletions

View File

@@ -1,4 +1,4 @@
// /pages/api/cpl/digitalOutputsAPIHandler.ts
// /pages/api/cpl/analogeEingaengeAPIHandler.ts
import { NextApiRequest, NextApiResponse } from "next";
import path from "path";
@@ -10,13 +10,16 @@ export default async function handler(
) {
const filePath = path.join(
process.cwd(),
"apiMockData",
"mocks",
"api",
"SERVICE",
"digitaleAusgaengeMockData.js"
"digitaleAusgaengeMockData.json"
);
try {
const data = await fs.readFile(filePath, "utf-8");
res.setHeader("Content-Type", "text/javascript");
res.status(200).send(data);
} catch (error) {
res.status(404).json({ error: "File not found" });

View File

@@ -1,46 +1,75 @@
// /pages/api/cpl/updateDigitalOutputsHandler.ts
// /pages/api/cpl/updateDigitalOutputs.ts
import { NextApiRequest, NextApiResponse } from "next";
import fs from "fs";
import path from "path";
import fs from "fs/promises";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
export default function handler(req, res) {
if (req.method !== "POST") {
return res.status(405).json({ error: "Method not allowed" });
return res.status(405).json({ message: "Nur POST erlaubt" });
}
const filePath = path.join(
process.cwd(),
"apiMockdata",
"SERVICE",
"digitaleAusgaengeMockData.js"
);
const { outputs } = req.body;
try {
const { outputs } = req.body;
if (!Array.isArray(outputs)) {
return res.status(400).json({ error: "Ungültige Datenstruktur" });
}
if (!Array.isArray(outputs) || outputs.length !== 4) {
return res
.status(400)
.json({ error: "Ungültiges Datenformat (4 Einträge erwartet)" });
const mode = process.env.NEXT_PUBLIC_CPL_MODE;
const jsonData = {
win_da_state: outputs.map((o) => (o.status ? 1 : 0)),
win_da_bezeichnung: outputs.map((o) => o.label),
};
let filePath = "";
if (mode === "json") {
filePath = path.join(
process.cwd(),
"mocks",
"api",
"SERVICE",
"digitaleAusgaengeMockData.json"
);
try {
fs.mkdirSync(path.dirname(filePath), { recursive: true });
fs.writeFileSync(filePath, JSON.stringify(jsonData, null, 2), "utf-8");
console.log("✅ Datei (JSON) geschrieben:", filePath);
res.status(200).json({ success: true });
} catch (err) {
console.error("❌ Fehler beim Schreiben der JSON-Datei:", err);
res.status(500).json({ error: "Fehler beim Schreiben der Datei" });
}
} else if (mode === "jsmock") {
filePath = path.join(
process.cwd(),
"mocks",
"js-simulator",
"SERVICE",
"digitaleAusgaengeMockData.js"
);
const stateArray = outputs.map((o) => (o.status ? 1 : 0)).join(", ");
const labelArray = outputs.map((o) => `"${o.label}"`).join(", ");
const jsContent =
`win_da_state = [${jsonData.win_da_state.join(", ")}];\n` +
`win_da_bezeichnung = [${jsonData.win_da_bezeichnung
.map((s) => `"${s}"`)
.join(", ")}];\n`;
const fileContent = `win_da_state = [${stateArray}];\nwin_da_bezeichnung = [${labelArray}];\n`;
try {
fs.mkdirSync(path.dirname(filePath), { recursive: true });
fs.writeFileSync(filePath, jsContent, "utf-8");
await fs.writeFile(filePath, fileContent, "utf-8");
return res
.status(200)
.json({ message: "Mockdaten erfolgreich gespeichert." });
} catch (error) {
return res
.status(500)
.json({ error: "Speichern fehlgeschlagen", detail: error });
console.log("✅ Datei (JS-Mock) geschrieben:", filePath);
res.status(200).json({ success: true });
} catch (err) {
console.error("❌ Fehler beim Schreiben der JS-Datei:", err);
res.status(500).json({ error: "Fehler beim Schreiben der JS-Datei" });
}
} else {
res
.status(403)
.json({ error: "In production ist Schreiben nicht erlaubt" });
}
}