table = "Benachrichtigung"; $this->seenTable = "Benachrichtigung_Gesehen"; } /** * Ermittelt die Benutzer-ID des aktuell eingeloggten Nutzers. */ private function getCurrentUserId(): ?int { $username = $_SESSION['username'] ?? null; if (!$username) { return null; } $rows = DatabaseShow( "Benutzer", "ID", "NAME = ?", $username ); return $rows[0]['ID'] ?? null; } /** * Alle Nachrichten (z.B. für eine Verwaltungsansicht). */ public function getAllMessages(): array { return DatabaseShow( $this->table, "ID, TITEL, NACHRICHT" ); } /** * Nur die Nachrichten, die der aktuelle Nutzer noch NICHT gesehen hat. * Genau das braucht das Modal, um zu entscheiden ob/was es anzeigt. */ public function getUnseenMessages(): array { $userId = $this->getCurrentUserId(); if ($userId === null) { return []; } $alleNachrichten = DatabaseShow( $this->table, "ID, TITEL, NACHRICHT" ); $gesehenRows = DatabaseShow( $this->seenTable, "NACHRICHTEN_ID", "BENUTZER_ID = ?", $userId ); $gesehenIds = array_column($gesehenRows, 'NACHRICHTEN_ID'); return array_values(array_filter( $alleNachrichten, fn($nachricht) => !in_array($nachricht['ID'], $gesehenIds) )); } /** * Legt eine neue Nachricht im Pool an (z.B. für eine Admin-Funktion). */ public function createMessage(string $titel, string $nachricht): bool { try { DatabaseInsert( $this->table, "TITEL, NACHRICHT", $titel, $nachricht ); return true; } catch (Exception $e) { throw new Exception($e->getMessage()); } } /** * Markiert eine bestimmte Nachricht als vom aktuellen Nutzer gesehen/bestätigt. */ public function markAsSeen(int $nachrichtId): bool { $userId = $this->getCurrentUserId(); if ($userId === null) { throw new Exception('Kein eingeloggter Benutzer gefunden.'); } // Prüfen, ob schon als gesehen markiert, um Duplikate zu vermeiden $bereitsGesehen = DatabaseShow( $this->seenTable, "ID", "BENUTZER_ID = ? AND NACHRICHTEN_ID = ?", $userId, $nachrichtId ); if (!empty($bereitsGesehen)) { return true; // war schon markiert, kein Fehler } try { DatabaseInsert( $this->seenTable, "BENUTZER_ID, NACHRICHTEN_ID", $userId, $nachrichtId ); return true; } catch (Exception $e) { throw new Exception($e->getMessage()); } } public function updateMessage(int $id, string $titel, string $nachricht): bool { try { DatabaseUpdate( $this->table, "TITEL = ?, NACHRICHT = ?", "ID = ?", $titel, $nachricht, $id ); return true; } catch (Exception $e) { throw new Exception($e->getMessage()); } } /** * Löscht eine Nachricht komplett, inkl. aller "Gesehen"-Einträge dazu. */ public function deleteMessage(int $id): bool { try { DatabaseDelete($this->seenTable, "NACHRICHTEN_ID = ?", $id); DatabaseDelete($this->table, "ID = ?", $id); return true; } catch (Exception $e) { throw new Exception($e->getMessage()); } } /** * Anzahl Nutzer, die eine bestimmte Nachricht bereits bestätigt haben. */ public function countSeenBy(int $id): int { $rows = DatabaseShow( $this->seenTable, "ID", "NACHRICHTEN_ID = ?", $id ); return count($rows); } }