MDL-63547 core_message: updated api::can_delete_message

This commit is contained in:
Mark Nelson 2018-10-14 19:48:13 +08:00
parent 14de10c463
commit 08cb8a34f9
3 changed files with 51 additions and 21 deletions

View file

@ -1197,30 +1197,20 @@ class api {
public static function can_delete_message($userid, $messageid) {
global $DB, $USER;
$sql = "SELECT m.id, m.useridfrom, mcm.userid as useridto
FROM {messages} m
INNER JOIN {message_conversations} mc
ON m.conversationid = mc.id
INNER JOIN {message_conversation_members} mcm
ON mcm.conversationid = mc.id
WHERE mcm.userid != m.useridfrom
AND m.id = ?";
$message = $DB->get_record_sql($sql, [$messageid], MUST_EXIST);
$systemcontext = \context_system::instance();
if ($message->useridfrom == $userid) {
$userdeleting = 'useridfrom';
} else if ($message->useridto == $userid) {
$userdeleting = 'useridto';
} else {
$conversationid = $DB->get_field('messages', 'conversationid', ['id' => $messageid], MUST_EXIST);
if (has_capability('moodle/site:deleteanymessage', $systemcontext)) {
return true;
}
if (!self::is_user_in_conversation($userid, $conversationid)) {
return false;
}
$systemcontext = \context_system::instance();
// Let's check if the user is allowed to delete this message.
if (has_capability('moodle/site:deleteanymessage', $systemcontext) ||
((has_capability('moodle/site:deleteownmessage', $systemcontext) &&
$USER->id == $message->$userdeleting))) {
if (has_capability('moodle/site:deleteownmessage', $systemcontext) &&
$USER->id == $userid) {
return true;
}
@ -1601,4 +1591,19 @@ class api {
OR (mcr.userid = ? AND mcr.requesteduserid = ?)";
return $DB->record_exists_sql($sql, [$userid, $requesteduserid, $requesteduserid, $userid]);
}
/**
* Checks if a user is already in a conversation.
*
* @param int $userid The id of the user we want to check if they are in a group
* @param int $conversationid The id of the conversation
* @return bool Returns true if a contact request exists, false otherwise
*/
public static function is_user_in_conversation(int $userid, int $conversationid) : bool {
global $DB;
return $DB->record_exists('message_conversation_members', ['conversationid' => $conversationid,
'userid' => $userid]);
}
}

View file

@ -2226,6 +2226,31 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertTrue(\core_message\api::does_contact_request_exist($user2->id, $user1->id));
}
/**
* Test the user in conversation check.
*/
public function test_is_user_in_conversation() {
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$conversationid = \core_message\api::create_conversation_between_users([$user1->id, $user2->id]);
$this->assertTrue(\core_message\api::is_user_in_conversation($user1->id, $conversationid));
}
/**
* Test the user in conversation check when they are not.
*/
public function test_is_user_in_conversation_when_not() {
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$user3 = self::getDataGenerator()->create_user();
$conversationid = \core_message\api::create_conversation_between_users([$user1->id, $user2->id]);
$this->assertFalse(\core_message\api::is_user_in_conversation($user3->id, $conversationid));
}
/**
* Comparison function for sorting contacts.
*

View file

@ -1648,7 +1648,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$result = core_message_external::delete_message(-1, $user1->id);
$this->fail('Exception expected due invalid messageid.');
} catch (dml_missing_record_exception $e) {
$this->assertEquals('invalidrecordunknown', $e->errorcode);
$this->assertEquals('invalidrecord', $e->errorcode);
}
// Invalid user.