feat(api): Zeitraum und Eingang als Pflichtparameter für AnalogInputs-API eingeführt
- API-Handler für /api/cpl/getAnalogInputsHistory überarbeitet - `zeitraum` (DIA0, DIA1, DIA2) und `eingang` (1–8) sind jetzt Pflichtfelder - Bei fehlenden oder ungültigen Parametern strukturierte Fehlerantwort mit Beispielen - Daten werden nun gezielt pro Eingang und Zeitraum geladen (z. B. AE3 + DIA1) - Bessere Fehlerbehandlung bei nicht vorhandenen Dateien
This commit is contained in:
@@ -1,43 +1,77 @@
|
||||
// /pages/api/cpl/getAnalogInputsHistory.ts
|
||||
|
||||
import path from "path";
|
||||
import fs from "fs/promises";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
|
||||
const erlaubteZeitraeume = ["DIA0", "DIA1", "DIA2"];
|
||||
const erlaubteEingaenge = [1, 2, 3, 4, 5, 6, 7, 8];
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse
|
||||
res: NextApiResponse<unknown>
|
||||
) {
|
||||
const { zeitraum, eingang } = req.query;
|
||||
|
||||
const zeitraumKey =
|
||||
typeof zeitraum === "string" && erlaubteZeitraeume.includes(zeitraum)
|
||||
? zeitraum
|
||||
: null;
|
||||
|
||||
const eingangId =
|
||||
typeof eingang === "string" && !isNaN(Number(eingang))
|
||||
? Number(eingang)
|
||||
: null;
|
||||
|
||||
// ❌ Fehlerhafte Anfrage
|
||||
if (!zeitraumKey || !eingangId || !erlaubteEingaenge.includes(eingangId)) {
|
||||
return res.status(400).json({
|
||||
error: "❌ Ungültige oder unvollständige Anfrage.",
|
||||
erwartet: {
|
||||
zeitraum: "Pflichtfeld. Erlaubt: DIA0 | DIA1 | DIA2",
|
||||
eingang: "Pflichtfeld. Erlaubt: 1 bis 8 (entspricht AE1 bis AE8)",
|
||||
},
|
||||
beispiele: [
|
||||
"/api/cpl/getAnalogInputsHistory?zeitraum=DIA1&eingang=3",
|
||||
"/api/cpl/getAnalogInputsHistory?zeitraum=DIA2&eingang=7",
|
||||
"http://localhost:3000/api/cpl/getAnalogInputsHistory?eingang=1&zeitraum=DIA0",
|
||||
],
|
||||
hinweis:
|
||||
"Die Antwort enthält ein Array mit Messwertobjekten für den gewählten Eingang und Zeitraum.",
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
const result: Record<number, unknown[]> = {};
|
||||
const filePath = path.join(
|
||||
process.cwd(),
|
||||
"mocks",
|
||||
"device-cgi-simulator",
|
||||
"chartsData",
|
||||
"analogInputs",
|
||||
`${eingangId}`,
|
||||
`${zeitraumKey}.json`
|
||||
);
|
||||
|
||||
for (let i = 1; i <= 8; i++) {
|
||||
const filePath = path.join(
|
||||
process.cwd(),
|
||||
"mocks",
|
||||
"device-cgi-simulator",
|
||||
"chartsData",
|
||||
"analogInputs",
|
||||
`${i}`,
|
||||
`DIA0.json`
|
||||
);
|
||||
console.log(`Lade Mock-Daten für analogInput${i} von: ${filePath}`);
|
||||
const fileContent = await fs.readFile(filePath, "utf-8");
|
||||
const daten = JSON.parse(fileContent);
|
||||
|
||||
try {
|
||||
const fileContent = await fs.readFile(filePath, "utf-8");
|
||||
result[99 + i] = JSON.parse(fileContent); // z. B. 100 für AE1, 101 für AE2
|
||||
} catch (error) {
|
||||
console.warn(
|
||||
`Mock-Datei für analogInput${i} nicht gefunden oder fehlerhaft.`,
|
||||
error
|
||||
);
|
||||
result[99 + i] = [];
|
||||
}
|
||||
}
|
||||
|
||||
res.status(200).json(result);
|
||||
res.status(200).json({
|
||||
eingang: eingangId,
|
||||
zeitraum: zeitraumKey,
|
||||
beschreibung:
|
||||
zeitraumKey === "DIA0"
|
||||
? "Alle Messwerte"
|
||||
: zeitraumKey === "DIA1"
|
||||
? "Stündlich aggregierte Messwerte"
|
||||
: "Täglich aggregierte Messwerte",
|
||||
daten,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Fehler beim Laden der analogen Eingänge (Mock):", error);
|
||||
res.status(500).json({ error: "Fehler beim Laden der Mock-Daten." });
|
||||
console.error(
|
||||
`❌ Datei nicht gefunden für Eingang ${eingangId} und Zeitraum ${zeitraumKey}:`,
|
||||
error
|
||||
);
|
||||
res.status(404).json({
|
||||
error: `Keine Daten gefunden für Eingang ${eingangId} mit Zeitraum ${zeitraumKey}.`,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user