Basic message implementation
This commit is contained in:
186
application/model/MessageModel.php
Normal file
186
application/model/MessageModel.php
Normal file
@@ -0,0 +1,186 @@
|
||||
<?php
|
||||
|
||||
class MessageModel
|
||||
{
|
||||
public static function sendMessage($sender_id, $receiver_id, $group_type, $subject, $message)
|
||||
{
|
||||
$database = DatabaseFactory::getFactory()->getConnection();
|
||||
|
||||
$sql = "INSERT INTO messages (sender_id, receiver_id, group_type, subject, message)
|
||||
VALUES (:sender_id, :receiver_id, :group_type, :subject, :message)";
|
||||
$query = $database->prepare($sql);
|
||||
return $query->execute(array(
|
||||
':sender_id' => $sender_id,
|
||||
':receiver_id' => $receiver_id,
|
||||
':group_type' => $group_type,
|
||||
':subject' => $subject,
|
||||
':message' => $message
|
||||
));
|
||||
}
|
||||
|
||||
public static function sendToUser($sender_id, $receiver_id, $subject, $message)
|
||||
{
|
||||
return self::sendMessage($sender_id, $receiver_id, null, $subject, $message);
|
||||
}
|
||||
|
||||
public static function sendToGroup($sender_id, $group_type, $subject, $message)
|
||||
{
|
||||
return self::sendMessage($sender_id, null, $group_type, $subject, $message);
|
||||
}
|
||||
|
||||
public static function getUnreadCount($user_id)
|
||||
{
|
||||
$database = DatabaseFactory::getFactory()->getConnection();
|
||||
|
||||
$sql = "SELECT COUNT(*) as count FROM messages
|
||||
WHERE receiver_id = :user_id AND is_read = 0";
|
||||
$query = $database->prepare($sql);
|
||||
$query->execute(array(':user_id' => $user_id));
|
||||
$result = $query->fetch();
|
||||
|
||||
return $result->count;
|
||||
}
|
||||
|
||||
public static function getUnreadCountForUser($user_id, $sender_id)
|
||||
{
|
||||
$database = DatabaseFactory::getFactory()->getConnection();
|
||||
|
||||
$sql = "SELECT COUNT(*) as count FROM messages
|
||||
WHERE receiver_id = :user_id AND sender_id = :sender_id AND is_read = 0";
|
||||
$query = $database->prepare($sql);
|
||||
$query->execute(array(
|
||||
':user_id' => $user_id,
|
||||
':sender_id' => $sender_id
|
||||
));
|
||||
$result = $query->fetch();
|
||||
|
||||
return $result->count;
|
||||
}
|
||||
|
||||
public static function getConversations($user_id)
|
||||
{
|
||||
$database = DatabaseFactory::getFactory()->getConnection();
|
||||
|
||||
$sql = "SELECT DISTINCT
|
||||
CASE
|
||||
WHEN sender_id = :user_id THEN receiver_id
|
||||
ELSE sender_id
|
||||
END as other_user_id,
|
||||
u.user_name,
|
||||
u.user_email,
|
||||
MAX(m.created_at) as last_message_time,
|
||||
(SELECT COUNT(*) FROM messages m2
|
||||
WHERE ((m2.sender_id = :user_id AND m2.receiver_id = other_user_id) OR
|
||||
(m2.receiver_id = :user_id AND m2.sender_id = other_user_id))
|
||||
AND m2.is_read = 0 AND m2.receiver_id = :user_id) as unread_count
|
||||
FROM messages m
|
||||
JOIN users u ON (CASE
|
||||
WHEN sender_id = :user_id THEN receiver_id
|
||||
ELSE sender_id
|
||||
END) = u.user_id
|
||||
WHERE (sender_id = :user_id OR receiver_id = :user_id)
|
||||
AND receiver_id IS NOT NULL
|
||||
GROUP BY other_user_id
|
||||
ORDER BY last_message_time DESC";
|
||||
|
||||
$query = $database->prepare($sql);
|
||||
$query->execute(array(':user_id' => $user_id));
|
||||
return $query->fetchAll();
|
||||
}
|
||||
|
||||
public static function getMessagesWithUser($user_id, $other_user_id)
|
||||
{
|
||||
$database = DatabaseFactory::getFactory()->getConnection();
|
||||
|
||||
$sql = "SELECT m.*, u_sender.user_name as sender_name,
|
||||
CASE
|
||||
WHEN m.sender_id = :user_id THEN 'sent'
|
||||
ELSE 'received'
|
||||
END as message_type
|
||||
FROM messages m
|
||||
JOIN users u_sender ON m.sender_id = u_sender.user_id
|
||||
WHERE ((m.sender_id = :user_id AND m.receiver_id = :other_user_id) OR
|
||||
(m.receiver_id = :user_id AND m.sender_id = :other_user_id))
|
||||
AND m.group_type IS NULL
|
||||
ORDER BY m.created_at ASC";
|
||||
|
||||
$query = $database->prepare($sql);
|
||||
$query->execute(array(
|
||||
':user_id' => $user_id,
|
||||
':other_user_id' => $other_user_id
|
||||
));
|
||||
$messages = $query->fetchAll();
|
||||
|
||||
// Mark received messages as read
|
||||
self::markAsRead($user_id, $other_user_id);
|
||||
|
||||
return $messages;
|
||||
}
|
||||
|
||||
public static function markAsRead($user_id, $sender_id)
|
||||
{
|
||||
$database = DatabaseFactory::getFactory()->getConnection();
|
||||
|
||||
$sql = "UPDATE messages SET is_read = 1
|
||||
WHERE receiver_id = :user_id AND sender_id = :sender_id AND is_read = 0";
|
||||
$query = $database->prepare($sql);
|
||||
return $query->execute(array(
|
||||
':user_id' => $user_id,
|
||||
':sender_id' => $sender_id
|
||||
));
|
||||
}
|
||||
|
||||
public static function getGroupMessages($user_id)
|
||||
{
|
||||
$database = DatabaseFactory::getFactory()->getConnection();
|
||||
|
||||
// Check user role to determine which group messages they should receive
|
||||
$user_role = UserModel::getUserRole($user_id);
|
||||
|
||||
$where_conditions = [];
|
||||
$params = [':user_id' => $user_id];
|
||||
|
||||
// All users receive all_users messages
|
||||
$where_conditions[] = "group_type = 'all_users'";
|
||||
|
||||
// Admins receive admin messages
|
||||
if ($user_role === 'admin') {
|
||||
$where_conditions[] = "group_type = 'admins'";
|
||||
}
|
||||
|
||||
// Moderators receive moderator messages (and admin messages if not already covered)
|
||||
if ($user_role === 'moderator' || $user_role === 'admin') {
|
||||
$where_conditions[] = "group_type = 'moderators'";
|
||||
}
|
||||
|
||||
if (empty($where_conditions)) {
|
||||
return []; // User has no role that qualifies for group messages
|
||||
}
|
||||
|
||||
$where_clause = "(" . implode(" OR ", $where_conditions) . ")";
|
||||
|
||||
$sql = "SELECT m.*, u.user_name as sender_name
|
||||
FROM messages m
|
||||
JOIN users u ON m.sender_id = u.user_id
|
||||
WHERE $where_clause AND m.receiver_id IS NULL
|
||||
ORDER BY m.created_at DESC";
|
||||
|
||||
$query = $database->prepare($sql);
|
||||
$query->execute($params);
|
||||
return $query->fetchAll();
|
||||
}
|
||||
|
||||
public static function getAllUsers($current_user_id)
|
||||
{
|
||||
$database = DatabaseFactory::getFactory()->getConnection();
|
||||
|
||||
$sql = "SELECT user_id, user_name, user_email
|
||||
FROM users
|
||||
WHERE user_id != :current_user_id
|
||||
ORDER BY user_name ASC";
|
||||
|
||||
$query = $database->prepare($sql);
|
||||
$query->execute(array(':current_user_id' => $current_user_id));
|
||||
return $query->fetchAll();
|
||||
}
|
||||
}
|
||||
@@ -375,4 +375,31 @@ class UserModel
|
||||
// return one row (we only have one result or nothing)
|
||||
return $query->fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the user role type based on account type
|
||||
*
|
||||
* @param $user_id int user id
|
||||
*
|
||||
* @return string The user role (admin, moderator, user)
|
||||
*/
|
||||
public static function getUserRole($user_id)
|
||||
{
|
||||
$database = DatabaseFactory::getFactory()->getConnection();
|
||||
|
||||
$sql = "SELECT user_account_type FROM users WHERE user_id = :user_id LIMIT 1";
|
||||
$query = $database->prepare($sql);
|
||||
$query->execute(array(':user_id' => $user_id));
|
||||
$result = $query->fetch();
|
||||
|
||||
// Map account type to role
|
||||
switch ($result->user_account_type) {
|
||||
case 7: // admin
|
||||
return 'admin';
|
||||
case 2: // moderator (example value, adjust according to your system)
|
||||
return 'moderator';
|
||||
default:
|
||||
return 'user';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user