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:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user