Merge branch 'MDL-63408_master' of git://github.com/markn86/moodle
This commit is contained in:
@@ -1868,4 +1868,84 @@ class api {
|
||||
|
||||
return $cancontact;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add some new members to an existing conversation.
|
||||
*
|
||||
* @param array $userids User ids array to add as members.
|
||||
* @param int $convid The conversation id. Must exists.
|
||||
* @throws \dml_missing_record_exception If convid conversation doesn't exist
|
||||
* @throws \dml_exception If there is a database error
|
||||
* @throws \moodle_exception If trying to add a member(s) to a non-group conversation
|
||||
*/
|
||||
public static function add_members_to_conversation(array $userids, int $convid) {
|
||||
global $DB;
|
||||
|
||||
$conversation = $DB->get_record('message_conversations', ['id' => $convid], '*', MUST_EXIST);
|
||||
|
||||
// We can only add members to a group conversation.
|
||||
if ($conversation->type != self::MESSAGE_CONVERSATION_TYPE_GROUP) {
|
||||
throw new \moodle_exception('You can not add members to a non-group conversation.');
|
||||
}
|
||||
|
||||
// Be sure we are not trying to add a non existing user to the conversation. Work only with existing users.
|
||||
list($useridcondition, $params) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED);
|
||||
$existingusers = array_keys($DB->get_records_select_menu('user',
|
||||
"id $useridcondition", $params, 'id', 'id, id'));
|
||||
|
||||
// Be sure we are not adding a user is already member of the conversation. Take all the members.
|
||||
$memberuserids = array_values($DB->get_records_menu(
|
||||
'message_conversation_members', ['conversationid' => $convid], 'id', 'id, userid')
|
||||
);
|
||||
|
||||
// Work with existing new members.
|
||||
$members = array();
|
||||
$newuserids = array_diff($existingusers, $memberuserids);
|
||||
foreach ($newuserids as $userid) {
|
||||
$member = new \stdClass();
|
||||
$member->conversationid = $convid;
|
||||
$member->userid = $userid;
|
||||
$member->timecreated = time();
|
||||
$members[] = $member;
|
||||
}
|
||||
|
||||
$DB->insert_records('message_conversation_members', $members);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove some members from an existing conversation.
|
||||
*
|
||||
* @param array $userids The user ids to remove from conversation members.
|
||||
* @param int $convid The conversation id. Must exists.
|
||||
* @throws \dml_exception
|
||||
* @throws \moodle_exception If trying to remove a member(s) from a non-group conversation
|
||||
*/
|
||||
public static function remove_members_from_conversation(array $userids, int $convid) {
|
||||
global $DB;
|
||||
|
||||
$conversation = $DB->get_record('message_conversations', ['id' => $convid], '*', MUST_EXIST);
|
||||
|
||||
if ($conversation->type != self::MESSAGE_CONVERSATION_TYPE_GROUP) {
|
||||
throw new \moodle_exception('You can not remove members from a non-group conversation.');
|
||||
}
|
||||
|
||||
list($useridcondition, $params) = $DB->get_in_or_equal($userids, SQL_PARAMS_NAMED);
|
||||
$params['convid'] = $convid;
|
||||
|
||||
$DB->delete_records_select('message_conversation_members',
|
||||
"conversationid = :convid AND userid $useridcondition", $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Count conversation members.
|
||||
*
|
||||
* @param int $convid The conversation id.
|
||||
* @return int Number of conversation members.
|
||||
* @throws \dml_exception
|
||||
*/
|
||||
public static function count_conversation_members(int $convid) : int {
|
||||
global $DB;
|
||||
|
||||
return $DB->count_records('message_conversation_members', ['conversationid' => $convid]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2504,6 +2504,323 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
|
||||
\core_message\api::get_conversation_between_users([$user1->id, $user2->id]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test count_conversation_members for non existing conversation.
|
||||
*/
|
||||
public function test_count_conversation_members_no_existing_conversation() {
|
||||
$this->assertEquals(0,
|
||||
\core_message\api::count_conversation_members(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test count_conversation_members for existing conversation.
|
||||
*/
|
||||
public function test_count_conversation_members_existing_conversation() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->assertEquals(2,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add_members_to_conversation for an individual conversation.
|
||||
*/
|
||||
public function test_add_members_to_individual_conversation() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
$user3 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->expectException('moodle_exception');
|
||||
\core_message\api::add_members_to_conversation([$user3->id], $conversationid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add_members_to_conversation for existing conversation.
|
||||
*/
|
||||
public function test_add_members_to_existing_conversation() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
$user3 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->assertNull(\core_message\api::add_members_to_conversation([$user3->id], $conversationid));
|
||||
$this->assertEquals(3,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add_members_to_conversation for non existing conversation.
|
||||
*/
|
||||
public function test_add_members_to_no_existing_conversation() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
|
||||
// Throw dml_missing_record_exception for non existing conversation.
|
||||
$this->expectException('dml_missing_record_exception');
|
||||
\core_message\api::add_members_to_conversation([$user1->id], 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add_member_to_conversation for non existing user.
|
||||
*/
|
||||
public function test_add_members_to_no_existing_user() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
// Don't throw an error for non existing user, but don't add it as a member.
|
||||
$this->assertNull(\core_message\api::add_members_to_conversation([0], $conversationid));
|
||||
$this->assertEquals(2,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add_members_to_conversation for current conversation member.
|
||||
*/
|
||||
public function test_add_members_to_current_conversation_member() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
// Don't add as a member a user that is already conversation member.
|
||||
$this->assertNull(\core_message\api::add_members_to_conversation([$user1->id], $conversationid));
|
||||
$this->assertEquals(2,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add_members_to_conversation for multiple users.
|
||||
*/
|
||||
public function test_add_members_for_multiple_users() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
$user3 = self::getDataGenerator()->create_user();
|
||||
$user4 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->assertNull(\core_message\api::add_members_to_conversation([$user3->id, $user4->id], $conversationid));
|
||||
$this->assertEquals(4,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add_members_to_conversation for multiple users, included non existing and current conversation members
|
||||
*/
|
||||
public function test_add_members_for_multiple_not_valid_users() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
$user3 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
// Don't throw errors, but don't add as members users don't exist or are already conversation members.
|
||||
$this->assertNull(\core_message\api::add_members_to_conversation([$user3->id, $user1->id, 0], $conversationid));
|
||||
$this->assertEquals(3,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test remove_members_from_conversation for individual conversation.
|
||||
*/
|
||||
public function test_remove_members_from_individual_conversation() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->expectException('moodle_exception');
|
||||
\core_message\api::remove_members_from_conversation([$user1->id], $conversationid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test remove_members_from_conversation for existing conversation.
|
||||
*/
|
||||
public function test_remove_members_from_existing_conversation() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->assertNull(\core_message\api::remove_members_from_conversation([$user1->id], $conversationid));
|
||||
$this->assertEquals(1,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test remove_members_from_conversation for non existing conversation.
|
||||
*/
|
||||
public function test_remove_members_from_no_existing_conversation() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
|
||||
// Throw dml_missing_record_exception for non existing conversation.
|
||||
$this->expectException('dml_missing_record_exception');
|
||||
\core_message\api::remove_members_from_conversation([$user1->id], 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test remove_members_from_conversation for non existing user.
|
||||
*/
|
||||
public function test_remove_members_for_no_existing_user() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->assertNull(\core_message\api::remove_members_from_conversation([0], $conversationid));
|
||||
$this->assertEquals(2,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test remove_members_from_conversation for multiple users.
|
||||
*/
|
||||
public function test_remove_members_for_multiple_users() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
$user3 = self::getDataGenerator()->create_user();
|
||||
$user4 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->assertNull(\core_message\api::add_members_to_conversation([$user3->id, $user4->id], $conversationid));
|
||||
$this->assertNull(\core_message\api::remove_members_from_conversation([$user3->id, $user4->id], $conversationid));
|
||||
$this->assertEquals(2,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test remove_members_from_conversation for multiple non valid users.
|
||||
*/
|
||||
public function test_remove_members_for_multiple_no_valid_users() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
$user3 = self::getDataGenerator()->create_user();
|
||||
$user4 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->assertNull(\core_message\api::add_members_to_conversation([$user3->id], $conversationid));
|
||||
$this->assertNull(
|
||||
\core_message\api::remove_members_from_conversation([$user2->id, $user3->id, $user4->id, 0], $conversationid)
|
||||
);
|
||||
$this->assertEquals(1,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test count_conversation_members for empty conversation.
|
||||
*/
|
||||
public function test_count_conversation_members_empty_conversation() {
|
||||
$user1 = self::getDataGenerator()->create_user();
|
||||
$user2 = self::getDataGenerator()->create_user();
|
||||
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
[
|
||||
$user1->id,
|
||||
$user2->id
|
||||
]
|
||||
);
|
||||
$conversationid = $conversation->id;
|
||||
|
||||
$this->assertNull(\core_message\api::remove_members_from_conversation([$user1->id, $user2->id], $conversationid));
|
||||
|
||||
$this->assertEquals(0,
|
||||
\core_message\api::count_conversation_members($conversationid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test can create a contact request.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user