MDL-64018 core_message: added external::get_user_contacts

This is to replace usages of external::data_for_messagearea_contacts
in the new UI.
This commit is contained in:
Mark Nelson 2018-11-20 12:01:01 +08:00
parent 715c45aac9
commit c9b0f33f78
4 changed files with 268 additions and 1 deletions

View File

@ -1080,6 +1080,15 @@ $functions = array(
'type' => 'read',
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
),
'core_message_get_user_contacts' => array(
'classname' => 'core_message_external',
'methodname' => 'get_user_contacts',
'classpath' => 'message/externallib.php',
'description' => 'Retrieve the contact list',
'type' => 'read',
'ajax' => true,
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
),
'core_message_get_conversations' => array(
'classname' => 'core_message_external',
'methodname' => 'get_conversations',

View File

@ -2226,6 +2226,66 @@ class core_message_external extends external_api {
);
}
/**
* The user contacts return parameters.
*
* @return external_function_parameters
*/
public static function get_user_contacts_parameters() {
return new external_function_parameters(
array(
'userid' => new external_value(PARAM_INT, 'The id of the user who we retrieving the contacts for'),
'limitfrom' => new external_value(PARAM_INT, 'Limit from', VALUE_DEFAULT, 0),
'limitnum' => new external_value(PARAM_INT, 'Limit number', VALUE_DEFAULT, 0)
)
);
}
/**
* Get user contacts.
*
* @param int $userid The id of the user who we are viewing conversations for
* @param int $limitfrom
* @param int $limitnum
* @return array
* @throws moodle_exception
*/
public static function get_user_contacts(int $userid, int $limitfrom = 0, int $limitnum = 0) {
global $CFG, $USER;
// Check if messaging is enabled.
if (empty($CFG->messaging)) {
throw new moodle_exception('disabled', 'message');
}
$systemcontext = context_system::instance();
$params = array(
'userid' => $userid,
'limitfrom' => $limitfrom,
'limitnum' => $limitnum
);
$params = self::validate_parameters(self::get_user_contacts_parameters(), $params);
self::validate_context($systemcontext);
if (($USER->id != $params['userid']) && !has_capability('moodle/site:readallmessages', $systemcontext)) {
throw new moodle_exception('You do not have permission to perform this action.');
}
return \core_message\api::get_user_contacts($params['userid'], $params['limitfrom'], $params['limitnum']);
}
/**
* The user contacts return structure.
*
* @return external_multiple_structure
*/
public static function get_user_contacts_returns() {
return new external_multiple_structure(
self::get_conversation_member_structure()
);
}
/**
* The get most recent message return parameters.
*

View File

@ -3191,6 +3191,193 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
core_message_external::data_for_messagearea_contacts($user->id);
}
/**
* Tests retrieving contacts.
*/
public function test_get_user_contacts() {
$this->resetAfterTest(true);
// Create some users.
$user1 = self::getDataGenerator()->create_user();
// Set as the user.
$this->setUser($user1);
$user2 = new stdClass();
$user2->firstname = 'User';
$user2->lastname = 'A';
$user2 = self::getDataGenerator()->create_user($user2);
$user3 = new stdClass();
$user3->firstname = 'User';
$user3->lastname = 'B';
$user3 = self::getDataGenerator()->create_user($user3);
$user4 = new stdClass();
$user4->firstname = 'User';
$user4->lastname = 'C';
$user4 = self::getDataGenerator()->create_user($user4);
$user5 = new stdClass();
$user5->firstname = 'User';
$user5->lastname = 'D';
$user5 = self::getDataGenerator()->create_user($user5);
// Add some users as contacts.
\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::get_user_contacts($user1->id);
// We need to execute the return values cleaning process to simulate the web service server.
$result = external_api::clean_returnvalue(core_message_external::get_user_contacts_returns(),
$result);
// Confirm the data is correct.
$contacts = $result;
usort($contacts, ['static', 'sort_contacts_id']);
$this->assertCount(3, $contacts);
$contact1 = array_shift($contacts);
$contact2 = array_shift($contacts);
$contact3 = array_shift($contacts);
$this->assertEquals($user2->id, $contact1['id']);
$this->assertEquals(fullname($user2), $contact1['fullname']);
$this->assertTrue($contact1['iscontact']);
$this->assertEquals($user3->id, $contact2['id']);
$this->assertEquals(fullname($user3), $contact2['fullname']);
$this->assertTrue($contact2['iscontact']);
$this->assertEquals($user4->id, $contact3['id']);
$this->assertEquals(fullname($user4), $contact3['fullname']);
$this->assertTrue($contact3['iscontact']);
}
/**
* Tests retrieving contacts as another user.
*/
public function test_get_user_contacts_as_other_user() {
$this->resetAfterTest(true);
$this->setAdminUser();
// Create some users.
$user1 = self::getDataGenerator()->create_user();
$user2 = new stdClass();
$user2->firstname = 'User';
$user2->lastname = 'A';
$user2 = self::getDataGenerator()->create_user($user2);
$user3 = new stdClass();
$user3->firstname = 'User';
$user3->lastname = 'B';
$user3 = self::getDataGenerator()->create_user($user3);
$user4 = new stdClass();
$user4->firstname = 'User';
$user4->lastname = 'C';
$user4 = self::getDataGenerator()->create_user($user4);
$user5 = new stdClass();
$user5->firstname = 'User';
$user5->lastname = 'D';
$user5 = self::getDataGenerator()->create_user($user5);
// Add some users as contacts.
\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::get_user_contacts($user1->id);
// We need to execute the return values cleaning process to simulate the web service server.
$result = external_api::clean_returnvalue(core_message_external::get_user_contacts_returns(),
$result);
// Confirm the data is correct.
$contacts = $result;
usort($contacts, ['static', 'sort_contacts_id']);
$this->assertCount(3, $contacts);
$contact1 = array_shift($contacts);
$contact2 = array_shift($contacts);
$contact3 = array_shift($contacts);
$this->assertEquals($user2->id, $contact1['id']);
$this->assertEquals(fullname($user2), $contact1['fullname']);
$this->assertTrue($contact1['iscontact']);
$this->assertEquals($user3->id, $contact2['id']);
$this->assertEquals(fullname($user3), $contact2['fullname']);
$this->assertTrue($contact2['iscontact']);
$this->assertEquals($user4->id, $contact3['id']);
$this->assertEquals(fullname($user4), $contact3['fullname']);
$this->assertTrue($contact3['iscontact']);
}
/**
* Tests retrieving contacts as another user without the proper capabilities.
*/
public function test_get_user_contacts_as_other_user_without_cap() {
$this->resetAfterTest(true);
// Create some users.
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
// The person retrieving the contacts for another user.
$this->setUser($user1);
// Perform the WS call and ensure an exception is thrown.
$this->expectException('moodle_exception');
core_message_external::get_user_contacts($user2->id);
}
/**
* Tests retrieving contacts with messaging disabled.
*/
public function test_get_user_contacts_messaging_disabled() {
global $CFG;
$this->resetAfterTest(true);
// Create some skeleton data just so we can call the WS.
$user = self::getDataGenerator()->create_user();
// The person retrieving the contacts.
$this->setUser($user);
// Disable messaging.
$CFG->messaging = 0;
// Perform the WS call and ensure we are shown that it is disabled.
$this->expectException('moodle_exception');
core_message_external::get_user_contacts($user->id);
}
/**
* Test getting contacts when there are no results.
*/
public function test_get_user_contacts_no_results() {
$this->resetAfterTest();
$user1 = self::getDataGenerator()->create_user();
$this->setUser($user1);
$requests = core_message_external::get_user_contacts($user1->id);
$requests = external_api::clean_returnvalue(core_message_external::get_user_contacts_returns(), $requests);
$this->assertEmpty($requests);
}
/**
* Tests retrieving messages.
*/
@ -4564,6 +4751,17 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
return $a['userid'] > $b['userid'];
}
/**
* Comparison function for sorting contacts.
*
* @param array $a
* @param array $b
* @return bool
*/
protected static function sort_contacts_id($a, $b) {
return $a['id'] > $b['id'];
}
/**
* Test verifying that conversations can be marked as favourite conversations.
*/

View File

@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die();
$version = 2018112000.01; // YYYYMMDD = weekly release date of this DEV branch.
$version = 2018112000.02; // YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.