diff --git a/message/classes/api.php b/message/classes/api.php index b4422be3435..19a2fa68ceb 100644 --- a/message/classes/api.php +++ b/message/classes/api.php @@ -1523,6 +1523,7 @@ class api { // Some restrictions we need to be aware of: // - Individual conversations containing soft-deleted user must be counted. // - Individual conversations containing only deleted messages must NOT be counted. + // - Individual conversations which are legacy 'self' conversations (2 members, both the same user) must NOT be counted. // - Group conversations with 0 messages must be counted. // - Linked conversations which are disabled (enabled = 0) must NOT be counted. // - Any type of conversation can be included in the favourites count, however, the type counts and the favourites count @@ -1538,6 +1539,17 @@ class api { FROM {message_conversations} mc INNER JOIN {message_conversation_members} mcm ON mcm.conversationid = mc.id + INNER JOIN ( + SELECT mcm.conversationid, count(distinct mcm.userid) as membercount + FROM {message_conversation_members} mcm + WHERE mcm.conversationid IN ( + SELECT DISTINCT conversationid + FROM {message_conversation_members} mcm2 + WHERE userid = :userid5 + ) + GROUP BY mcm.conversationid + ) uniquemembercount + ON uniquemembercount.conversationid = mc.id LEFT JOIN ( SELECT m.conversationid as convid, MAX(m.timecreated) as maxtime FROM {messages} m @@ -1553,7 +1565,10 @@ class api { $favsql WHERE mcm.userid = :userid3 AND mc.enabled = :enabled - AND ((mc.type = :individualtype AND maxvisibleconvmessage.convid IS NOT NULL) OR (mc.type = :grouptype)) + AND ( + (mc.type = :individualtype AND maxvisibleconvmessage.convid IS NOT NULL AND membercount > 1) OR + (mc.type = :grouptype) + ) GROUP BY mc.type, fav.itemtype ORDER BY mc.type ASC"; @@ -1562,6 +1577,7 @@ class api { 'userid2' => $userid, 'userid3' => $userid, 'userid4' => $userid, + 'userid5' => $userid, 'action' => self::MESSAGE_ACTION_DELETED, 'enabled' => self::MESSAGE_CONVERSATION_ENABLED, 'individualtype' => self::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, diff --git a/message/tests/api_test.php b/message/tests/api_test.php index 65dfb4cd2b0..5370fc3b8c2 100644 --- a/message/tests/api_test.php +++ b/message/tests/api_test.php @@ -5706,7 +5706,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase { public function test_get_conversation_counts_test_cases() { $typeindividual = \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL; $typegroup = \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP; - list($user1, $user2, $user3, $user4, $user5, $user6, $user7) = [0, 1, 2, 3, 4, 5, 6]; + list($user1, $user2, $user3, $user4, $user5, $user6, $user7, $user8) = [0, 1, 2, 3, 4, 5, 6, 7]; $conversations = [ [ 'type' => $typeindividual, @@ -5736,6 +5736,13 @@ class core_message_api_testcase extends core_message_messagelib_testcase { 'favourites' => [$user6], 'enabled' => false ], + [ + 'type' => $typeindividual, + 'users' => [$user8, $user8], + 'messages' => [$user8, $user8], + 'favourites' => [], + 'enabled' => null // Individual conversations cannot be disabled. + ], ]; return [ @@ -5926,6 +5933,17 @@ class core_message_api_testcase extends core_message_messagelib_testcase { ]], 'deletedusers' => [] ], + 'Conversation with self' => [ + 'conversationConfigs' => $conversations, + 'deletemessagesuser' => null, + 'deletemessages' => [], + 'arguments' => [$user8], + 'expected' => ['favourites' => 0, 'types' => [ + \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0, + \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 0 + ]], + 'deletedusers' => [] + ], ]; } @@ -5956,6 +5974,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase { $generator->create_user(), $generator->create_user(), $generator->create_user(), + $generator->create_user(), $generator->create_user() ]; diff --git a/message/tests/externallib_test.php b/message/tests/externallib_test.php index cb1959e4920..fbfeb35fc94 100644 --- a/message/tests/externallib_test.php +++ b/message/tests/externallib_test.php @@ -6138,7 +6138,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { public function test_get_conversation_counts_test_cases() { $typeindividual = \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL; $typegroup = \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP; - list($user1, $user2, $user3, $user4, $user5, $user6, $user7) = [0, 1, 2, 3, 4, 5, 6]; + list($user1, $user2, $user3, $user4, $user5, $user6, $user7, $user8) = [0, 1, 2, 3, 4, 5, 6, 7]; $conversations = [ [ 'type' => $typeindividual, @@ -6168,6 +6168,13 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { 'favourites' => [$user6], 'enabled' => false ], + [ + 'type' => $typeindividual, + 'users' => [$user8, $user8], + 'messages' => [$user8, $user8], + 'favourites' => [], + 'enabled' => null // Individual conversations cannot be disabled. + ], ]; return [ @@ -6358,6 +6365,17 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { ]], 'deletedusers' => [] ], + 'Conversation with self' => [ + 'conversationConfigs' => $conversations, + 'deletemessagesuser' => null, + 'deletemessages' => [], + 'arguments' => [$user8], + 'expected' => ['favourites' => 0, 'types' => [ + \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0, + \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 0 + ]], + 'deletedusers' => [] + ], ]; } @@ -6389,6 +6407,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { $generator->create_user(), $generator->create_user(), $generator->create_user(), + $generator->create_user(), $generator->create_user() ];