Skip to content

Commit

Permalink
MDL-63725 core_message: added api::get_conversation_members
Browse files Browse the repository at this point in the history
  • Loading branch information
mdjnelson committed Nov 1, 2018
1 parent 8b019fb commit 6ecd6e5
Show file tree
Hide file tree
Showing 2 changed files with 214 additions and 2 deletions.
45 changes: 43 additions & 2 deletions message/classes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -1727,9 +1727,7 @@ public static function decline_contact_request(int $userid, int $requesteduserid
public static function get_contact_requests(int $userid) : array {
global $DB;

// Used to search for contacts.
$ufields = \user_picture::fields('u');

$sql = "SELECT $ufields, mcr.id as contactrequestid
FROM {user} u
JOIN {message_contact_requests} mcr
Expand Down Expand Up @@ -2167,4 +2165,47 @@ public static function update_conversation_name(int $conversationid, string $nam
}
}
}

/**
* Returns a list of conversation members.
*
* @param int $userid The user we are returning the conversation members for, used by helper::get_member_info.
* @param int $conversationid The id of the conversation
* @param bool $includecontactrequests Do we want to include contact requests with this data?
* @param int $limitfrom
* @param int $limitnum
* @return array
*/
public static function get_conversation_members(int $userid, int $conversationid, bool $includecontactrequests = false,
int $limitfrom = 0, int $limitnum = 0) : array {
global $DB;

if ($members = $DB->get_records('message_conversation_members', ['conversationid' => $conversationid],
'timecreated ASC, id ASC', 'userid', $limitfrom, $limitnum)) {
$userids = array_keys($members);
$members = helper::get_member_info($userid, $userids);

// Check if we want to include contact requests as well.
if ($includecontactrequests) {
list($useridsql, $usersparams) = $DB->get_in_or_equal($userids);

$wheresql = "(userid $useridsql OR requesteduserid $useridsql)";
if ($contactrequests = $DB->get_records_select('message_contact_requests', $wheresql,
array_merge($usersparams, $usersparams), 'timecreated ASC, id ASC')) {
foreach ($contactrequests as $contactrequest) {
if (isset($members[$contactrequest->userid])) {
$members[$contactrequest->userid]->contactrequests[] = $contactrequest;
}
if (isset($members[$contactrequest->requesteduserid])) {
$members[$contactrequest->requesteduserid]->contactrequests[] = $contactrequest;
}
}
}
}

return $members;
}

return [];
}
}
171 changes: 171 additions & 0 deletions message/tests/api_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -3888,6 +3888,177 @@ public function test_update_conversation_name() {
);
}

/**
* Test returning members in a conversation with no contact requests.
*/
public function test_get_conversation_members() {
$lastaccess = new stdClass();
$lastaccess->lastaccess = time();

$user1 = self::getDataGenerator()->create_user($lastaccess);
$user2 = self::getDataGenerator()->create_user();
$user3 = self::getDataGenerator()->create_user();

// This user will not be in the conversation, but a contact request will exist for them.
$user4 = self::getDataGenerator()->create_user();

// Add some contact requests.
\core_message\api::create_contact_request($user1->id, $user3->id);
\core_message\api::create_contact_request($user1->id, $user4->id);
\core_message\api::create_contact_request($user2->id, $user3->id);

// User 1 and 2 are already contacts.
\core_message\api::add_contact($user1->id, $user2->id);

// User 1 has blocked user 3.
\core_message\api::block_user($user1->id, $user3->id);
$conversation = \core_message\api::create_conversation(
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
[
$user1->id,
$user2->id,
$user3->id
]
);
$conversationid = $conversation->id;
$members = \core_message\api::get_conversation_members($user1->id, $conversationid, false);

// Sort them by id.
ksort($members);
$this->assertCount(3, $members);
$member1 = array_shift($members);
$member2 = array_shift($members);
$member3 = array_shift($members);

// Confirm the standard fields are OK.
$this->assertEquals($user1->id, $member1->id);
$this->assertEquals(fullname($user1), $member1->fullname);
$this->assertEquals(true, $member1->isonline);
$this->assertEquals(true, $member1->showonlinestatus);
$this->assertEquals(false, $member1->iscontact);
$this->assertEquals(false, $member1->isblocked);
$this->assertObjectNotHasAttribute('contactrequests', $member1);

$this->assertEquals($user2->id, $member2->id);
$this->assertEquals(fullname($user2), $member2->fullname);
$this->assertEquals(false, $member2->isonline);
$this->assertEquals(true, $member2->showonlinestatus);
$this->assertEquals(true, $member2->iscontact);
$this->assertEquals(false, $member2->isblocked);
$this->assertObjectNotHasAttribute('contactrequests', $member2);

$this->assertEquals($user3->id, $member3->id);
$this->assertEquals(fullname($user3), $member3->fullname);
$this->assertEquals(false, $member3->isonline);
$this->assertEquals(true, $member3->showonlinestatus);
$this->assertEquals(false, $member3->iscontact);
$this->assertEquals(true, $member3->isblocked);
$this->assertObjectNotHasAttribute('contactrequests', $member3);
}

