Files
ITL-Huge/application/controller/MessageController.php
2025-12-15 11:08:23 +01:00

212 lines
7.8 KiB
PHP

<?php
class MessageController extends Controller
{
public function __construct()
{
parent::__construct();
// Require login for all message features
Auth::checkAuthentication();
}
/**
* Send a message to a specific user via URL parameters
* URL format: message/send/{receiver_id}/{subject}/{message}
*/
public function send()
{
// Handle POST request
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$receiver_id = isset($_POST['receiver_id']) ? $_POST['receiver_id'] : null;
$subject = isset($_POST['subject']) ? $_POST['subject'] : 'No Subject';
$message = isset($_POST['message']) ? $_POST['message'] : null;
if (!$receiver_id || !$message) {
Session::add('feedback_negative', 'Receiver and message are required');
Redirect::to('message');
return;
}
// Send the message
$sender_id = Session::get('user_id');
$success = MessageModel::sendToUser($sender_id, $receiver_id, $subject, $message);
if ($success) {
Session::add('feedback_positive', 'Message sent successfully');
} else {
Session::add('feedback_negative', 'Failed to send message');
}
// If coming from conversation view, return there
if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'conversation') !== false) {
Redirect::to('message/conversation/' . $receiver_id);
} else {
Redirect::to('message');
}
return;
}
// Handle GET request
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$receiver_id = isset($url_parts[2]) ? $url_parts[2] : null;
$subject = isset($url_parts[3]) ? urldecode($url_parts[3]) : null;
$message = isset($url_parts[4]) ? urldecode($url_parts[4]) : null;
if (!$receiver_id || !$subject || !$message) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Missing parameters. Use: message/send/{receiver_id}/{subject}/{message}']);
return;
}
// Verify receiver exists
$receiver = UserModel::getPublicProfileOfUser($receiver_id);
if (!$receiver) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Receiver not found']);
return;
}
// Send the message
$sender_id = Session::get('user_id');
$success = MessageModel::sendToUser($sender_id, $receiver_id, $subject, $message);
header('Content-Type: application/json');
if ($success) {
echo json_encode(['success' => true, 'message' => 'Message sent successfully']);
} else {
echo json_encode(['success' => false, 'message' => 'Failed to send message']);
}
}
/**
* Send a message to a group via URL parameters
* URL format: message/sendgroup/{group_type}/{subject}/{message}
* group_type can be: admins, moderators, all_users
*/
public function sendgroup()
{
// Handle POST request
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$group_type = isset($_POST['group_type']) ? $_POST['group_type'] : null;
$subject = isset($_POST['subject']) ? $_POST['subject'] : 'No Subject';
$message = isset($_POST['message']) ? $_POST['message'] : null;
if (!$group_type || !$message) {
Session::add('feedback_negative', 'Group type and message are required');
Redirect::to('message');
return;
}
// Validate group type
if (!in_array($group_type, ['admins', 'moderators', 'all_users'])) {
Session::add('feedback_negative', 'Invalid group type');
Redirect::to('message');
return;
}
// Send the message
$sender_id = Session::get('user_id');
$success = MessageModel::sendToGroup($sender_id, $group_type, $subject, $message);
if ($success) {
Session::add('feedback_positive', 'Message sent to group successfully');
} else {
Session::add('feedback_negative', 'Failed to send message to group');
}
Redirect::to('message');
return;
}
// Handle GET request
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$group_type = isset($url_parts[2]) ? $url_parts[2] : null;
$subject = isset($url_parts[3]) ? urldecode($url_parts[3]) : null;
$message = isset($url_parts[4]) ? urldecode($url_parts[4]) : null;
if (!$group_type || !$subject || !$message) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Missing parameters. Use: message/sendgroup/{group_type}/{subject}/{message}']);
return;
}
// Validate group type
if (!in_array($group_type, ['admins', 'moderators', 'all_users'])) {
header('Content-Type: application/json');
echo json_encode(['success' => false, 'message' => 'Invalid group type. Must be: admins, moderators, or all_users']);
return;
}
// Send the message
$sender_id = Session::get('user_id');
$success = MessageModel::sendToGroup($sender_id, $group_type, $subject, $message);
header('Content-Type: application/json');
if ($success) {
echo json_encode(['success' => true, 'message' => 'Message sent to group successfully']);
} else {
echo json_encode(['success' => false, 'message' => 'Failed to send message to group']);
}
}
/**
* Show the messenger interface
*/
public function index()
{
$user_id = Session::get('user_id');
// Get conversations and unread count
$conversations = MessageModel::getConversations($user_id);
$unread_count = MessageModel::getUnreadCount($user_id);
$this->View->render('message/index', array(
'conversations' => $conversations,
'unread_count' => $unread_count,
'all_users' => MessageModel::getAllUsers($user_id)
));
}
/**
* Show conversation with a specific user
*/
public function conversation()
{
$user_id = Session::get('user_id');
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
$other_user_id = isset($url_parts[2]) ? $url_parts[2] : null;
if (!$other_user_id) {
Redirect::to('message');
return;
}
// Get user info for the other person
$other_user = UserModel::getPublicProfileOfUser($other_user_id);
if (!$other_user) {
Redirect::to('message');
return;
}
// Get messages
$messages = MessageModel::getMessagesWithUser($user_id, $other_user_id);
$this->View->render('message/conversation', array(
'messages' => $messages,
'other_user' => $other_user
));
}
/**
* Get unread count as JSON
*/
public function unreadcount()
{
$user_id = Session::get('user_id');
$unread_count = MessageModel::getUnreadCount($user_id);
header('Content-Type: application/json');
echo json_encode(['unread_count' => $unread_count]);
}
}