diff --git a/Abgabe_Mohr/controller/Chat.php b/Abgabe_Mohr/controller/Chat.php index 47a0e02..c87fcac 100644 --- a/Abgabe_Mohr/controller/Chat.php +++ b/Abgabe_Mohr/controller/Chat.php @@ -1,43 +1,50 @@ getUserById($_SESSION['user_id']); - $allUsers = $userModel->getAllUsers(); - $selectedUser = null; - $messages = []; + $allUsers = $userModel->getAllUsersExcept($currentUserId); + $currentUser = $userModel->getUserById( $currentUserId); + $unreadCounts = $chatModel->getUnreadCounts($currentUserId); - // Prüfen, ob ein Kontakt ausgewählt wurde - if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['contact_id'])) { - $contactId = (int)$_POST['contact_id']; - $selectedUser = $userModel->getUserById($contactId); - $chatModel = Factory::createChatModel(); - $messages = $chatModel->getMessagesBetweenUsers($currentUser['id'], $selectedUser['id']); + // Unread in Kontakte einfügen + foreach ($allUsers as &$user) { + $user['unread'] = $unreadCounts[$user['id']] ?? 0; } - // Prüfen, ob eine Nachricht gesendet wird - if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['message']) && isset($_POST['receiver_id'])) { - $chatModel = Factory::createChatModel(); - $chatModel->senderID = $currentUser['id']; - $chatModel->empfaengerID = (int)$_POST['receiver_id']; - $chatModel->nachricht = trim($_POST['message']); - $chatModel->insert(); - - // Nachricht nach dem Senden erneut laden - $selectedUser = $userModel->getUserById($_POST['receiver_id']); - $messages = $chatModel->getMessagesBetweenUsers($currentUser['id'], $selectedUser['id']); - } - - require_once(PROJEKT_VIEW_DIR . "/chat/index.php"); + // View laden + require __DIR__ . "/../view/chat/index.php"; } + // Nachrichten zwischen zwei Usern per AJAX laden + public function loadMessages() + { + + if (!isset($_SESSION['user_id'])) exit; + + $current = $_SESSION['user_id']; + $other = (int)$_POST['user_id']; + + $chatModel = new ChatModel(); + $messages = $chatModel->getMessagesBetweenUsers($current, $other); + + // Direkt lesen markieren + $chatModel->markAsRead($other, $current); + + header('Content-Type: application/json'); + echo json_encode($messages); + } } diff --git a/Abgabe_Mohr/htdocs/index.php b/Abgabe_Mohr/htdocs/index.php index 3ac2b0f..c283fc3 100644 --- a/Abgabe_Mohr/htdocs/index.php +++ b/Abgabe_Mohr/htdocs/index.php @@ -4,6 +4,7 @@ require_once("../config/config.php"); require_once("../libs/Database.php"); require_once("../libs/Factory.php"); require_once("../libs/Model.php"); +require_once("../libs/Controller.php"); if (session_status() === PHP_SESSION_NONE) { diff --git a/Abgabe_Mohr/libs/Controller.php b/Abgabe_Mohr/libs/Controller.php new file mode 100644 index 0000000..54effe9 --- /dev/null +++ b/Abgabe_Mohr/libs/Controller.php @@ -0,0 +1,14 @@ +errorArray; } +public function getAllUsersExcept($id) + { + $db = Database::getInstance()->getConnection(); + + $stmt = $db->prepare("SELECT id, vorname, nachname FROM user WHERE id != ?"); + $stmt->bind_param("i", $id); + $stmt->execute(); + + return $stmt->get_result()->fetch_all(MYSQLI_ASSOC); + } + + // --- Registrierung --- public function insert() { $this->validate(); diff --git a/Abgabe_Mohr/model/ChatModel.php b/Abgabe_Mohr/model/ChatModel.php index 347ef54..b0ec3ad 100644 --- a/Abgabe_Mohr/model/ChatModel.php +++ b/Abgabe_Mohr/model/ChatModel.php @@ -1,50 +1,70 @@ getConnection(); $stmt = $db->prepare(" - INSERT INTO chat (user_sender, user_empfaenger, nachricht) - VALUES (?, ?, ?) + INSERT INTO chat (user_sender, user_empfaenger, nachricht, gelesen) + VALUES (?, ?, ?, 0) "); - if (!$stmt) { - throw new Exception("Fehler beim Vorbereiten der DB-Anfrage: " . $db->error); - } - $stmt->bind_param("iis", $this->senderID, $this->empfaengerID, $this->nachricht); - if (!$stmt->execute()) { - throw new Exception("Fehler beim Einfügen in die DB: " . $stmt->error); - } - - return true; + $stmt->bind_param("iis", $sender, $receiver, $message); + $stmt->execute(); } - // Nachrichten zwischen zwei Usern abrufen - public function getMessagesBetweenUsers($user1, $user2) { + public function getMessagesBetweenUsers($user1, $user2) + { $db = Database::getInstance()->getConnection(); $stmt = $db->prepare(" - SELECT * FROM chat - WHERE (user_sender = ? AND user_empfaenger = ?) + SELECT * FROM chat + WHERE (user_sender = ? AND user_empfaenger = ?) OR (user_sender = ? AND user_empfaenger = ?) ORDER BY id ASC "); - if (!$stmt) { - throw new Exception("Fehler beim Vorbereiten der DB-Abfrage: " . $db->error); - } - $stmt->bind_param("iiii", $user1, $user2, $user2, $user1); $stmt->execute(); - $result = $stmt->get_result(); + return $stmt->get_result()->fetch_all(MYSQLI_ASSOC); + } - return $result->fetch_all(MYSQLI_ASSOC); + public function markAsRead($sender, $receiver) + { + $db = Database::getInstance()->getConnection(); + + $stmt = $db->prepare(" + UPDATE chat SET gelesen = 1 + WHERE user_sender = ? AND user_empfaenger = ? + "); + + $stmt->bind_param("ii", $sender, $receiver); + $stmt->execute(); + } + + public function getUnreadCounts($receiverId) + { + $db = Database::getInstance()->getConnection(); + + $stmt = $db->prepare(" + SELECT user_sender, COUNT(*) AS unread + FROM chat + WHERE user_empfaenger = ? AND gelesen = 0 + GROUP BY user_sender + "); + + $stmt->bind_param("i", $receiverId); + $stmt->execute(); + + $rows = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); + + $out = []; + foreach ($rows as $r) { + $out[$r['user_sender']] = $r['unread']; + } + + return $out; } } diff --git a/Abgabe_Mohr/view/chat/index.php b/Abgabe_Mohr/view/chat/index.php index 7ce8264..c1195ae 100644 --- a/Abgabe_Mohr/view/chat/index.php +++ b/Abgabe_Mohr/view/chat/index.php @@ -18,7 +18,7 @@
- +
-
-
+
+
@@ -54,7 +54,7 @@