MDL-59834 Global Search: Indexing user messages

Make indexing of user messages tolerant to user deletion.
When creating the search document for user messages,
add a check to see if the user has been deleted in the
system. If they have been deleted abort creating the search
document.
This is to avoid rasining an error when trying to get the
user context for a deleted user.
This commit is contained in:
Matt Porritt
2017-09-04 09:18:34 +10:00
parent 77a6a09950
commit e396e62df5
3 changed files with 99 additions and 0 deletions
+8
View File
@@ -51,6 +51,14 @@ abstract class base_message extends \core_search\base {
* @return \core_search\document
*/
public function get_document($record, $options = array()) {
// Check if user still exists, before proceeding.
$user = \core_user::get_user($options['user1id'], 'deleted');
if ($user->deleted == 1) {
return false;
}
// Get user context.
try {
$usercontext = \context_user::instance($options['user1id']);
} catch (\moodle_exception $ex) {
+45
View File
@@ -226,4 +226,49 @@ class message_received_search_testcase extends advanced_testcase {
$this->assertEquals(\core_search\manager::ACCESS_DELETED, $searcharea->check_access($messageid));
}
/**
* Test received deleted user.
* Tests the case where a received message for a deleted user
* is attempted to be added to the index.
*
* @return void
*/
public function test_message_received_deleted_user() {
// Returns the instance as long as the area is supported.
$searcharea = \core_search\manager::get_search_area($this->messagereceivedareaid);
$this->assertInstanceOf('\core_message\search\message_received', $searcharea);
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->preventResetByRollback();
$sink = $this->redirectMessages();
$message = new \core\message\message();
$message->courseid = SITEID;
$message->userfrom = $user1;
$message->userto = $user2;
$message->subject = "Test Subject";
$message->smallmessage = "Test small messsage";
$message->fullmessage = "Test full messsage";
$message->fullmessageformat = 0;
$message->fullmessagehtml = null;
$message->notification = 0;
$message->component = "moodle";
$message->name = "instantmessage";
message_send($message);
$messages = $sink->get_messages();
$message = $messages[0];
// Delete user.
delete_user($user2);
$doc = $searcharea->get_document($message);
$this->assertFalse($doc);
}
}
+46
View File
@@ -226,4 +226,50 @@ class message_sent_search_testcase extends advanced_testcase {
$this->assertEquals(\core_search\manager::ACCESS_DELETED, $searcharea->check_access($messageid));
}
/**
* Test sent deleted user.
* Tests the case where a sent message for a deleted user
* is attempted to be added to the index.
*
* @return void
*/
public function test_message_sent_deleted_user() {
// Returns the instance as long as the area is supported.
$searcharea = \core_search\manager::get_search_area($this->messagesentareaid);
$this->assertInstanceOf('\core_message\search\message_sent', $searcharea);
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->preventResetByRollback();
$sink = $this->redirectMessages();
$message = new \core\message\message();
$message->courseid = SITEID;
$message->userfrom = $user1;
$message->userto = $user2;
$message->subject = "Test Subject";
$message->smallmessage = "Test small messsage";
$message->fullmessage = "Test full messsage";
$message->fullmessageformat = 0;
$message->fullmessagehtml = null;
$message->notification = 0;
$message->component = "moodle";
$message->name = "instantmessage";
message_send($message);
$messages = $sink->get_messages();
$message = $messages[0];
// Delete user.
delete_user($user1);
$doc = $searcharea->get_document($message);
$this->assertFalse($doc);
}
}