MDL-63692 core_message: Add favourite conversations to Privacy API

This commit is contained in:
Sara Arjona
2018-11-19 22:09:13 +01:00
parent 6b036d04cf
commit 16913e60b3
4 changed files with 215 additions and 11 deletions
+26 -5
View File
@@ -172,9 +172,11 @@ class provider implements
* @param \context $context The context to which deletion is scoped.
* @param string $component The favourite's component name.
* @param string $itemtype The favourite's itemtype.
* @param int $itemid Optional itemid associated with component.
* @throws \dml_exception if any errors are encountered during deletion.
*/
public static function delete_favourites_for_all_users(\context $context, string $component, string $itemtype) {
public static function delete_favourites_for_all_users(\context $context, string $component, string $itemtype,
int $itemid = 0) {
global $DB;
$params = [
@@ -184,6 +186,11 @@ class provider implements
];
$select = "component = :component AND itemtype =:itemtype AND contextid = :contextid";
if (!empty($itemid)) {
$select .= " AND itemid = :itemid";
$params['itemid'] = $itemid;
}
$DB->delete_records_select('favourite', $select, $params);
}
@@ -193,10 +200,11 @@ class provider implements
* @param \core_privacy\local\request\approved_userlist $userlist The approved contexts and user information
* to delete information for.
* @param string $itemtype The favourite's itemtype.
* @param int $itemid Optional itemid associated with component.
* @throws \dml_exception if any errors are encountered during deletion.
*/
public static function delete_favourites_for_userlist(\core_privacy\local\request\approved_userlist $userlist,
string $itemtype) {
string $itemtype, int $itemid = 0) {
global $DB;
$userids = $userlist->get_userids();
@@ -217,6 +225,11 @@ class provider implements
$params += $userparams;
$select = "component = :component AND itemtype = :itemtype AND contextid = :contextid AND userid $usersql";
if (!empty($itemid)) {
$select .= " AND itemid = :itemid";
$params['itemid'] = $itemid;
}
$DB->delete_records_select('favourite', $select, $params);
}
@@ -224,12 +237,14 @@ class provider implements
* Delete all favourites for the specified user, in the specified contexts.
*
* @param approved_contextlist $contextlist The approved contexts and user information to delete information for.
* @param string $component
* @param string $itemtype
* @param string $component The favourite's component name.
* @param string $itemtype The favourite's itemtype.
* @param int $itemid Optional itemid associated with component.
* @throws \coding_exception
* @throws \dml_exception
*/
public static function delete_favourites_for_user(approved_contextlist $contextlist, string $component, string $itemtype) {
public static function delete_favourites_for_user(approved_contextlist $contextlist, string $component, string $itemtype,
int $itemid = 0) {
global $DB;
$userid = $contextlist->get_user()->id;
@@ -244,6 +259,12 @@ class provider implements
$params += $inparams;
$select = "userid = :userid AND component = :component AND itemtype =:itemtype AND contextid $insql";
if (!empty($itemid)) {
$select .= " AND itemid = :itemid";
$params['itemid'] = $itemid;
}
$DB->delete_records_select('favourite', $select, $params);
}
}
+1
View File
@@ -107,6 +107,7 @@ $string['outputenabled'] = 'Output enabled';
$string['outputnotavailable'] = 'Not available';
$string['outputnotconfigured'] = 'Not configured';
$string['permitted'] = 'Permitted';
$string['privacy:metadata:core_favourites'] = 'The conversations starred by the user';
$string['privacy:metadata:messages'] = 'Messages';
$string['privacy:metadata:messages:conversationid'] = 'The ID of the conversation';
$string['privacy:metadata:messages:fullmessage'] = 'The full message';
+78
View File
@@ -157,6 +157,9 @@ class provider implements
$items->add_user_preference('core_message_messageprovider_settings',
'privacy:metadata:preference:core_message_settings');
// Add favourite conversations.
$items->link_subsystem('core_favourites', 'privacy:metadata:core_favourites');
return $items;
}
@@ -224,6 +227,9 @@ class provider implements
$contextlist->add_user_context($userid);
}
// Add favourite conversations.
\core_favourites\privacy\provider::add_contexts_for_userid($contextlist, $userid, 'core_message', 'message_conversations');
return $contextlist;
}
@@ -273,6 +279,16 @@ class provider implements
if ($hasdata) {
$userlist->add_user($userid);
}
// Add favourite conversations.
$component = $userlist->get_component();
if ($component != 'core_message') {
$userlist->set_component('core_message');
}
\core_favourites\privacy\provider::add_userids_for_context($userlist, 'message_conversations');
if ($component != 'core_message') {
$userlist->set_component($component);
}
}
/**
@@ -407,6 +423,10 @@ class provider implements
}
$contextlist->add_from_sql($sql, $params);
// Add favourite conversations. We don't need to filter by itemid because for now they are in the system context.
\core_favourites\privacy\provider::add_contexts_for_userid($contextlist, $userid, 'core_message', 'message_conversations');
}
/**
@@ -435,6 +455,16 @@ class provider implements
}
$userlist->add_from_sql('userid', $sql, $params);
// Add favourite conversations.
$component = $userlist->get_component();
if ($component != 'core_message') {
$userlist->set_component('core_message');
}
\core_favourites\privacy\provider::add_userids_for_context($userlist, 'message_conversations');
if ($component != 'core_message') {
$userlist->set_component($component);
}
}
/**
@@ -519,6 +549,15 @@ class provider implements
$messageids = $DB->get_records_list('messages', 'conversationid', $conversationids);
$messageids = array_keys($messageids);
// Delete these favourite conversations to all the users.
foreach ($conversationids as $conversationid) {
\core_favourites\privacy\provider::delete_favourites_for_all_users(
$context,
'core_message',
'message_conversations',
$conversationid);
}
// Delete messages and user_actions.
$DB->delete_records_list('message_user_actions', 'messageid', $messageids);
$DB->delete_records_list('messages', 'id', $messageids);
@@ -629,6 +668,13 @@ class provider implements
$sql = "conversationid $conversationidsql AND userid $useridsql";
// Reuse the $params var because it contains the useridparams and the conversationids.
$DB->delete_records_select('message_conversation_members', $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(
$userlist,
'message_conversations'
);
}
}
@@ -712,6 +758,24 @@ class provider implements
$sql = "conversationid $conversationidsql AND userid = :userid";
// Reuse the $params var because it contains the userid and the conversationids.
$DB->delete_records_select('message_conversation_members', $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.
$favouritectxids = [\context_user::instance($userid)->id];
} else {
$favouritectxids = $contextids;
}
$contextlist = new \core_privacy\local\request\approved_contextlist(
\core_user::get_user($userid),
'core_message',
$favouritectxids
);
\core_favourites\privacy\provider::delete_favourites_for_user(
$contextlist,
'core_message',
'message_conversations'
);
}
}
@@ -874,6 +938,9 @@ class provider implements
$subcontext,
[get_string('messages', 'core_message'), $otherusertext]
);
// Get the context for the favourite conversation.
$conversationctx = \context_user::instance($userid);
} else {
// Conversations with context are stored in 'Messages | <Conversation item type> | <Conversation name>'.
if (get_string_manager()->string_exists($conversation->itemtype, $conversation->component)) {
@@ -888,10 +955,21 @@ class provider implements
$subcontext,
[get_string('messages', 'core_message'), $itemtypestring, $conversationname]
);
// Get the context for the favourite conversation.
$conversationctx = \context::instance_by_id($conversation->contextid);
}
// Export the conversation messages.
writer::with_context($context)->export_data($subcontext, (object) $messagedata);
// Get user's favourites information for the particular conversation.
$conversationfavourite = \core_favourites\privacy\provider::get_favourites_info_for_user($userid, $conversationctx,
'core_message', 'message_conversations', $conversation->id);
if ($conversationfavourite) {
// 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);
}
}
}
+110 -6
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(8, $itemcollection);
$this->assertCount(9, $itemcollection);
$messagestable = array_shift($itemcollection);
$this->assertEquals('messages', $messagestable->get_name());
@@ -73,6 +73,10 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$usersettings = array_shift($itemcollection);
$this->assertEquals('core_message_messageprovider_settings', $usersettings->get_name());
$favouriteconversations = array_shift($itemcollection);
$this->assertEquals('core_favourites', $favouriteconversations->get_name());
$this->assertEquals('privacy:metadata:core_favourites', $favouriteconversations->get_summary());
$privacyfields = $messagestable->get_privacy_fields();
$this->assertArrayHasKey('useridfrom', $privacyfields);
$this->assertArrayHasKey('conversationid', $privacyfields);
@@ -1570,7 +1574,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
$this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
// Send some private messages between user 1 and user 2.
$pm1id = $this->create_message($user1->id, $user2->id, $now);
// Get conversation.
$iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
$component = 'core_group';
$itemtype = 'groups';
$conversation1 = \core_message\api::get_conversation_by_area(
@@ -1580,6 +1588,10 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$coursecontext1->id
);
// Make favourite some conversations.
\core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
\core_message\api::set_favourite_conversation($iconversation1id, $user2->id);
// 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);
@@ -1589,9 +1601,6 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$dbm2 = $DB->get_record('messages', ['id' => $m2]);
$dbm3 = $DB->get_record('messages', ['id' => $m3]);
// Send some private messages between user 1 and user 2.
$pm1id = $this->create_message($user1->id, $user2->id, $now);
// Mark as read and delete some messages.
\core_message\api::mark_message_as_read($user1->id, $dbm3, $now + 5);
\core_message\api::delete_message($user1->id, $m2);
@@ -1645,6 +1654,18 @@ 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 favourite group conversation is correct.
$favourite = (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
], 'starred');
$this->assertCount(4, $favourite);
$this->assertEquals(get_string('yes'), $favourite['starred']);
// Reset writer before exporting conversations for user2.
writer::reset();
// Export all the conversations related to the groups in course1 for user2.
provider::export_conversations($user2->id, 'core_group', 'groups', $coursecontext1);
@@ -1693,6 +1714,14 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(transform::datetime($now + 3), $m3->timecreated);
$this->assertEquals('-', $m3->timeread);
$this->assertArrayNotHasKey('timedeleted', (array) $m3);
// Confirm there are no favourite group conversation for user2.
$favourite = (array) $writer->get_related_data([
get_string('messages', 'core_message'),
get_string($conversation1->itemtype, $conversation1->component),
$conversation1->name
], 'starred');
$this->assertCount(0, $favourite);
}
/**
@@ -1765,7 +1794,8 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
$this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user2->id));
// Get conversation.
// Get conversations.
$iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
$conversation1 = \core_message\api::get_conversation_by_area(
$component,
$itemtype,
@@ -1779,6 +1809,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$coursecontext2->id
);
// Make favourite some conversations.
\core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user2->id);
// Send some messages to the conversation.
$gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.1', $now + 1);
$gm2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.2', $now + 2);
@@ -1819,6 +1854,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be 5 notifications - 3 notifications + 2 for the contact request.
$this->assertEquals(5, $DB->count_records('notifications'));
// There should be 3 favourite conversations.
$this->assertEquals(3, $DB->count_records('favourite'));
// Delete conversations for all users in course1.
provider::delete_conversations_for_all_users($coursecontext1, $component, $itemtype);
@@ -1858,6 +1896,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be 6 conversation members - (2 + 2) individual + 2 group.
$this->assertEquals(6, $DB->count_records('message_conversation_members'));
// There should be 1 favourite conversation - the individual one.
$this->assertEquals(1, $DB->count_records('favourite'));
}
/**
@@ -1930,7 +1971,8 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
$this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user2->id));
// Get conversation.
// Get conversations.
$iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
$conversation1 = \core_message\api::get_conversation_by_area(
$component,
$itemtype,
@@ -1944,6 +1986,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$coursecontext2->id
);
// Make favourite some conversations.
\core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user2->id);
// Send some messages to the conversation.
$gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.1', $now + 1);
$gm2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.2', $now + 2);
@@ -1980,6 +2027,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be 5 notifications - 3 notifications + 2 for the contact request.
$this->assertEquals(5, $DB->count_records('notifications'));
// There should be 3 favourite conversations.
$this->assertEquals(3, $DB->count_records('favourite'));
// Delete group conversations for all users in system context.
provider::delete_conversations_for_all_users($systemcontext, $component, $itemtype);
@@ -1992,6 +2042,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(9, $DB->count_records('message_conversation_members'));
$this->assertEquals(5, $DB->count_records('notifications'));
$this->assertEquals(3, $DB->count_records('favourite'));
// Delete individual conversations for all users in system context.
provider::delete_conversations_for_all_users($systemcontext, '', '');
@@ -2005,6 +2056,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(9, $DB->count_records('message_conversation_members'));
$this->assertEquals(5, $DB->count_records('notifications'));
$this->assertEquals(3, $DB->count_records('favourite'));
}
/**
@@ -2093,6 +2145,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$coursecontext2->id
);
// Make favourite some conversations.
\core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user2->id);
// Send some messages to the conversation.
$gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.1', $now + 1);
$gm2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.2', $now + 2);
@@ -2129,6 +2186,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
// There should be 5 notifications - 3 notifications + 2 for the contact request.
$this->assertEquals(5, $DB->count_records('notifications'));
// There should be 3 favourite conversations.
$this->assertEquals(3, $DB->count_records('favourite'));
// Delete group conversations for all users in user context.
provider::delete_conversations_for_all_users($user1context, $component, $itemtype);
@@ -2141,6 +2201,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(9, $DB->count_records('message_conversation_members'));
$this->assertEquals(5, $DB->count_records('notifications'));
$this->assertEquals(3, $DB->count_records('favourite'));
// Delete individual conversations for all users in user context.
provider::delete_conversations_for_all_users($user1context, '', '');
@@ -2154,6 +2215,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(4, $DB->count_records('message_conversations'));
$this->assertEquals(9, $DB->count_records('message_conversation_members'));
$this->assertEquals(5, $DB->count_records('notifications'));
$this->assertEquals(3, $DB->count_records('favourite'));
}
/**
@@ -2224,6 +2286,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
// Get conversation.
$iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
$conversation1 = \core_message\api::get_conversation_by_area(
$component,
$itemtype,
@@ -2231,6 +2294,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$coursecontext1->id
);
// Make favourite some conversations.
\core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user2->id);
// Send some messages to the conversation.
$gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1);
$gm2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 2', $now + 2);
@@ -2270,6 +2338,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
}, $members);
$this->assertContains($user1->id, $members);
// There should be three favourite conversations.
$this->assertEquals(3, $DB->count_records('favourite'));
// Delete group conversations for user1 in course1 and course2.
$approvedcontextlist = new \core_privacy\tests\request\approved_contextlist($user1, 'core_message',
[$coursecontext1->id, $coursecontext2->id]);
@@ -2313,6 +2384,17 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
return $member->userid;
}, $members);
$this->assertNotContains($user1->id, $members);
// There should be 2 favourite conversations - 2 group.
$this->assertEquals(2, $DB->count_records('favourite'));
$favourites = $DB->get_records('favourite');
foreach ($favourites as $favourite) {
if ($favourite->userid == $user1->id) {
$this->assertEquals($iconversation1id, $favourite->itemid);
} else if ($favourite->userid == $user2->id) {
$this->assertEquals($conversation1->id, $favourite->itemid);
}
}
}
@@ -2387,6 +2469,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user4->id));
// Get conversation.
$iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
$conversation1 = \core_message\api::get_conversation_by_area(
$component,
$itemtype,
@@ -2394,6 +2477,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$coursecontext1->id
);
// Make favourite some conversations.
\core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
\core_message\api::set_favourite_conversation($conversation1->id, $user3->id);
// Send some messages to the conversation.
$gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1);
$gm2 = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 2', $now + 2);
@@ -2434,6 +2522,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertContains($user1->id, $members);
$this->assertContains($user4->id, $members);
// There should be 3 favourite conversations.
$this->assertEquals(3, $DB->count_records('favourite'));
// Delete group conversations for user1 and user2 in course2 context.
$approveduserlist = new \core_privacy\local\request\approved_userlist($coursecontext2, 'core_message',
[$user1->id, $user2->id]);
@@ -2448,6 +2539,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(4, $DB->count_records('message_user_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'));
// Delete group conversations for user4 in course1 context.
$approveduserlist = new \core_privacy\local\request\approved_userlist($coursecontext1, 'core_message',
@@ -2462,6 +2554,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$this->assertEquals(6, $DB->count_records('messages'));
$this->assertEquals(4, $DB->count_records('message_user_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.
$this->assertEquals(7, $DB->count_records('message_conversation_members'));
@@ -2509,6 +2602,17 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
}, $members);
$this->assertNotContains($user1->id, $members);
$this->assertNotContains($user2->id, $members);
// There should be 2 favourite conversations - user1 individual + user3 group.
$this->assertEquals(2, $DB->count_records('favourite'));
$favourites = $DB->get_records('favourite');
foreach ($favourites as $favourite) {
if ($favourite->userid == $user1->id) {
$this->assertEquals($iconversation1id, $favourite->itemid);
} else if ($favourite->userid == $user3->id) {
$this->assertEquals($conversation1->id, $favourite->itemid);
}
}
}
/**