false, 'error' => 'Invalid CSRF token']); exit; } } $currentUser = $_SESSION['user']; $userId = $currentUser['user_id']; // Use centralized database connection $conn = Database::getConnection(); // Get POST data $data = json_decode(file_get_contents('php://input'), true); if (!$data) { throw new Exception("Invalid JSON data received"); } $ticketId = $data['ticket_id']; // Initialize models $commentModel = new CommentModel($conn); $auditLog = new AuditLogModel($conn); // Extract @mentions from comment text $mentions = $commentModel->extractMentions($data['comment_text'] ?? ''); $mentionedUsers = []; if (!empty($mentions)) { $mentionedUsers = $commentModel->getMentionedUsers($mentions); } // Add comment with user tracking $result = $commentModel->addComment($ticketId, $data, $userId); // Log comment creation to audit log if ($result['success'] && isset($result['comment_id'])) { $auditLog->logCommentCreate($userId, $result['comment_id'], $ticketId); // Log mentions to audit log foreach ($mentionedUsers as $mentionedUser) { $auditLog->log( $userId, 'mention', 'user', (string)$mentionedUser['user_id'], [ 'ticket_id' => $ticketId, 'comment_id' => $result['comment_id'], 'mentioned_username' => $mentionedUser['username'] ] ); } // Add mentioned users to result for frontend $result['mentions'] = array_map(function($u) { return $u['username']; }, $mentionedUsers); } // Add user display name to result for frontend if ($result['success']) { $result['user_name'] = $currentUser['display_name'] ?? $currentUser['username']; } // Discard any unexpected output ob_end_clean(); // Return JSON response header('Content-Type: application/json'); echo json_encode($result); } catch (Exception $e) { // Discard any unexpected output ob_end_clean(); // Return error response header('Content-Type: application/json'); echo json_encode([ 'success' => false, 'error' => $e->getMessage() ]); }