/**
* Test returning members in a conversation with contact requests.
*/
public function test_get_conversation_members_with_contact_requests() {
$lastaccess = new stdClass();
$lastaccess->lastaccess = time();

$user1 = self::getDataGenerator()->create_user($lastaccess);
$user2 = self::getDataGenerator()->create_user();
$user3 = self::getDataGenerator()->create_user();

// This user will not be in the conversation, but a contact request will exist for them.
$user4 = self::getDataGenerator()->create_user();
// Add some contact requests.
\core_message\api::create_contact_request($user1->id, $user2->id);
\core_message\api::create_contact_request($user1->id, $user3->id);
\core_message\api::create_contact_request($user1->id, $user4->id);
\core_message\api::create_contact_request($user2->id, $user3->id);

// User 1 and 2 are already contacts.
\core_message\api::add_contact($user1->id, $user2->id);
// User 1 has blocked user 3.
\core_message\api::block_user($user1->id, $user3->id);

$conversation = \core_message\api::create_conversation(
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
[
$user1->id,
$user2->id,
$user3->id
]
);
$conversationid = $conversation->id;

$members = \core_message\api::get_conversation_members($user1->id, $conversationid, true);

// Sort them by id.
ksort($members);

$this->assertCount(3, $members);

$member1 = array_shift($members);
$member2 = array_shift($members);
$member3 = array_shift($members);

// Confirm the standard fields are OK.
$this->assertEquals($user1->id, $member1->id);
$this->assertEquals(fullname($user1), $member1->fullname);
$this->assertEquals(true, $member1->isonline);
$this->assertEquals(true, $member1->showonlinestatus);
$this->assertEquals(false, $member1->iscontact);
$this->assertEquals(false, $member1->isblocked);
$this->assertCount(3, $member1->contactrequests);

$this->assertEquals($user2->id, $member2->id);
$this->assertEquals(fullname($user2), $member2->fullname);
$this->assertEquals(false, $member2->isonline);
$this->assertEquals(true, $member2->showonlinestatus);
$this->assertEquals(true, $member2->iscontact);
$this->assertEquals(false, $member2->isblocked);
$this->assertCount(2, $member2->contactrequests);

$this->assertEquals($user3->id, $member3->id);
$this->assertEquals(fullname($user3), $member3->fullname);
$this->assertEquals(false, $member3->isonline);
$this->assertEquals(true, $member3->showonlinestatus);
$this->assertEquals(false, $member3->iscontact);
$this->assertEquals(true, $member3->isblocked);
$this->assertCount(2, $member3->contactrequests);

// Confirm the contact requests are OK.
$request1 = array_shift($member1->contactrequests);
$request2 = array_shift($member1->contactrequests);
$request3 = array_shift($member1->contactrequests);

$this->assertEquals($user1->id, $request1->userid);
$this->assertEquals($user2->id, $request1->requesteduserid);

$this->assertEquals($user1->id, $request2->userid);
$this->assertEquals($user3->id, $request2->requesteduserid);

$this->assertEquals($user1->id, $request3->userid);
$this->assertEquals($user4->id, $request3->requesteduserid);

$request1 = array_shift($member2->contactrequests);
$request2 = array_shift($member2->contactrequests);

$this->assertEquals($user1->id, $request1->userid);
$this->assertEquals($user2->id, $request1->requesteduserid);

$this->assertEquals($user2->id, $request2->userid);
$this->assertEquals($user3->id, $request2->requesteduserid);

$request1 = array_shift($member3->contactrequests);
$request2 = array_shift($member3->contactrequests);

$this->assertEquals($user1->id, $request1->userid);
$this->assertEquals($user3->id, $request1->requesteduserid);

$this->assertEquals($user2->id, $request2->userid);
$this->assertEquals($user3->id, $request2->requesteduserid);
}

/**
* Comparison function for sorting contacts.
*
Expand Down

0 comments on commit 6ecd6e5

Please sign in to comment.