diff --git a/lib/db/services.php b/lib/db/services.php index 541fecbca0d..f4bd168b7f1 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/classes/api.php b/message/classes/api.php index 28d7706ae4c..97eca1d1d03 100644 --- a/message/classes/api.php +++ b/message/classes/api.php @@ -2504,14 +2504,14 @@ class api { } /** - * Count how many contact requests the user has received. + * Returns the number of contact requests the user has received. * - * @param \stdClass $user The user to fetch contact requests for + * @param int $userid The ID of the user we want to return the number of received contact requests for * @return int The count */ - public static function count_received_contact_requests(\stdClass $user) : int { + public static function get_received_contact_requests_count(int $userid) : int { global $DB; - return $DB->count_records('message_contact_requests', ['requesteduserid' => $user->id]); + return $DB->count_records('message_contact_requests', ['requesteduserid' => $userid]); } /** diff --git a/message/externallib.php b/message/externallib.php index c5a3fca2c8f..76fffba7968 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/lib.php b/message/lib.php index e477900f657..c734c5ccfb6 100644 --- a/message/lib.php +++ b/message/lib.php @@ -805,7 +805,7 @@ function core_message_render_navbar_output(\renderer_base $renderer) { // Add the messages popover. if (!empty($CFG->messaging)) { $unreadcount = \core_message\api::count_unread_conversations($USER); - $requestcount = \core_message\api::count_received_contact_requests($USER); + $requestcount = \core_message\api::get_received_contact_requests_count($USER->id); $context = [ 'userid' => $USER->id, 'unreadcount' => $unreadcount + $requestcount @@ -840,7 +840,7 @@ function core_message_standard_after_main_region_html() { $individualconversationcount = $conversationcounts['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL]; $groupconversationcount = $conversationcounts['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP]; $favouriteconversationcount = $conversationcounts['favourites']; - $requestcount = \core_message\api::count_received_contact_requests($USER); + $requestcount = \core_message\api::get_received_contact_requests_count($USER->id); $contactscount = \core_message\api::count_contacts($USER->id); $choices = []; diff --git a/message/tests/api_test.php b/message/tests/api_test.php index bdee4edf40b..6f8d2669998 100644 --- a/message/tests/api_test.php +++ b/message/tests/api_test.php @@ -4895,27 +4895,27 @@ class core_message_api_testcase extends core_message_messagelib_testcase { } /** - * Test the count_received_contact_requests() function. + * Test the get_received_contact_requests_count() function. */ - public function test_count_received_contact_requests() { + public function test_get_received_contact_requests_count() { $user1 = self::getDataGenerator()->create_user(); $user2 = self::getDataGenerator()->create_user(); $user3 = self::getDataGenerator()->create_user(); $user4 = self::getDataGenerator()->create_user(); - $this->assertEquals(0, \core_message\api::count_received_contact_requests($user1)); + $this->assertEquals(0, \core_message\api::get_received_contact_requests_count($user1->id)); \core_message\api::create_contact_request($user2->id, $user1->id); - $this->assertEquals(1, \core_message\api::count_received_contact_requests($user1)); + $this->assertEquals(1, \core_message\api::get_received_contact_requests_count($user1->id)); \core_message\api::create_contact_request($user3->id, $user1->id); - $this->assertEquals(2, \core_message\api::count_received_contact_requests($user1)); + $this->assertEquals(2, \core_message\api::get_received_contact_requests_count($user1->id)); \core_message\api::create_contact_request($user1->id, $user4->id); // Function should ignore sent requests. - $this->assertEquals(2, \core_message\api::count_received_contact_requests($user1)); + $this->assertEquals(2, \core_message\api::get_received_contact_requests_count($user1->id)); } /** diff --git a/message/tests/externallib_test.php b/message/tests/externallib_test.php index 8019307630d..2d7dea85ac5 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. */