MDL-36941 core: convert existing api to use new table structure

Also deprecated the following functions -

1. message_move_userfrom_unread2read - It is not necessary
   for us to mark a message as read on user deletion.
2. message_get_blocked_users - Horrible logic used to
   determine if a user is blocked via reference on some
   randomly chosen 'isblocked' variable.
3. message_get_contacts - The same as above. This can be
   done in a much nicer way.
4. message_mark_message_read - We want two functions to do
   this to avoid confusing messages and notifications.
5. message_can_delete_message - This assumed the variable
   $message contained the 'useridto' property, which
   was present in the old table structure. We do not want
   future usages where a query is done on the new table
   and is simply passed as this won't contain this property.
6. message_delete_message - Same as above.
This commit is contained in:
Mark Nelson 2018-01-04 15:01:37 +08:00
parent 4cd439887a
commit 883ce42127
29 changed files with 1714 additions and 1096 deletions

View file

@ -1161,7 +1161,7 @@ class core_message_external extends external_api {
* @since Moodle 2.5
*/
public static function get_contacts() {
global $CFG, $PAGE;
global $CFG, $PAGE, $USER;
// Check if messaging is enabled.
if (empty($CFG->messaging)) {
@ -1170,25 +1170,68 @@ class core_message_external extends external_api {
require_once($CFG->dirroot . '/user/lib.php');
list($online, $offline, $strangers) = message_get_contacts();
$allcontacts = array('online' => $online, 'offline' => $offline, 'strangers' => $strangers);
foreach ($allcontacts as $mode => $contacts) {
foreach ($contacts as $key => $contact) {
$newcontact = array(
'id' => $contact->id,
'fullname' => fullname($contact),
'unread' => $contact->messagecount
);
$allcontacts = array('online' => [], 'offline' => [], 'strangers' => []);
$contacts = \core_message\api::get_contacts_with_unread_message_count($USER->id);
foreach ($contacts as $contact) {
// Set the mode.
$mode = 'offline';
if (\core_message\helper::is_online($contact->lastaccess)) {
$mode = 'online';
}
$userpicture = new user_picture($contact);
$userpicture->size = 1; // Size f1.
$newcontact['profileimageurl'] = $userpicture->get_url($PAGE)->out(false);
$userpicture->size = 0; // Size f2.
$newcontact['profileimageurlsmall'] = $userpicture->get_url($PAGE)->out(false);
$newcontact = array(
'id' => $contact->id,
'fullname' => fullname($contact),
'unread' => $contact->messagecount
);
$allcontacts[$mode][$key] = $newcontact;
$userpicture = new user_picture($contact);
$userpicture->size = 1; // Size f1.
$newcontact['profileimageurl'] = $userpicture->get_url($PAGE)->out(false);
$userpicture->size = 0; // Size f2.
$newcontact['profileimageurlsmall'] = $userpicture->get_url($PAGE)->out(false);
$allcontacts[$mode][$contact->id] = $newcontact;
}
$strangers = \core_message\api::get_non_contacts_with_unread_message_count($USER->id);
foreach ($strangers as $contact) {
$newcontact = array(
'id' => $contact->id,
'fullname' => fullname($contact),
'unread' => $contact->messagecount
);
$userpicture = new user_picture($contact);
$userpicture->size = 1; // Size f1.
$newcontact['profileimageurl'] = $userpicture->get_url($PAGE)->out(false);
$userpicture->size = 0; // Size f2.
$newcontact['profileimageurlsmall'] = $userpicture->get_url($PAGE)->out(false);
$allcontacts['strangers'][$contact->id] = $newcontact;
}
// Add noreply user and support user to the list, if they don't exist.
$supportuser = core_user::get_support_user();
if (!isset($strangers[$supportuser->id]) && !$supportuser->deleted) {
$supportuser->messagecount = message_count_unread_messages($USER, $supportuser);
if ($supportuser->messagecount > 0) {
$supportuser->fullname = fullname($supportuser);
$supportuser->unread = $supportuser->messagecount;
$allcontacts['strangers'][$supportuser->id] = $supportuser;
}
}
$noreplyuser = core_user::get_noreply_user();
if (!isset($strangers[$noreplyuser->id]) && !$noreplyuser->deleted) {
$noreplyuser->messagecount = message_count_unread_messages($USER, $noreplyuser);
if ($noreplyuser->messagecount > 0) {
$noreplyuser->fullname = fullname($noreplyuser);
$noreplyuser->unread = $noreplyuser->messagecount;
$allcontacts['strangers'][$noreplyuser->id] = $noreplyuser;
}
}
return $allcontacts;
}
@ -1486,13 +1529,16 @@ class core_message_external extends external_api {
foreach ($messages as $mid => $message) {
// Do not return deleted messages.
if (($useridto == $USER->id and $message->timeusertodeleted) or
if (!$message->notification) {
if (($useridto == $USER->id and $message->timeusertodeleted) or
($useridfrom == $USER->id and $message->timeuserfromdeleted)) {
unset($messages[$mid]);
continue;
unset($messages[$mid]);
continue;
}
}
$message->useridto = $useridto;
// We need to get the user from the query.
if (empty($userfromfullname)) {
// Check for non-reply and support users.
@ -1517,11 +1563,6 @@ class core_message_external extends external_api {
$message->usertofullname = $usertofullname;
}
// This field is only available in the message_read table.
if (!isset($message->timeread)) {
$message->timeread = 0;
}
$message->text = message_format_message_text($message);
$messages[$mid] = (array) $message;
}
@ -1774,7 +1815,7 @@ class core_message_external extends external_api {
}
// Now, we can get safely all the blocked users.
$users = message_get_blocked_users($user);
$users = \core_message\api::get_blocked_users($user->id);
$blockedusers = array();
foreach ($users as $user) {
@ -1875,16 +1916,24 @@ class core_message_external extends external_api {
$context = context_system::instance();
self::validate_context($context);
$message = $DB->get_record('message', array('id' => $params['messageid']), '*', MUST_EXIST);
$sql = "SELECT m.*, mcm.userid as useridto
FROM {messages} m
INNER JOIN {message_conversations} mc
ON m.conversationid = mc.id
INNER JOIN {message_conversation_members} mcm
ON mcm.conversationid = mc.id
WHERE mcm.userid != m.useridfrom
AND m.id = ?";
$message = $DB->get_record_sql($sql, [$params['messageid']], MUST_EXIST);
if ($message->useridto != $USER->id) {
throw new invalid_parameter_exception('Invalid messageid, you don\'t have permissions to mark this message as read');
}
$messageid = message_mark_message_read($message, $timeread);
\core_message\api::mark_message_as_read($USER->id, $message->id, $timeread);
$results = array(
'messageid' => $messageid,
'messageid' => $message->id,
'warnings' => $warnings
);
return $results;
@ -2094,7 +2143,7 @@ class core_message_external extends external_api {
* @since 3.1
*/
public static function delete_message($messageid, $userid, $read = true) {
global $CFG, $DB;
global $CFG;
// Check if private messaging between users is allowed.
if (empty($CFG->messaging)) {
@ -2116,15 +2165,11 @@ class core_message_external extends external_api {
$context = context_system::instance();
self::validate_context($context);
$messagestable = $params['read'] ? 'message_read' : 'message';
$message = $DB->get_record($messagestable, array('id' => $params['messageid']), '*', MUST_EXIST);
$user = core_user::get_user($params['userid'], '*', MUST_EXIST);
core_user::require_active_user($user);
$status = false;
if (message_can_delete_message($message, $user->id)) {
$status = message_delete_message($message, $user->id);;
if (\core_message\api::can_delete_message($user->id, $messageid)) {
$status = \core_message\api::delete_message($user->id, $messageid);
} else {
throw new moodle_exception('You do not have permission to delete this message');
}