Merge branch 'MDL-63850_master' of git://github.com/markn86/moodle

This commit is contained in:
Andrew Nicols
2018-11-12 07:53:09 +08:00
5 changed files with 223 additions and 66 deletions
+27 -28
View File
@@ -561,10 +561,11 @@ class api {
$conversationset = $DB->get_recordset_sql($sql, $params, $limitfrom, $limitnum);
$conversations = [];
$uniquemembers = [];
$members = [];
$individualmembers = [];
$groupmembers = [];
foreach ($conversationset as $conversation) {
$conversations[] = $conversation;
$conversations[$conversation->id] = $conversation;
$members[$conversation->id] = [];
}
$conversationset->close();
@@ -600,7 +601,7 @@ class api {
if ($conversation->conversationtype == self::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL) {
if (!is_null($conversation->useridfrom) && $conversation->useridfrom != $userid) {
$members[$conversation->id][$conversation->useridfrom] = $conversation->useridfrom;
$uniquemembers[$conversation->useridfrom] = $conversation->useridfrom;
$individualmembers[$conversation->useridfrom] = $conversation->useridfrom;
} else {
$individualconversations[] = $conversation->id;
}
@@ -608,7 +609,7 @@ class api {
// If we have a recent message, the sender is our member.
if (!is_null($conversation->useridfrom)) {
$members[$conversation->id][$conversation->useridfrom] = $conversation->useridfrom;
$uniquemembers[$conversation->useridfrom] = $conversation->useridfrom;
$groupmembers[$conversation->useridfrom] = $conversation->useridfrom;
}
}
}
@@ -626,10 +627,9 @@ class api {
foreach ($conversationmembers as $mid => $member) {
$members[$member->conversationid][$member->userid] = $member->userid;
$uniquemembers[$member->userid] = $member->userid;
$individualmembers[$member->userid] = $member->userid;
}
}
$memberids = array_values($uniquemembers);
// We could fail early here if we're sure that:
// a) we have no otherusers for all the conversations (users may have been deleted)
@@ -639,8 +639,17 @@ class api {
// needs to be done in a separate query to avoid doing a join on the messages tables and the user
// tables because on large sites these tables are massive which results in extremely slow
// performance (typically due to join buffer exhaustion).
if (!empty($memberids)) {
$memberinfo = helper::get_member_info($userid, $memberids);
if (!empty($individualmembers) || !empty($groupmembers)) {
// Now, we want to remove any duplicates from the group members array. For individual members we will
// be doing a more extensive call as we want their contact requests as well as privacy information,
// which is not necessary for group conversations.
$diffgroupmembers = array_diff($groupmembers, $individualmembers);
$individualmemberinfo = helper::get_member_info($userid, $individualmembers, true, true);
$groupmemberinfo = helper::get_member_info($userid, $diffgroupmembers);
// Don't use array_merge, as we lose array keys.
$memberinfo = $individualmemberinfo + $groupmemberinfo;
// Update the members array with the member information.
$deletedmembers = [];
@@ -651,7 +660,15 @@ class api {
if ($memberinfo[$memberid]->isdeleted) {
$deletedmembers[$convid][] = $memberid;
}
$members[$convid][$key] = $memberinfo[$memberid];
$members[$convid][$key] = clone $memberinfo[$memberid];
if ($conversations[$convid]->conversationtype == self::MESSAGE_CONVERSATION_TYPE_GROUP) {
// Remove data we don't need for group.
$members[$convid][$key]->requirescontact = null;
$members[$convid][$key]->canmessage = null;
$members[$convid][$key]->contactrequests = [];
}
}
}
}
@@ -2490,25 +2507,7 @@ class api {
if ($members = $DB->get_records('message_conversation_members', ['conversationid' => $conversationid],
'timecreated ASC, id ASC', 'userid', $limitfrom, $limitnum)) {
$userids = array_keys($members);
$members = helper::get_member_info($userid, $userids);
// Check if we want to include contact requests as well.
if ($includecontactrequests) {
list($useridsql, $usersparams) = $DB->get_in_or_equal($userids);
$wheresql = "(userid $useridsql OR requesteduserid $useridsql)";
if ($contactrequests = $DB->get_records_select('message_contact_requests', $wheresql,
array_merge($usersparams, $usersparams), 'timecreated ASC, id ASC')) {
foreach ($contactrequests as $contactrequest) {
if (isset($members[$contactrequest->userid])) {
$members[$contactrequest->userid]->contactrequests[] = $contactrequest;
}
if (isset($members[$contactrequest->requesteduserid])) {
$members[$contactrequest->requesteduserid]->contactrequests[] = $contactrequest;
}
}
}
}
$members = helper::get_member_info($userid, $userids, $includecontactrequests);
return $members;
}