diff --git a/lib/db/services.php b/lib/db/services.php index 9f7392362d9..4cf4a245974 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -939,6 +939,15 @@ $functions = array( 'ajax' => true, 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE), ), + 'core_message_get_received_contact_requests_count' => array( + 'classname' => 'core_message_external', + 'methodname' => 'get_received_contact_requests_count', + 'classpath' => 'message/externallib.php', + 'description' => 'Gets the number of received contact requests', + 'type' => 'read', + 'ajax' => true, + 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE), + ), 'core_message_delete_contacts' => array( 'classname' => 'core_message_external', 'methodname' => 'delete_contacts', diff --git a/message/externallib.php b/message/externallib.php index f842b85a2f2..c67b4c772ff 100644 --- a/message/externallib.php +++ b/message/externallib.php @@ -752,6 +752,60 @@ class core_message_external extends external_api { ); } + /** + * Returns the number of contact requests the user has received parameters description. + * + * @return external_function_parameters + */ + public static function get_received_contact_requests_count_parameters() { + return new external_function_parameters( + array( + 'userid' => new external_value(PARAM_INT, 'The id of the user we want to return the number of ' . + 'received contact requests for', VALUE_REQUIRED), + ) + ); + } + + /** + * Returns the number of contact requests the user has received. + * + * @param int $userid The ID of the user we want to return the number of received contact requests for + * @return external_value + */ + public static function get_received_contact_requests_count(int $userid) { + global $CFG, $USER; + + // Check if messaging is enabled. + if (empty($CFG->messaging)) { + throw new moodle_exception('disabled', 'message'); + } + + // Validate context. + $context = context_system::instance(); + self::validate_context($context); + + $params = [ + 'userid' => $userid, + ]; + $params = self::validate_parameters(self::get_received_contact_requests_count_parameters(), $params); + + $capability = 'moodle/site:manageallmessaging'; + if (($USER->id != $params['userid']) && !has_capability($capability, $context)) { + throw new required_capability_exception($context, $capability, 'nopermissions', ''); + } + + return \core_message\api::get_received_contact_requests_count($params['userid']); + } + + /** + * Returns the number of contact requests the user has received return description. + * + * @return external_value + */ + public static function get_received_contact_requests_count_returns() { + return new external_value(PARAM_INT, 'The number of received contact requests'); + } + /** * Returns get conversation members parameters description. * diff --git a/message/tests/externallib_test.php b/message/tests/externallib_test.php index 451b866a04e..d19e171261b 100644 --- a/message/tests/externallib_test.php +++ b/message/tests/externallib_test.php @@ -663,6 +663,85 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { core_message_external::create_contact_request($user1->id, $user2->id); } + /** + * Test getting the number of received contact requests. + */ + public function test_get_received_contact_requests_count() { + $this->resetAfterTest(); + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + $user3 = self::getDataGenerator()->create_user(); + $user4 = self::getDataGenerator()->create_user(); + + $this->setUser($user1); + + $contactrequestnumber = core_message_external::get_received_contact_requests_count($user1->id); + $contactrequestnumber = external_api::clean_returnvalue( + core_message_external::get_received_contact_requests_count_returns(), $contactrequestnumber); + $this->assertEquals(0, $contactrequestnumber); + + \core_message\api::create_contact_request($user2->id, $user1->id); + + $contactrequestnumber = core_message_external::get_received_contact_requests_count($user1->id); + $contactrequestnumber = external_api::clean_returnvalue( + core_message_external::get_received_contact_requests_count_returns(), $contactrequestnumber); + $this->assertEquals(1, $contactrequestnumber); + + \core_message\api::create_contact_request($user3->id, $user1->id); + + $contactrequestnumber = core_message_external::get_received_contact_requests_count($user1->id); + $contactrequestnumber = external_api::clean_returnvalue( + core_message_external::get_received_contact_requests_count_returns(), $contactrequestnumber); + $this->assertEquals(2, $contactrequestnumber); + + \core_message\api::create_contact_request($user1->id, $user4->id); + + // Web service should ignore sent requests. + $contactrequestnumber = core_message_external::get_received_contact_requests_count($user1->id); + $contactrequestnumber = external_api::clean_returnvalue( + core_message_external::get_received_contact_requests_count_returns(), $contactrequestnumber); + $this->assertEquals(2, $contactrequestnumber); + } + + /** + * Test getting the number of received contact requests with no permissions. + */ + public function test_get_received_contact_requests_count_no_permission() { + $this->resetAfterTest(); + + // Create some skeleton data just so we can call the WS. + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + $this->setUser($user2); + + // Ensure an exception is thrown. + $this->expectException('required_capability_exception'); + core_message_external::get_received_contact_requests_count($user1->id); + } + + /** + * Test getting the number of received contact requests with messaging disabled. + */ + public function test_get_received_contact_requests_count_messaging_disabled() { + global $CFG; + + $this->resetAfterTest(); + + // Create some skeleton data just so we can call the WS. + $user1 = self::getDataGenerator()->create_user(); + + $this->setUser($user1); + + // Disable messaging. + $CFG->messaging = 0; + + // Ensure an exception is thrown. + $this->expectException('moodle_exception'); + core_message_external::get_received_contact_requests_count($user1->id); + } + /** * Test creating a contact request. */ diff --git a/version.php b/version.php index 4c5fe15a3fd..2ae71e2a405 100644 --- a/version.php +++ b/version.php @@ -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.