- Externe Webservices von TALAS V5 integriert und geprüft (Statuscode + Antwortstruktur) - Eigene API-Endpunkte wie /api/talas_v5_DB/getDevices hinzugefügt und validiert - Prüfung von NEXT_PUBLIC_USE_MOCKS zur Vermeidung von Mockdaten in Produktion - Validierung der Umgebungsvariablen wie DB_HOST, DB_NAME und NODE_ENV ergänzt - Response-Status 200 bei vollständigem Erfolg, 207 bei Teilfehlern - Verbesserung der JSON-Antwortstruktur zur einfacheren Analyse
134 lines
4.5 KiB
JavaScript
134 lines
4.5 KiB
JavaScript
// /pages/api/health.js
|
||
export default async function handler(req, res) {
|
||
const basePath = "talas5";
|
||
const protocol = "http";
|
||
const hostname = "10.10.0.70";
|
||
const port = "80";
|
||
const idMap = "12";
|
||
const idUser = "484";
|
||
const idLD = "50922";
|
||
|
||
const buildUrl = method =>
|
||
`${protocol}://${hostname}:${port}/${basePath}/ClientData/WebServiceMap.asmx/${method}?idMap=${idMap}&idUser=${idUser}`;
|
||
|
||
const externalUrls = {
|
||
GisStationsStaticDistrict: buildUrl("GisStationsStaticDistrict"),
|
||
GisLinesStatus: `${protocol}://${hostname}:${port}/${basePath}/ClientData/WebServiceMap.asmx/GisLinesStatus?idMap=${idMap}`,
|
||
GisStationsMeasurements: buildUrl("GisStationsMeasurements"),
|
||
GisStationsStatusDistrict: buildUrl("GisStationsStatusDistrict"),
|
||
GisSystemStatic: buildUrl("GisSystemStatic"),
|
||
};
|
||
|
||
const internalApiBase = "http://localhost:3000";
|
||
|
||
const internalApis = {
|
||
//area
|
||
readArea: `${internalApiBase}/api/talas_v5_DB/area/readArea?m=${idMap}`,
|
||
//device
|
||
getAllStationsNames: `${internalApiBase}/api/talas_v5_DB/device/getAllStationsNames`,
|
||
getDevices: `${internalApiBase}/api/talas_v5_DB/device/getDevices`,
|
||
//gisLines
|
||
readGisLines: `${internalApiBase}/api/talas_v5_DB/gisLines/readGisLines`,
|
||
//locationDevice
|
||
getDeviceId: `${internalApiBase}/api/talas_v5_DB/locationDevice/getDeviceId`,
|
||
locationDeviceNameById: `${internalApiBase}/api/talas_v5_DB/locationDevice/locationDeviceNameById?idLD=${idLD}`,
|
||
locationDevices: `${internalApiBase}/api/talas_v5_DB/locationDevice/locationDevices`,
|
||
//pois
|
||
addPoi: `${internalApiBase}/api/talas_v5_DB/pois/addPoi`,
|
||
deletePoi: `${internalApiBase}/api/talas_v5_DB/pois/deletePoi`,
|
||
getPoiById: `${internalApiBase}/api/talas_v5_DB/pois/getPoiById`,
|
||
poiIcons: `${internalApiBase}/api/talas_v5_DB/pois/poi-icons`,
|
||
readAllPOIs: `${internalApiBase}/api/talas_v5_DB/pois/readAllPOIs`,
|
||
updateLocation: `${internalApiBase}/api/talas_v5_DB/pois/updateLocation`,
|
||
updatePoi: `${internalApiBase}/api/talas_v5_DB/pois/updatePoi`,
|
||
//poiTyp
|
||
readPoiTyp: `${internalApiBase}/api/talas_v5_DB/poiTyp/readPoiTyp`,
|
||
//station
|
||
getAllStationsNames: `${internalApiBase}/api/talas_v5_DB/station/getAllStationsNames`,
|
||
getDevices: `${internalApiBase}/api/talas_v5_DB/station/getDevices`,
|
||
//
|
||
priorityConfig: `${internalApiBase}/api/talas_v5_DB/priorityConfig`,
|
||
};
|
||
|
||
const results = {};
|
||
|
||
// Prüfe externe Webservices
|
||
await Promise.all(
|
||
Object.entries(externalUrls).map(async ([name, url]) => {
|
||
try {
|
||
const response = await fetch(url);
|
||
results[name] = {
|
||
ok: response.ok,
|
||
status: response.status,
|
||
url,
|
||
};
|
||
|
||
if (name === "GisSystemStatic" && response.ok) {
|
||
const data = await response.json();
|
||
results["UserRights"] = {
|
||
ok: Array.isArray(data.Rights),
|
||
length: data.Rights?.length || 0,
|
||
};
|
||
}
|
||
} catch (error) {
|
||
results[name] = {
|
||
ok: false,
|
||
error: error.message,
|
||
url,
|
||
};
|
||
}
|
||
})
|
||
);
|
||
|
||
// Prüfe interne API-Routen
|
||
await Promise.all(
|
||
Object.entries(internalApis).map(async ([name, url]) => {
|
||
try {
|
||
const response = await fetch(url);
|
||
results[`API_${name}`] = {
|
||
ok: response.ok,
|
||
status: response.status,
|
||
url,
|
||
};
|
||
} catch (error) {
|
||
results[`API_${name}`] = {
|
||
ok: false,
|
||
error: error.message,
|
||
url,
|
||
};
|
||
}
|
||
})
|
||
);
|
||
|
||
// Prüfe Mock-Status
|
||
const useMocksEnv = process.env.NEXT_PUBLIC_USE_MOCKS;
|
||
results["MockMode"] = {
|
||
expected: "false",
|
||
actual: useMocksEnv,
|
||
ok: useMocksEnv === "false",
|
||
info:
|
||
useMocksEnv === "false"
|
||
? "✅ Mockdaten deaktiviert – Live-Daten aktiv."
|
||
: "⚠️ Mockdaten aktiv – nicht für Produktion geeignet!",
|
||
};
|
||
|
||
// Prüfe Konfiguration der .env.production
|
||
results["envConfig"] = {
|
||
NODE_ENV: process.env.NODE_ENV || "undefined",
|
||
DB_HOST: process.env.DB_HOST || "❌ fehlt",
|
||
NEXT_PUBLIC_USE_MOCKS: useMocksEnv || "❌ fehlt",
|
||
status:
|
||
process.env.NODE_ENV === "production" && useMocksEnv === "false" && process.env.DB_HOST
|
||
? "✅ .env.production scheint korrekt."
|
||
: "⚠️ Bitte .env.production prüfen – möglicherweise fehlt etwas.",
|
||
};
|
||
|
||
const allOk = Object.values(results).every(r => r.ok);
|
||
|
||
res.status(allOk ? 200 : 207).json({
|
||
status: allOk ? "ok" : "partial",
|
||
version: "1.0.0",
|
||
services: results,
|
||
});
|
||
}
|