MDL-64773 core_message: updated privacy provider

This commit is contained in:
Mark Nelson 2019-02-06 19:24:17 +08:00
parent 086409f601
commit 1c36c11a18
3 changed files with 122 additions and 3 deletions

View File

@ -162,6 +162,11 @@ $string['privacy:metadata:message_contact_requests'] = 'The list of contact requ
$string['privacy:metadata:message_contact_requests:requesteduserid'] = 'The ID of the user who received the contact request';
$string['privacy:metadata:message_contact_requests:timecreated'] = 'The time when the contact request was created';
$string['privacy:metadata:message_contact_requests:userid'] = 'The ID of the user who sent the contact request';
$string['privacy:metadata:message_conversation_actions'] = 'The list of conversation user actions';
$string['privacy:metadata:message_conversation_actions:action'] = 'The action that was performed';
$string['privacy:metadata:message_conversation_actions:conversationid'] = 'The ID of the conversation this action belongs to';
$string['privacy:metadata:message_conversation_actions:timecreated'] = 'The time when the action was created';
$string['privacy:metadata:message_conversation_actions:userid'] = 'The ID of the user who performed this action';
$string['privacy:metadata:message_conversation_members'] = 'The list of users in a conversation';
$string['privacy:metadata:message_conversation_members:conversationid'] = 'The ID of the conversation';
$string['privacy:metadata:message_conversation_members:timecreated'] = 'The time when the member was created';

View File

@ -99,6 +99,16 @@ class provider implements
'privacy:metadata:message_conversation_members'
);
$items->add_database_table(
'message_conversation_actions',
[
'conversationid' => 'privacy:metadata:message_conversation_actions:conversationid',
'userid' => 'privacy:metadata:message_conversation_actions:userid',
'timecreated' => 'privacy:metadata:message_conversation_actions:timecreated',
],
'privacy:metadata:message_conversation_actions'
);
$items->add_database_table(
'message_contacts',
[
@ -205,6 +215,8 @@ class provider implements
// It is enough to add the user's context as soon as we come to the conclusion that the user has some data.
// Also, the order of checking is sorted by the probability of occurrence (just by guess).
// There is no need to check the message_user_actions table, as there needs to be a message in order to be a message action.
// There is no need to check the message_conversation_actions table, as there needs to be a conversation in order to
// be a conversation action.
// So, checking messages table would suffice.
$hasdata = false;
@ -258,6 +270,8 @@ class provider implements
// It is enough to add the user's context as soon as we come to the conclusion that the user has some data.
// Also, the order of checking is sorted by the probability of occurrence (just by guess).
// There is no need to check the message_user_actions table, as there needs to be a message in order to be a message action.
// There is no need to check the message_conversation_actions table, as there needs to be a conversation in order to
// be a conversation action.
// So, checking messages table would suffice.
$hasdata = false;
@ -568,6 +582,7 @@ class provider implements
// Delete members and conversations.
$DB->delete_records_list('message_conversation_members', 'conversationid', $conversationids);
$DB->delete_records_list('message_conversation_actions', 'conversationid', $conversationids);
$DB->delete_records_list('message_conversations', 'id', $conversationids);
}
}
@ -673,6 +688,9 @@ class provider implements
// Reuse the $params var because it contains the useridparams and the conversationids.
$DB->delete_records_select('message_conversation_members', $sql, $params);
// Delete any conversation actions.
$DB->delete_records_select('message_conversation_actions', $sql, $params);
// Delete the favourite conversations.
$userlist = new \core_privacy\local\request\approved_userlist($context, 'core_message', $userids);
\core_favourites\privacy\provider::delete_favourites_for_userlist(
@ -763,6 +781,9 @@ class provider implements
// Reuse the $params var because it contains the userid and the conversationids.
$DB->delete_records_select('message_conversation_members', $sql, $params);
// Delete any conversation actions.
$DB->delete_records_select('message_conversation_actions', $sql, $params);
// Delete the favourite conversations.
if (empty($contextids) && empty($component) && empty($itemtype) && empty($itemid)) {
// Favourites for individual conversations are stored into the user context.
@ -974,6 +995,20 @@ class provider implements
// If the conversation has been favorited by the user, include it in the export.
writer::with_context($context)->export_related_data($subcontext, 'starred', (object) $conversationfavourite);
}
// Check if the conversation was muted.
$params = [
'userid' => $userid,
'conversationid' => $conversation->id,
'action' => \core_message\api::CONVERSATION_ACTION_MUTED
];
if ($mca = $DB->get_record('message_conversation_actions', $params)) {
$mcatostore = [
'muted' => transform::yesno(true),
'timecreated' => transform::datetime($mca->timecreated),
];
writer::with_context($context)->export_related_data($subcontext, 'muted', (object) $mcatostore);
}
}
}

View File

