MDL-63211 core: update core to use new APIs

This commit is contained in:
Mark Nelson 2018-08-28 17:41:15 +08:00
parent beeadbf783
commit f219eac7b4
10 changed files with 529 additions and 242 deletions

View File

@ -4182,7 +4182,7 @@ EOD;
// Check to see if we should be displaying a message button.
if (!empty($CFG->messaging) && $USER->id != $user->id && has_capability('moodle/site:sendmessage', $context)) {
$iscontact = !empty(message_get_contact($user->id));
$iscontact = \core_message\api::is_contact($USER->id, $user->id);
$contacttitle = $iscontact ? 'removefromyourcontacts' : 'addtoyourcontacts';
$contacturlaction = $iscontact ? 'removecontact' : 'addcontact';
$contactimage = $iscontact ? 'removecontact' : 'addcontact';

View File

@ -1 +1 @@
define(["jquery","core/ajax","core/templates","core/notification","core/str","core/config","core/custom_interaction_events","core_message/message_area_events"],function(a,b,c,d,e,f,g,h){function i(a){this.messageArea=a,this._init()}var j={PROFILE:"[data-region='profile']",PROFILEADDCONTACT:"[data-action='profile-add-contact']",PROFILEBLOCKCONTACT:"[data-action='profile-block-contact']",PROFILEREMOVECONTACT:"[data-action='profile-remove-contact']",PROFILESENDMESSAGE:"[data-action='profile-send-message']",PROFILEUNBLOCKCONTACT:"[data-action='profile-unblock-contact']",PROFILEVIEW:"[data-action='profile-view']",SHOWCONTACTS:"[data-action='show-contacts']",MESSAGESAREA:"[data-region='messages-area']",MESSAGINGAREA:"[data-region='messaging-area']"};return i.prototype.messageArea=null,i.prototype._init=function(){g.define(this.messageArea.node,[g.events.activate]),this.messageArea.onCustomEvent(h.CONTACTSELECTED,this._viewProfile.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEVIEW,function(a,b){this._viewFullProfile(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILESENDMESSAGE,function(a,b){this._sendMessage(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEUNBLOCKCONTACT,function(a,b){this._unblockContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEBLOCKCONTACT,function(a,b){this._blockContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEADDCONTACT,function(a,b){this._addContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEREMOVECONTACT,function(a,b){this._removeContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.SHOWCONTACTS,this._hideMessagingArea.bind(this))},i.prototype._viewProfile=function(a,e){c.render("core/loading",{}).done(function(a,b){c.replaceNodeContents(this.messageArea.find(j.MESSAGESAREA),a,b)}.bind(this));var f=b.call([{methodname:"core_message_data_for_messagearea_get_profile",args:{currentuserid:this.messageArea.getCurrentUserId(),otheruserid:e}}]);return f[0].then(function(a){return c.render("core_message/message_area_profile",a)}).then(function(a,b){c.replaceNodeContents(this.messageArea.find(j.MESSAGESAREA),a,b)}.bind(this)).fail(d.exception)},i.prototype._viewFullProfile=function(){window.location.href=f.wwwroot+"/user/profile.php?id="+this._getUserId()},i.prototype._sendMessage=function(){this.messageArea.trigger(h.SENDMESSAGE,this._getUserId())},i.prototype._blockContact=function(){var a=this._performAction("core_message_block_contacts","unblockcontact","profile-block-contact","profile-unblock-contact","");return a.then(function(){this.messageArea.trigger(h.CONTACTBLOCKED,this._getUserId())}.bind(this))},i.prototype._unblockContact=function(){var a=this._performAction("core_message_unblock_contacts","blockcontact","profile-unblock-contact","profile-block-contact","danger");return a.then(function(){this.messageArea.trigger(h.CONTACTUNBLOCKED,this._getUserId())}.bind(this))},i.prototype._addContact=function(){var a=this._performAction("core_message_create_contacts","removecontact","profile-add-contact","profile-remove-contact","danger");return a.then(function(){this.messageArea.trigger(h.CONTACTADDED,this._getUserId())}.bind(this))},i.prototype._removeContact=function(){var a=this._performAction("core_message_delete_contacts","addcontact","profile-remove-contact","profile-add-contact","");return a.then(function(){this.messageArea.trigger(h.CONTACTREMOVED,this._getUserId())}.bind(this))},i.prototype._performAction=function(a,c,f,g,h){var i=b.call([{methodname:a,args:{userid:this.messageArea.getCurrentUserId(),userids:[this._getUserId()]}}]);return i[0].then(function(){return e.get_string(c,"message")}).then(function(a){this._changeText(a,f,g,h)}.bind(this)).fail(d.exception)},i.prototype._changeText=function(a,b,c,d){var e=this.messageArea.find("[data-action='"+b+"']");e.text(a),e.removeClass(),d&&e.addClass(d),e.attr("data-action",c)},i.prototype._getUserId=function(){return this.messageArea.find(j.PROFILE).data("userid")},i.prototype._hideMessagingArea=function(){this.messageArea.find(j.MESSAGINGAREA).removeClass("show-messages").addClass("hide-messages")},i});
define(["jquery","core/ajax","core/templates","core/notification","core/str","core/config","core/custom_interaction_events","core_message/message_area_events"],function(a,b,c,d,e,f,g,h){function i(a){this.messageArea=a,this._init()}var j={PROFILE:"[data-region='profile']",PROFILEADDCONTACT:"[data-action='profile-add-contact']",PROFILEBLOCKCONTACT:"[data-action='profile-block-contact']",PROFILEREMOVECONTACT:"[data-action='profile-remove-contact']",PROFILESENDMESSAGE:"[data-action='profile-send-message']",PROFILEUNBLOCKCONTACT:"[data-action='profile-unblock-contact']",PROFILEVIEW:"[data-action='profile-view']",SHOWCONTACTS:"[data-action='show-contacts']",MESSAGESAREA:"[data-region='messages-area']",MESSAGINGAREA:"[data-region='messaging-area']"};return i.prototype.messageArea=null,i.prototype._init=function(){g.define(this.messageArea.node,[g.events.activate]),this.messageArea.onCustomEvent(h.CONTACTSELECTED,this._viewProfile.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEVIEW,function(a,b){this._viewFullProfile(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILESENDMESSAGE,function(a,b){this._sendMessage(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEUNBLOCKCONTACT,function(a,b){this._unblockContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEBLOCKCONTACT,function(a,b){this._blockContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEADDCONTACT,function(a,b){this._addContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEREMOVECONTACT,function(a,b){this._removeContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.SHOWCONTACTS,this._hideMessagingArea.bind(this))},i.prototype._viewProfile=function(a,e){c.render("core/loading",{}).done(function(a,b){c.replaceNodeContents(this.messageArea.find(j.MESSAGESAREA),a,b)}.bind(this));var f=b.call([{methodname:"core_message_data_for_messagearea_get_profile",args:{currentuserid:this.messageArea.getCurrentUserId(),otheruserid:e}}]);return f[0].then(function(a){return c.render("core_message/message_area_profile",a)}).then(function(a,b){c.replaceNodeContents(this.messageArea.find(j.MESSAGESAREA),a,b)}.bind(this)).fail(d.exception)},i.prototype._viewFullProfile=function(){window.location.href=f.wwwroot+"/user/profile.php?id="+this._getUserId()},i.prototype._sendMessage=function(){this.messageArea.trigger(h.SENDMESSAGE,this._getUserId())},i.prototype._blockContact=function(){var a=this._performAction("core_message_block_user","unblockcontact","profile-block-contact","profile-unblock-contact","");return a.then(function(){this.messageArea.trigger(h.CONTACTBLOCKED,this._getUserId())}.bind(this))},i.prototype._unblockContact=function(){var a=this._performAction("core_message_unblock_user","blockcontact","profile-unblock-contact","profile-block-contact","danger");return a.then(function(){this.messageArea.trigger(h.CONTACTUNBLOCKED,this._getUserId())}.bind(this))},i.prototype._addContact=function(){var a=this._performAction("core_message_create_contact_request","removecontact","profile-add-contact","profile-remove-contact","danger");return a.then(function(){this.messageArea.trigger(h.CONTACTADDED,this._getUserId())}.bind(this))},i.prototype._removeContact=function(){var a=this._performAction("core_message_delete_contacts","addcontact","profile-remove-contact","profile-add-contact","");return a.then(function(){this.messageArea.trigger(h.CONTACTREMOVED,this._getUserId())}.bind(this))},i.prototype._performAction=function(a,c,f,g,h){var i="";switch(a){case"core_message_block_user":i={userid:this.messageArea.getCurrentUserId(),blockeduserid:this._getUserId()};break;case"core_message_unblock_user":i={userid:this.messageArea.getCurrentUserId(),unblockeduserid:this._getUserId()};break;case"core_message_create_contact_request":i={userid:this.messageArea.getCurrentUserId(),requesteduserid:this._getUserId()};break;default:i={userid:this.messageArea.getCurrentUserId(),userids:[this._getUserId()]}}var j=b.call([{methodname:a,args:i}]);return j[0].then(function(){return e.get_string(c,"message")}).then(function(a){this._changeText(a,f,g,h)}.bind(this)).fail(d.exception)},i.prototype._changeText=function(a,b,c,d){var e=this.messageArea.find("[data-action='"+b+"']");e.text(a),e.removeClass(),d&&e.addClass(d),e.attr("data-action",c)},i.prototype._getUserId=function(){return this.messageArea.find(j.PROFILE).data("userid")},i.prototype._hideMessagingArea=function(){this.messageArea.find(j.MESSAGINGAREA).removeClass("show-messages").addClass("hide-messages")},i});

View File

@ -153,7 +153,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str'
* @private
*/
Profile.prototype._blockContact = function() {
var action = this._performAction('core_message_block_contacts', 'unblockcontact', 'profile-block-contact',
var action = this._performAction('core_message_block_user', 'unblockcontact', 'profile-block-contact',
'profile-unblock-contact', '');
return action.then(function() {
this.messageArea.trigger(Events.CONTACTBLOCKED, this._getUserId());
@ -167,7 +167,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str'
* @private
*/
Profile.prototype._unblockContact = function() {
var action = this._performAction('core_message_unblock_contacts', 'blockcontact', 'profile-unblock-contact',
var action = this._performAction('core_message_unblock_user', 'blockcontact', 'profile-unblock-contact',
'profile-block-contact', 'danger');
return action.then(function() {
this.messageArea.trigger(Events.CONTACTUNBLOCKED, this._getUserId());
@ -181,7 +181,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str'
* @private
*/
Profile.prototype._addContact = function() {
var action = this._performAction('core_message_create_contacts', 'removecontact', 'profile-add-contact',
var action = this._performAction('core_message_create_contact_request', 'removecontact', 'profile-add-contact',
'profile-remove-contact', 'danger');
return action.then(function() {
this.messageArea.trigger(Events.CONTACTADDED, this._getUserId());
@ -214,14 +214,40 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str'
* @private
*/
Profile.prototype._performAction = function(service, string, oldaction, newaction, newclass) {
// This is a temporary hack as we are getting rid of this UI.
var userargs = '';
switch (service) {
case 'core_message_block_user':
userargs = {
userid: this.messageArea.getCurrentUserId(),
blockeduserid: this._getUserId()
};
break;
case 'core_message_unblock_user':
userargs = {
userid: this.messageArea.getCurrentUserId(),
unblockeduserid: this._getUserId()
};
break;
case 'core_message_create_contact_request':
userargs = {
userid: this.messageArea.getCurrentUserId(),
requesteduserid: this._getUserId()
};
break;
default:
userargs = {
userid: this.messageArea.getCurrentUserId(),
userids: [
this._getUserId()
]
};
}
var promises = Ajax.call([{
methodname: service,
args: {
userid: this.messageArea.getCurrentUserId(),
userids: [
this._getUserId()
]
}
args: userargs
}]);
return promises[0].then(function() {

View File

@ -63,8 +63,8 @@ class api {
$ufields2 = \user_picture::fields('u2', array('lastaccess'), 'userto_id', 'userto_');
$sql = "SELECT m.id, m.useridfrom, mcm.userid as useridto, m.subject, m.fullmessage, m.fullmessagehtml, m.fullmessageformat,
m.smallmessage, m.timecreated, 0 as isread, $ufields, mcont.blocked as userfrom_blocked, $ufields2,
mcont2.blocked as userto_blocked
m.smallmessage, m.timecreated, 0 as isread, $ufields, mub.id as userfrom_blocked, $ufields2,
mub2.id as userto_blocked
FROM {messages} m
INNER JOIN {user} u
ON u.id = m.useridfrom
@ -74,10 +74,10 @@ class api {
ON mcm.conversationid = m.conversationid
INNER JOIN {user} u2
ON u2.id = mcm.userid
LEFT JOIN {message_contacts} mcont
ON (mcont.contactid = u.id AND mcont.userid = ?)
LEFT JOIN {message_contacts} mcont2
ON (mcont2.contactid = u2.id AND mcont2.userid = ?)
LEFT JOIN {message_users_blocked} mub
ON (mub.blockeduserid = u.id AND mub.userid = ?)
LEFT JOIN {message_users_blocked} mub2
ON (mub2.blockeduserid = u2.id AND mub2.userid = ?)
LEFT JOIN {message_user_actions} mua
ON (mua.messageid = m.id AND mua.userid = ? AND mua.action = ?)
WHERE (m.useridfrom = ? OR mcm.userid = ?)
@ -101,7 +101,7 @@ class api {
$message->isread = true;
}
$blockedcol = $prefix . 'blocked';
$message->blocked = $message->$blockedcol;
$message->blocked = $message->$blockedcol ? 1 : 0;
$message->messageid = $message->id;
$conversations[] = helper::create_contact($message, $prefix);
@ -126,12 +126,12 @@ class api {
// Get all the users in the course.
list($esql, $params) = get_enrolled_sql(\context_course::instance($courseid), '', 0, true);
$sql = "SELECT u.*, mc.blocked
$sql = "SELECT u.*, mub.id as isblocked
FROM {user} u
JOIN ($esql) je
ON je.id = u.id
LEFT JOIN {message_contacts} mc
ON (mc.contactid = u.id AND mc.userid = :userid)
LEFT JOIN {message_users_blocked} mub
ON (mub.blockeduserid = u.id AND mub.userid = :userid)
WHERE u.deleted = 0";
// Add more conditions.
$fullname = $DB->sql_fullname();
@ -144,6 +144,7 @@ class api {
$contacts = array();
if ($users = $DB->get_records_sql($sql, $params, $limitfrom, $limitnum)) {
foreach ($users as $user) {
$user->blocked = $user->isblocked ? 1 : 0;
$contacts[] = helper::create_contact($user);
}
}
@ -172,19 +173,22 @@ class api {
// Ok, let's search for contacts first.
$contacts = array();
$sql = "SELECT $ufields, mc.blocked
$sql = "SELECT $ufields, mub.id as isuserblocked
FROM {user} u
JOIN {message_contacts} mc
ON u.id = mc.contactid
LEFT JOIN {message_users_blocked} mub
ON (mub.userid = :userid2 AND mub.blockeduserid = u.id)
WHERE mc.userid = :userid
AND u.deleted = 0
AND u.confirmed = 1
AND " . $DB->sql_like($fullname, ':search', false) . "
AND u.id $exclude
ORDER BY " . $DB->sql_fullname();
if ($users = $DB->get_records_sql($sql, array('userid' => $userid, 'search' => '%' . $search . '%') + $excludeparams,
0, $limitnum)) {
if ($users = $DB->get_records_sql($sql, array('userid' => $userid, 'userid2' => $userid,
'search' => '%' . $search . '%') + $excludeparams, 0, $limitnum)) {
foreach ($users as $user) {
$user->blocked = $user->isuserblocked ? 1 : 0;
$contacts[] = helper::create_contact($user);
}
}
@ -225,7 +229,7 @@ class api {
WHERE userid = :userid)
ORDER BY " . $DB->sql_fullname();
if ($users = $DB->get_records_sql($sql, array('userid' => $userid, 'search' => '%' . $search . '%') + $excludeparams,
0, $limitnum)) {
0, $limitnum)) {
foreach ($users as $user) {
$noncontacts[] = helper::create_contact($user);
}
@ -324,7 +328,7 @@ class api {
return [];
}
$contactssql = "SELECT contactid, blocked
$contactssql = "SELECT contactid
FROM {message_contacts}
WHERE userid = ?
AND contactid $useridsql";
@ -401,21 +405,41 @@ class api {
public static function get_contacts($userid, $limitfrom = 0, $limitnum = 0) {
global $DB;
$arrcontacts = array();
$sql = "SELECT u.*, mc.blocked
$contactids = [];
$sql = "SELECT mc.*
FROM {message_contacts} mc
JOIN {user} u
ON mc.contactid = u.id
WHERE mc.userid = :userid
AND u.deleted = 0
ORDER BY " . $DB->sql_fullname();
if ($contacts = $DB->get_records_sql($sql, array('userid' => $userid), $limitfrom, $limitnum)) {
WHERE mc.userid = ? OR mc.contactid = ?
ORDER BY timecreated DESC";
if ($contacts = $DB->get_records_sql($sql, [$userid, $userid], $limitfrom, $limitnum)) {
foreach ($contacts as $contact) {
$arrcontacts[] = helper::create_contact($contact);
if ($userid == $contact->userid) {
$contactids[] = $contact->contactid;
} else {
$contactids[] = $contact->userid;
}
}
}
return $arrcontacts;
if (!empty($contactids)) {
list($insql, $inparams) = $DB->get_in_or_equal($contactids);
$sql = "SELECT u.*, mub.id as isblocked
FROM {user} u
LEFT JOIN {message_users_blocked} mub
ON u.id = mub.blockeduserid
WHERE u.id $insql";
if ($contacts = $DB->get_records_sql($sql, $inparams)) {
$arrcontacts = [];
foreach ($contacts as $contact) {
$contact->blocked = $contact->isblocked ? 1 : 0;
$arrcontacts[] = helper::create_contact($contact);
}
return $arrcontacts;
}
}
return [];
}
/**
@ -434,21 +458,24 @@ class api {
$unreadcountssql = "SELECT $userfields, count(m.id) as messagecount
FROM {message_contacts} mc
INNER JOIN {user} u
ON u.id = mc.contactid
ON (u.id = mc.contactid OR u.id = mc.userid)
LEFT JOIN {messages} m
ON m.useridfrom = mc.contactid
ON ((m.useridfrom = mc.contactid OR m.useridfrom = mc.userid) AND m.useridfrom != ?)
LEFT JOIN {message_conversation_members} mcm
ON mcm.conversationid = m.conversationid AND mcm.userid = ? AND mcm.userid != m.useridfrom
LEFT JOIN {message_user_actions} mua
ON (mua.messageid = m.id AND mua.userid = ? AND mua.action = ?)
LEFT JOIN {message_users_blocked} mub
ON (mub.userid = ? AND mub.blockeduserid = u.id)
WHERE mua.id is NULL
AND mc.userid = ?
AND mc.blocked = 0
AND mub.id is NULL
AND (mc.userid = ? OR mc.contactid = ?)
AND u.id != ?
AND u.deleted = 0
GROUP BY $userfields";
return $DB->get_records_sql($unreadcountssql, [$userid, $userid, self::MESSAGE_ACTION_READ,
$userid, $userid], $limitfrom, $limitnum);
return $DB->get_records_sql($unreadcountssql, [$userid, $userid, $userid, self::MESSAGE_ACTION_READ,
$userid, $userid, $userid, $userid], $limitfrom, $limitnum);
}
/**
@ -474,14 +501,17 @@ class api {
ON (mua.messageid = m.id AND mua.userid = ? AND mua.action = ?)
LEFT JOIN {message_contacts} mc
ON (mc.userid = ? AND mc.contactid = u.id)
LEFT JOIN {message_users_blocked} mub
ON (mub.userid = ? AND mub.blockeduserid = u.id)
WHERE mcm.userid = ?
AND mcm.userid != m.useridfrom
AND mua.id is NULL
AND mub.id is NULL
AND mc.id is NULL
AND u.deleted = 0
GROUP BY $userfields";
return $DB->get_records_sql($unreadcountssql, [$userid, self::MESSAGE_ACTION_READ, $userid, $userid],
return $DB->get_records_sql($unreadcountssql, [$userid, self::MESSAGE_ACTION_READ, $userid, $userid, $userid],
$limitfrom, $limitnum);
}
@ -550,7 +580,7 @@ class api {
* @return \stdClass
*/
public static function get_profile($userid, $otheruserid) {
global $CFG, $DB, $PAGE;
global $CFG, $PAGE;
require_once($CFG->dirroot . '/user/lib.php');
@ -587,15 +617,8 @@ class api {
}
}
// Check if the contact has been blocked.
$contact = $DB->get_record('message_contacts', array('userid' => $userid, 'contactid' => $otheruserid));
if ($contact) {
$data->isblocked = (bool) $contact->blocked;
$data->iscontact = true;
} else {
$data->isblocked = false;
$data->iscontact = false;
}
$data->isblocked = self::is_blocked($userid, $otheruserid);
$data->iscontact = self::is_contact($userid, $otheruserid);
return $data;
}
@ -854,9 +877,9 @@ class api {
$user = $USER;
}
$sql = "SELECT count(mc.id)
FROM {message_contacts} mc
WHERE mc.userid = :userid AND mc.blocked = 1";
$sql = "SELECT count(mub.id)
FROM {message_users_blocked} mub
WHERE mub.userid = :userid";
return $DB->count_records_sql($sql, array('userid' => $user->id));
}
@ -908,7 +931,7 @@ class api {
* @return bool true if $sender is blocked, false otherwise.
*/
public static function is_user_non_contact_blocked($recipient, $sender = null) {
global $USER, $DB;
global $USER;
if (is_null($sender)) {
// The message is from the logged in user, unless otherwise specified.
@ -918,8 +941,7 @@ class api {
$blockednoncontacts = get_user_preferences('message_blocknoncontacts', '', $recipient->id);
if (!empty($blockednoncontacts)) {
// Confirm the sender is a contact of the recipient.
$exists = $DB->record_exists('message_contacts', array('userid' => $recipient->id, 'contactid' => $sender->id));
if ($exists) {
if (self::is_contact($sender->id, $recipient->id)) {
// All good, the recipient is a contact of the sender.
return false;
} else {
@ -954,7 +976,7 @@ class api {
return false;
}
if ($DB->get_field('message_contacts', 'blocked', ['userid' => $recipientid, 'contactid' => $senderid])) {
if (self::is_blocked($recipientid, $senderid)) {
return true;
}
@ -1079,12 +1101,11 @@ class api {
$userfields = \user_picture::fields('u', array('lastaccess'));
$blockeduserssql = "SELECT $userfields
FROM {message_contacts} mc
FROM {message_users_blocked} mub
INNER JOIN {user} u
ON u.id = mc.contactid
ON u.id = mub.blockeduserid
WHERE u.deleted = 0
AND mc.userid = ?
AND mc.blocked = 1
AND mub.userid = ?
GROUP BY $userfields
ORDER BY u.firstname ASC";
return $DB->get_records_sql($blockeduserssql, [$userid]);

View File

@ -90,23 +90,30 @@ class core_message_external extends external_api {
foreach($params['messages'] as $message) {
$receivers[] = $message['touserid'];
}
list($sqluserids, $sqlparams) = $DB->get_in_or_equal($receivers, SQL_PARAMS_NAMED, 'userid_');
list($sqluserids, $sqlparams) = $DB->get_in_or_equal($receivers);
$tousers = $DB->get_records_select("user", "id " . $sqluserids . " AND deleted = 0", $sqlparams);
$blocklist = array();
$contactlist = array();
$sqlparams['contactid'] = $USER->id;
$contactsqlparams = array_merge($sqlparams, [$USER->id], [$USER->id], $sqlparams);
$rs = $DB->get_recordset_sql("SELECT *
FROM {message_contacts}
WHERE userid $sqluserids
AND contactid = :contactid", $sqlparams);
WHERE (userid $sqluserids AND contactid = ?)
OR (userid = ? AND contactid $sqluserids)", $contactsqlparams);
foreach ($rs as $record) {
if ($record->blocked) {
// $record->userid is blocking current user
$blocklist[$record->userid] = true;
} else {
// $record->userid have current user as contact
$contactlist[$record->userid] = true;
$useridtouse = $record->userid;
if ($record->userid == $USER->id) {
$useridtouse = $record->contactid;
}
$contactlist[$useridtouse] = true;
}
$rs->close();
$blocksqlparams = array_merge($sqlparams, [$USER->id]);
$rs = $DB->get_recordset_sql("SELECT *
FROM {message_users_blocked}
WHERE userid $sqluserids
AND blockeduserid = ?", $blocksqlparams);
foreach ($rs as $record) {
$blocklist[$record->userid] = true;
}
$rs->close();
@ -327,7 +334,7 @@ class core_message_external extends external_api {
$params = self::validate_parameters(self::delete_contacts_parameters(), $params);
foreach ($params['userids'] as $id) {
message_remove_contact($id, $userid);
\core_message\api::remove_contact($userid, $id);
}
return null;

View File

@ -187,6 +187,7 @@ function message_search_users($courseids, $searchtext, $sort='', $exceptions='')
$params = array(
'userid' => $USER->id,
'userid2' => $USER->id,
'query' => "%$searchtext%"
);
@ -207,10 +208,12 @@ function message_search_users($courseids, $searchtext, $sort='', $exceptions='')
if (in_array(SITEID, $courseids)) {
// Search on site level.
return $DB->get_records_sql("SELECT $ufields, mc.id as contactlistid, mc.blocked
return $DB->get_records_sql("SELECT $ufields, mc.id as contactlistid, mub.id as userblockedid
FROM {user} u
LEFT JOIN {message_contacts} mc
ON mc.contactid = u.id AND mc.userid = :userid
LEFT JOIN {message_users_blocked} mub
ON mub.userid = :userid2 AND mub.blockeduserid = u.id
WHERE u.deleted = '0' AND u.confirmed = '1'
AND (".$DB->sql_like($fullname, ':query', false).")
$except
@ -229,11 +232,13 @@ function message_search_users($courseids, $searchtext, $sort='', $exceptions='')
// Everyone who has a role assignment in this course or higher.
// TODO: add enabled enrolment join here (skodak)
$users = $DB->get_records_sql("SELECT DISTINCT $ufields, mc.id as contactlistid, mc.blocked
$users = $DB->get_records_sql("SELECT DISTINCT $ufields, mc.id as contactlistid, mub.id as userblockedid
FROM {user} u
JOIN {role_assignments} ra ON ra.userid = u.id
LEFT JOIN {message_contacts} mc
ON mc.contactid = u.id AND mc.userid = :userid
LEFT JOIN {message_users_blocked} mub
ON mub.userid = :userid2 AND mub.blockeduserid = u.id
WHERE u.deleted = '0' AND u.confirmed = '1'
AND (".$DB->sql_like($fullname, ':query', false).")
AND ra.contextid $contextwhere

View File

@ -102,20 +102,20 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
* Test count_blocked_users.
*/
public function test_count_blocked_users() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
// Create users to add to the admin's contact list.
// Create user to add to the admin's block list.
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$this->assertEquals(0, \core_message\api::count_blocked_users());
// Add 1 blocked and 1 normal contact to admin's contact list.
message_add_contact($user1->id);
message_add_contact($user2->id, 1);
// Add 1 blocked user to admin's blocked user list.
\core_message\api::block_user($USER->id, $user1->id);
$this->assertEquals(0, \core_message\api::count_blocked_users($user2));
$this->assertEquals(0, \core_message\api::count_blocked_users($user1));
$this->assertEquals(1, \core_message\api::count_blocked_users());
}
@ -140,7 +140,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$user2 = self::getDataGenerator()->create_user($user2);
// Block the second user.
message_block_contact($user2->id, $user1->id);
\core_message\api::block_user($user1->id, $user2->id);
$user3 = new stdClass();
$user3->firstname = 'User';
@ -247,9 +247,9 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->getDataGenerator()->enrol_user($user1->id, $course5->id, $role->id);
// Add some users as contacts.
message_add_contact($user2->id, 0, $user1->id);
message_add_contact($user3->id, 0, $user1->id);
message_add_contact($user4->id, 0, $user1->id);
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
// Remove the viewparticipants capability from one of the courses.
$course5context = context_course::instance($course5->id);
@ -280,25 +280,31 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
// Create some users.
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$user3 = self::getDataGenerator()->create_user();
// The person doing the search.
$this->setUser($user1);
// Send some messages back and forth.
$time = 1;
$this->send_fake_message($user1, $user2, 'Yo!', 0, $time);
$this->send_fake_message($user2, $user1, 'Sup mang?', 0, $time + 1);
$this->send_fake_message($user1, $user2, 'Writing PHPUnit tests!', 0, $time + 2);
$this->send_fake_message($user2, $user1, 'Word.', 0, $time + 3);
$this->send_fake_message($user3, $user1, 'Don\'t block me.', 0, $time);
$this->send_fake_message($user1, $user2, 'Yo!', 0, $time + 1);
$this->send_fake_message($user2, $user1, 'Sup mang?', 0, $time + 2);
$this->send_fake_message($user1, $user2, 'Writing PHPUnit tests!', 0, $time + 3);
$this->send_fake_message($user2, $user1, 'Word.', 0, $time + 4);
// Block user 3.
\core_message\api::block_user($user1->id, $user3->id);
// Perform a search.
$messages = \core_message\api::search_messages($user1->id, 'o');
// Confirm the data is correct.
$this->assertEquals(2, count($messages));
$this->assertEquals(3, count($messages));
$message1 = $messages[0];
$message2 = $messages[1];
$message3 = $messages[2];
$this->assertEquals($user2->id, $message1->userid);
$this->assertEquals($user2->id, $message1->useridfrom);
@ -321,6 +327,17 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertTrue($message2->isread);
$this->assertFalse($message2->isblocked);
$this->assertNull($message2->unreadcount);
$this->assertEquals($user3->id, $message3->userid);
$this->assertEquals($user3->id, $message3->useridfrom);
$this->assertEquals(fullname($user3), $message3->fullname);
$this->assertTrue($message3->ismessaging);
$this->assertEquals('Don\'t block me.', $message3->lastmessage);
$this->assertNotEmpty($message3->messageid);
$this->assertNull($message3->isonline);
$this->assertFalse($message3->isread);
$this->assertTrue($message3->isblocked);
$this->assertNull($message3->unreadcount);
}
/**
@ -939,15 +956,16 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$user5 = self::getDataGenerator()->create_user($user5);
// Add some users as contacts.
message_add_contact($user2->id, 0, $user1->id);
message_add_contact($user3->id, 0, $user1->id);
message_add_contact($user4->id, 0, $user1->id);
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
// Retrieve the contacts.
$contacts = \core_message\api::get_contacts($user1->id);
// Confirm the data is correct.
$this->assertEquals(3, count($contacts));
usort($contacts, ['static', 'sort_contacts']);
$contact1 = $contacts[0];
$contact2 = $contacts[1];
@ -1315,7 +1333,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->setUser($user1);
// Block the second user.
message_block_contact($user2->id);
\core_message\api::block_user($user1->id, $user2->id);
// Check that the second user can no longer send the first user a message.
$this->assertFalse(\core_message\api::can_post_message($user1, $user2));
@ -1343,10 +1361,17 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertTrue(\core_message\api::is_user_non_contact_blocked($user2));
// Add the first user as a contact for the second user.
message_add_contact($user1->id, 0, $user2->id);
\core_message\api::add_contact($user2->id, $user1->id);
// Check that the return result is now false.
$this->assertFalse(\core_message\api::is_user_non_contact_blocked($user2));
// Set the first user's preference to not receive messages from non-contacts.
set_user_preference('message_blocknoncontacts', 1, $user1->id);
$this->setUser($user2);
// Confirm it is still false. We want to ensure a contact request works both ways
// as it is now an agreement between users.
$this->assertFalse(\core_message\api::is_user_non_contact_blocked($user1));
}
/**
@ -1365,13 +1390,13 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertFalse(\core_message\api::is_user_blocked($user1->id, $user2->id));
// Block the user.
message_block_contact($user2->id);
\core_message\api::block_user($user1->id, $user2->id);
// User should be blocked.
$this->assertTrue(\core_message\api::is_user_blocked($user1->id, $user2->id));
// Unblock the user.
message_unblock_contact($user2->id);
\core_message\api::unblock_user($user1->id, $user2->id);
$this->assertFalse(\core_message\api::is_user_blocked($user1->id, $user2->id));
}
@ -1386,7 +1411,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->setUser($user1);
// Block the admin user.
message_block_contact(2);
\core_message\api::block_user($user1->id, 2);
// Now change to the admin user.
$this->setAdminUser();
@ -1623,13 +1648,12 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$user2 = $this->getDataGenerator()->create_user();
// Add users to the admin's contact list.
message_add_contact($user1->id);
message_add_contact($user2->id, 1);
\core_message\api::block_user($USER->id, $user2->id);
$this->assertCount(1, \core_message\api::get_blocked_users($USER->id));
// Block other user.
message_block_contact($user1->id);
\core_message\api::block_user($USER->id, $user1->id);
$this->assertCount(2, \core_message\api::get_blocked_users($USER->id));
// Test deleting users.
@ -1649,9 +1673,8 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$user4 = self::getDataGenerator()->create_user();
// Add the users to each of their contacts.
message_add_contact($user1->id, 0, $user2->id);
message_add_contact($user2->id, 0, $user1->id);
message_add_contact($user3->id, 0, $user2->id);
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user2->id, $user3->id);
$this->send_fake_message($user1, $user2);
$this->send_fake_message($user1, $user2);
@ -1669,13 +1692,13 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
// Get the contacts and the unread message count.
$messages = \core_message\api::get_contacts_with_unread_message_count($user2->id);
// Confirm the size is correct.
$this->assertCount(2, $messages);
ksort($messages);
$messageinfo1 = array_shift($messages);
$messageinfo2 = array_shift($messages);
$this->assertEquals($user1->id, $messageinfo1->id);
$this->assertEquals(4, $messageinfo1->messagecount);
$this->assertEquals($user3->id, $messageinfo2->id);
@ -1742,7 +1765,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$user2 = self::getDataGenerator()->create_user();
// Add the users to each of their contacts.
message_add_contact($user1->id, 0, $user2->id);
\core_message\api::add_contact($user2->id, $user1->id);
// Check we get the correct message count.
$messages = \core_message\api::get_contacts_with_unread_message_count($user2->id);
@ -1768,8 +1791,8 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$user4 = self::getDataGenerator()->create_user();
// Add a user to the contact list of the users we are testing this function with.
message_add_contact($user4->id, 0, $user1->id);
message_add_contact($user4->id, 0, $user2->id);
\core_message\api::add_contact($user1->id, $user4->id);
\core_message\api::add_contact($user2->id, $user4->id);
$this->send_fake_message($user1, $user2);
$this->send_fake_message($user1, $user2);
@ -2167,4 +2190,15 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertTrue(\core_message\api::does_contact_request_exist($user1->id, $user2->id));
$this->assertTrue(\core_message\api::does_contact_request_exist($user2->id, $user1->id));
}
/**
* Comparison function for sorting contacts.
*
* @param stdClass $a
* @param stdClass $b
* @return bool
*/
protected static function sort_contacts($a, $b) {
return $a->userid > $b->userid;
}
}

View File

@ -52,6 +52,8 @@ class core_message_events_testcase extends core_message_messagelib_testcase {
* Test the message contact added event.
*/
public function test_message_contact_added() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
@ -60,7 +62,7 @@ class core_message_events_testcase extends core_message_messagelib_testcase {
// Trigger and capture the event when adding a contact.
$sink = $this->redirectEvents();
message_add_contact($user->id);
\core_message\api::add_contact($USER->id, $user->id);
$events = $sink->get_events();
$event = reset($events);
@ -78,6 +80,8 @@ class core_message_events_testcase extends core_message_messagelib_testcase {
* Test the message contact removed event.
*/
public function test_message_contact_removed() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
@ -85,11 +89,11 @@ class core_message_events_testcase extends core_message_messagelib_testcase {
$user = $this->getDataGenerator()->create_user();
// Add the user to the admin's contact list.
message_add_contact($user->id);
\core_message\api::add_contact($USER->id, $user->id);
// Trigger and capture the event when adding a contact.
$sink = $this->redirectEvents();
message_remove_contact($user->id);
\core_message\api::remove_contact($USER->id, $user->id);
$events = $sink->get_events();
$event = reset($events);
@ -104,61 +108,37 @@ class core_message_events_testcase extends core_message_messagelib_testcase {
}
/**
* Test the message contact blocked event.
* Test the message user blocked event.
*/
public function test_message_contact_blocked() {
public function test_message_user_blocked() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
// Create a user to add to the admin's contact list.
$user = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
// Add the user to the admin's contact list.
message_add_contact($user->id);
\core_message\api::add_contact($USER->id, $user->id);
// Trigger and capture the event when blocking a contact.
$sink = $this->redirectEvents();
message_block_contact($user->id);
\core_message\api::block_user($USER->id, $user->id);
$events = $sink->get_events();
$event = reset($events);
// Check that the event data is valid.
$this->assertInstanceOf('\core\event\message_contact_blocked', $event);
$this->assertInstanceOf('\core\event\message_user_blocked', $event);
$this->assertEquals(context_user::instance(2), $event->get_context());
$expected = array(SITEID, 'message', 'block contact', 'index.php?user1=' . $user->id . '&user2=2', $user->id);
$this->assertEventLegacyLogData($expected, $event);
$url = new moodle_url('/message/index.php', array('user1' => $event->userid, 'user2' => $event->relateduserid));
$this->assertEquals($url, $event->get_url());
// Make sure that the contact blocked event is not triggered again.
$sink->clear();
message_block_contact($user->id);
$events = $sink->get_events();
$event = reset($events);
$this->assertEmpty($event);
// Make sure that we still have 1 blocked user.
$this->assertEquals(1, \core_message\api::count_blocked_users());
// Now blocking a user that is not a contact.
$sink->clear();
message_block_contact($user2->id);
$events = $sink->get_events();
$event = reset($events);
// Check that the event data is valid.
$this->assertInstanceOf('\core\event\message_contact_blocked', $event);
$this->assertEquals(context_user::instance(2), $event->get_context());
$expected = array(SITEID, 'message', 'block contact', 'index.php?user1=' . $user2->id . '&user2=2', $user2->id);
$this->assertEventLegacyLogData($expected, $event);
$url = new moodle_url('/message/index.php', array('user1' => $event->userid, 'user2' => $event->relateduserid));
$this->assertEquals($url, $event->get_url());
}
/**
* Test the message contact unblocked event.
* Test the message user unblocked event.
*/
public function test_message_contact_unblocked() {
public function test_message_user_unblocked() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
@ -166,39 +146,25 @@ class core_message_events_testcase extends core_message_messagelib_testcase {
$user = $this->getDataGenerator()->create_user();
// Add the user to the admin's contact list.
message_add_contact($user->id);
\core_message\api::add_contact($USER->id, $user->id);
// Block the user.
message_block_contact($user->id);
\core_message\api::block_user($USER->id, $user->id);
// Make sure that we have 1 blocked user.
$this->assertEquals(1, \core_message\api::count_blocked_users());
// Trigger and capture the event when unblocking a contact.
$sink = $this->redirectEvents();
message_unblock_contact($user->id);
\core_message\api::unblock_user($USER->id, $user->id);
$events = $sink->get_events();
$event = reset($events);
// Check that the event data is valid.
$this->assertInstanceOf('\core\event\message_contact_unblocked', $event);
$this->assertInstanceOf('\core\event\message_user_unblocked', $event);
$this->assertEquals(context_user::instance(2), $event->get_context());
$expected = array(SITEID, 'message', 'unblock contact', 'index.php?user1=' . $user->id . '&user2=2', $user->id);
$this->assertEventLegacyLogData($expected, $event);
$url = new moodle_url('/message/index.php', array('user1' => $event->userid, 'user2' => $event->relateduserid));
$this->assertEquals($url, $event->get_url());
// Make sure that we have no blocked users.
$this->assertEmpty(\core_message\api::count_blocked_users());
// Make sure that the contact unblocked event is not triggered again.
$sink->clear();
message_unblock_contact($user->id);
$events = $sink->get_events();
$event = reset($events);
$this->assertEmpty($event);
// Make sure that we still have no blocked users.
$this->assertEmpty(\core_message\api::count_blocked_users());
}
/**

View File

@ -91,42 +91,33 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
}
/**
* Test send_instant_messages
* Test send_instant_messages.
*/
public function test_send_instant_messages() {
global $DB, $USER;
global $DB, $USER, $CFG;
$this->resetAfterTest();
$this->resetAfterTest(true);
// Transactions used in tests, tell phpunit use alternative reset method.
$this->preventResetByRollback();
// Turn off all message processors (so nothing is really sent)
require_once($CFG->dirroot . '/message/lib.php');
$messageprocessors = get_message_processors();
foreach($messageprocessors as $messageprocessor) {
$messageprocessor->enabled = 0;
$DB->update_record('message_processors', $messageprocessor);
}
// Set the required capabilities by the external function
$contextid = context_system::instance()->id;
$roleid = $this->assignUserCapability('moodle/site:sendmessage', $contextid);
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->setUser($user1);
// Create test message data.
$message1 = array();
$message1['touserid'] = $user1->id;
$message1['touserid'] = $user2->id;
$message1['text'] = 'the message.';
$message1['clientmsgid'] = 4;
$messages = array($message1);
$sentmessages = core_message_external::send_instant_messages($messages);
// We need to execute the return values cleaning process to simulate the web service server.
$sentmessages = external_api::clean_returnvalue(core_message_external::send_instant_messages_returns(), $sentmessages);
$sentmessage = reset($sentmessages);
$sql = "SELECT m.*, mcm.userid as useridto
FROM {messages} m
INNER JOIN {message_conversations} mc
@ -135,13 +126,196 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
ON mcm.conversationid = mc.id
WHERE mcm.userid != ?
AND m.id = ?";
$themessage = $DB->get_record_sql($sql, [$USER->id, $sentmessages[0]['msgid']]);
$themessage = $DB->get_record_sql($sql, [$USER->id, $sentmessage['msgid']]);
// Confirm that the message was inserted correctly.
$this->assertEquals($themessage->useridfrom, $USER->id);
$this->assertEquals($themessage->useridfrom, $user1->id);
$this->assertEquals($themessage->useridto, $message1['touserid']);
$this->assertEquals($themessage->smallmessage, $message1['text']);
$this->assertEquals($sentmessages[0]['clientmsgid'], $message1['clientmsgid']);
$this->assertEquals($sentmessage['clientmsgid'], $message1['clientmsgid']);
}
/**
* Test send_instant_messages to a user who has blocked you.
*/
public function test_send_instant_messages_blocked_user() {
global $DB;
$this->resetAfterTest();
// Transactions used in tests, tell phpunit use alternative reset method.
$this->preventResetByRollback();
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->setUser($user1);
\core_message\api::block_user($user2->id, $user1->id);
// Create test message data.
$message1 = array();
$message1['touserid'] = $user2->id;
$message1['text'] = 'the message.';
$message1['clientmsgid'] = 4;
$messages = array($message1);
$sentmessages = core_message_external::send_instant_messages($messages);
$sentmessages = external_api::clean_returnvalue(core_message_external::send_instant_messages_returns(), $sentmessages);
$sentmessage = reset($sentmessages);
$this->assertEquals(get_string('userisblockingyou', 'message'), $sentmessage['errormessage']);
$this->assertEquals(0, $DB->count_records('messages'));
}
/**
* Test send_instant_messages when sending a message to a non-contact who has blocked non-contacts.
*/
public function test_send_instant_messages_block_non_contacts() {
global $DB;
$this->resetAfterTest(true);
// Transactions used in tests, tell phpunit use alternative reset method.
$this->preventResetByRollback();
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->setUser($user1);
// Set the user preference so user 2 does not accept messages from non-contacts.
set_user_preference('message_blocknoncontacts', 1, $user2);
// Create test message data.
$message1 = array();
$message1['touserid'] = $user2->id;
$message1['text'] = 'the message.';
$message1['clientmsgid'] = 4;
$messages = array($message1);
$sentmessages = core_message_external::send_instant_messages($messages);
$sentmessages = external_api::clean_returnvalue(core_message_external::send_instant_messages_returns(), $sentmessages);
$sentmessage = reset($sentmessages);
$this->assertEquals(get_string('userisblockingyounoncontact', 'message', fullname($user2)), $sentmessage['errormessage']);
$this->assertEquals(0, $DB->count_records('messages'));
}
/**
* Test send_instant_messages when sending a message to a contact who has blocked non-contacts.
*/
public function test_send_instant_messages_block_non_contacts_but_am_contact() {
global $DB, $USER;
$this->resetAfterTest(true);
// Transactions used in tests, tell phpunit use alternative reset method.
$this->preventResetByRollback();
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->setUser($user1);
// Set the user preference so user 2 does not accept messages from non-contacts.
set_user_preference('message_blocknoncontacts', 1, $user2);
\core_message\api::add_contact($user1->id, $user2->id);
// Create test message data.
$message1 = array();
$message1['touserid'] = $user2->id;
$message1['text'] = 'the message.';
$message1['clientmsgid'] = 4;
$messages = array($message1);
$sentmessages = core_message_external::send_instant_messages($messages);
$sentmessages = external_api::clean_returnvalue(core_message_external::send_instant_messages_returns(), $sentmessages);
$sentmessage = reset($sentmessages);
$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 != ?
AND m.id = ?";
$themessage = $DB->get_record_sql($sql, [$USER->id, $sentmessage['msgid']]);
// Confirm that the message was inserted correctly.
$this->assertEquals($themessage->useridfrom, $user1->id);
$this->assertEquals($themessage->useridto, $message1['touserid']);
$this->assertEquals($themessage->smallmessage, $message1['text']);
$this->assertEquals($sentmessage['clientmsgid'], $message1['clientmsgid']);
}
/**
* Test send_instant_messages with no capabilities
*/
public function test_send_instant_messages_no_capability() {
global $DB;
$this->resetAfterTest(true);
// Transactions used in tests, tell phpunit use alternative reset method.
$this->preventResetByRollback();
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->setUser($user1);
// Unset the required capabilities by the external function.
$contextid = context_system::instance()->id;
$userrole = $DB->get_record('role', array('shortname' => 'user'));
$this->unassignUserCapability('moodle/site:sendmessage', $contextid, $userrole->id);
// Create test message data.
$message1 = array();
$message1['touserid'] = $user2->id;
$message1['text'] = 'the message.';
$message1['clientmsgid'] = 4;
$messages = array($message1);
$this->expectException('required_capability_exception');
core_message_external::send_instant_messages($messages);
}
/**
* Test send_instant_messages when messaging is disabled.
*/
public function test_send_instant_messages_messaging_disabled() {
global $CFG;
$this->resetAfterTest(true);
// Transactions used in tests, tell phpunit use alternative reset method.
$this->preventResetByRollback();
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->setUser($user1);
// Disable messaging.
$CFG->messaging = 0;
// Create test message data.
$message1 = array();
$message1['touserid'] = $user2->id;
$message1['text'] = 'the message.';
$message1['clientmsgid'] = 4;
$messages = array($message1);
$this->expectException('moodle_exception');
core_message_external::send_instant_messages($messages);
}
/**
@ -159,21 +333,25 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Adding a contact.
$return = core_message_external::create_contacts(array($user2->id));
$this->assertDebuggingCalled();
$return = external_api::clean_returnvalue(core_message_external::create_contacts_returns(), $return);
$this->assertEquals(array(), $return);
// Adding a contact who is already a contact.
$return = core_message_external::create_contacts(array($user2->id));
$this->assertDebuggingCalled();
$return = external_api::clean_returnvalue(core_message_external::create_contacts_returns(), $return);
$this->assertEquals(array(), $return);
// Adding multiple contacts.
$return = core_message_external::create_contacts(array($user3->id, $user4->id));
$this->assertDebuggingCalledCount(2);
$return = external_api::clean_returnvalue(core_message_external::create_contacts_returns(), $return);
$this->assertEquals(array(), $return);
// Adding a non-existing user.
$return = core_message_external::create_contacts(array(99999));
$this->assertDebuggingCalled();
$return = external_api::clean_returnvalue(core_message_external::create_contacts_returns(), $return);
$this->assertCount(1, $return);
$return = array_pop($return);
@ -182,6 +360,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Adding contacts with valid and invalid parameters.
$return = core_message_external::create_contacts(array($user5->id, 99999));
$this->assertDebuggingCalledCount(2);
$return = external_api::clean_returnvalue(core_message_external::create_contacts_returns(), $return);
$this->assertCount(1, $return);
$return = array_pop($return);
@ -207,8 +386,11 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$user5 = self::getDataGenerator()->create_user();
$user6 = self::getDataGenerator()->create_user();
$this->setUser($user1);
$this->assertEquals(array(), core_message_external::create_contacts(
array($user3->id, $user4->id, $user5->id, $user6->id)));
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
\core_message\api::add_contact($user1->id, $user5->id);
\core_message\api::add_contact($user1->id, $user6->id);
// Removing a non-contact.
$return = core_message_external::delete_contacts(array($user2->id));
@ -248,25 +430,32 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$user4 = self::getDataGenerator()->create_user();
$user5 = self::getDataGenerator()->create_user();
$this->setUser($user1);
$this->assertEquals(array(), core_message_external::create_contacts(array($user3->id, $user4->id, $user5->id)));
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
\core_message\api::add_contact($user1->id, $user5->id);
// Blocking a contact.
$return = core_message_external::block_contacts(array($user2->id));
$this->assertDebuggingCalled();
$return = external_api::clean_returnvalue(core_message_external::block_contacts_returns(), $return);
$this->assertEquals(array(), $return);
// Blocking a contact who is already a contact.
$return = core_message_external::block_contacts(array($user2->id));
$this->assertDebuggingCalled();
$return = external_api::clean_returnvalue(core_message_external::block_contacts_returns(), $return);
$this->assertEquals(array(), $return);
// Blocking multiple contacts.
$return = core_message_external::block_contacts(array($user3->id, $user4->id));
$this->assertDebuggingCalledCount(2);
$return = external_api::clean_returnvalue(core_message_external::block_contacts_returns(), $return);
$this->assertEquals(array(), $return);
// Blocking a non-existing user.
$return = core_message_external::block_contacts(array(99999));
$this->assertDebuggingCalled();
$return = external_api::clean_returnvalue(core_message_external::block_contacts_returns(), $return);
$this->assertCount(1, $return);
$return = array_pop($return);
@ -275,6 +464,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Blocking contacts with valid and invalid parameters.
$return = core_message_external::block_contacts(array($user5->id, 99999));
$this->assertDebuggingCalledCount(2);
$return = external_api::clean_returnvalue(core_message_external::block_contacts_returns(), $return);
$this->assertCount(1, $return);
$return = array_pop($return);
@ -300,33 +490,42 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$user5 = self::getDataGenerator()->create_user();
$user6 = self::getDataGenerator()->create_user();
$this->setUser($user1);
$this->assertEquals(array(), core_message_external::create_contacts(
array($user3->id, $user4->id, $user5->id, $user6->id)));
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
\core_message\api::add_contact($user1->id, $user5->id);
\core_message\api::add_contact($user1->id, $user6->id);
// Removing a non-contact.
$return = core_message_external::unblock_contacts(array($user2->id));
$this->assertDebuggingCalled();
$this->assertNull($return);
// Removing one contact.
$return = core_message_external::unblock_contacts(array($user3->id));
$this->assertDebuggingCalled();
$this->assertNull($return);
// Removing multiple contacts.
$return = core_message_external::unblock_contacts(array($user4->id, $user5->id));
$this->assertDebuggingCalledCount(2);
$this->assertNull($return);
// Removing contact from unexisting user.
$return = core_message_external::unblock_contacts(array(99999));
$this->assertDebuggingCalled();
$this->assertNull($return);
// Removing mixed valid and invalid data.
$return = core_message_external::unblock_contacts(array($user6->id, 99999));
$this->assertDebuggingCalledCount(2);
$this->assertNull($return);
// Try to unblock a contact of another user contact list, should throw an exception.
// All assertions must be added before this point.
$this->expectException('required_capability_exception');
core_message_external::unblock_contacts(array($user2->id), $user3->id);
$this->assertDebuggingCalled();
}
/**
@ -771,8 +970,10 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Login as user1.
$this->setUser($user1);
$this->assertEquals(array(), core_message_external::create_contacts(
array($user_offline1->id, $user_offline2->id, $user_offline3->id, $user_online->id)));
\core_message\api::add_contact($user1->id, $user_offline1->id);
\core_message\api::add_contact($user1->id, $user_offline2->id);
\core_message\api::add_contact($user1->id, $user_offline3->id);
\core_message\api::add_contact($user1->id, $user_online->id);
// User_stranger sends a couple of messages to user1.
$this->send_message($user_stranger, $user1, 'Hello there!');
@ -791,6 +992,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertCount(1, $contacts['online']);
$this->assertCount(3, $contacts['strangers']);
core_message_external::block_contacts(array($user_blocked->id));
$this->assertDebuggingCalled();
$contacts = core_message_external::get_contacts();
$contacts = external_api::clean_returnvalue(core_message_external::get_contacts_returns(), $contacts);
$this->assertCount(3, $contacts['offline']);
@ -1195,8 +1397,9 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Login as user1.
$this->setUser($user1);
$this->assertEquals(array(), core_message_external::create_contacts(
array($useroffline1->id, $useroffline2->id)));
\core_message\api::add_contact($user1->id, $useroffline1->id);
\core_message\api::add_contact($user1->id, $useroffline2->id);
// The userstranger sends a couple of messages to user1.
$this->send_message($userstranger, $user1, 'Hello there!');
@ -1214,6 +1417,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Block the $userblocked and retrieve again the list.
core_message_external::block_contacts(array($userblocked->id));
$this->assertDebuggingCalled();
$blockedusers = core_message_external::get_blocked_users($user1->id);
$blockedusers = external_api::clean_returnvalue(core_message_external::get_blocked_users_returns(), $blockedusers);
$this->assertCount(1, $blockedusers['users']);
@ -1223,7 +1427,6 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$blockedusers = core_message_external::get_blocked_users($user1->id);
$blockedusers = external_api::clean_returnvalue(core_message_external::get_blocked_users_returns(), $blockedusers);
$this->assertCount(0, $blockedusers['users']);
}
/**
@ -1238,8 +1441,8 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Login as user1.
$this->setUser($user1);
$this->assertEquals(array(), core_message_external::create_contacts(
array($user2->id, $user3->id)));
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
// The user2 sends a couple of messages to user1.
$this->send_message($user2, $user1, 'Hello there!');
@ -1297,8 +1500,8 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Login as user1.
$this->setUser($user1);
$this->assertEquals(array(), core_message_external::create_contacts(
array($user2->id, $user3->id)));
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
// The user2 sends a couple of notifications to user1.
$this->send_message($user2, $user1, 'Hello there!', 1);
@ -1359,7 +1562,8 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Login as user1.
$this->setUser($user1);
$this->assertEquals(array(), core_message_external::create_contacts(array($user2->id, $user3->id)));
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
// User user1 does not interchange messages with user3.
$m1to2 = message_post_message($user1, $user2, 'some random text 1', FORMAT_MOODLE);
@ -1588,7 +1792,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$user2 = self::getDataGenerator()->create_user($user2);
// Block the second user.
message_block_contact($user2->id, $user1->id);
\core_message\api::block_user($user1->id, $user2->id);
$user3 = new stdClass();
$user3->firstname = 'User';
@ -1798,9 +2002,9 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->getDataGenerator()->enrol_user($user1->id, $course3->id, 'student');
// Add some users as contacts.
message_add_contact($user2->id, 0, $user1->id);
message_add_contact($user3->id, 0, $user1->id);
message_add_contact($user4->id, 0, $user1->id);
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
// Perform a search.
$result = core_message_external::data_for_messagearea_search_users($user1->id, 'search');
@ -1886,9 +2090,9 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$course3 = $this->getDataGenerator()->create_course($course3);
// Add some users as contacts.
message_add_contact($user2->id, 0, $user1->id);
message_add_contact($user3->id, 0, $user1->id);
message_add_contact($user4->id, 0, $user1->id);
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
// Perform a search.
$result = core_message_external::data_for_messagearea_search_users($user1->id, 'search');
@ -2336,9 +2540,9 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$user5 = self::getDataGenerator()->create_user($user5);
// Add some users as contacts.
message_add_contact($user2->id, 0, $user1->id);
message_add_contact($user3->id, 0, $user1->id);
message_add_contact($user4->id, 0, $user1->id);
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
// Retrieve the contacts.
$result = core_message_external::data_for_messagearea_contacts($user1->id);
@ -2349,6 +2553,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Confirm the data is correct.
$contacts = $result['contacts'];
usort($contacts, ['static', 'sort_contacts']);
$this->assertCount(3, $contacts);
$contact1 = $contacts[0];
@ -2418,9 +2623,9 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$user5 = self::getDataGenerator()->create_user($user5);
// Add some users as contacts.
message_add_contact($user2->id, 0, $user1->id);
message_add_contact($user3->id, 0, $user1->id);
message_add_contact($user4->id, 0, $user1->id);
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
// Retrieve the contacts.
$result = core_message_external::data_for_messagearea_contacts($user1->id);
@ -2431,6 +2636,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Confirm the data is correct.
$contacts = $result['contacts'];
usort($contacts, ['static', 'sort_contacts']);
$this->assertCount(3, $contacts);
$contact1 = $contacts[0];
@ -3317,4 +3523,15 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->expectException('moodle_exception');
$prefs = core_message_external::get_user_message_preferences($otheruser->id);
}
/**
* Comparison function for sorting contacts.
*
* @param array $a
* @param array $b
* @return bool
*/
protected static function sort_contacts($a, $b) {
return $a['userid'] > $b['userid'];
}
}

View File

@ -106,6 +106,8 @@ class core_message_messagelib_testcase extends advanced_testcase {
* Test message_get_blocked_users.
*/
public function test_message_get_blocked_users() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
@ -113,15 +115,13 @@ class core_message_messagelib_testcase extends advanced_testcase {
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
// Add users to the admin's contact list.
message_add_contact($user1->id);
message_add_contact($user2->id, 1);
\core_message\api::block_user($USER->id, $user2->id);
$this->assertCount(1, message_get_blocked_users());
$this->assertDebuggingCalled();
// Block other user.
message_block_contact($user1->id);
\core_message\api::block_user($USER->id, $user1->id);
$this->assertCount(2, message_get_blocked_users());
$this->assertDebuggingCalled();
@ -149,8 +149,8 @@ class core_message_messagelib_testcase extends advanced_testcase {
$user3 = $this->getDataGenerator()->create_user(); // Stranger.
// Add users to the admin's contact list.
message_add_contact($user1->id);
message_add_contact($user2->id);
\core_message\api::add_contact($USER->id, $user1->id);
\core_message\api::add_contact($USER->id, $user2->id);
// Send some messages.
$this->send_fake_message($user1, $USER);
@ -173,7 +173,7 @@ class core_message_messagelib_testcase extends advanced_testcase {
$this->assertCount(3, $strangers);
// Block 1 user.
message_block_contact($user2->id);
\core_message\api::block_user($USER->id, $user2->id);
list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
$this->assertDebuggingCalled();
$this->assertCount(0, $onlinecontacts);
@ -286,29 +286,34 @@ class core_message_messagelib_testcase extends advanced_testcase {
* Test message_add_contact.
*/
public function test_message_add_contact() {
global $DB, $USER;
// Set this user as the admin.
$this->setAdminUser();
// Create a user to add to the admin's contact list.
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$user3 = $this->getDataGenerator()->create_user();
message_add_contact($user1->id);
message_add_contact($user2->id, 0);
// Add duplicate contact and make sure only 1 record exists.
message_add_contact($user2->id, 1);
$this->assertDebuggingCalled();
$this->assertEquals(1, $DB->count_records('message_contact_requests'));
$this->assertNotEmpty(message_get_contact($user1->id));
$this->assertNotEmpty(message_get_contact($user2->id));
$this->assertEquals(false, message_get_contact($user3->id));
$this->assertEquals(1, \core_message\api::count_blocked_users());
message_add_contact($user2->id, 1);
$this->assertDebuggingCalled();
$this->assertEquals(1, $DB->count_records('message_users_blocked'));
message_add_contact($user2->id, 0);
$this->assertDebuggingCalled();
$this->assertEquals(0, $DB->count_records('message_users_blocked'));
}
/**
* Test message_remove_contact.
*/
public function test_message_remove_contact() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
@ -316,18 +321,21 @@ class core_message_messagelib_testcase extends advanced_testcase {
$user = $this->getDataGenerator()->create_user();
// Add the user to the admin's contact list.
message_add_contact($user->id);
$this->assertNotEmpty(message_get_contact($user->id));
\core_message\api::add_contact($USER->id, $user->id);
// Remove user from admin's contact list.
message_remove_contact($user->id);
$this->assertDebuggingCalled();
$this->assertEquals(false, message_get_contact($user->id));
$this->assertDebuggingCalled();
}
/**
* Test message_block_contact.
*/
public function test_message_block_contact() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
@ -336,13 +344,14 @@ class core_message_messagelib_testcase extends advanced_testcase {
$user2 = $this->getDataGenerator()->create_user();
// Add users to the admin's contact list.
message_add_contact($user1->id);
message_add_contact($user2->id);
\core_message\api::add_contact($USER->id, $user1->id);
\core_message\api::add_contact($USER->id, $user2->id);
$this->assertEquals(0, \core_message\api::count_blocked_users());
// Block 1 user.
message_block_contact($user2->id);
$this->assertDebuggingCalled();
$this->assertEquals(1, \core_message\api::count_blocked_users());
}
@ -351,21 +360,21 @@ class core_message_messagelib_testcase extends advanced_testcase {
* Test message_unblock_contact.
*/
public function test_message_unblock_contact() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
// Create a user to add to the admin's contact list.
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
// Add users to the admin's contact list.
message_add_contact($user1->id);
message_add_contact($user2->id, 1); // Add blocked contact.
// Add users to the admin's blocked list.
\core_message\api::block_user($USER->id, $user1->id);
$this->assertEquals(1, \core_message\api::count_blocked_users());
// Unblock user.
message_unblock_contact($user2->id);
message_unblock_contact($user1->id);
$this->assertDebuggingCalled();
$this->assertEquals(0, \core_message\api::count_blocked_users());
}
@ -373,6 +382,8 @@ class core_message_messagelib_testcase extends advanced_testcase {
* Test message_search_users.
*/
public function test_message_search_users() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
@ -381,8 +392,8 @@ class core_message_messagelib_testcase extends advanced_testcase {
$user2 = $this->getDataGenerator()->create_user(array('firstname' => 'Test2', 'lastname' => 'user2'));
// Add users to the admin's contact list.
message_add_contact($user1->id);
message_add_contact($user2->id); // Add blocked contact.
\core_message\api::add_contact($USER->id, $user1->id);
\core_message\api::add_contact($USER->id, $user2->id);
$this->assertCount(1, message_search_users(0, 'Test1'));
$this->assertCount(2, message_search_users(0, 'Test'));