From ea46bd771b73fdc30330f37d824b79e0a4bd8fbd Mon Sep 17 00:00:00 2001 From: ISA Date: Mon, 2 Sep 2024 09:06:49 +0200 Subject: [PATCH] mysql createPool --- .env.local | 43 +-- hooks/useLineData.js | 25 +- pages/api - Kopie/[...path].js | 20 ++ pages/api - Kopie/get-talasIP.js | 20 ++ pages/api - Kopie/gis-proxy.js | 34 +++ pages/api - Kopie/linesColorApi.js | 64 ++++ pages/api - Kopie/rights.js | 29 ++ pages/api - Kopie/talas5/area.js | 40 +++ pages/api - Kopie/talas5/location_device.js | 42 +++ .../webserviceMap/GisStationsMeasurements.js | 116 ++++++++ .../GisStationsStaticDistrict.js | 281 ++++++++++++++++++ .../GisStationsStatusDistrict.js | 84 ++++++ .../talas5/webserviceMap/GisSystemStatic.js | 273 +++++++++++++++++ .../gisStationsMeasurementsSQL.js | 74 +++++ .../talas_v5_DB/gisLines/readGisLines.js | 34 +++ .../gisLines/updateLineCoordinates.js | 58 ++++ .../talas_v5_DB/locationDevice/getDeviceId.js | 41 +++ .../locationDevice/locationDeviceNameById.js | 40 +++ .../locationDevice/locationDevices.js | 32 ++ .../talas_v5_DB/poiTyp/readPoiTyp.js | 37 +++ .../talas_v5_DB/pois/addLocation.js | 37 +++ .../api - Kopie/talas_v5_DB/pois/deletePoi.js | 42 +++ .../talas_v5_DB/pois/getPoiById.js | 43 +++ .../api - Kopie/talas_v5_DB/pois/poi-icons.js | 36 +++ .../talas_v5_DB/pois/readLocations.js | 32 ++ .../talas_v5_DB/pois/updateLocation.js | 82 +++++ .../api - Kopie/talas_v5_DB/pois/updatePoi.js | 45 +++ .../api - Kopie/talas_v5_DB/priorityConfig.js | 31 ++ .../station/getAllStationsNames.js | 43 +++ pages/api.zip | Bin 0 -> 23173 bytes pages/api/talas5/area.js | 45 +-- pages/api/talas5/location_device.js | 60 ++-- .../GisStationsStatusDistrict.js | 33 +- .../gisStationsMeasurementsSQL.js | 24 +- .../api/talas_v5_DB/gisLines/readGisLines.js | 18 +- .../gisLines/updateLineCoordinates.js | 17 +- .../talas_v5_DB/locationDevice/getDeviceId.js | 27 +- .../locationDevice/locationDeviceNameById.js | 24 +- .../locationDevice/locationDevices.js | 26 +- pages/api/talas_v5_DB/poiTyp/readPoiTyp.js | 26 +- pages/api/talas_v5_DB/pois/addLocation.js | 34 +-- pages/api/talas_v5_DB/pois/deletePoi.js | 26 +- pages/api/talas_v5_DB/pois/getPoiById.js | 24 +- pages/api/talas_v5_DB/pois/poi-icons.js | 24 +- pages/api/talas_v5_DB/pois/readLocations.js | 25 +- pages/api/talas_v5_DB/pois/updateLocation.js | 64 +--- pages/api/talas_v5_DB/pois/updatePoi.js | 24 +- pages/api/talas_v5_DB/priorityConfig.js | 20 +- .../station/getAllStationsNames.js | 24 +- utils/mapFeatures.js | 48 +-- utils/mapInitialization.js | 32 +- utils/mysqlPool.js | 40 +++ 52 files changed, 2026 insertions(+), 437 deletions(-) create mode 100644 pages/api - Kopie/[...path].js create mode 100644 pages/api - Kopie/get-talasIP.js create mode 100644 pages/api - Kopie/gis-proxy.js create mode 100644 pages/api - Kopie/linesColorApi.js create mode 100644 pages/api - Kopie/rights.js create mode 100644 pages/api - Kopie/talas5/area.js create mode 100644 pages/api - Kopie/talas5/location_device.js create mode 100644 pages/api - Kopie/talas5/webserviceMap/GisStationsMeasurements.js create mode 100644 pages/api - Kopie/talas5/webserviceMap/GisStationsStaticDistrict.js create mode 100644 pages/api - Kopie/talas5/webserviceMap/GisStationsStatusDistrict.js create mode 100644 pages/api - Kopie/talas5/webserviceMap/GisSystemStatic.js create mode 100644 pages/api - Kopie/talas5/webserviceMap/gisStationsMeasurementsSQL.js create mode 100644 pages/api - Kopie/talas_v5_DB/gisLines/readGisLines.js create mode 100644 pages/api - Kopie/talas_v5_DB/gisLines/updateLineCoordinates.js create mode 100644 pages/api - Kopie/talas_v5_DB/locationDevice/getDeviceId.js create mode 100644 pages/api - Kopie/talas_v5_DB/locationDevice/locationDeviceNameById.js create mode 100644 pages/api - Kopie/talas_v5_DB/locationDevice/locationDevices.js create mode 100644 pages/api - Kopie/talas_v5_DB/poiTyp/readPoiTyp.js create mode 100644 pages/api - Kopie/talas_v5_DB/pois/addLocation.js create mode 100644 pages/api - Kopie/talas_v5_DB/pois/deletePoi.js create mode 100644 pages/api - Kopie/talas_v5_DB/pois/getPoiById.js create mode 100644 pages/api - Kopie/talas_v5_DB/pois/poi-icons.js create mode 100644 pages/api - Kopie/talas_v5_DB/pois/readLocations.js create mode 100644 pages/api - Kopie/talas_v5_DB/pois/updateLocation.js create mode 100644 pages/api - Kopie/talas_v5_DB/pois/updatePoi.js create mode 100644 pages/api - Kopie/talas_v5_DB/priorityConfig.js create mode 100644 pages/api - Kopie/talas_v5_DB/station/getAllStationsNames.js create mode 100644 pages/api.zip create mode 100644 utils/mysqlPool.js diff --git a/.env.local b/.env.local index 6760ecd25..582ebfb9b 100644 --- a/.env.local +++ b/.env.local @@ -1,7 +1,24 @@ #.env.local #je nach dem Mysql Server, ob localhost freigegeben ist oder die IP Adresse des Servers, manchmal die beide und manchmal nur eine -DB_HOST=10.10.0.30 +#DB_HOST=10.10.0.30 +#DB_USER=root +#DB_PASSWORD="root#$" +#DB_NAME=talas_v5 +#DB_PORT=3306 + + +######################### + +#NEXT_PUBLIC_BASE_URL="http://10.10.0.30/talas5/devices/" +#NEXT_PUBLIC_SERVER_URL="http://10.10.0.70" +#NEXT_PUBLIC_PROXY_TARGET="http://10.10.0.30" +#NEXT_PUBLIC_ONLINE_TILE_LAYER="http://10.10.0.30:3000/mapTiles/{z}/{x}/{y}.png" +#NEXT_PUBLIC_ONLINE_TILE_LAYER="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" +######################### + + +DB_HOST=10.10.0.70 DB_USER=root DB_PASSWORD="root#$" DB_NAME=talas_v5 @@ -11,26 +28,10 @@ DB_PORT=3306 ######################### NEXT_PUBLIC_BASE_URL="http://10.10.0.30/talas5/devices/" -NEXT_PUBLIC_SERVER_URL="http://10.10.0.30" -NEXT_PUBLIC_PROXY_TARGET="http://10.10.0.30" -NEXT_PUBLIC_ONLINE_TILE_LAYER="http://10.10.0.30:3000/mapTiles/{z}/{x}/{y}.png" -######################### - - -#DB_HOST=10.10.0.70 -#DB_USER=root -#DB_PASSWORD="root#$" -#DB_NAME=talas_v5 -#DB_PORT=3306 - - -######################### - -#NEXT_PUBLIC_BASE_URL="http://10.10.0.70/talas5/devices/" -#NEXT_PUBLIC_SERVER_URL="http://10.10.0.70" -#NEXT_PUBLIC_PROXY_TARGET="http://10.10.0.70" -#NEXT_PUBLIC_ONLINE_TILE_LAYER="http://10.10.0.13:3000/mapTiles/{z}/{x}/{y}.png" -#NEXT_PUBLIC_ONLINE_TILE_LAYER="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" +NEXT_PUBLIC_SERVER_URL="http://10.10.0.70" +NEXT_PUBLIC_PROXY_TARGET="http://10.10.0.70" +NEXT_PUBLIC_ONLINE_TILE_LAYER="http://10.10.0.13:3000/mapTiles/{z}/{x}/{y}.png" +NEXT_PUBLIC_ONLINE_TILE_LAYER="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" ######################### #DB_HOST=192.168.10.167 diff --git a/hooks/useLineData.js b/hooks/useLineData.js index 3f6dc0540..be5ebae98 100644 --- a/hooks/useLineData.js +++ b/hooks/useLineData.js @@ -89,7 +89,9 @@ const useLineData = (webserviceGisLinesStatusUrl, setLineStatusData) => { // Setze die Farbe und Tooltip für jede Linie (für alle Prioritätslevel) colorsByModule[key] = prioColor; - newTooltipContents[key] = ` + // Überprüfe, ob ModulTyp den Text "705-FO" enthält + if (statis.ModulTyp && statis.ModulTyp.includes("705-FO")) { + newTooltipContents[key] = `
${statis.ModulName || "Unknown"}
@@ -109,6 +111,27 @@ const useLineData = (webserviceGisLinesStatusUrl, setLineStatusData) => { ${values.schleifenwert ? `Schleifenwert: ${values.schleifenwert}` : ""}
`; + } else { + newTooltipContents[key] = ` +
+ ${statis.ModulName || "Unknown"} +
+ ${statis.ModulTyp || "N/A"} +
+ Slot: ${statis.Modul || "N/A"} +
+ Station: ${namesData[matchingLine.idLD] || "N/A"} +
+
+ + ${messageDisplay} +
+ ${prioNameDisplay} +
+ +
+ `; + } } }); diff --git a/pages/api - Kopie/[...path].js b/pages/api - Kopie/[...path].js new file mode 100644 index 000000000..b270661b1 --- /dev/null +++ b/pages/api - Kopie/[...path].js @@ -0,0 +1,20 @@ +// pages/api/[...path].js +import { createProxyMiddleware } from "http-proxy-middleware"; +//import { SERVER_URL } from "../config/urls.js"; +//console.log("SERVER_URL:", SERVER_URL); // Debug-Ausgabe + +export default createProxyMiddleware({ + //target: "http://192.168.10.58:3001", + // Stationen bekommen + //target: "http://10.10.0.13", // Ziel-URL des Proxys // API Aufruf zum mapGisStationsStaticDistrictUrl, mapGisStationsStatusDistrictUrl, mapGisStationsMeasurementsUrl, mapGisSystemStaticUrl und mapDataIconUrl + target: `${process.env.NEXT_PUBLIC_SERVER_URL}`, // + //target: urls.PROXY_TARGET, + //target: "http://localhost:3000", // Ziel-URL des Proxys + //target: "http://192.168.10.187:3000", // Ziel-URL des Proxys + //target: "http://192.168.10.14", + changeOrigin: true, + pathRewrite: { + "^/api": "/", // Optional: Entfernt /api aus dem Pfad, wenn das Backend dies nicht erfordert + }, + logLevel: "debug", // Setzt das Logging-Level auf "debug" für detaillierte Ausgaben +}); diff --git a/pages/api - Kopie/get-talasIP.js b/pages/api - Kopie/get-talasIP.js new file mode 100644 index 000000000..1216fbbb7 --- /dev/null +++ b/pages/api - Kopie/get-talasIP.js @@ -0,0 +1,20 @@ +// pages/api/get-talasIP.js + +export default function handler(req, res) { + // Der x-forwarded-for Header könnte mehrere IP-Adressen enthalten, getrennt durch Kommas + let clientIp = + req.headers["x-forwarded-for"]?.split(",").map((ip) => ip.trim())[0] || + req.socket.remoteAddress; + + // Entfernen möglicher IPv6 "mapped" IPv4 Adressen + if (clientIp?.includes("::ffff:")) { + clientIp = clientIp.split("::ffff:")[1]; + } + + // Nur IPv4 Adressen weitergeben, IPv6 Adressen ausschließen + if (clientIp && clientIp.includes(":")) { + clientIp = ""; // Dies setzt die IP auf leer, wenn es sich um eine IPv6-Adresse handelt + } + + res.status(200).json({ ip: clientIp }); +} diff --git a/pages/api - Kopie/gis-proxy.js b/pages/api - Kopie/gis-proxy.js new file mode 100644 index 000000000..b76883298 --- /dev/null +++ b/pages/api - Kopie/gis-proxy.js @@ -0,0 +1,34 @@ +// /pages/api/gis-proxy.js +// Importieren der erforderlichen Module +import httpProxy from "http-proxy"; +import Cookies from "cookies"; + +// Erstellen eines Proxy-Servers +const proxy = httpProxy.createProxyServer(); + +export default (req, res) => { + return new Promise((resolve) => { + // CORS-Headers einstellen + res.setHeader("Access-Control-Allow-Credentials", true); + res.setHeader("Access-Control-Allow-Origin", "*"); + + // Cookies initialisieren + const cookies = new Cookies(req, res); + const targetUrl = `${process.env.NEXT_PUBLIC_SERVER_URL}/talas5/ClientData/WebserviceMap.asmx/GisSystemStatic`; + + // Proxy-Konfiguration und Event-Listener + req.on("data", () => {}); + req.on("end", () => { + proxy.web(req, res, { target: targetUrl, changeOrigin: true, selfHandleResponse: false }, (e) => { + if (e) { + console.error(e); + res.status(500).json({ error: "Proxy-Fehler", e }); + } + resolve(); + }); + }); + + // Weiterleitung der Headers + req.headers.cookie = cookies.get("cookie-name") || ""; + }); +}; diff --git a/pages/api - Kopie/linesColorApi.js b/pages/api - Kopie/linesColorApi.js new file mode 100644 index 000000000..57ee59262 --- /dev/null +++ b/pages/api - Kopie/linesColorApi.js @@ -0,0 +1,64 @@ +// /pages/api/linesColorApi.js +// http://10.10.0.13/talas5/ClientData/WebServiceMap.asmx/GisStationsStatusDistrict +//In DB gis_lines idLD und idModul anpassen entsprechend + +// /pages/api/linesColorApi.js +import NextCors from "nextjs-cors"; + +export default async function handler(req, res) { + // Run the cors middleware + await NextCors(req, res, { + // Options + methods: ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"], + origin: "*", // Erlauben Sie alle Ursprünge, oder geben Sie spezifische Ursprünge an + optionsSuccessStatus: 200, // Legacy-Browser-Unterstützung für 204 + }); + + const response = { + Name: "Liste aller Statis der Linien", + Zeitstempel: new Date().toISOString(), // Aktuellen Zeitstempel hinzufügen + IdMap: "10", + Statis: [ + /* { + IdLD: 50922, + Modul: 1, + DpName: "KUE01_Ausfall", + ModulName: "42 Wippershain Sender", + // ModulTyp: "nicht vorhanden", + ModulTyp: "KÜ705-FO", + Message: "KUEG 01: 42 Wippershain Sender Messwerkausfall kommend", + Level: 4, + PrioColor: "#FFFF00", + PrioName: "system", + Value: "10 MOhm", + }, + { + IdLD: 25440, + Modul: 3, + DpName: "KUE03_Ausfall", + ModulName: "42 Solz Sender", + //ModulTyp: "nicht vorhanden", + ModulTyp: "KÜSS V2", + Message: "KUEG 03: 42 Solz Sender Messwerkausfall kommend", + Level: 4, + PrioColor: "#FF0000", + PrioName: "system", + Value: "10 MOhm", + }, + { + IdLD: 25440, + Modul: 4, + DpName: "KUE04_Ausfall", + ModulName: "42/13 Bad Hersfeld Gaswerk", + ModulTyp: "Kue705-FO", + Message: "KUEG 04: 42/13 Bad Hersfeld Gaswerk Messwerkausfall kommend", + Level: 4, + PrioColor: "#FF00FF", + PrioName: "system", + Value: "10 MOhm", + }, */ + ], + }; + + res.status(200).json(response); +} diff --git a/pages/api - Kopie/rights.js b/pages/api - Kopie/rights.js new file mode 100644 index 000000000..507228147 --- /dev/null +++ b/pages/api - Kopie/rights.js @@ -0,0 +1,29 @@ +// pages/api/rights.js + +export default function handler(req, res) { + const { idMap, idUser } = req.query; + + // Beispielhafte Rechte, die je nach idMap und idUser variieren können + const rights = { + '10': [ + { IdRight: 1, Name: "Zugriff auf Dashboard" }, + { IdRight: 56, Name: "Erweiterte Berechtigungen" } + ], + '2': [ + { IdRight: 2, Name: "Zugriff auf Einstellungen" } + ], + '1': [ + { IdRight: 10, Name: "Admin-Zugriff" }, + { IdRight: 11, Name: "Zugriff auf alle Daten" } + ] + }; + + // Prüfung, ob eine gültige idMap und idUser vorhanden sind + if (rights[idMap] && idUser === '484') { + // Rückgabe der spezifischen Rechte basierend auf der idMap und idUser + res.status(200).json({ Rights: rights[idMap] }); + } else { + // Rückgabe leerer Rechte für ungültige idMap oder andere Benutzer + res.status(200).json({ Rights: [] }); + } +} diff --git a/pages/api - Kopie/talas5/area.js b/pages/api - Kopie/talas5/area.js new file mode 100644 index 000000000..9205aa5ca --- /dev/null +++ b/pages/api - Kopie/talas5/area.js @@ -0,0 +1,40 @@ +// pages/api/talas_v5/area.js +// Lesen von talas_v5 MySQL-Datenbank -> area Tabelle enthält DAUZ Geräte +// Wenn gebraucht wird, dann nutzen ansonsten löschen + +import mysql from "mysql"; + +const dbConfig = { + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, +}; +//console.log("my dbconfig: ", dbConfig); +export default function handler(req, res) { + const connection = mysql.createConnection(dbConfig); + + connection.connect((err) => { + if (err) { + console.error("Fehler beim Verbinden:", err.stack); + res.status(500).json({ error: "Verbindungsfehler zur Datenbank" }); + return; + } + + //console.log("Verbunden als ID", connection.threadId); + //Fehler weil, existiertdie Tabelle auf localhost:3000 nicht + connection.query("SELECT ..., ..., ..., ... FROM ... WHERE ... = ...", (error, results) => { + if (error) { + console.error("Fehler beim Abrufen der API", error); + res.status(500).json({ error: "Fehler bei der Abfrage" }); + return; + } + + // Wichtig: Senden Sie die Antwort zurück + res.status(200).json(results); + + connection.end(); + }); + }); +} diff --git a/pages/api - Kopie/talas5/location_device.js b/pages/api - Kopie/talas5/location_device.js new file mode 100644 index 000000000..9292690e0 --- /dev/null +++ b/pages/api - Kopie/talas5/location_device.js @@ -0,0 +1,42 @@ +// Importieren des mysql2 Pakets +import mysql from "mysql2"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +// Ein Hilfsfunktion, um Anfragen zu vereinfachen +function queryDatabase(query, params) { + return new Promise((resolve, reject) => { + pool.query(query, params, (error, results) => { + if (error) { + return reject(error); + } + resolve(results); + }); + }); +} + +// API-Handler +export default async function handler(req, res) { + try { + // Dein SQL-Query und die Parameter + const sql = "SELECT idLD, iddevice, name FROM location_device WHERE iddevice = ?"; + const params = [160]; // Beispielparameter + + // Ausführen der Datenbankabfrage + const results = await queryDatabase(sql, params); + res.status(200).json(results); + } catch (error) { + console.error("Fehler beim Abrufen der API", error); + res.status(500).json({ error: "Fehler bei der Abfrage" }); + } +} diff --git a/pages/api - Kopie/talas5/webserviceMap/GisStationsMeasurements.js b/pages/api - Kopie/talas5/webserviceMap/GisStationsMeasurements.js new file mode 100644 index 000000000..5aba69fc6 --- /dev/null +++ b/pages/api - Kopie/talas5/webserviceMap/GisStationsMeasurements.js @@ -0,0 +1,116 @@ +// /pages/api/talas5/webserviceMap/GisStationsMeasurements.js +const GisStationsMeasurements = { + "Name": "Liste aller Messungen der Geraete", + "Zeitstempel": "2024-05-31T15:25:32.5047629+02:00", + "IdMap": "10", + "Statis": [ + { + "IdLD": 50004, + "IdL": 18624, + "IdDP": 3, + "Na": "FBT", + "Val": "20.5", + "Unit": "°C", + "Gr": "GMA", + "Area_Name": "Renzenhof (RG)" + }, + { + "IdLD": 50004, + "IdL": 18624, + "IdDP": 10, + "Na": "GT", + "Val": "nicht ermittelbar", + "Unit": "°C", + "Gr": "GMA", + "Area_Name": "Renzenhof (RG)" + }, + { + "IdLD": 50004, + "IdL": 18624, + "IdDP": 2, + "Na": "LT", + "Val": "Datenlücke", + "Unit": "°C", + "Gr": "GMA", + "Area_Name": "Renzenhof (RG)" + }, + { + "IdLD": 50004, + "IdL": 18624, + "IdDP": 6, + "Na": "RLF", + "Val": "100.0", + "Unit": "%", + "Gr": "GMA", + "Area_Name": "Renzenhof (RG)" + }, + { + "IdLD": 50004, + "IdL": 18624, + "IdDP": 11, + "Na": "TPT", + "Val": "8.3", + "Unit": "°C", + "Gr": "GMA", + "Area_Name": "Renzenhof (RG)" + }, + { + "IdLD": 50004, + "IdL": 18624, + "IdDP": 12, + "Na": "TT1", + "Val": "---", + "Unit": "°C", + "Gr": "GMA", + "Area_Name": "Renzenhof (RG)" + }, + { + "IdLD": 50004, + "IdL": 18624, + "IdDP": 16, + "Na": "WFD", + "Val": "0.12", + "Unit": "mm", + "Gr": "GMA", + "Area_Name": "Renzenhof (RG)" + }, + { + "IdLD": 50004, + "IdL": 18624, + "IdDP": 8, + "Na": "WGM", + "Val": "---", + "Unit": "m/s", + "Gr": "GMA", + "Area_Name": "Renzenhof (RG)" + }, + { + "IdLD": 50004, + "IdL": 18624, + "IdDP": 9, + "Na": "WGS", + "Val": "---", + "Unit": "m/s", + "Gr": "GMA", + "Area_Name": "Renzenhof (RG)" + } + ] + } + + // Export an async function handler for the API route. + export default async function handler(req, res) { + // Initialize an empty params object to store query parameters. + const params = { + idMap: req.query.idMap, + + }; + + // Check if the requested ID map and user match certain conditions. + if (params.idMap === '10') { + // If the conditions are met, return the GisStationsMeasurements object with a 200 status code. + res.status(200).json(GisStationsMeasurements); + } else { + // If not, return a 404 error with the message "Not Found". + res.status(404).send('Not Found'); + } + }; \ No newline at end of file diff --git a/pages/api - Kopie/talas5/webserviceMap/GisStationsStaticDistrict.js b/pages/api - Kopie/talas5/webserviceMap/GisStationsStaticDistrict.js new file mode 100644 index 000000000..bf302f3d7 --- /dev/null +++ b/pages/api - Kopie/talas5/webserviceMap/GisStationsStaticDistrict.js @@ -0,0 +1,281 @@ +// /pages/api/talas5/webserviceMap/GisStationsStaticDistrict.js +const GisStationsStaticDistrict = { + "Name": "Liste aller Geraete einer bestimmten Karte", + "Zeitstempel": "2024-05-31T15:26:56.9235766+02:00", + "IdMap": "10", + "Points": [ + { + "LD_Name": "CPL Bentheim", + "IdLD": 50017, + "Device": "CPL V3.5 mit 16 Kü", + "Link": "cpl.aspx?ver=35&kue=16&id=50017", + "Location_Name": "Technikraum", + "Location_Short": "BEHE", + "IdLocation": 17448, + "Area_Name": "Bad-Bentheim", + "Area_Short": "BEHE--00", + "IdArea": 16418, + "X": 51.5728, + "Y": 9.00056, + "Icon": 20, + "System": 1, + "Active": 0 + }, + { + "LD_Name": "Drucker", + "IdLD": 50084, + "Device": "Basisgerät", + "Link": "basis.aspx?ver=1&id=50084", + "Location_Name": "Technikraum", + "Location_Short": "SLUE", + "IdLocation": 17776, + "Area_Name": "Schlüchtern II", + "Area_Short": "SLUE--00", + "IdArea": 14688, + "X": 53.2455, + "Y": 8.1614, + "Icon": 14, + "System": 200, + "Active": 0 + }, + { + "LD_Name": "Türkontakt", + "IdLD": 50666, + "Device": "ECI", + "Link": "eci.aspx?ver=1&id=50666", + "Location_Name": "Technikraum", + "Location_Short": "SLUE", + "IdLocation": 17776, + "Area_Name": "Schlüchtern II", + "Area_Short": "SLUE--00", + "IdArea": 14688, + "X": 53.2455, + "Y": 8.1614, + "Icon": 17, + "System": 2, + "Active": 0 + }, + { + "LD_Name": "Triptis", + "IdLD": 50888, + "Device": "CPL 200", + "Link": "cpl.aspx?ver=30&kue=16&id=50888", + "Location_Name": "Technikraum", + "Location_Short": "SLUE", + "IdLocation": 17776, + "Area_Name": "Schlüchtern II", + "Area_Short": "SLUE--00", + "IdArea": 14688, + "X": 53.2455, + "Y": 8.1614, + "Icon": 20, + "System": 1, + "Active": 0 + }, + { + "LD_Name": "Rodaborn I", + "IdLD": 50889, + "Device": "cpl.mio V>6", + "Link": "cplmio.aspx?ver=1&id=50889", + "Location_Name": "Technikraum", + "Location_Short": "SLUE", + "IdLocation": 17776, + "Area_Name": "Schlüchtern II", + "Area_Short": "SLUE--00", + "IdArea": 14688, + "X": 53.2455, + "Y": 8.1614, + "Icon": 20, + "System": 1, + "Active": 0 + }, + { + "LD_Name": "Rodaborn II", + "IdLD": 50900, + "Device": "cpl.mio V>6", + "Link": "cplmio.aspx?ver=1&id=50900", + "Location_Name": "Technikraum", + "Location_Short": "SLUE", + "IdLocation": 17776, + "Area_Name": "Schlüchtern II", + "Area_Short": "SLUE--00", + "IdArea": 14688, + "X": 53.2455, + "Y": 8.1614, + "Icon": 20, + "System": 1, + "Active": 0 + }, + { + "LD_Name": "Hermsdorf", + "IdLD": 50901, + "Device": "CPL V3.5 mit 24 Kü", + "Link": "cpl.aspx?ver=35&kue=24&id=50901", + "Location_Name": "Technikraum", + "Location_Short": "SLUE", + "IdLocation": 17776, + "Area_Name": "Schlüchtern II", + "Area_Short": "SLUE--00", + "IdArea": 14688, + "X": 53.2455, + "Y": 8.1614, + "Icon": 20, + "System": 1, + "Active": 1 + }, + { + "LD_Name": "GMA Littwin (TEST)", + "IdLD": 50004, + "Device": "Glättemeldeanlage", + "Link": "gma.aspx?ver=1&id=50004", + "Location_Name": "RG Relaisraum", + "Location_Short": "REZR", + "IdLocation": 18624, + "Area_Name": "Renzenhof (RG)", + "Area_Short": "REZHRG00", + "IdArea": 16570, + "X": 53.246036, + "Y": 8.163293, + "Icon": 1, + "System": 11, + "Active": 0 + }, + { + "LD_Name": "NRS Testserver", + "IdLD": 50005, + "Device": "Notruf Server", + "Link": "nrs_server.aspx?ver=1&id=50005", + "Location_Name": "(EV Ammersricht BZR REL)", + "Location_Short": "AMME", + "IdLocation": 21118, + "Area_Name": "Ammersricht BZR (FGN)", + "Area_Short": "AMMER--00", + "IdArea": 15958, + "X": 52.52726, + "Y": 12.165488, + "Icon": 19, + "System": 8, + "Active": 0 + }, + { + "LD_Name": "Gateway 2", + "IdLD": 50007, + "Device": "Notruf Server", + "Link": "nrs_server.aspx?ver=1&id=50007", + "Location_Name": "(EV Ammersricht BZR REL)", + "Location_Short": "AMME", + "IdLocation": 21118, + "Area_Name": "Ammersricht BZR (FGN)", + "Area_Short": "AMMER--00", + "IdArea": 15958, + "X": 52.52726, + "Y": 12.165488, + "Icon": 19, + "System": 8, + "Active": 0 + }, + { + "LD_Name": "Basisgerät mit SNMP MVP", + "IdLD": 50669, + "Device": "Basisgerät + SNMP", + "Link": "basisSNMP.aspx?&ver=1&id=50669", + "Location_Name": "Mylinghauserstraße Engelbert", + "Location_Short": "G-GEVELSBE-1", + "IdLocation": 24012, + "Area_Name": "Gevelsberg", + "Area_Short": "GMA-GEVELSBE", + "IdArea": 20919, + "X": 51.316799, + "Y": 7.33281, + "Icon": 14, + "System": 200, + "Active": 1 + }, + { + "LD_Name": "Server 3", + "IdLD": 50009, + "Device": "Notruf Server", + "Link": "nrs_server.aspx?ver=1&id=50009", + "Location_Name": "Militärringstraße Militärringstraße", + "Location_Short": "G-KÖLN-1", + "IdLocation": 24015, + "Area_Name": "Köln", + "Area_Short": "GMA-KÖLN", + "IdArea": 20921, + "X": 50.898399, + "Y": 6.92278, + "Icon": 19, + "System": 8, + "Active": 0 + }, + { + "LD_Name": "ICL Test 5", + "IdLD": 50054, + "Device": "ICL", + "Link": "icl.aspx?ver=1&id=50054", + "Location_Name": "Recheder Mühlenweg Dortmund-Ems-Kanal", + "Location_Short": "G-OLFEN-SE-1", + "IdLocation": 24022, + "Area_Name": "Olfen-Selm", + "Area_Short": "GMA-OLFEN-SE", + "IdArea": 20926, + "X": 51.702202, + "Y": 7.40822, + "Icon": 23, + "System": 100, + "Active": 0 + }, + { + "LD_Name": "ICL Test 3", + "IdLD": 50052, + "Device": "ICL", + "Link": "icl.aspx?ver=1&id=50052", + "Location_Name": "Weidenstraße Hestenberg", + "Location_Short": "G-PLETTENB-1", + "IdLocation": 24024, + "Area_Name": "Plettenberg", + "Area_Short": "GMA-PLETTENB", + "IdArea": 20928, + "X": 51.224098, + "Y": 7.86969, + "Icon": 23, + "System": 100, + "Active": 0 + }, + { + "LD_Name": "Test Februar Kai", + "IdLD": 50912, + "Device": "Dauerzählstelle DZ", + "Link": "dauz.aspx?ver=1&id=50912", + "Location_Name": "In der Hoffnung Kiesberg - BG Ost", + "Location_Short": "G-WUPPERTA-4", + "IdLocation": 24039, + "Area_Name": "Wuppertal", + "Area_Short": "GMA-WUPPERTA", + "IdArea": 20937, + "X": 51.238899, + "Y": 7.12715, + "Icon": 14, + "System": 110, + "Active": 1 + } + ] + } + + // Export an async function handler for the API route. + export default async function handler(req, res) { + // Initialize an empty params object to store query parameters. + const params = { + idMap: req.query.idMap, + idUser: req.query.idUser + }; + + // Check if the requested ID map and user match certain conditions. + if (params.idMap === '10' && params.idUser === '484') { + // If the conditions are met, return the GisStationsStaticDistrict object with a 200 status code. + res.status(200).json(GisStationsStaticDistrict); + } else { + // If not, return a 404 error with the message "Not Found". + res.status(404).send('Not Found'); + } + }; \ No newline at end of file diff --git a/pages/api - Kopie/talas5/webserviceMap/GisStationsStatusDistrict.js b/pages/api - Kopie/talas5/webserviceMap/GisStationsStatusDistrict.js new file mode 100644 index 000000000..ae7c25bde --- /dev/null +++ b/pages/api - Kopie/talas5/webserviceMap/GisStationsStatusDistrict.js @@ -0,0 +1,84 @@ +// /pages/api/talas5/webserviceMap/gisStationsMeasurementsSQL.js +import mysql from "mysql2/promise"; + +// Erstellen eines Verbindungspools anstelle einer einzelnen Verbindung +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + const { idMap, idUser } = req.query; + + if (!idMap || !idUser) { + return res.status(400).json({ error: "idMap and idUser are required" }); + } + + try { + let onlySystem = -1; + let districtCounter = 0; + + // Get onlySystem + const [mapResult] = await pool.query("SELECT idsystem_typ FROM maps WHERE id = ?", [idMap]); + if (mapResult.length > 0) { + onlySystem = mapResult[0].idsystem_typ ?? -1; + } + + // Get districtCounter + if (idUser > 0) { + const [userLayerResult] = await pool.query("SELECT count(*) as count FROM user_User_layer1 WHERE iduser = ?", [idUser]); + districtCounter = userLayerResult[0].count; + } + + // Building the query + let query = ` + SELECT ld.idLD, dc.message, p.level, p.name, p.color, ld.idDevice, de.isService, dc.idIcon + FROM location as l + LEFT JOIN location_coordinates AS co ON l.idLocation = co.idLocation and co.idMaps = ? + LEFT JOIN location_device AS ld ON ld.idLocation = l.idLocation + LEFT JOIN datapoint as d ON d.idLD = ld.idLD + LEFT JOIN datapoint_conditions AS dc ON dc.idcondition = d.last_message_condition + LEFT JOIN prio AS p ON p.idPrio = dc.idprio + LEFT JOIN devices AS de ON de.idDevice = ld.idDevice + LEFT JOIN area as a on a.idArea = l.idArea + WHERE p.level < 100 AND co.X > 0 + `; + + const queryParams = [idMap]; + if (districtCounter > 0) { + query += ` AND a.iddistrict IN (SELECT iddistrict FROM user_user_layer1 WHERE iduser = ?)`; + queryParams.push(idUser); + } + if (onlySystem >= 0) { + query += ` AND de.idsystem_typ = ?`; + queryParams.push(onlySystem); + } + query += ` ORDER BY p.level desc`; + + const [results] = await pool.query(query, queryParams); + + const mpss = { + IdMap: idMap.toString(), + Statis: results.map((row) => ({ + IdLD: row.idLD ?? -1, + Le: row.level ?? -1, + Me: row.message ?? "?", + Na: row.name ?? "?", + Co: row.color ?? "#ffffff", + Feld: row.idDevice ?? -1, + Icon: row.idIcon ?? 0, + })), + }; + + res.status(200).json(mpss); + } catch (error) { + console.error("Fehler beim Laden der Daten:", error); + res.status(500).json({ error: "Interner Serverfehler" }); + } +} diff --git a/pages/api - Kopie/talas5/webserviceMap/GisSystemStatic.js b/pages/api - Kopie/talas5/webserviceMap/GisSystemStatic.js new file mode 100644 index 000000000..b2fb56635 --- /dev/null +++ b/pages/api - Kopie/talas5/webserviceMap/GisSystemStatic.js @@ -0,0 +1,273 @@ +// /pages/api/webServiceMap.js +const gisSystemStatic = { + "Name": "Liste aller angezeigten Systeme", + "Zeitstempel": "2024-05-31T15:08:49.8599542+02:00", + "IdMap": "10", + "Systems": [ + { + "IdSystem": 1, + "Name": "TALAS", + "Longname": "Talas Meldestationen", + "Allow": 1, + "Icon": 1 + }, + { + "IdSystem": 2, + "Name": "ECI", + "Longname": "ECI Geräte", + "Allow": 1, + "Icon": 2 + }, + { + "IdSystem": 5, + "Name": "GSM Modem", + "Longname": "LR77 GSM Modems", + "Allow": 1, + "Icon": 5 + }, + { + "IdSystem": 6, + "Name": "Cisco Router", + "Longname": "Cisco Router", + "Allow": 1, + "Icon": 6 + }, + { + "IdSystem": 7, + "Name": "WAGO", + "Longname": "WAGO I/O Systeme", + "Allow": 1, + "Icon": 7 + }, + { + "IdSystem": 8, + "Name": "Siemens", + "Longname": "Siemens Notrufsystem", + "Allow": 0, + "Icon": 8 + }, + { + "IdSystem": 9, + "Name": "OTDR", + "Longname": "Glasfaserüberwachung OTU", + "Allow": 0, + "Icon": 9 + }, + { + "IdSystem": 10, + "Name": "WDM", + "Longname": " Wavelength Division Multiplexing", + "Allow": 0, + "Icon": 10 + }, + { + "IdSystem": 11, + "Name": "GMA", + "Longname": "Glättemeldeanlagen", + "Allow": 1, + "Icon": 11 + }, + { + "IdSystem": 13, + "Name": "Messstellen", + "Longname": "Messstellen", + "Allow": 0, + "Icon": 13 + }, + { + "IdSystem": 100, + "Name": "TALAS ICL", + "Longname": "Talas ICL Unterstationen", + "Allow": 1, + "Icon": 100 + }, + { + "IdSystem": 110, + "Name": "DAUZ", + "Longname": "Dauerzählstellen", + "Allow": 1, + "Icon": 110 + }, + { + "IdSystem": 111, + "Name": "SMS-Funkmodem", + "Longname": "SMS-Funkmodem", + "Allow": 0, + "Icon": 111 + }, + { + "IdSystem": 200, + "Name": "Sonstige", + "Longname": "Sonstige", + "Allow": 1, + "Icon": 200 + } + ], + "Rights": [ + { + "IdRight": 1 + }, + { + "IdRight": 2 + }, + { + "IdRight": 3 + }, + { + "IdRight": 5 + }, + { + "IdRight": 6 + }, + { + "IdRight": 7 + }, + { + "IdRight": 8 + }, + { + "IdRight": 10 + }, + { + "IdRight": 11 + }, + { + "IdRight": 12 + }, + { + "IdRight": 20 + }, + { + "IdRight": 22 + }, + { + "IdRight": 23 + }, + { + "IdRight": 25 + }, + { + "IdRight": 30 + }, + { + "IdRight": 40 + }, + { + "IdRight": 41 + }, + { + "IdRight": 42 + }, + { + "IdRight": 43 + }, + { + "IdRight": 44 + }, + { + "IdRight": 45 + }, + { + "IdRight": 46 + }, + { + "IdRight": 47 + }, + { + "IdRight": 48 + }, + { + "IdRight": 49 + }, + { + "IdRight": 50 + }, + { + "IdRight": 51 + }, + { + "IdRight": 52 + }, + { + "IdRight": 55 + }, + { + "IdRight": 56 + }, + { + "IdRight": 60 + }, + { + "IdRight": 61 + }, + { + "IdRight": 62 + }, + { + "IdRight": 63 + }, + { + "IdRight": 64 + }, + { + "IdRight": 65 + }, + { + "IdRight": 68 + }, + { + "IdRight": 69 + }, + { + "IdRight": 70 + }, + { + "IdRight": 71 + }, + { + "IdRight": 72 + }, + { + "IdRight": 73 + }, + { + "IdRight": 79 + }, + { + "IdRight": 80 + }, + { + "IdRight": 90 + }, + { + "IdRight": 93 + }, + { + "IdRight": 94 + }, + { + "IdRight": 95 + }, + { + "IdRight": 96 + } + ] +} + +// Export an async function handler for the API route. +export default async function handler(req, res) { + // Initialize an empty params object to store query parameters. + const params = { + idMap: req.query.idMap, + idUser: req.query.idUser + }; + + // Check if the requested ID map and user match certain conditions. + if (params.idMap === '10' && params.idUser === '484') { + // If the conditions are met, return the gisSystemStatic object with a 200 status code. + res.status(200).json(gisSystemStatic); + } else { + // If not, return a 404 error with the message "Not Found". + res.status(404).send('Not Found'); + } +}; \ No newline at end of file diff --git a/pages/api - Kopie/talas5/webserviceMap/gisStationsMeasurementsSQL.js b/pages/api - Kopie/talas5/webserviceMap/gisStationsMeasurementsSQL.js new file mode 100644 index 000000000..90c535086 --- /dev/null +++ b/pages/api - Kopie/talas5/webserviceMap/gisStationsMeasurementsSQL.js @@ -0,0 +1,74 @@ +// /pages/api/talas5/webserviceMap/gisStationsMeasurementsSQL.js +import mysql from "mysql2"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +pool.on("connection", function (connection) { + console.log("Database connected successfully."); +}); + +pool.on("error", function (err) { + console.error("Fehler beim Verbinden:", err); +}); + +export default function handler(req, res) { + const idMap = req.query.idMap; + if (req.method !== "GET") { + return res.status(405).json({ error: "Nur GET Methode erlaubt" }); + } + + const sqlQuery = ` + SELECT + ld.idLD, + dp.idDP, + dp.name AS Na, + dp.value AS Val, + dp.unit AS Unit, + mg.name AS Gr, + ld.idLocation, + area.Name AS Area_Name + FROM location_device as ld + LEFT JOIN location_coordinates AS co ON ld.idLocation = co.idLocation and co.idMaps = ? + LEFT JOIN devices AS de ON de.idDevice = ld.idDevice + LEFT JOIN datapoint AS dp ON ld.idLD = dp.idLD + LEFT JOIN message_group AS mg ON dp.idmessage_group = mg.idmessage_group + LEFT JOIN location AS loc ON ld.idLocation = loc.idLocation + LEFT JOIN area AS area ON loc.idArea = area.idArea + WHERE co.X > 0 AND dp.idmessage_group>0 AND length(dp.unit)> 0 AND length(dp.value)> 0 + `; + + pool.query(sqlQuery, [idMap], (error, results) => { + if (error) { + console.error("Fehler beim Abrufen der gis_lines:", error); + return res.status(500).json({ error: "Fehler beim Abrufen der gis_lines" }); + } + + const response = { + Name: "Liste aller Messungen der Geraete", + Zeitstempel: new Date().toISOString(), + IdMap: idMap, + Statis: results.map((row) => ({ + IdLD: row.idLD, + IdDP: row.idDP, + Na: row.Na, + Val: row.Val, + Unit: row.Unit, + Gr: row.Gr, + IdLocation: row.idLocation, + Area_Name: row.Area_Name, + })), + }; + + res.json(response); + }); +} diff --git a/pages/api - Kopie/talas_v5_DB/gisLines/readGisLines.js b/pages/api - Kopie/talas_v5_DB/gisLines/readGisLines.js new file mode 100644 index 000000000..d734ed011 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/gisLines/readGisLines.js @@ -0,0 +1,34 @@ +// /pages/api/talas_v5_DB/gisLines/readGisLines.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "GET") { + return res.status(405).json({ error: "Nur GET Methode erlaubt" }); + } + + const query = "SELECT * FROM talas_v5.gis_lines;"; + + try { + const [results] = await pool.query(query); + if (results.length > 0) { + res.status(200).json(results); + } else { + res.status(404).json({ error: "Gerät nicht gefunden" }); + } + } catch (error) { + console.error("Fehler beim Abrufen der gis_lines:", error); + res.status(500).json({ error: "Fehler beim Abrufen der gis_lines" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/gisLines/updateLineCoordinates.js b/pages/api - Kopie/talas_v5_DB/gisLines/updateLineCoordinates.js new file mode 100644 index 000000000..4271160a0 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/gisLines/updateLineCoordinates.js @@ -0,0 +1,58 @@ +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "POST") { + return res.status(405).json({ error: "Nur POST Methode erlaubt" }); + } + + const { idLD, idModul, newCoordinates } = req.body; + if (!idLD || !idModul || !newCoordinates) { + return res.status(400).json({ error: "Fehlende Daten" }); + } + + const newLineString = `LINESTRING(${newCoordinates.map((coord) => `${coord[0]} ${coord[1]}`).join(",")})`; + + const query = "UPDATE talas_v5.gis_lines SET points = ST_GeomFromText(?) WHERE idLD = ? AND idModul = ?;"; + + let connection; + + try { + // Hole eine Verbindung aus dem Pool + connection = await pool.getConnection(); + + // Beginne eine Transaktion + await connection.beginTransaction(); + + // Führe die Abfrage aus + const [results] = await connection.query(query, [newLineString, idLD, idModul]); + + // Commit der Transaktion + await connection.commit(); + + console.log("Transaction Complete."); + res.status(200).json({ + success: "Updated successfully.", + affectedRows: results.affectedRows, + }); + } catch (error) { + // Rollback im Falle eines Fehlers + if (connection) await connection.rollback(); + console.error("Fehler beim Aktualisieren der gis_lines:", error); + res.status(500).json({ error: "Fehler beim Aktualisieren der gis_lines" }); + } finally { + // Stelle sicher, dass die Verbindung zurückgegeben wird + if (connection) connection.release(); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/locationDevice/getDeviceId.js b/pages/api - Kopie/talas_v5_DB/locationDevice/getDeviceId.js new file mode 100644 index 000000000..8b2326316 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/locationDevice/getDeviceId.js @@ -0,0 +1,41 @@ +// API in /api/talas_v5_DB/locationDevice/getDeviceId.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "GET") { + return res.status(405).json({ error: "Nur GET Methode erlaubt" }); + } + + const { deviceName } = req.query; + + if (!deviceName) { + return res.status(400).json({ error: "deviceName ist erforderlich" }); + } + + const query = "SELECT idLD FROM location_device WHERE name = ?"; + + try { + // Ausführen der Abfrage mit dem Pool + const [results] = await pool.query(query, [deviceName]); + if (results.length > 0) { + res.status(200).json({ idLD: results[0].idLD }); + } else { + res.status(404).json({ error: "Gerät nicht gefunden" }); + } + } catch (error) { + console.error("Fehler beim Abrufen der Geräte-ID:", error); + res.status(500).json({ error: "Fehler beim Abrufen der Geräte-ID" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/locationDevice/locationDeviceNameById.js b/pages/api - Kopie/talas_v5_DB/locationDevice/locationDeviceNameById.js new file mode 100644 index 000000000..575541547 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/locationDevice/locationDeviceNameById.js @@ -0,0 +1,40 @@ +// API in /api/talas_v5_DB/locationDevice/locationDeviceNameById.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "GET") { + return res.status(405).json({ error: "Nur GET Methode erlaubt" }); + } + + const { idLD } = req.query; + + if (!idLD) { + return res.status(400).json({ error: "idLD ist erforderlich" }); + } + + try { + const query = "SELECT name FROM location_device WHERE idLD = ?"; + const [results] = await pool.query(query, [idLD]); + + if (results.length > 0) { + res.status(200).json({ name: results[0].name }); + } else { + res.status(404).json({ error: "Gerät nicht gefunden", idLD }); + } + } catch (error) { + console.error("Fehler beim Abrufen des Gerätenamens:", error); + res.status(500).json({ error: "Fehler beim Abrufen des Gerätenamens" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/locationDevice/locationDevices.js b/pages/api - Kopie/talas_v5_DB/locationDevice/locationDevices.js new file mode 100644 index 000000000..082dc2929 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/locationDevice/locationDevices.js @@ -0,0 +1,32 @@ +// API in /api/talas_v5_DB/locationDevice/locationDevices.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "GET") { + return res.status(405).json({ error: "Nur GET Methode erlaubt" }); + } + + const query = "SELECT * FROM location_device WHERE iddevice = 160"; + + try { + // Ausführen der Abfrage mit dem Verbindungspool + const [results] = await pool.query(query); + + res.status(200).json(results); + } catch (error) { + console.error("Fehler beim Abrufen der Geräteinformationen:", error); + res.status(500).json({ error: "Fehler beim Abrufen der Geräteinformationen" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/poiTyp/readPoiTyp.js b/pages/api - Kopie/talas_v5_DB/poiTyp/readPoiTyp.js new file mode 100644 index 000000000..baff8f83d --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/poiTyp/readPoiTyp.js @@ -0,0 +1,37 @@ +// pages/api/talas_v5_DB/poiTyp/readPoiTyp.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "GET") { + res.setHeader("Allow", ["GET"]); + return res.status(405).end(`Method ${req.method} Not Allowed`); + } + + const query = "SELECT * FROM poityp"; + + try { + // Ausführen der Abfrage mit dem Verbindungspool + const [results] = await pool.query(query); + + if (results.length === 0) { + return res.status(404).json({ message: "Keine Einträge gefunden" }); + } + + res.status(200).json(results); + } catch (error) { + console.error("Fehler beim Abfragen der Datenbank:", error); + res.status(500).json({ error: "Ein Fehler ist aufgetreten" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/pois/addLocation.js b/pages/api - Kopie/talas_v5_DB/pois/addLocation.js new file mode 100644 index 000000000..864835647 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/pois/addLocation.js @@ -0,0 +1,37 @@ +// pages/api/addLocation.js +import mysql from "mysql"; + +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + connectionLimit: 10, // Maximale Anzahl gleichzeitiger Verbindungen +}); + +export default function handler(req, res) { + if (req.method === "POST") { + const { name, poiTypeId, latitude, longitude, idLD } = req.body; + console.log("Received data:", req.body); // Überprüfen der empfangenen Daten + + const query = "INSERT INTO poi (description, idPoiTyp, position, idLD) VALUES (?, ?, ST_GeomFromText(?),?)"; + const point = `POINT(${longitude} ${latitude})`; + const values = [name, poiTypeId, point, idLD]; + + // Verwende den Pool, um eine Verbindung zu bekommen und die Query auszuführen + pool.query(query, values, (error, results) => { + if (error) { + console.error("Fehler beim Einfügen des Standorts:", error); + return res.status(500).json({ error: "Ein Fehler ist aufgetreten" }); + } + res.status(200).json({ + id: results.insertId, + message: "Standort erfolgreich hinzugefügt", + }); + }); + } else { + res.setHeader("Allow", ["POST"]); + res.status(405).end(`Method ${req.method} Not Allowed`); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/pois/deletePoi.js b/pages/api - Kopie/talas_v5_DB/pois/deletePoi.js new file mode 100644 index 000000000..e9132bd6b --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/pois/deletePoi.js @@ -0,0 +1,42 @@ +// pages/api/talas_v5_DB/pois/deletePoi.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "DELETE") { + return res.status(405).json({ error: "Nur DELETE Methode erlaubt" }); + } + + const { id } = req.query; // ID aus der Anfrage holen + + if (!id) { + return res.status(400).json({ error: "POI ID ist erforderlich" }); + } + + const query = "DELETE FROM poi WHERE idPoi = ?"; + + try { + // Ausführen der Abfrage mit dem Verbindungspool + const [results] = await pool.query(query, [id]); + + if (results.affectedRows > 0) { + res.status(200).json({ message: "POI erfolgreich gelöscht" }); + } else { + res.status(404).json({ error: "POI nicht gefunden" }); + } + } catch (error) { + console.error("Fehler beim Löschen des POI 3:", error); + res.status(500).json({ error: "Fehler beim Löschen des POI" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/pois/getPoiById.js b/pages/api - Kopie/talas_v5_DB/pois/getPoiById.js new file mode 100644 index 000000000..3bd2f1023 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/pois/getPoiById.js @@ -0,0 +1,43 @@ +// pages/api/talas_v5_DB/pois/getPoiById.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "GET") { + res.setHeader("Allow", ["GET"]); + return res.status(405).end(`Method ${req.method} Not Allowed`); + } + + const { idPoi } = req.query; + + if (!idPoi) { + return res.status(400).json({ error: "idPoi ist erforderlich" }); + } + + const query = "SELECT description FROM poi WHERE idPoi = ?"; + + try { + // Ausführen der Abfrage mit dem Verbindungspool + const [results] = await pool.query(query, [idPoi]); + + if (results.length === 0) { + return res.status(404).json({ error: "POI nicht gefunden" }); + } + + res.status(200).json(results[0]); + } catch (error) { + console.error("Fehler bei der Abfrage:", error); + res.status(500).json({ error: "Fehler bei der Abfrage" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/pois/poi-icons.js b/pages/api - Kopie/talas_v5_DB/pois/poi-icons.js new file mode 100644 index 000000000..407704538 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/pois/poi-icons.js @@ -0,0 +1,36 @@ +// pages/api/talas_v5_DB/pois/poi-icons.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "GET") { + return res.status(405).json({ error: "Nur GET Methode erlaubt" }); + } + + const query = ` + SELECT p.idPoi, i.path + FROM poi p + JOIN poiTyp pt ON p.idPoiTyp = pt.idPoiTyp + JOIN poiicons i ON pt.icon = i.idpoiicons; + `; + + try { + // Ausführen der Abfrage mit dem Verbindungspool + const [results] = await pool.query(query); + res.status(200).json(results); + } catch (error) { + console.error("Fehler beim Abrufen der Icons:", error); + res.status(500).json({ error: "Fehler beim Abrufen der Icons" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/pois/readLocations.js b/pages/api - Kopie/talas_v5_DB/pois/readLocations.js new file mode 100644 index 000000000..308de78af --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/pois/readLocations.js @@ -0,0 +1,32 @@ +// pages/api/talas_v5_DB/pois/readLocations.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + const query = ` + SELECT idPoi, description, idPoiTyp, idLD, ST_AsText(position) AS position + FROM poi + `; + + try { + // Ausführen der Abfrage mit dem Verbindungspool + const [results] = await pool.query(query); + + // Senden der Antwort zurück + res.status(200).json(results); + } catch (error) { + console.error("Fehler beim Abrufen der API:", error); + res.status(500).json({ error: "Fehler bei der Abfrage" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/pois/updateLocation.js b/pages/api - Kopie/talas_v5_DB/pois/updateLocation.js new file mode 100644 index 000000000..ee61070f2 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/pois/updateLocation.js @@ -0,0 +1,82 @@ +// pages/api/talas_v5_DB/pois/updateLocation.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + charset: "utf8mb4", + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "POST") { + res.setHeader("Allow", ["POST"]); + return res.status(405).end(`Method ${req.method} Not Allowed`); + } + + const { id, latitude, longitude } = req.body; + + if (!id || latitude === undefined || longitude === undefined) { + return res.status(400).json({ error: "id, latitude, und longitude sind erforderlich" }); + } + + const query = "UPDATE poi SET position = POINT(?, ?) WHERE idPoi = ?"; + + try { + const [result] = await pool.query(query, [longitude, latitude, id]); + + if (result.affectedRows > 0) { + res.status(200).json({ success: true }); + } else { + res.status(404).json({ error: "POI nicht gefunden" }); + } + } catch (error) { + console.error("Fehler beim Aktualisieren der Position:", error); + res.status(500).json({ error: "Ein Fehler ist aufgetreten" }); + } +} + +/* import mysql from "mysql"; +import util from "util"; + +const dbConfig = { + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + charset: "utf8mb4", +}; + +export default async function handler(req, res) { + if (req.method !== "POST") { + res.setHeader("Allow", ["POST"]); + return res.status(405).end(`Method ${req.method} Not Allowed`); + } + + const { id, latitude, longitude } = req.body; + + const connection = mysql.createConnection(dbConfig); + // Promisify the query method + const query = util.promisify(connection.query).bind(connection); + + try { + await query("UPDATE poi SET position = POINT(?, ?) WHERE idPoi = ?", [ + longitude, + latitude, + id, + ]); + res.status(200).json({ success: true }); + } catch (error) { + console.error(error); + res.status(500).json({ error: "Ein Fehler ist aufgetreten" }); + } finally { + connection.end(); + } +} */ diff --git a/pages/api - Kopie/talas_v5_DB/pois/updatePoi.js b/pages/api - Kopie/talas_v5_DB/pois/updatePoi.js new file mode 100644 index 000000000..bc3356a2f --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/pois/updatePoi.js @@ -0,0 +1,45 @@ +// pages/api/talas_v5_DB/pois/updatePoi.js +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "POST") { + return res.status(405).json({ error: "Nur POST Methode erlaubt" }); + } + + const { idPoi, description, idPoiTyp, idLD } = req.body; + + if (!idPoi) { + return res.status(400).json({ error: "POI ID ist erforderlich" }); + } + + const query = ` + UPDATE talas_v5.poi + SET description = ?, idPoiTyp = ?, idLD = ? + WHERE idPoi = ? + `; + + try { + const [results] = await pool.query(query, [description, idPoiTyp, idLD, idPoi]); + + if (results.affectedRows > 0) { + res.status(200).json({ message: "POI erfolgreich aktualisiert" }); + } else { + res.status(404).json({ error: "POI nicht gefunden" }); + } + } catch (error) { + console.error("Fehler beim Aktualisieren des POI:", error); + res.status(500).json({ error: "Fehler beim Aktualisieren des POI" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/priorityConfig.js b/pages/api - Kopie/talas_v5_DB/priorityConfig.js new file mode 100644 index 000000000..719007020 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/priorityConfig.js @@ -0,0 +1,31 @@ +// pages/api/talas_v5_DB/priorityConfig.js +// in tals5 http://10.10.0.13/talas5/Management/PriorityConfig.aspx beinhaltet die Tabelle prio die Prioritäten der Meldungen (Level 1-4) oder (0-4) je nachdem DB-Design +// das ist die API, die die Prioritäten zurückgibt + +import mysql from "mysql2/promise"; + +// Erstellen eines Pools von Datenbankverbindungen +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + try { + // Ausführen der Datenbankabfrage + const query = "SELECT idprio, level, name, color FROM prio"; + const results = await pool.query(query); + + // Wichtig: Senden Sie die Antwort zurück + res.status(200).json(results[0]); // Da mysql2 Tuple [rows, fields] zurückgibt, wählen wir nur rows mit [0] + } catch (error) { + console.error("Fehler beim Abrufen der API", error); + res.status(500).json({ error: "Fehler bei der Abfrage" }); + } +} diff --git a/pages/api - Kopie/talas_v5_DB/station/getAllStationsNames.js b/pages/api - Kopie/talas_v5_DB/station/getAllStationsNames.js new file mode 100644 index 000000000..0d5d5ca05 --- /dev/null +++ b/pages/api - Kopie/talas_v5_DB/station/getAllStationsNames.js @@ -0,0 +1,43 @@ +// /pages/api/talas_v5_DB/station/getAllStationsNames.js +import mysql from "mysql2/promise"; + +// Verbindungspool-Konfiguration +const pool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + waitForConnections: true, + connectionLimit: 10, + queueLimit: 0, +}); + +export default async function handler(req, res) { + if (req.method !== "GET") { + res.setHeader("Allow", ["GET"]); + return res.status(405).end(`Method ${req.method} Not Allowed`); + } + + try { + // Abrufen aller idLD und ihrer Namen + const [results] = await pool.query("SELECT idLD, name FROM location_device"); + + if (results.length === 0) { + return res.status(404).json({ error: "No data found" }); + } + + // Struktur der Antwort anpassen + const namesMap = results.reduce((map, { idLD, name }) => { + if (!map[idLD]) { + map[idLD] = name; // Stelle sicher, dass hier keine Duplikate oder Überschreibungen entstehen + } + return map; + }, {}); + + res.status(200).json(namesMap); + } catch (err) { + console.error("Fehler beim Abrufen der Daten:", err); + res.status(500).json({ error: "Error retrieving data from the database" }); + } +} diff --git a/pages/api.zip b/pages/api.zip new file mode 100644 index 0000000000000000000000000000000000000000..345e83d412f38404ca22b3bbbb79bf9c15123ea4 GIT binary patch literal 23173 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 literal 0 HcmV?d00001 diff --git a/pages/api/talas5/area.js b/pages/api/talas5/area.js index 9205aa5ca..a9c399a52 100644 --- a/pages/api/talas5/area.js +++ b/pages/api/talas5/area.js @@ -1,40 +1,19 @@ // pages/api/talas_v5/area.js // Lesen von talas_v5 MySQL-Datenbank -> area Tabelle enthält DAUZ Geräte -// Wenn gebraucht wird, dann nutzen ansonsten löschen -import mysql from "mysql"; +import getPool from "../../utils/mysqlPool"; // Verwende den Singleton-Pool -const dbConfig = { - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, -}; -//console.log("my dbconfig: ", dbConfig); -export default function handler(req, res) { - const connection = mysql.createConnection(dbConfig); +export default async function handler(req, res) { + try { + const pool = getPool(); // Hole den Pool - connection.connect((err) => { - if (err) { - console.error("Fehler beim Verbinden:", err.stack); - res.status(500).json({ error: "Verbindungsfehler zur Datenbank" }); - return; - } + // Führe die Abfrage aus + const [results] = await pool.query("SELECT id, name FROM area WHERE id = ?", [req.query.id]); - //console.log("Verbunden als ID", connection.threadId); - //Fehler weil, existiertdie Tabelle auf localhost:3000 nicht - connection.query("SELECT ..., ..., ..., ... FROM ... WHERE ... = ...", (error, results) => { - if (error) { - console.error("Fehler beim Abrufen der API", error); - res.status(500).json({ error: "Fehler bei der Abfrage" }); - return; - } - - // Wichtig: Senden Sie die Antwort zurück - res.status(200).json(results); - - connection.end(); - }); - }); + // Sende die Antwort zurück + res.status(200).json(results); + } catch (error) { + console.error("Fehler beim Abrufen der API", error); + res.status(500).json({ error: "Fehler bei der Abfrage" }); + } } diff --git a/pages/api/talas5/location_device.js b/pages/api/talas5/location_device.js index 9292690e0..498db9424 100644 --- a/pages/api/talas5/location_device.js +++ b/pages/api/talas5/location_device.js @@ -1,42 +1,34 @@ -// Importieren des mysql2 Pakets -import mysql from "mysql2"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); - -// Ein Hilfsfunktion, um Anfragen zu vereinfachen -function queryDatabase(query, params) { - return new Promise((resolve, reject) => { - pool.query(query, params, (error, results) => { - if (error) { - return reject(error); - } - resolve(results); - }); - }); -} +// /pages/api/talas5/location_device.js +import getPool from "../../../utils/mysqlPool"; // Import Singleton-Pool // API-Handler export default async function handler(req, res) { - try { - // Dein SQL-Query und die Parameter - const sql = "SELECT idLD, iddevice, name FROM location_device WHERE iddevice = ?"; - const params = [160]; // Beispielparameter + const pool = getPool(); // Singleton-Pool verwenden - // Ausführen der Datenbankabfrage - const results = await queryDatabase(sql, params); + let connection; + try { + // SQL-Query and parameters + const sql = "SELECT idLD, iddevice, name FROM location_device WHERE iddevice = ?"; + const params = [160]; // Example parameter + + // Get a connection from the pool + connection = await pool.getConnection(); + + // Execute the query + const [results] = await connection.query(sql, params); + + // Check if results are empty + if (!results.length) { + return res.status(404).json({ error: "Keine Geräte gefunden" }); + } + + // Respond with the results res.status(200).json(results); } catch (error) { - console.error("Fehler beim Abrufen der API", error); - res.status(500).json({ error: "Fehler bei der Abfrage" }); + // Log and return error + console.error("Fehler beim Abrufen der Geräteinformationen:", error); + res.status(500).json({ error: "Fehler beim Abrufen der Geräteinformationen" }); + } finally { + if (connection) connection.release(); } } diff --git a/pages/api/talas5/webserviceMap/GisStationsStatusDistrict.js b/pages/api/talas5/webserviceMap/GisStationsStatusDistrict.js index ae7c25bde..27b0b442b 100644 --- a/pages/api/talas5/webserviceMap/GisStationsStatusDistrict.js +++ b/pages/api/talas5/webserviceMap/GisStationsStatusDistrict.js @@ -1,19 +1,10 @@ -// /pages/api/talas5/webserviceMap/gisStationsMeasurementsSQL.js -import mysql from "mysql2/promise"; - -// Erstellen eines Verbindungspools anstelle einer einzelnen Verbindung -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +// /pages/api/talas5/webserviceMap/GisStationsStatusDistrict.js +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + let connection; // Verbindung deklarieren + const { idMap, idUser } = req.query; if (!idMap || !idUser) { @@ -21,22 +12,25 @@ export default async function handler(req, res) { } try { + // Verbindung aus dem Pool holen + connection = await pool.getConnection(); + let onlySystem = -1; let districtCounter = 0; // Get onlySystem - const [mapResult] = await pool.query("SELECT idsystem_typ FROM maps WHERE id = ?", [idMap]); + const [mapResult] = await connection.query("SELECT idsystem_typ FROM maps WHERE id = ?", [idMap]); if (mapResult.length > 0) { onlySystem = mapResult[0].idsystem_typ ?? -1; } // Get districtCounter if (idUser > 0) { - const [userLayerResult] = await pool.query("SELECT count(*) as count FROM user_User_layer1 WHERE iduser = ?", [idUser]); + const [userLayerResult] = await connection.query("SELECT count(*) as count FROM user_User_layer1 WHERE iduser = ?", [idUser]); districtCounter = userLayerResult[0].count; } - // Building the query + // Query erstellen let query = ` SELECT ld.idLD, dc.message, p.level, p.name, p.color, ld.idDevice, de.isService, dc.idIcon FROM location as l @@ -61,7 +55,7 @@ export default async function handler(req, res) { } query += ` ORDER BY p.level desc`; - const [results] = await pool.query(query, queryParams); + const [results] = await connection.query(query, queryParams); const mpss = { IdMap: idMap.toString(), @@ -80,5 +74,8 @@ export default async function handler(req, res) { } catch (error) { console.error("Fehler beim Laden der Daten:", error); res.status(500).json({ error: "Interner Serverfehler" }); + } finally { + // Stelle sicher, dass die Verbindung zurück in den Pool gegeben wird + if (connection) connection.release(); } } diff --git a/pages/api/talas5/webserviceMap/gisStationsMeasurementsSQL.js b/pages/api/talas5/webserviceMap/gisStationsMeasurementsSQL.js index 90c535086..7912816d4 100644 --- a/pages/api/talas5/webserviceMap/gisStationsMeasurementsSQL.js +++ b/pages/api/talas5/webserviceMap/gisStationsMeasurementsSQL.js @@ -1,27 +1,9 @@ // /pages/api/talas5/webserviceMap/gisStationsMeasurementsSQL.js -import mysql from "mysql2"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); - -pool.on("connection", function (connection) { - console.log("Database connected successfully."); -}); - -pool.on("error", function (err) { - console.error("Fehler beim Verbinden:", err); -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + const idMap = req.query.idMap; if (req.method !== "GET") { return res.status(405).json({ error: "Nur GET Methode erlaubt" }); diff --git a/pages/api/talas_v5_DB/gisLines/readGisLines.js b/pages/api/talas_v5_DB/gisLines/readGisLines.js index d734ed011..ce7ec97dd 100644 --- a/pages/api/talas_v5_DB/gisLines/readGisLines.js +++ b/pages/api/talas_v5_DB/gisLines/readGisLines.js @@ -1,19 +1,8 @@ -// /pages/api/talas_v5_DB/gisLines/readGisLines.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + if (req.method !== "GET") { return res.status(405).json({ error: "Nur GET Methode erlaubt" }); } @@ -21,6 +10,7 @@ export default async function handler(req, res) { const query = "SELECT * FROM talas_v5.gis_lines;"; try { + // Abrufen der Datenbankergebnisse const [results] = await pool.query(query); if (results.length > 0) { res.status(200).json(results); diff --git a/pages/api/talas_v5_DB/gisLines/updateLineCoordinates.js b/pages/api/talas_v5_DB/gisLines/updateLineCoordinates.js index 4271160a0..4be22f7e4 100644 --- a/pages/api/talas_v5_DB/gisLines/updateLineCoordinates.js +++ b/pages/api/talas_v5_DB/gisLines/updateLineCoordinates.js @@ -1,18 +1,8 @@ -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + if (req.method !== "POST") { return res.status(405).json({ error: "Nur POST Methode erlaubt" }); } @@ -52,7 +42,6 @@ export default async function handler(req, res) { console.error("Fehler beim Aktualisieren der gis_lines:", error); res.status(500).json({ error: "Fehler beim Aktualisieren der gis_lines" }); } finally { - // Stelle sicher, dass die Verbindung zurückgegeben wird if (connection) connection.release(); } } diff --git a/pages/api/talas_v5_DB/locationDevice/getDeviceId.js b/pages/api/talas_v5_DB/locationDevice/getDeviceId.js index 8b2326316..00b36b4ed 100644 --- a/pages/api/talas_v5_DB/locationDevice/getDeviceId.js +++ b/pages/api/talas_v5_DB/locationDevice/getDeviceId.js @@ -1,19 +1,9 @@ // API in /api/talas_v5_DB/locationDevice/getDeviceId.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + if (req.method !== "GET") { return res.status(405).json({ error: "Nur GET Methode erlaubt" }); } @@ -26,9 +16,14 @@ export default async function handler(req, res) { const query = "SELECT idLD FROM location_device WHERE name = ?"; + let connection; + try { - // Ausführen der Abfrage mit dem Pool - const [results] = await pool.query(query, [deviceName]); + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + + // Ausführen der Abfrage + const [results] = await connection.query(query, [deviceName]); + if (results.length > 0) { res.status(200).json({ idLD: results[0].idLD }); } else { @@ -37,5 +32,7 @@ export default async function handler(req, res) { } catch (error) { console.error("Fehler beim Abrufen der Geräte-ID:", error); res.status(500).json({ error: "Fehler beim Abrufen der Geräte-ID" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung in den Pool zurück } } diff --git a/pages/api/talas_v5_DB/locationDevice/locationDeviceNameById.js b/pages/api/talas_v5_DB/locationDevice/locationDeviceNameById.js index 575541547..3649343e2 100644 --- a/pages/api/talas_v5_DB/locationDevice/locationDeviceNameById.js +++ b/pages/api/talas_v5_DB/locationDevice/locationDeviceNameById.js @@ -1,19 +1,9 @@ // API in /api/talas_v5_DB/locationDevice/locationDeviceNameById.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + if (req.method !== "GET") { return res.status(405).json({ error: "Nur GET Methode erlaubt" }); } @@ -24,9 +14,13 @@ export default async function handler(req, res) { return res.status(400).json({ error: "idLD ist erforderlich" }); } + let connection; + try { + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + const query = "SELECT name FROM location_device WHERE idLD = ?"; - const [results] = await pool.query(query, [idLD]); + const [results] = await connection.query(query, [idLD]); if (results.length > 0) { res.status(200).json({ name: results[0].name }); @@ -36,5 +30,7 @@ export default async function handler(req, res) { } catch (error) { console.error("Fehler beim Abrufen des Gerätenamens:", error); res.status(500).json({ error: "Fehler beim Abrufen des Gerätenamens" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung in den Pool zurück } } diff --git a/pages/api/talas_v5_DB/locationDevice/locationDevices.js b/pages/api/talas_v5_DB/locationDevice/locationDevices.js index 082dc2929..4b1e7bc2b 100644 --- a/pages/api/talas_v5_DB/locationDevice/locationDevices.js +++ b/pages/api/talas_v5_DB/locationDevice/locationDevices.js @@ -1,32 +1,28 @@ // API in /api/talas_v5_DB/locationDevice/locationDevices.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + if (req.method !== "GET") { return res.status(405).json({ error: "Nur GET Methode erlaubt" }); } const query = "SELECT * FROM location_device WHERE iddevice = 160"; + let connection; + try { - // Ausführen der Abfrage mit dem Verbindungspool - const [results] = await pool.query(query); + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + + // Ausführen der Abfrage + const [results] = await connection.query(query); res.status(200).json(results); } catch (error) { console.error("Fehler beim Abrufen der Geräteinformationen:", error); res.status(500).json({ error: "Fehler beim Abrufen der Geräteinformationen" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung in den Pool zurück } } diff --git a/pages/api/talas_v5_DB/poiTyp/readPoiTyp.js b/pages/api/talas_v5_DB/poiTyp/readPoiTyp.js index baff8f83d..34fb06aaf 100644 --- a/pages/api/talas_v5_DB/poiTyp/readPoiTyp.js +++ b/pages/api/talas_v5_DB/poiTyp/readPoiTyp.js @@ -1,19 +1,9 @@ // pages/api/talas_v5_DB/poiTyp/readPoiTyp.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Verwende den Singleton-Pool + if (req.method !== "GET") { res.setHeader("Allow", ["GET"]); return res.status(405).end(`Method ${req.method} Not Allowed`); @@ -21,9 +11,13 @@ export default async function handler(req, res) { const query = "SELECT * FROM poityp"; + let connection; + try { - // Ausführen der Abfrage mit dem Verbindungspool - const [results] = await pool.query(query); + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + + // Führe die Abfrage aus + const [results] = await connection.query(query); if (results.length === 0) { return res.status(404).json({ message: "Keine Einträge gefunden" }); @@ -33,5 +27,7 @@ export default async function handler(req, res) { } catch (error) { console.error("Fehler beim Abfragen der Datenbank:", error); res.status(500).json({ error: "Ein Fehler ist aufgetreten" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung zurück in den Pool } } diff --git a/pages/api/talas_v5_DB/pois/addLocation.js b/pages/api/talas_v5_DB/pois/addLocation.js index 864835647..98494b342 100644 --- a/pages/api/talas_v5_DB/pois/addLocation.js +++ b/pages/api/talas_v5_DB/pois/addLocation.js @@ -1,16 +1,9 @@ // pages/api/addLocation.js -import mysql from "mysql"; +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - connectionLimit: 10, // Maximale Anzahl gleichzeitiger Verbindungen -}); +export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden -export default function handler(req, res) { if (req.method === "POST") { const { name, poiTypeId, latitude, longitude, idLD } = req.body; console.log("Received data:", req.body); // Überprüfen der empfangenen Daten @@ -19,17 +12,24 @@ export default function handler(req, res) { const point = `POINT(${longitude} ${latitude})`; const values = [name, poiTypeId, point, idLD]; - // Verwende den Pool, um eine Verbindung zu bekommen und die Query auszuführen - pool.query(query, values, (error, results) => { - if (error) { - console.error("Fehler beim Einfügen des Standorts:", error); - return res.status(500).json({ error: "Ein Fehler ist aufgetreten" }); - } + let connection; + + try { + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + + // Verwende die Verbindung, um die Query auszuführen + const [results] = await connection.query(query, values); + res.status(200).json({ id: results.insertId, message: "Standort erfolgreich hinzugefügt", }); - }); + } catch (error) { + console.error("Fehler beim Einfügen des Standorts:", error); + res.status(500).json({ error: "Ein Fehler ist aufgetreten" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung in den Pool zurück + } } else { res.setHeader("Allow", ["POST"]); res.status(405).end(`Method ${req.method} Not Allowed`); diff --git a/pages/api/talas_v5_DB/pois/deletePoi.js b/pages/api/talas_v5_DB/pois/deletePoi.js index e9132bd6b..43ac96a9a 100644 --- a/pages/api/talas_v5_DB/pois/deletePoi.js +++ b/pages/api/talas_v5_DB/pois/deletePoi.js @@ -1,19 +1,9 @@ // pages/api/talas_v5_DB/pois/deletePoi.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + if (req.method !== "DELETE") { return res.status(405).json({ error: "Nur DELETE Methode erlaubt" }); } @@ -26,9 +16,13 @@ export default async function handler(req, res) { const query = "DELETE FROM poi WHERE idPoi = ?"; + let connection; + try { + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + // Ausführen der Abfrage mit dem Verbindungspool - const [results] = await pool.query(query, [id]); + const [results] = await connection.query(query, [id]); if (results.affectedRows > 0) { res.status(200).json({ message: "POI erfolgreich gelöscht" }); @@ -36,7 +30,9 @@ export default async function handler(req, res) { res.status(404).json({ error: "POI nicht gefunden" }); } } catch (error) { - console.error("Fehler beim Löschen des POI 3:", error); + console.error("Fehler beim Löschen des POI:", error); res.status(500).json({ error: "Fehler beim Löschen des POI" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung in den Pool zurück } } diff --git a/pages/api/talas_v5_DB/pois/getPoiById.js b/pages/api/talas_v5_DB/pois/getPoiById.js index 3bd2f1023..d06e1d86f 100644 --- a/pages/api/talas_v5_DB/pois/getPoiById.js +++ b/pages/api/talas_v5_DB/pois/getPoiById.js @@ -1,19 +1,9 @@ // pages/api/talas_v5_DB/pois/getPoiById.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + if (req.method !== "GET") { res.setHeader("Allow", ["GET"]); return res.status(405).end(`Method ${req.method} Not Allowed`); @@ -27,9 +17,13 @@ export default async function handler(req, res) { const query = "SELECT description FROM poi WHERE idPoi = ?"; + let connection; + try { + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + // Ausführen der Abfrage mit dem Verbindungspool - const [results] = await pool.query(query, [idPoi]); + const [results] = await connection.query(query, [idPoi]); if (results.length === 0) { return res.status(404).json({ error: "POI nicht gefunden" }); @@ -39,5 +33,7 @@ export default async function handler(req, res) { } catch (error) { console.error("Fehler bei der Abfrage:", error); res.status(500).json({ error: "Fehler bei der Abfrage" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung in den Pool zurück } } diff --git a/pages/api/talas_v5_DB/pois/poi-icons.js b/pages/api/talas_v5_DB/pois/poi-icons.js index 407704538..742260fb9 100644 --- a/pages/api/talas_v5_DB/pois/poi-icons.js +++ b/pages/api/talas_v5_DB/pois/poi-icons.js @@ -1,19 +1,9 @@ // pages/api/talas_v5_DB/pois/poi-icons.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + if (req.method !== "GET") { return res.status(405).json({ error: "Nur GET Methode erlaubt" }); } @@ -25,12 +15,18 @@ export default async function handler(req, res) { JOIN poiicons i ON pt.icon = i.idpoiicons; `; + let connection; + try { + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + // Ausführen der Abfrage mit dem Verbindungspool - const [results] = await pool.query(query); + const [results] = await connection.query(query); res.status(200).json(results); } catch (error) { console.error("Fehler beim Abrufen der Icons:", error); res.status(500).json({ error: "Fehler beim Abrufen der Icons" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung in den Pool zurück } } diff --git a/pages/api/talas_v5_DB/pois/readLocations.js b/pages/api/talas_v5_DB/pois/readLocations.js index 308de78af..464d0df5e 100644 --- a/pages/api/talas_v5_DB/pois/readLocations.js +++ b/pages/api/talas_v5_DB/pois/readLocations.js @@ -1,32 +1,27 @@ // pages/api/talas_v5_DB/pois/readLocations.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + const query = ` SELECT idPoi, description, idPoiTyp, idLD, ST_AsText(position) AS position FROM poi `; + let connection; + try { - // Ausführen der Abfrage mit dem Verbindungspool - const [results] = await pool.query(query); + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + + const [results] = await connection.query(query); // Senden der Antwort zurück res.status(200).json(results); } catch (error) { console.error("Fehler beim Abrufen der API:", error); res.status(500).json({ error: "Fehler bei der Abfrage" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung in den Pool zurück } } diff --git a/pages/api/talas_v5_DB/pois/updateLocation.js b/pages/api/talas_v5_DB/pois/updateLocation.js index ee61070f2..dafa9ce20 100644 --- a/pages/api/talas_v5_DB/pois/updateLocation.js +++ b/pages/api/talas_v5_DB/pois/updateLocation.js @@ -1,20 +1,9 @@ // pages/api/talas_v5_DB/pois/updateLocation.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - charset: "utf8mb4", - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + if (req.method !== "POST") { res.setHeader("Allow", ["POST"]); return res.status(405).end(`Method ${req.method} Not Allowed`); @@ -28,8 +17,12 @@ export default async function handler(req, res) { const query = "UPDATE poi SET position = POINT(?, ?) WHERE idPoi = ?"; + let connection; + try { - const [result] = await pool.query(query, [longitude, latitude, id]); + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + + const [result] = await connection.query(query, [longitude, latitude, id]); if (result.affectedRows > 0) { res.status(200).json({ success: true }); @@ -39,44 +32,7 @@ export default async function handler(req, res) { } catch (error) { console.error("Fehler beim Aktualisieren der Position:", error); res.status(500).json({ error: "Ein Fehler ist aufgetreten" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung in den Pool zurück } } - -/* import mysql from "mysql"; -import util from "util"; - -const dbConfig = { - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - charset: "utf8mb4", -}; - -export default async function handler(req, res) { - if (req.method !== "POST") { - res.setHeader("Allow", ["POST"]); - return res.status(405).end(`Method ${req.method} Not Allowed`); - } - - const { id, latitude, longitude } = req.body; - - const connection = mysql.createConnection(dbConfig); - // Promisify the query method - const query = util.promisify(connection.query).bind(connection); - - try { - await query("UPDATE poi SET position = POINT(?, ?) WHERE idPoi = ?", [ - longitude, - latitude, - id, - ]); - res.status(200).json({ success: true }); - } catch (error) { - console.error(error); - res.status(500).json({ error: "Ein Fehler ist aufgetreten" }); - } finally { - connection.end(); - } -} */ diff --git a/pages/api/talas_v5_DB/pois/updatePoi.js b/pages/api/talas_v5_DB/pois/updatePoi.js index bc3356a2f..1b46ec65e 100644 --- a/pages/api/talas_v5_DB/pois/updatePoi.js +++ b/pages/api/talas_v5_DB/pois/updatePoi.js @@ -1,19 +1,9 @@ // pages/api/talas_v5_DB/pois/updatePoi.js -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Verwende den Singleton-Pool + if (req.method !== "POST") { return res.status(405).json({ error: "Nur POST Methode erlaubt" }); } @@ -30,8 +20,12 @@ export default async function handler(req, res) { WHERE idPoi = ? `; + let connection; + try { - const [results] = await pool.query(query, [description, idPoiTyp, idLD, idPoi]); + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + + const [results] = await connection.query(query, [description, idPoiTyp, idLD, idPoi]); if (results.affectedRows > 0) { res.status(200).json({ message: "POI erfolgreich aktualisiert" }); @@ -41,5 +35,7 @@ export default async function handler(req, res) { } catch (error) { console.error("Fehler beim Aktualisieren des POI:", error); res.status(500).json({ error: "Fehler beim Aktualisieren des POI" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung zurück in den Pool } } diff --git a/pages/api/talas_v5_DB/priorityConfig.js b/pages/api/talas_v5_DB/priorityConfig.js index 719007020..a2a24d1c6 100644 --- a/pages/api/talas_v5_DB/priorityConfig.js +++ b/pages/api/talas_v5_DB/priorityConfig.js @@ -2,28 +2,18 @@ // in tals5 http://10.10.0.13/talas5/Management/PriorityConfig.aspx beinhaltet die Tabelle prio die Prioritäten der Meldungen (Level 1-4) oder (0-4) je nachdem DB-Design // das ist die API, die die Prioritäten zurückgibt -import mysql from "mysql2/promise"; - -// Erstellen eines Pools von Datenbankverbindungen -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../utils/mysqlPool"; // Singleton-Pool importieren export default async function handler(req, res) { + const pool = getPool(); // Singleton-Pool verwenden + try { // Ausführen der Datenbankabfrage const query = "SELECT idprio, level, name, color FROM prio"; - const results = await pool.query(query); + const [results] = await pool.query(query); // Wichtig: Senden Sie die Antwort zurück - res.status(200).json(results[0]); // Da mysql2 Tuple [rows, fields] zurückgibt, wählen wir nur rows mit [0] + res.status(200).json(results); // Nur rows werden zurückgegeben } catch (error) { console.error("Fehler beim Abrufen der API", error); res.status(500).json({ error: "Fehler bei der Abfrage" }); diff --git a/pages/api/talas_v5_DB/station/getAllStationsNames.js b/pages/api/talas_v5_DB/station/getAllStationsNames.js index 0d5d5ca05..1bf158cb2 100644 --- a/pages/api/talas_v5_DB/station/getAllStationsNames.js +++ b/pages/api/talas_v5_DB/station/getAllStationsNames.js @@ -1,27 +1,21 @@ // /pages/api/talas_v5_DB/station/getAllStationsNames.js -import mysql from "mysql2/promise"; - -// Verbindungspool-Konfiguration -const pool = mysql.createPool({ - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_NAME, - port: process.env.DB_PORT, - waitForConnections: true, - connectionLimit: 10, - queueLimit: 0, -}); +import getPool from "../../../../utils/mysqlPool"; // Importiere den Singleton-Pool export default async function handler(req, res) { + const pool = getPool(); // Verwende den Singleton-Pool + if (req.method !== "GET") { res.setHeader("Allow", ["GET"]); return res.status(405).end(`Method ${req.method} Not Allowed`); } + let connection; + try { + connection = await pool.getConnection(); // Hole eine Verbindung aus dem Pool + // Abrufen aller idLD und ihrer Namen - const [results] = await pool.query("SELECT idLD, name FROM location_device"); + const [results] = await connection.query("SELECT idLD, name FROM location_device"); if (results.length === 0) { return res.status(404).json({ error: "No data found" }); @@ -39,5 +33,7 @@ export default async function handler(req, res) { } catch (err) { console.error("Fehler beim Abrufen der Daten:", err); res.status(500).json({ error: "Error retrieving data from the database" }); + } finally { + if (connection) connection.release(); // Gib die Verbindung zurück in den Pool } } diff --git a/utils/mapFeatures.js b/utils/mapFeatures.js index 59a327681..8cba33e7f 100644 --- a/utils/mapFeatures.js +++ b/utils/mapFeatures.js @@ -131,40 +131,7 @@ export const setupMarkers = async ( export const setupPolylines = (map, linePositions, lineColors, tooltipContents, setNewCoords, tempMarker, currentZoom, currentCenter) => { const markers = []; const polylines = []; - let isMouseOverMenuItem = false; - const checkMouseOverMenu = () => { - if (!isMouseOverMenuItem) { - //showContextMenuItemByIndex(map, 0); - //showContextMenuItemByIndex(map, 1); - //closeContextMenu(); // Kontextmenü schließen, wenn die Maus nicht mehr darüber ist - } - }; - - const handleMouseOverMenuItem = () => { - isMouseOverMenuItem = true; - }; - - const handleMouseOutMenuItem = () => { - isMouseOverMenuItem = false; - setTimeout(checkMouseOverMenu, 500); // kleine Verzögerung, um sicherzustellen, dass es keine schnellen Bewegungen sind - }; - - const closeContextMenu = () => { - const contextMenuElement = document.querySelector(".leaflet-contextmenu"); - if (contextMenuElement) { - contextMenuElement.style.display = "none"; // Kontextmenü ausblenden - } - }; - - const handleOutsideClick = (event) => { - const contextMenuElement = document.querySelector(".leaflet-contextmenu"); - if (contextMenuElement && !contextMenuElement.contains(event.target)) { - //closeContextMenu(); // Kontextmenü schließen, wenn der Klick außerhalb stattfindet - } - }; - - //document.addEventListener("mousedown", handleOutsideClick); linePositions.forEach((lineData, lineIndex) => { const lineMarkers = []; lineData.coordinates.forEach((coord, index) => { @@ -269,8 +236,6 @@ export const setupPolylines = (map, linePositions, lineColors, tooltipContents, const polyline = L.polyline(lineData.coordinates, { color: lineColors[`${lineData.idLD}-${lineData.idModul}`] || "#000000", contextmenu: true, - idLD: lineData.idLD, // Füge die idLD zur Polyline hinzu - idModul: lineData.idModul, // Füge die idModul zur Polyline hinzu contextmenuItems: [ { text: "Stützpunkt hinzufügen", @@ -290,21 +255,12 @@ export const setupPolylines = (map, linePositions, lineColors, tooltipContents, }).addTo(map); polyline.on("mouseover", (e) => { - polyline.setStyle({ weight: 15 }); - }); - - polyline.on("mousedown", (e) => { - polyline.setStyle({ weight: 15 }); - }); - - polyline.on("mouseup", (e) => { - polyline.setStyle({ weight: 15 }); + polyline.setStyle({ weight: 10 }); }); polyline.on("mouseout", (e) => { polyline.setStyle({ weight: 3 }); polyline.setStyle({ color: lineColors[`${lineData.idLD}-${lineData.idModul}`] || "#000000" }); - //setTimeout(checkMouseOverMenu, 500); }); polyline.bindTooltip(tooltipContents[`${lineData.idLD}-${lineData.idModul}`] || "Standard-Tooltip-Inhalt", { @@ -316,7 +272,5 @@ export const setupPolylines = (map, linePositions, lineColors, tooltipContents, markers.push(...lineMarkers); }); - // Add listeners to the context menu items - const contextMenuElement = document.querySelector(".leaflet-contextmenu"); // Assuming the context menu class is 'leaflet-contextmenu' return { markers, polylines }; }; diff --git a/utils/mapInitialization.js b/utils/mapInitialization.js index 71e49a733..ffbc761b5 100644 --- a/utils/mapInitialization.js +++ b/utils/mapInitialization.js @@ -40,14 +40,40 @@ export const initializeMap = (mapRef, setMap, setOms, setMenuItemAdded, addItems text: "Station Öffnen (Tab)", icon: "/img/screen_new.png", callback: (e) => { - const clickedTarget = lastClickedTarget || findNearestPolyline(initMap, e.latlng); // Verwende zwischengespeichertes Ziel oder die nächstgelegene Linie + const clickedTarget = lastClickedTarget || e.relatedTarget || e.layer; + + if (!clickedTarget) { + console.error("Kein gültiges Ziel im Kontextmenü"); + return; + } + + // Prüfen, ob das Element eine Station (Marker) oder Linie (Polyline) ist + if (clickedTarget instanceof L.Marker) { + console.log("Marker angeklickt"); + openInNewTab(e, clickedTarget); + } else if (clickedTarget instanceof L.Polyline) { + console.log("Linie angeklickt:", clickedTarget.options.idLD); // Hier kannst du die ID oder andere Optionen der Polyline verwenden + // Optional: Funktion zum Öffnen der Linie implementieren + openInNewTab(e, clickedTarget); + } else { + console.error("Unbekanntes Element"); + } + }, + }, + + /* callback: (e) => { + //Wenn Kein Station oder ein Station ist + const clickedMarker = e.relatedTarget; // Zugriff auf den Marker, der das Event ausgelöst hat + openInNewTab(e, clickedMarker); + //wenn Linie ist (polyline) + const clickedTarget = lastClickedTarget || findNearestPolyline(initMap, e.latlng); // Verwende zwischengespeichertes Ziel oder die nächstgelegene Linie if (clickedTarget) { openInNewTab(e, clickedTarget); // Gemeinsame Funktion für Linien und Stationen } else { console.error("Kein gültiges Ziel im Kontextmenü"); - } + } }, - }, + }, */ "-", ], }); diff --git a/utils/mysqlPool.js b/utils/mysqlPool.js new file mode 100644 index 000000000..266a6ecdf --- /dev/null +++ b/utils/mysqlPool.js @@ -0,0 +1,40 @@ +import mysql from "mysql2/promise"; + +// Variablen für den Singleton-Pool +let cachedPool; +let connectionCount = 0; // Zähler für die aktiven Verbindungen + +// Funktion zum Abrufen des Pools +function getPool() { + if (!cachedPool) { + cachedPool = mysql.createPool({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_NAME, + port: process.env.DB_PORT, + connectionLimit: 10, // Setze ein Limit für gleichzeitige Verbindungen + waitForConnections: true, + queueLimit: 0, // Unbegrenzte Warteschlange für Verbindungen + }); + + // Ereignisse für das Protokollieren der Verbindungsstatistiken + cachedPool.on("acquire", () => { + connectionCount++; + console.log("Connection acquired. Active connections: ", connectionCount); + }); + + cachedPool.on("release", () => { + connectionCount--; + console.log("Connection released. Active connections: ", connectionCount); + }); + + cachedPool.on("enqueue", () => { + console.log("Waiting for available connection slot."); + }); + } + + return cachedPool; +} + +export default getPool;