Skip to content

Commit

Permalink
MDL-63692 core_message: Fix the context for favourite conversations
Browse files Browse the repository at this point in the history
The converation favourites were previously set in the system context
which is not right, as they should be stored:
- In the conversation context when defined.
- In the user context, when contextid is null (that means is an
individual conversation).
  • Loading branch information
sarjona committed Nov 19, 2018
1 parent c752cce commit 6b036d0
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 5 deletions.
20 changes: 20 additions & 0 deletions lib/db/upgrade.php
Original file line number Diff line number Diff line change
Expand Up @@ -2784,5 +2784,25 @@ function xmldb_main_upgrade($oldversion) {
upgrade_main_savepoint(true, 2018111300.01);
}

if ($oldversion < 2018111300.02) {
// Update favourited conversations, so they are saved in the proper context instead of the system.
$sql = "SELECT f.*, mc.contextid as conversationctx
FROM {favourite} f
JOIN {message_conversations} mc
ON mc.id = f.itemid";
$favouritedconversations = $DB->get_records_sql($sql);
foreach ($favouritedconversations as $fc) {
if (empty($fc->conversationctx)) {
$conversationidctx = \context_user::instance($fc->userid)->id;
} else {
$conversationidctx = $fc->conversationctx;
}

$DB->set_field('favourite', 'contextid', $conversationidctx, ['id' => $fc->id]);
}

upgrade_main_savepoint(true, 2018111300.02);
}

return true;
}
34 changes: 30 additions & 4 deletions message/classes/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -784,11 +784,24 @@ public static function get_conversations_between_users(int $userid1, int $userid
* @throws \moodle_exception if the user or conversation don't exist.
*/
public static function set_favourite_conversation(int $conversationid, int $userid) : favourite {
global $DB;

if (!self::is_user_in_conversation($userid, $conversationid)) {
throw new \moodle_exception("Conversation doesn't exist or user is not a member");
}
$ufservice = \core_favourites\service_factory::get_service_for_user_context(\context_user::instance($userid));
return $ufservice->create_favourite('core_message', 'message_conversations', $conversationid, \context_system::instance());
// Get the context for this conversation.
$conversation = $DB->get_record('message_conversations', ['id' => $conversationid]);
$userctx = \context_user::instance($userid);
if (empty($conversation->contextid)) {
// When the conversation hasn't any contextid value defined, the favourite will be added to the user context.
$conversationctx = $userctx;
} else {
// If the contextid is defined, the favourite will be added there.
$conversationctx = \context::instance_by_id($conversation->contextid);
}

$ufservice = \core_favourites\service_factory::get_service_for_user_context($userctx);
return $ufservice->create_favourite('core_message', 'message_conversations', $conversationid, $conversationctx);
}

/**
Expand All @@ -799,8 +812,21 @@ public static function set_favourite_conversation(int $conversationid, int $user
* @throws \moodle_exception if the favourite does not exist for the user.
*/
public static function unset_favourite_conversation(int $conversationid, int $userid) {
$ufservice = \core_favourites\service_factory::get_service_for_user_context(\context_user::instance($userid));
$ufservice->delete_favourite('core_message', 'message_conversations', $conversationid, \context_system::instance());
global $DB;

// Get the context for this conversation.
$conversation = $DB->get_records('message_conversations', ['id' => $conversationid]);
$userctx = \context_user::instance($userid);
if (empty($conversation->contextid)) {
// When the conversation hasn't any contextid value defined, the favourite will be added to the user context.
$conversationctx = $userctx;
} else {
// If the contextid is defined, the favourite will be added there.
$conversationctx = \context::instance_by_id($conversation->contextid);
}

$ufservice = \core_favourites\service_factory::get_service_for_user_context($userctx);
$ufservice->delete_favourite('core_message', 'message_conversations', $conversationid, $conversationctx);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion version.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

defined('MOODLE_INTERNAL') || die();

$version = 2018111300.01; // YYYYMMDD = weekly release date of this DEV branch.
$version = 2018111300.02; // YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.

Expand Down

0 comments on commit 6b036d0

Please sign in to comment.