push current stand

This commit is contained in:
WummerMIB
2025-12-05 08:37:52 +01:00
parent 00bcb5afec
commit 075465e56b
7 changed files with 135 additions and 60 deletions
+34 -27
View File
@@ -1,43 +1,50 @@
<?php <?php
class Chat { class Chat
{
public function index()
{
public function index() {
if (!isset($_SESSION['user_id'])) { if (!isset($_SESSION['user_id'])) {
header("Location: " . PROJEKT_URL . "/Login"); header("Location: /projekte/htdocs/login.php");
exit; exit;
} }
$currentUserId = $_SESSION['user_id'];
$chatModel = Factory::createChatModel();
$userModel = Factory::createBenutzerModel(); $userModel = Factory::createBenutzerModel();
$currentUser = $userModel->getUserById($_SESSION['user_id']);
$allUsers = $userModel->getAllUsers();
$selectedUser = null; $allUsers = $userModel->getAllUsersExcept($currentUserId);
$messages = []; $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(); // Unread in Kontakte einfügen
$messages = $chatModel->getMessagesBetweenUsers($currentUser['id'], $selectedUser['id']); foreach ($allUsers as &$user) {
$user['unread'] = $unreadCounts[$user['id']] ?? 0;
} }
// Prüfen, ob eine Nachricht gesendet wird // View laden
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['message']) && isset($_POST['receiver_id'])) { require __DIR__ . "/../view/chat/index.php";
$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");
} }
// 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);
}
} }
+1
View File
@@ -4,6 +4,7 @@ require_once("../config/config.php");
require_once("../libs/Database.php"); require_once("../libs/Database.php");
require_once("../libs/Factory.php"); require_once("../libs/Factory.php");
require_once("../libs/Model.php"); require_once("../libs/Model.php");
require_once("../libs/Controller.php");
if (session_status() === PHP_SESSION_NONE) { if (session_status() === PHP_SESSION_NONE) {
+14
View File
@@ -0,0 +1,14 @@
<?php
class Controller {
public function model($model) {
require_once "../model/" . $model . ".php";
return new $model();
}
public function view($view, $data = []) {
extract($data);
require_once "../view/" . $view . ".php";
}
}
+12
View File
@@ -27,6 +27,18 @@ class BenutzerModel extends Model {
public function getErrors() { return $this->errorArray; } public function getErrors() { return $this->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 --- // --- Registrierung ---
public function insert() { public function insert() {
$this->validate(); $this->validate();
+47 -27
View File
@@ -1,33 +1,22 @@
<?php <?php
class ChatModel { class ChatModel
{
public $senderID; public function insert($sender, $receiver, $message)
public $empfaengerID; {
public $nachricht;
// Nachricht in DB speichern
public function insert() {
$db = Database::getInstance()->getConnection(); $db = Database::getInstance()->getConnection();
$stmt = $db->prepare(" $stmt = $db->prepare("
INSERT INTO chat (user_sender, user_empfaenger, nachricht) INSERT INTO chat (user_sender, user_empfaenger, nachricht, gelesen)
VALUES (?, ?, ?) 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); $stmt->bind_param("iis", $sender, $receiver, $message);
if (!$stmt->execute()) { $stmt->execute();
throw new Exception("Fehler beim Einfügen in die DB: " . $stmt->error);
}
return true;
} }
// Nachrichten zwischen zwei Usern abrufen public function getMessagesBetweenUsers($user1, $user2)
public function getMessagesBetweenUsers($user1, $user2) { {
$db = Database::getInstance()->getConnection(); $db = Database::getInstance()->getConnection();
$stmt = $db->prepare(" $stmt = $db->prepare("
@@ -37,14 +26,45 @@ class ChatModel {
ORDER BY id ASC 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->bind_param("iiii", $user1, $user2, $user2, $user1);
$stmt->execute(); $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;
} }
} }
+4 -4
View File
@@ -18,7 +18,7 @@
</div> </div>
<div class="flex-1 overflow-y-auto" id="contacts-container"> <div class="flex-1 overflow-y-auto" id="contacts-container">
<?php foreach ($allUsers as $user): ?> <?php foreach ($allUsers as $user): ?>
<?php if ($user['id'] != $currentUser['id']): ?> <?php if ($user['id'] != $currentUserId): ?>
<div class="contact p-2 cursor-pointer hover:bg-gray-100 flex justify-between items-center" data-userid="<?= $user['id'] ?>"> <div class="contact p-2 cursor-pointer hover:bg-gray-100 flex justify-between items-center" data-userid="<?= $user['id'] ?>">
<span><?= htmlspecialchars($user['vorname'] . ' ' . $user['nachname']) ?></span> <span><?= htmlspecialchars($user['vorname'] . ' ' . $user['nachname']) ?></span>
<span class="badge bg-red-500 text-white rounded-full px-2 py-1 text-xs" <span class="badge bg-red-500 text-white rounded-full px-2 py-1 text-xs"
@@ -37,8 +37,8 @@
<div id="chat-window" class="flex-1 p-4 overflow-y-auto"> <div id="chat-window" class="flex-1 p-4 overflow-y-auto">
<?php if(!empty($messages)): ?> <?php if(!empty($messages)): ?>
<?php foreach($messages as $msg): ?> <?php foreach($messages as $msg): ?>
<div class="flex <?= $msg['user_sender'] == $currentUser['id'] ? 'justify-end' : 'justify-start' ?> mb-2"> <div class="flex <?= $msg['user_sender'] == $currentUserId ? 'justify-end' : 'justify-start' ?> mb-2">
<div class="<?= $msg['user_sender'] == $currentUser['id'] ? 'bg-blue-500 text-white' : 'bg-gray-300 text-black' ?> p-2 rounded max-w-xs break-words"> <div class="<?= $msg['user_sender'] == $currentUserId ? 'bg-blue-500 text-white' : 'bg-gray-300 text-black' ?> p-2 rounded max-w-xs break-words">
<?= htmlspecialchars($msg['nachricht']) ?> <?= htmlspecialchars($msg['nachricht']) ?>
</div> </div>
</div> </div>
@@ -54,7 +54,7 @@
</div> </div>
<script> <script>
const currentUserId = <?= $currentUser['id'] ?>; const currentUserId = <?= $currentUserId ?>;
let currentChatUserId = null; let currentChatUserId = null;
const ws = new WebSocket('ws://localhost:8080'); const ws = new WebSocket('ws://localhost:8080');
+21
View File
@@ -80,6 +80,27 @@ class ChatServer implements MessageComponentInterface {
$stmt->close(); $stmt->close();
$db->close(); $db->close();
} }
protected function countUnread($receiverId, $senderId) {
$db = new mysqli("localhost","root","","projekte");
$stmt = $db->prepare("
SELECT COUNT(*)
FROM chat
WHERE user_empfaenger = ?
AND user_sender = ?
AND gelesen = 0
");
$stmt->bind_param("ii", $receiverId, $senderId);
$stmt->execute();
$stmt->bind_result($count);
$stmt->fetch();
$stmt->close();
$db->close();
return $count;
}
} }
// Server starten // Server starten