diff --git a/.env.local b/.env.local index bb753e837..c7ac37850 100644 --- a/.env.local +++ b/.env.local @@ -14,5 +14,6 @@ NEXT_PUBLIC_DEBUG_LOG=true # für Polylines/kabelstecken -> in Konextmenü "Station öffnen" " NEXT_PUBLIC_BASE_URL=http://10.10.0.70/talas5/devices/ -NEXT_PUBLIC_API_BASE_URL=http://10.10.0.70/talas5/ClientData/WebServiceMap.asmx +#auf dem Entwicklungsrechner dev und auf dem Server prod +NEXT_PUBLIC_API_PORT_MODE=dev diff --git a/components/DataSheet.js b/components/DataSheet.js index 920af5bd4..751a5900f 100644 --- a/components/DataSheet.js +++ b/components/DataSheet.js @@ -164,7 +164,7 @@ function DataSheet() { useInitGisStationsStatic(); //--------------------------- useEffect(() => { - //console.log("🔍 GisStationsStatic Inhalt:", GisStationsStatic); + console.log("🔍 GisStationsStatic Inhalt:", GisStationsStatic); if (!GisStationsStatic) { console.warn("⚠️ GisStationsStatic ist `null` oder nicht geladen."); @@ -177,7 +177,7 @@ function DataSheet() { } if (!GisStationsStatic.Points || !Array.isArray(GisStationsStatic.Points)) { - //console.warn("⚠️ GisStationsStatic.Points ist nicht vorhanden oder kein Array.", GisStationsStatic); + console.warn("⚠️ GisStationsStatic.Points ist nicht vorhanden oder kein Array.", GisStationsStatic); return; } @@ -198,7 +198,7 @@ function DataSheet() { })) ); - // console.log("📌 stationListing aktualisiert:", filteredAreas); + console.log("📌 stationListing aktualisiert:", filteredAreas); }, [GisStationsStatic]); //--------------------------- diff --git a/components/PoiUpdateModal.js b/components/PoiUpdateModal.js index 93e07c287..ef1093136 100644 --- a/components/PoiUpdateModal.js +++ b/components/PoiUpdateModal.js @@ -130,7 +130,9 @@ const PoiUpdateModal = ({ onClose, poiData }) => { useEffect(() => { console.log("currentPoi von PoiUpdateModal.js : ", currentPoi.idLD); - fetch("/api/talas_v5_DB/locationDevice/locationDevices") + const API_BASE_URL = `${window.location.origin}:3000`; +const response = await fetch(`${API_BASE_URL}/api/talas_v5_DB/locationDevice/locationDevices`); + .then((response) => response.json()) .then((data) => { setLocationDeviceData(data); diff --git a/config/appVersion.js b/config/appVersion.js index c6c98a8cf..d0046b014 100644 --- a/config/appVersion.js +++ b/config/appVersion.js @@ -1,2 +1,2 @@ // /config/appVersion -export const APP_VERSION = "1.1.69"; +export const APP_VERSION = "1.1.70"; diff --git a/docs/frontend/redux/api/fromWebService.md b/docs/frontend/redux/api/fromWebService.md index d2ce8de41..1885408e1 100644 --- a/docs/frontend/redux/api/fromWebService.md +++ b/docs/frontend/redux/api/fromWebService.md @@ -4,18 +4,12 @@ In diesem Verzeichnis befinden sich alle Webservice-Fetch-Funktionen für die Ko --- -## Aktueller Stand - -Jede Funktion liest `idMap` und `idUser` **ausschließlich aus der URL**, wie sie von TALAS.web übergeben werden. - ---- - ## Übergabe der Parameter über URL (`m`, `u`) TALAS.web ruft die Kartenansicht in der Regel so auf: ``` -http://localhost:3000/?m=10&u=484 +http://[SERVER]:3000/?m=10&u=484 ``` Daraus ergeben sich folgende Zuweisungen: @@ -25,14 +19,12 @@ Daraus ergeben sich folgende Zuweisungen: | `m` | `idMap` | `const idMap = params.get("m")` | | `u` | `idUser` | `const idUser = params.get("u")` | -🔔 Achtung: Diese Kurzform (`m`, `u`) ist systembedingt durch TALAS.web vorgegeben und **soll nicht durch `idMap` oder `idUser` ersetzt werden**, da die Parameter sonst nicht erkannt werden. - ### Beispiel: ```ts const params = new URLSearchParams(window.location.search); -const idMap = params.get("m"); // statt "idMap" -const idUser = params.get("u"); // statt "idUser" +const idMap = params.get("m"); +const idUser = params.get("u"); ``` --- @@ -49,11 +41,26 @@ Das wurde entfernt, um folgende Ziele zu erreichen: - ❌ Keine fest eingetragenen Defaults im Browser sichtbar - ✅ Verbindlichkeit: TALAS.web übergibt die Werte immer korrekt via URL -- 🔐 Sicherheit: Kein versehentliches Verwenden eines falschen Users (z. B. ID 484) +- 🔐 Sicherheit: Kein versehentliches Verwenden eines falschen Users - 🔍 Fehler leichter erkennbar (Parameter nicht gefunden = echter Fehler) --- +## Hinweis zur Webservice-Konfiguration + +Die Webservice-Basisadresse wird **nicht mehr über `.env.local` gesteuert**. + +Stattdessen wird sie dynamisch im Client anhand des aktuellen Hostnamens bestimmt: + +```js +const baseUrl = `${window.location.origin}/talas5/ClientData/WebServiceMap.asmx`; +``` + +➡ Dadurch ist kein Rebuild mehr nötig bei IP-Wechseln oder Serverumzügen. +Die Build-Version kann auf jedem Server wiederverwendet werden. + +--- + ## Optional: Validierung einbauen Falls gewünscht, kann ein expliziter Fehler ausgelöst werden: @@ -80,12 +87,4 @@ Diese Änderung betrifft alle Funktionen in: --- -## Hinweis zur Konfiguration - -Die Webservice-Basisadresse wird weiterhin über `.env.local` konfiguriert: - -```env -NEXT_PUBLIC_API_BASE_URL=http://10.10.0.13/talas5/ClientData/WebServiceMap.asmx -``` - -Aber `idMap` und `idUser` werden **nicht** mehr über Umgebungsvariablen gesteuert. +Diese Konvention stellt sicher, dass Webservices unabhängig von IP und Serverkonfiguration aufgerufen werden können. diff --git a/docs/frontend/redux/api/fromWebService/fetchGisSystemStatic.md b/docs/frontend/redux/api/fromWebService/fetchGisSystemStatic.md new file mode 100644 index 000000000..b61989233 --- /dev/null +++ b/docs/frontend/redux/api/fromWebService/fetchGisSystemStatic.md @@ -0,0 +1,76 @@ +# 🌐 fetchGisSystemStatic – Geräte-Systemdaten abrufen + +## Zweck + +Diese Funktion ruft die Gerätestatus-Übersicht für eine bestimmte Karte ab: + +WebService-Endpunkt: + +``` +GisSystemStatic?idMap={idMap}&idUser={idUser} +``` + +--- + +## Besonderheit bei der URL + +Die Webservices (z. B. `WebServiceMap.asmx`) laufen **immer auf Port 80**, +egal ob im Entwicklungsmodus (`localhost`, `:3000`) oder auf dem Testserver (`10.10.0.13`). + +Daher wird im Code explizit `:80` gesetzt – gesteuert über die Umgebungsvariable: + +```env +NEXT_PUBLIC_API_PORT_MODE=dev +``` + +### Beispiel (aus dem Code): + +```js +const mode = process.env.NEXT_PUBLIC_API_PORT_MODE; + +const apiBaseUrl = mode === "dev" ? `${window.location.protocol}//${window.location.hostname}:80/talas5/ClientData/WebServiceMap.asmx` : `${window.location.origin}/talas5/ClientData/WebServiceMap.asmx`; +``` + +--- + +## Parameter + +Die Funktion liest folgende URL-Parameter ein: + +| URL-Parameter | Beschreibung | Übergabe durch TALAS.web | +| ------------- | ------------ | ------------------------ | +| `m` | Map-ID | Ja | +| `u` | User-ID | Ja | + +Diese werden aus der URL wie folgt gelesen: + +```js +const params = new URLSearchParams(window.location.search); +const idMap = params.get("m"); +const idUser = params.get("u"); +``` + +--- + +## Beispiel-Aufruf + +TALAS-Aufruf: + +``` +http://10.10.0.13/talas5/MessagesMap/mapTypeC.aspx?m=12&u=484 +``` + +wird im Webservice-Request zu: + +``` +http://10.10.0.13/talas5/ClientData/WebServiceMap.asmx/GisSystemStatic?idMap=12&idUser=484 +``` + +--- + +## Siehe auch + +- `.env.local` → `NEXT_PUBLIC_API_PORT_MODE` +- `docs/fromWebService.md` +- API-Datei: `/redux/api/fromWebService/fetchGisSystemStatic.js` +- 📄 Pfad: `/docs/frontend/redux/api/fromWebService/fetchGisSystemStatic.md` diff --git a/hooks/useMapComponentState.js b/hooks/useMapComponentState.js index 3baf0df0b..a8c999008 100644 --- a/hooks/useMapComponentState.js +++ b/hooks/useMapComponentState.js @@ -49,31 +49,29 @@ export const useMapComponentState = () => { const fetchDeviceData = async () => { try { - const apiBaseUrl = process.env.NEXT_PUBLIC_API_BASE_URL; + const host = window.location.hostname; + const port = host === "10.10.0.70" ? "3000" : "80"; + + //const apiBaseUrl = `http://${host}:${port}/talas5/ClientData/WebServiceMap.asmx`; + const apiBaseUrl = `http://10.10.0.70/talas5/ClientData/WebServiceMap.asmx`; - // URL-Parameter aus der aktuellen Browser-URL holen const params = new URLSearchParams(window.location.search); - const idMap = params.get("idMap") || "12"; // Fallback auf "12" falls nicht gesetzt - + const idMap = params.get("m"); + //console.log("idMap:", idMap); const url = `${apiBaseUrl}/GisStationsStatic?idMap=${idMap}`; - //console.log("📡 API Request URL:", url); + //console.log("URL:", url); const response = await fetch(url); - //console.log("📡 API Response Status:", response.status); - // console.log("📡 API Response Headers:", response.headers.get("content-type")); - - const text = await response.text(); - //console.log("📡 API Response Text:", text); - - // JSON manuell parsen, falls die API keinen JSON-Header sendet - const data = JSON.parse(text); + // 🔄 KORREKT: Webservice liefert direkt JSON + const data = await response.json(); + //console.log("Standort- und Gerätedaten:", data); setLocationDeviceData(data.Points || []); - if (data.Points && data.Points.length > 0) { setDeviceName(data.Points[0].LD_Name); + //console.log("Gerätename:", data.Points[0].LD_Name); } } catch (error) { console.error("❌ Fehler beim Abrufen der Gerätedaten:", error); diff --git a/redux/api/fromWebService/fetchGisStationsMeasurements.js b/redux/api/fromWebService/fetchGisStationsMeasurements.js index c5b66013c..b74cdcc43 100644 --- a/redux/api/fromWebService/fetchGisStationsMeasurements.js +++ b/redux/api/fromWebService/fetchGisStationsMeasurements.js @@ -1,8 +1,7 @@ // /redux/api/fromWebService/fetchGisStationsMeasurements.js -const apiBaseUrl = process.env.NEXT_PUBLIC_API_BASE_URL; - export const fetchGisStationsMeasurements = async () => { + const apiBaseUrl = `${window.location.origin}/talas5/ClientData/WebServiceMap.asmx`; const params = new URLSearchParams(window.location.search); const idMap = params.get("m"); const idUser = params.get("u"); diff --git a/redux/api/fromWebService/fetchGisStationsStatic.js b/redux/api/fromWebService/fetchGisStationsStatic.js index b8333b9f4..cc94b4d20 100644 --- a/redux/api/fromWebService/fetchGisStationsStatic.js +++ b/redux/api/fromWebService/fetchGisStationsStatic.js @@ -1,6 +1,6 @@ // /redux/api/fromWebService/fetchGisStationsStatic.js -const apiBaseUrl = process.env.NEXT_PUBLIC_API_BASE_URL; +const apiBaseUrl = `${window.location.origin}/talas5/ClientData/WebServiceMap.asmx`; export const fetchGisStationsStatic = async () => { try { diff --git a/redux/api/fromWebService/fetchGisStationsStaticDistrict.js b/redux/api/fromWebService/fetchGisStationsStaticDistrict.js index 56fd19a21..1239425b5 100644 --- a/redux/api/fromWebService/fetchGisStationsStaticDistrict.js +++ b/redux/api/fromWebService/fetchGisStationsStaticDistrict.js @@ -1,8 +1,7 @@ // /redux/api/fromWebService/fetchGisStationsStaticDistrict.js -const apiBaseUrl = process.env.NEXT_PUBLIC_API_BASE_URL; - export const fetchGisStationsStaticDistrict = async () => { + const apiBaseUrl = `${window.location.origin}/talas5/ClientData/WebServiceMap.asmx`; const params = new URLSearchParams(window.location.search); const idMap = params.get("m"); const idUser = params.get("u"); diff --git a/redux/api/fromWebService/fetchGisStationsStatusDistrict.js b/redux/api/fromWebService/fetchGisStationsStatusDistrict.js index 60b042343..7b4024001 100644 --- a/redux/api/fromWebService/fetchGisStationsStatusDistrict.js +++ b/redux/api/fromWebService/fetchGisStationsStatusDistrict.js @@ -1,8 +1,7 @@ // /redux/api/fromWebService/fetchGisStationsStatusDistrict.js -const apiBaseUrl = process.env.NEXT_PUBLIC_API_BASE_URL; - export const fetchGisStationsStatusDistrict = async () => { + const apiBaseUrl = `${window.location.origin}/talas5/ClientData/WebServiceMap.asmx`; const params = new URLSearchParams(window.location.search); const idMap = params.get("m"); const idUser = params.get("u"); diff --git a/redux/api/fromWebService/fetchGisSystemStatic.js b/redux/api/fromWebService/fetchGisSystemStatic.js index 910d48b5a..cfdebf9fa 100644 --- a/redux/api/fromWebService/fetchGisSystemStatic.js +++ b/redux/api/fromWebService/fetchGisSystemStatic.js @@ -1,14 +1,16 @@ // /redux/api/fromWebService/fetchGisSystemStatic.js -const apiBaseUrl = process.env.NEXT_PUBLIC_API_BASE_URL; - export async function fetchGisSystemStatic() { + const mode = process.env.NEXT_PUBLIC_API_PORT_MODE; + + const apiBaseUrl = mode === "dev" ? `${window.location.protocol}//${window.location.hostname}:80/talas5/ClientData/WebServiceMap.asmx` : `${window.location.origin}/talas5/ClientData/WebServiceMap.asmx`; + const params = new URLSearchParams(window.location.search); const idMap = params.get("m"); const idUser = params.get("u"); - //console.log("🔍 fetchGisSystemStatic - idMap:", idMap); - //console.log("🔍 fetchGisSystemStatic - idUser:", idUser); - //console.log("🔍 fetchGisSystemStatic - URL:", `${apiBaseUrl}/GisSystemStatic?idMap=${idMap}&idUser=${idUser}`); + console.log("🔍 fetchGisSystemStatic - idMap:", idMap); + console.log("🔍 fetchGisSystemStatic - idUser:", idUser); + console.log("🔍 fetchGisSystemStatic - URL:", `${apiBaseUrl}/GisSystemStatic?idMap=${idMap}&idUser=${idUser}`); const response = await fetch(`${apiBaseUrl}/GisSystemStatic?idMap=${idMap}&idUser=${idUser}`); const data = await response.json(); diff --git a/redux/slices/webService/gisStationsStaticSlice.js b/redux/slices/webService/gisStationsStaticSlice.js index 918c22a4c..62a991155 100644 --- a/redux/slices/webService/gisStationsStaticSlice.js +++ b/redux/slices/webService/gisStationsStaticSlice.js @@ -5,7 +5,7 @@ import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"; // API-Fetch-Funktion für GIS Stations Static mit dynamischem URL-Parameter export const fetchGisStationsStatic = createAsyncThunk("gisStationsStatic/fetchGisStationsStatic", async (_, { rejectWithValue }) => { try { - const apiBaseUrl = process.env.NEXT_PUBLIC_API_BASE_URL; + const apiBaseUrl = `${window.location.origin}/talas5/ClientData/WebServiceMap.asmx`; // URL-Parameter aus der aktuellen Browser-URL holen const params = new URLSearchParams(window.location.search);