@ -47,7 +47,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$collection = new collection('core_message');
$newcollection = provider::get_metadata($collection);
$itemcollection = $newcollection->get_collection();
$this->assertCount(9, $itemcollection);
$this->assertCount(10, $itemcollection);
$messagestable = array_shift($itemcollection);
$this->assertEquals('messages', $messagestable->get_name());
@ -58,6 +58,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$messageconversationmemberstable = array_shift($itemcollection);
$this->assertEquals('message_conversation_members', $messageconversationmemberstable->get_name());
$messageconversationactions = array_shift($itemcollection);
$this->assertEquals('message_conversation_actions', $messageconversationactions->get_name());
$messagecontacts = array_shift($itemcollection);
$this->assertEquals('message_contacts', $messagecontacts->get_name());
@ -1584,6 +1587,10 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
\core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
\core_message\api::set_favourite_conversation($iconversation1id, $user2->id);
// Mute some conversations.
\core_message\api::mute_conversation($user1->id, $conversation1->id);
\core_message\api::mute_conversation($user2->id, $iconversation1id);
// Send some messages to the conversation.
$m1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1);
$m2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 2', $now + 2);
@ -1646,6 +1653,15 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(transform::datetime($now + 5), $m3->timeread);
$this->assertArrayNotHasKey('timedeleted', (array) $m3);
// Confirm the muted group conversation is correct.
$mutedconversations = (array) $writer->get_related_data([
get_string('messages', 'core_message'),
get_string($conversation1->itemtype, $conversation1->component),
get_string('privacy:export:conversationprefix', 'core_message') . $conversation1->name
], 'muted');
$this->assertCount(2, $mutedconversations);
$this->assertEquals(get_string('yes'), $mutedconversations['muted']);
// Confirm the favourite group conversation is correct.
$favourite = (array) $writer->get_related_data([
get_string('messages', 'core_message'),
@ -1707,6 +1723,14 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals('-', $m3->timeread);
$this->assertArrayNotHasKey('timedeleted', (array) $m3);
// Confirm the muted group conversation is correct.
$mutedconversations = (array) $writer->get_related_data([
get_string('messages', 'core_message'),
get_string($conversation1->itemtype, $conversation1->component),
$conversation1->name
], 'muted');
$this->assertCount(0, $mutedconversations);
// Confirm there are no favourite group conversation for user2.
$favourite = (array) $writer->get_related_data([
get_string('messages', 'core_message'),
@ -1822,6 +1846,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// Mark as read one of the conversation messages.
\core_message\api::mark_message_as_read($user1->id, $dbgm3, $now + 5);
// Mark some conversations as muted by two users.
\core_message\api::mute_conversation($user1->id, $iconversation1id);
\core_message\api::mute_conversation($user1->id, $conversation1->id);
\core_message\api::mute_conversation($user2->id, $conversation1->id);
// There should be 2 contacts.
$this->assertEquals(2, $DB->count_records('message_contacts'));
@ -1837,6 +1866,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be 4 user actions - 3 for reading the message, 1 for deleting.
$this->assertEquals(4, $DB->count_records('message_user_actions'));
// There should be 3 muted conversations.
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
// There should be 4 conversations - 2 individual + 2 group.
$this->assertEquals(4, $DB->count_records('message_conversations'));
@ -1861,7 +1893,10 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be still 2 blocked users.
$this->assertEquals(2, $DB->count_records('message_users_blocked'));
// There should be 5 notifications.
// There should be 1 muted conversation.
$this->assertEquals(1, $DB->count_records('message_conversation_actions'));
// There should be 3 notifications.
$this->assertEquals(5, $DB->count_records('notifications'));
// There should be 5 messages - 3 individual - 2 group (course2).
@ -1992,6 +2027,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$dbgm3 = $DB->get_record('messages', ['id' => $gm3]);
// Mark some conversations as muted by two users.
\core_message\api::mute_conversation($user1->id, $iconversation1id);
\core_message\api::mute_conversation($user1->id, $conversation1->id);
\core_message\api::mute_conversation($user2->id, $conversation1->id);
// Mark as read one of the conversation messages.
\core_message\api::mark_message_as_read($user1->id, $dbgm3, $now + 5);
@ -2010,6 +2050,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be 4 user actions - 3 for reading the message, 1 for deleting.
$this->assertEquals(4, $DB->count_records('message_user_actions'));
// There should be 3 muted conversations.
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
// There should be 4 conversations - 2 individual + 2 group.
$this->assertEquals(4, $DB->count_records('message_conversations'));
@ -2031,6 +2074,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(2, $DB->count_records('message_users_blocked'));
$this->assertEquals(8, $DB->count_records('messages'));
$this->assertEquals(4, $DB->count_records('message_user_actions'));
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(9, $DB->count_records('message_conversation_members'));
$this->assertEquals(5, $DB->count_records('notifications'));
@ -2045,6 +2089,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(2, $DB->count_records('message_users_blocked'));
$this->assertEquals(8, $DB->count_records('messages'));
$this->assertEquals(4, $DB->count_records('message_user_actions'));
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(9, $DB->count_records('message_conversation_members'));
$this->assertEquals(5, $DB->count_records('notifications'));
@ -2154,6 +2199,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// Mark as read one of the conversation messages.
\core_message\api::mark_message_as_read($user1->id, $dbgm3, $now + 5);
// Mark some of the conversations as muted by two users.
\core_message\api::mute_conversation($user1->id, $iconversation1id);
\core_message\api::mute_conversation($user1->id, $conversation1->id);
\core_message\api::mute_conversation($user2->id, $conversation1->id);
// There should be 2 contacts.
$this->assertEquals(2, $DB->count_records('message_contacts'));
@ -2169,6 +2219,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be 4 user actions - 3 for reading the message, 1 for deleting.
$this->assertEquals(4, $DB->count_records('message_user_actions'));
// There should be 3 muted conversations.
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
// There should be 4 conversations - 2 individual + 2 group.
$this->assertEquals(4, $DB->count_records('message_conversations'));
@ -2190,6 +2243,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(2, $DB->count_records('message_users_blocked'));
$this->assertEquals(8, $DB->count_records('messages'));
$this->assertEquals(4, $DB->count_records('message_user_actions'));
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(9, $DB->count_records('message_conversation_members'));
$this->assertEquals(5, $DB->count_records('notifications'));
@ -2204,6 +2258,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(2, $DB->count_records('message_users_blocked'));
$this->assertEquals(8, $DB->count_records('messages'));
$this->assertEquals(4, $DB->count_records('message_user_actions'));
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(9, $DB->count_records('message_conversation_members'));
$this->assertEquals(5, $DB->count_records('notifications'));
@ -2301,6 +2356,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// Mark as read one of the conversation messages.
\core_message\api::mark_message_as_read($user1->id, $dbm3, $now + 5);
// Mark some of the conversations as muted by two users.
\core_message\api::mute_conversation($user1->id, $iconversation1id);
\core_message\api::mute_conversation($user1->id, $conversation1->id);
\core_message\api::mute_conversation($user2->id, $conversation1->id);
// There should be 2 contacts.
$this->assertEquals(2, $DB->count_records('message_contacts'));
@ -2319,6 +2379,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be 4 user actions - 3 for reading the message, one for deleting.
$this->assertEquals(4, $DB->count_records('message_user_actions'));
// There should be 3 users muting a conversation.
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
// There should be 3 conversations - 2 private + 1 group.
$this->assertEquals(3, $DB->count_records('message_conversations'));
@ -2347,7 +2410,10 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be still 2 blocked users.
$this->assertEquals(2, $DB->count_records('message_users_blocked'));
// There should be 5 notifications.
// There should be 2 muted conversation.
$this->assertEquals(2, $DB->count_records('message_conversation_actions'));
// There should be 3 notifications.
$this->assertEquals(5, $DB->count_records('notifications'));
// There should be 4 messages - 3 private + 1 group sent by user2.
@ -2484,6 +2550,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// Mark as read one of the conversation messages.
\core_message\api::mark_message_as_read($user1->id, $dbm3, $now + 5);
// Mark some of the conversations as muted by two users.
\core_message\api::mute_conversation($user1->id, $iconversation1id);
\core_message\api::mute_conversation($user1->id, $conversation1->id);
\core_message\api::mute_conversation($user2->id, $conversation1->id);
// There should be 2 contacts.
$this->assertEquals(2, $DB->count_records('message_contacts'));
@ -2502,6 +2573,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be 4 user actions - 3 for reading the message, one for deleting.
$this->assertEquals(4, $DB->count_records('message_user_actions'));
// There should be 3 muted conversation.
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
// There should be 3 conversations - 2 private + 2 group.
$this->assertEquals(4, $DB->count_records('message_conversations'));
@ -2529,6 +2603,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(5, $DB->count_records('notifications'));
$this->assertEquals(6, $DB->count_records('messages'));
$this->assertEquals(4, $DB->count_records('message_user_actions'));
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(8, $DB->count_records('message_conversation_members'));
$this->assertEquals(3, $DB->count_records('favourite'));
@ -2545,6 +2620,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(5, $DB->count_records('notifications'));
$this->assertEquals(6, $DB->count_records('messages'));
$this->assertEquals(4, $DB->count_records('message_user_actions'));
$this->assertEquals(3, $DB->count_records('message_conversation_actions'));
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(3, $DB->count_records('favourite'));
// There should be 7 conversation members - (2 + 2) private + 3 group.
@ -2583,6 +2659,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
}, $useractions);
$this->assertNotContains($gm3, $useractions);
// There should be 1 muted conversation.
$this->assertEquals(1, $DB->count_records('message_conversation_actions'));
// There should be still 4 conversations - 2 private + 2 group.
$this->assertEquals(4, $DB->count_records('message_conversations'));