178 lines
4.4 KiB
PHP
178 lines
4.4 KiB
PHP
<?php
|
|
|
|
include_once(__DIR__ . '/DatabaseController.php');
|
|
include_once(__DIR__ . '/DataController.php');
|
|
|
|
class Notification
|
|
{
|
|
protected $table;
|
|
protected $seenTable;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->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);
|
|
}
|
|
}
|