diff --git a/message/classes/api.php b/message/classes/api.php index 7885baa702f..0a549c80051 100644 --- a/message/classes/api.php +++ b/message/classes/api.php @@ -2046,24 +2046,26 @@ class api { * It will not include blocked users. * * @param int $userid + * @param int $limitfrom + * @param int $limitnum * @return array The list of contact requests */ - public static function get_contact_requests(int $userid) : array { + public static function get_contact_requests(int $userid, int $limitfrom = 0, int $limitnum = 0) : array { global $DB; - $ufields = \user_picture::fields('u'); - $sql = "SELECT $ufields, mcr.id as contactrequestid - FROM {user} u - JOIN {message_contact_requests} mcr - ON u.id = mcr.userid + $sql = "SELECT mcr.userid + FROM {message_contact_requests} mcr LEFT JOIN {message_users_blocked} mub - ON (mub.userid = ? AND mub.blockeduserid = u.id) + ON (mub.userid = ? AND mub.blockeduserid = mcr.userid) WHERE mcr.requesteduserid = ? - AND u.deleted = 0 AND mub.id is NULL - ORDER BY mcr.timecreated DESC"; + ORDER BY mcr.timecreated ASC"; + if ($contactrequests = $DB->get_records_sql($sql, [$userid, $userid], $limitfrom, $limitnum)) { + $userids = array_keys($contactrequests); + return helper::get_member_info($userid, $userids); + } - return $DB->get_records_sql($sql, [$userid, $userid]); + return []; } /** diff --git a/message/externallib.php b/message/externallib.php index 8a126bb26ca..a4d1f2bdee4 100644 --- a/message/externallib.php +++ b/message/externallib.php @@ -599,7 +599,9 @@ class core_message_external extends external_api { public static function get_contact_requests_parameters() { return new external_function_parameters( [ - 'userid' => new external_value(PARAM_INT, 'The id of the user we want the requests for') + 'userid' => new external_value(PARAM_INT, 'The id of the user we want the requests for'), + 'limitfrom' => new external_value(PARAM_INT, 'Limit from', VALUE_DEFAULT, 0), + 'limitnum' => new external_value(PARAM_INT, 'Limit number', VALUE_DEFAULT, 0) ] ); } @@ -613,8 +615,10 @@ class core_message_external extends external_api { * It will not include blocked users. * * @param int $userid The id of the user we want to get the contact requests for + * @param int $limitfrom + * @param int $limitnum */ - public static function get_contact_requests(int $userid) { + public static function get_contact_requests(int $userid, int $limitfrom = 0, int $limitnum = 0) { global $CFG, $USER; // Check if messaging is enabled. @@ -631,10 +635,14 @@ class core_message_external extends external_api { throw new required_capability_exception($context, $capability, 'nopermissions', ''); } - $params = ['userid' => $userid]; + $params = [ + 'userid' => $userid, + 'limitfrom' => $limitfrom, + 'limitnum' => $limitnum + ]; $params = self::validate_parameters(self::get_contact_requests_parameters(), $params); - return \core_message\api::get_contact_requests($params['userid']); + return \core_message\api::get_contact_requests($params['userid'], $params['limitfrom'], $params['limitnum']); } /** @@ -644,26 +652,7 @@ class core_message_external extends external_api { */ public static function get_contact_requests_returns() { return new external_multiple_structure( - new external_single_structure( - [ - 'id' => new external_value(core_user::get_property_type('id'), 'ID of the user'), - 'contactrequestid' => new external_value(PARAM_INT, 'The ID of the contact request'), - 'picture' => new external_value(core_user::get_property_type('picture'), 'The picture'), - 'firstname' => new external_value(core_user::get_property_type('firstname'), - 'The first name(s) of the user'), - 'lastname' => new external_value(core_user::get_property_type('lastname'), - 'The family name of the user'), - 'firstnamephonetic' => new external_value(core_user::get_property_type('firstnamephonetic'), - 'The phonetic first name of the user'), - 'lastnamephonetic' => new external_value(core_user::get_property_type('lastnamephonetic'), - 'The phonetic last name of the user'), - 'middlename' => new external_value(core_user::get_property_type('middlename'), - 'The middle name of the user'), - 'alternatename' => new external_value(core_user::get_property_type('alternatename'), - 'The alternate name of the user'), - 'email' => new external_value(core_user::get_property_type('email'), 'An email address') - ] - ) + self::get_conversation_member_structure() ); } diff --git a/message/tests/api_test.php b/message/tests/api_test.php index 29be0fa2f57..5e12f1e5d19 100644 --- a/message/tests/api_test.php +++ b/message/tests/api_test.php @@ -4062,14 +4062,44 @@ class core_message_api_testcase extends core_message_messagelib_testcase { $request = reset($requests); $this->assertEquals($user2->id, $request->id); - $this->assertEquals($user2->picture, $request->picture); - $this->assertEquals($user2->firstname, $request->firstname); - $this->assertEquals($user2->lastname, $request->lastname); - $this->assertEquals($user2->firstnamephonetic, $request->firstnamephonetic); - $this->assertEquals($user2->lastnamephonetic, $request->lastnamephonetic); - $this->assertEquals($user2->middlename, $request->middlename); - $this->assertEquals($user2->alternatename, $request->alternatename); - $this->assertEquals($user2->email, $request->email); + $this->assertEquals(fullname($user2), $request->fullname); + $this->assertObjectHasAttribute('profileimageurl', $request); + $this->assertObjectHasAttribute('profileimageurlsmall', $request); + $this->assertObjectHasAttribute('isonline', $request); + $this->assertObjectHasAttribute('showonlinestatus', $request); + $this->assertObjectHasAttribute('isblocked', $request); + $this->assertObjectHasAttribute('iscontact', $request); + } + + /** + * Test getting contact requests when there are none. + */ + public function test_get_contact_requests_no_requests() { + $this->resetAfterTest(); + + $user1 = self::getDataGenerator()->create_user(); + + $requests = \core_message\api::get_contact_requests($user1->id); + + $this->assertEmpty($requests); + } + + /** + * Test getting contact requests with limits. + */ + public function test_get_contact_requests_with_limits() { + $this->resetAfterTest(); + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + $user3 = self::getDataGenerator()->create_user(); + + \core_message\api::create_contact_request($user2->id, $user1->id); + \core_message\api::create_contact_request($user3->id, $user1->id); + + $requests = \core_message\api::get_contact_requests($user1->id, 0, 1); + + $this->assertCount(1, $requests); } /** diff --git a/message/tests/externallib_test.php b/message/tests/externallib_test.php index 8c9678ce0ae..7e3bb70eb18 100644 --- a/message/tests/externallib_test.php +++ b/message/tests/externallib_test.php @@ -574,14 +574,50 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { $request = reset($requests); $this->assertEquals($user2->id, $request['id']); - $this->assertEquals($user2->picture, $request['picture']); - $this->assertEquals($user2->firstname, $request['firstname']); - $this->assertEquals($user2->lastname, $request['lastname']); - $this->assertEquals($user2->firstnamephonetic, $request['firstnamephonetic']); - $this->assertEquals($user2->lastnamephonetic, $request['lastnamephonetic']); - $this->assertEquals($user2->middlename, $request['middlename']); - $this->assertEquals($user2->alternatename, $request['alternatename']); - $this->assertEquals($user2->email, $request['email']); + $this->assertEquals(fullname($user2), $request['fullname']); + $this->assertArrayHasKey('profileimageurl', $request); + $this->assertArrayHasKey('profileimageurlsmall', $request); + $this->assertArrayHasKey('isonline', $request); + $this->assertArrayHasKey('showonlinestatus', $request); + $this->assertArrayHasKey('isblocked', $request); + $this->assertArrayHasKey('iscontact', $request); + } + + /** + * Test getting contact requests when there are none. + */ + public function test_get_contact_requests_no_requests() { + $this->resetAfterTest(); + + $user1 = self::getDataGenerator()->create_user(); + + $this->setUser($user1); + + $requests = core_message_external::get_contact_requests($user1->id); + $requests = external_api::clean_returnvalue(core_message_external::get_contact_requests_returns(), $requests); + + $this->assertEmpty($requests); + } + + /** + * Test getting contact requests with limits. + */ + public function test_get_contact_requests_with_limits() { + $this->resetAfterTest(); + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + $user3 = self::getDataGenerator()->create_user(); + + $this->setUser($user1); + + \core_message\api::create_contact_request($user2->id, $user1->id); + \core_message\api::create_contact_request($user3->id, $user1->id); + + $requests = core_message_external::get_contact_requests($user1->id, 0, 1); + $requests = external_api::clean_returnvalue(core_message_external::get_contact_requests_returns(), $requests); + + $this->assertCount(1, $requests); } /**