/** * Service-Klasse für das Nachrichtensystem (Message Service). * Ermöglicht den Abruf und Versand von Systemnachrichten und Herausforderungen (Challenges) * sowie das Ändern des Gelesen-Status von Nachrichten. */ class MessageService { /** * Erstellt eine Instanz des MessageService. * @param {Object} config - Das globale Konfigurationsobjekt. */ constructor(config) { this.baseUrl = config.API_BASE_URL; this.urlTail = "messages"; } /** * Lädt alle Nachrichten (eingehend und ausgehend) für den authentifizierten Benutzer. * @param {string} username - Der Benutzername. * @param {string} password - Das Passwort des Benutzers. * @returns {Promise} Ein Promise mit der Liste aller Nachrichten im Body. */ async getMessages(username, password) { const response = await fetch(`${this.baseUrl}${this.urlTail}`, { method: "GET", headers: { "X-Username": username, "X-Password": password, }, }); let body = null; try { body = await response.json(); } catch { console.error("Error in getMessages"); } return { status: response.status, ok: response.ok, body: body, }; } /** * Sendet eine Nachricht (oder eine eingebettete Challenge) an einen anderen Benutzer. * @param {string} username - Der Benutzername des Senders. * @param {string} password - Das Passwort des Senders. * @param {string} recipient - Der Empfänger der Nachricht. * @param {string} type - Der Typ der Nachricht (z. B. "standard" oder "challenge"). * @param {string} text - Der eigentliche Textinhalt (kann eingebettete Challenge-JSON-Daten enthalten). * @returns {Promise} Ein Promise mit der Antwort des Servers im Body. */ async postMessage(username, password, recipient, type, text) { const response = await fetch(`${this.baseUrl}${this.urlTail}`, { method: "POST", headers: { "Content-Type": "application/json", "X-Username": username, "X-Password": password, }, body: JSON.stringify({ recipient: recipient, type: type, text: text, }), }); let body = null; try { body = await response.json(); } catch { console.error("Error in postMessage"); } return { status: response.status, ok: response.ok, body: body, }; } /** * Markiert eine spezifische Nachricht als gelesen. * @param {string} username - Der Benutzername des Empfängers. * @param {string} password - Das Passwort des Empfängers. * @param {string|number} messageId - Eindeutige ID der Nachricht. * @returns {Promise} Ein Promise mit dem Resultat der PATCH-Anfrage. */ async markMessageAsRead(username, password, messageId) { const response = await fetch(`${this.baseUrl}${this.urlTail}/${messageId}/read`, { method: "PATCH", headers: { "X-Username": username, "X-Password": password, }, }); let body = null; try { body = await response.json(); } catch { console.error("Error in markMessageAsRead"); } return { status: response.status, ok: response.ok, body: body, }; } /** * Markiert alle ungelesenen Nachrichten des Benutzers auf einmal als gelesen. * @param {string} username - Der Benutzername. * @param {string} password - Das Passwort des Benutzers. * @returns {Promise} Ein Promise mit dem Status der Bulk-Operation. */ async markAllMessagesAsRead(username, password) { const response = await fetch(`${this.baseUrl}${this.urlTail}/read`, { method: "PATCH", headers: { "X-Username": username, "X-Password": password, }, }); let body = null; try { body = await response.json(); } catch { console.error("Error in markAllMessagesAsRead"); } return { status: response.status, ok: response.ok, body: body, }; } } // Global verfügbar machen window.MessageService = MessageService;