diff --git a/docs/ANLEITUNG.md b/docs/ANLEITUNG.md index f20bde4d..ce303003 100644 --- a/docs/ANLEITUNG.md +++ b/docs/ANLEITUNG.md @@ -38,6 +38,17 @@ Das Startmenue ist in drei Bereiche gegliedert: - Fenster koennen verschoben, minimiert, maximiert und geschlossen werden. - Programme koennen sowohl globale System-Apps als auch klassische Module sein. +## API + +Die API der Anwendung liegt aktuell bewusst auf demselben Host wie der Desktop. + +Das Zielbild ist: + +- `desktop.kusche.berlin/api/v1/...` +- `staging.desktop.kusche.berlin/api/v1/...` + +Eine getrennte API-Domain wie `api.desktop.kusche.berlin` ist derzeit nicht der Standard. + ## Einstellungen oeffnen Die Einstellungen werden aktuell ueber die App `User Self Management` bereitgestellt. diff --git a/docs/CONTENT.md b/docs/CONTENT.md index 8acbec1c..a0a73b58 100644 --- a/docs/CONTENT.md +++ b/docs/CONTENT.md @@ -58,6 +58,9 @@ Diese Benennungen gelten projektweit und sollen in UI, Doku und Weiterentwicklun - `App` Ein bereitgestelltes System-Tool oder Modul. Eine App kann als Desktop-App, Menue-App, Systembar-Eintrag oder Quelle fuer Widgets/Funktionen auftreten. +- `API` + Die serverseitige Programmschnittstelle der Desktop-Anwendung. Sie wird im aktuellen Projekt auf demselben Host wie die Desktop-Shell unter `/api/v1/...` bereitgestellt. + - `Widget` Eine kleine Funktion oder Mini-Anzeige. Widgets sind nicht automatisch identisch mit Apps. Eine App kann Widgets bereitstellen, muss es aber nicht. @@ -82,6 +85,7 @@ Stand dieser Datei: - `User Self Management` als Setup-App - erster echter Modulpfad fuer klassische Module mit Modul-Discovery aus `modules//` - `Mining-Checker` als erstes angebundenes klassisches Modul +- versionierte API auf demselben Host unter `(staging.)desktop.kusche.berlin/api/v1/...` - Benutzereinstellungen fuer Desktop-Skin, App-Auswahl, Infobereich und Profildaten in einer eigenen Datenbanktabelle mit `_user_data`-Suffix - vorhandene JSON-Dateien dienen nur noch als Fallback oder Uebergang fuer lokale Entwicklung und Altbestaende - LDAP-Synchronisierung fuer Standardfelder wie Name, E-Mail, Telefon, Titel und Ort @@ -96,6 +100,7 @@ Aus [README.md](/home/lars/Schreibtisch/Projekte/desktop.kusche.berlin/docs/READ - `public/` ist der Web-Root fuer die Desktop-Shell - `src/Desktop/` enthaelt zentrale Desktop-Mechaniken +- die API bleibt auf demselben Host wie die Desktop-Shell und wird unter `/api/v1/...` versioniert - `partials/desktop/` enthaelt Shell-Templates - `modules/` bleibt Zielort fuer klassische Module - `temp/nexus-module-import/` ist Rohbasis fuer importierte Nexus-Module @@ -136,6 +141,7 @@ Fuer einen spaeteren Hilfebereich sollen Inhalte aus dieser Datei in Themenblcke - `Infobereich konfigurieren` - `Apps und Desktop Type verwalten` - `Module verstehen und starten` +- `API-Pfade und Versionen verstehen` - `Benutzerdaten und Synchronisierung` Die Inhalte sollen spaeter moeglichst nicht neu erfunden, sondern aus den zentral gepflegten Dateien abgeleitet werden. diff --git a/docs/README.md b/docs/README.md index f60e0676..7c7586af 100644 --- a/docs/README.md +++ b/docs/README.md @@ -33,6 +33,7 @@ Zentraler Dokumentationsindex fuer das Projekt. - `Old-Nexus/` wird nicht technisch eingebunden. - Skins `Windows`, `Apple`, `Linux` laufen auf einer gemeinsamen Shell. - Keycloak bleibt das Auth-System. +- API und Desktop laufen auf demselben Host. Zielpfad ist `(staging.)desktop.kusche.berlin/api/v1/...`. - der Theme-Handoff ist in [keycloak-theme-handoff.md](/home/lars/Schreibtisch/Projekte/desktop.kusche.berlin/docs/keycloak-theme-handoff.md) beschrieben. ## Dokumentationsregel @@ -49,3 +50,4 @@ Aktuell wichtig: - der Mining-Checker ist das erste als echtes Desktop-Modul angebundene Modul unter `modules/mining-checker/` - Modul-Assets koennen ueber einen gemeinsamen Auslieferungsweg aus dem Modul selbst geladen werden +- die API bleibt vorerst auf demselben Host und wird nicht auf `api.desktop.kusche.berlin` ausgelagert diff --git a/docs/UMSETZUNGSSTATUS.md b/docs/UMSETZUNGSSTATUS.md index 6d87693e..3b759cbe 100644 --- a/docs/UMSETZUNGSSTATUS.md +++ b/docs/UMSETZUNGSSTATUS.md @@ -25,6 +25,7 @@ Aktuell ist das Projekt auf einem V1-Scaffold-Stand: - App-Registry, Widget-Registry und Import-Basis sind angelegt - erster echter Modulmechanismus fuer klassische Module ist vorhanden - `Mining-Checker` ist als erstes klassisches Modul angebunden +- API soll im Zielbild auf demselben Host unter `(staging.)desktop.kusche.berlin/api/v1/...` liegen - Keycloak ist nur konzeptionell vorbereitet, nicht integriert - Admin-Bereiche und persistente User-Desktops sind noch offen @@ -34,6 +35,7 @@ Aktuell ist das Projekt auf einem V1-Scaffold-Stand: - keine Includes, Imports, Asset-Pfade oder Laufzeitkopplung auf Altbestand - klassische Module bleiben strukturell unter `modules//` - die Desktop-Shell ist eine eigene Anwendungsschicht und kein Theme-Umbau des alten Systems +- API und Desktop teilen sich im aktuellen Zielbild denselben Host; Standardpfad ist `/api/v1/...` ## Status Nach Datei diff --git a/docs/WEITERENTWICKLUNG.md b/docs/WEITERENTWICKLUNG.md index 9f4c417f..8c0c3557 100644 --- a/docs/WEITERENTWICKLUNG.md +++ b/docs/WEITERENTWICKLUNG.md @@ -33,6 +33,7 @@ Verbindlich ist: - Nutzerdaten und Desktop-Preferences bevorzugt datenbankbasiert speichern, nicht dateibasiert - `README.md`-Dateien in Teilbereichen aktuell halten - zentrale Doku bei jeder relevanten Struktur- oder Begriffsanpassung mitpflegen +- API-Pfade versioniert und host-konsistent unter `(staging.)desktop.kusche.berlin/api/v1/...` halten ## NoGo's @@ -43,12 +44,14 @@ Verbindlich ist: - keine nur lokalen README-Informationen ohne zentrale Uebernahme der wichtigen Punkte - keine Hilfeinhalte nur in Chatverlaeufen oder Ad-hoc-Notizen belassen - keine produktive Architekturabhaengigkeit zu `Old-Nexus/` oder vergleichbaren Altbestaenden +- keine neue Standard-API-Domain wie `api.desktop.kusche.berlin`, solange keine ausdrueckliche Architekturentscheidung dafuer getroffen wurde ## Architekturregeln - `modules//` bleibt Ort fuer klassische Module - globale Desktop-Mechaniken liegen im gemeinsamen Kern - globale Modul-Helfer duerfen im gemeinsamen Kern liegen, Fachlogik aber nicht +- API und Desktop teilen sich im aktuellen Zielbild denselben Host; offizielle Basis ist `/api/v1/...` - Skins definieren Darstellung und Interaktionsdetails, nicht die Fachlogik - Hilfe- und Inhaltsdateien sollen spaeter maschinenlesbar oder zumindest klar strukturierbar in einen Hilfebereich ueberfuehrt werden koennen @@ -67,6 +70,7 @@ Bei jeder groesseren Aenderung ist zu pruefen: - `docs/UMSETZUNGSSTATUS.md` nur dann als erledigt markieren, wenn es ausdruecklich freigegeben wurde - Fokus liegt aktuell auf Desktop-UI und Apps - Login und Keycloak sind vorerst akzeptiert und nicht der aktuelle Hauptschwerpunkt +- API-Zielpfade sollen auf `(staging.)desktop.kusche.berlin/api/v1/...` vereinheitlicht werden - Desktop-Icons sind frei verschiebbar und werden pro Benutzer und Skin lokal gespeichert - die Schriftfarbe von Desktop-Icons passt sich automatisch an den Hintergrund an - Benutzerdaten sollen spaeter sauber in LDAP oder Keycloak geschrieben werden diff --git a/modules/mining-checker/assets/js/app.js b/modules/mining-checker/assets/js/app.js index 7a73d562..69f6efea 100644 --- a/modules/mining-checker/assets/js/app.js +++ b/modules/mining-checker/assets/js/app.js @@ -276,6 +276,27 @@ return formatDateByParts(value, true); } + function normalizeApiUrl(rawUrl) { + const url = String(rawUrl || ''); + if (!url || !apiBase.includes('?path=')) { + return url; + } + + if (!url.startsWith(apiBase)) { + return url; + } + + const [baseRoot, basePath = ''] = apiBase.split('?path='); + const suffix = url.slice(apiBase.length); + const [routeSuffix, extraQuery = ''] = suffix.split('?'); + const normalizedPath = [basePath, routeSuffix] + .map((part) => String(part || '').replace(/^\/+|\/+$/g, '')) + .filter(Boolean) + .join('/'); + + return `${baseRoot}?path=${encodeURIComponent(normalizedPath)}${extraQuery ? `&${extraQuery}` : ''}`; + } + async function request(path, options) { const requestOptions = options && typeof options === 'object' ? { ...options } : {}; const debugEnabled = !!debugBus.enabled; @@ -287,7 +308,7 @@ const controller = new AbortController(); const timeoutId = window.setTimeout(() => controller.abort(), timeoutMs); - const requestUrl = path; + const requestUrl = normalizeApiUrl(path); const headers = { ...(requestOptions.headers || {}) }; if (debugEnabled) { headers['X-Mining-Debug'] = '1'; diff --git a/start.md b/start.md index bc05ed6c..29791c99 100644 --- a/start.md +++ b/start.md @@ -44,6 +44,7 @@ Danach bei Bedarf die fachlichen Projektanweisungen lesen: - `README.md`-Dateien in Teilbereichen pflegen - wichtige Informationen aus dezentralen `README.md`-Dateien auch zentral in `docs/` halten - `Old-Nexus/` oder Altbestand nie technisch zur Laufzeit einbinden +- API-Pfade im aktuellen Projektziel unter `(staging.)desktop.kusche.berlin/api/v1/...` halten und keine separate Standard-API-Domain annehmen ## Wichtige Dokumente