mirror of
https://github.com/moodle/moodle.git
synced 2025-04-22 00:42:54 +02:00
MDL-64057 core_message: add get_conversation_counts() web service
This commit is contained in:
parent
8e91aaabc9
commit
28ff6ad1da
@ -1115,6 +1115,15 @@ $functions = array(
|
||||
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
|
||||
'ajax' => true,
|
||||
),
|
||||
'core_message_get_conversation_counts' => array(
|
||||
'classname' => 'core_message_external',
|
||||
'methodname' => 'get_conversation_counts',
|
||||
'classpath' => 'message/externallib.php',
|
||||
'description' => 'Retrieve a list of conversation counts, indexed by type.',
|
||||
'type' => 'read',
|
||||
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
|
||||
'ajax' => true,
|
||||
),
|
||||
'core_message_get_conversation_members' => array(
|
||||
'classname' => 'core_message_external',
|
||||
'methodname' => 'get_conversation_members',
|
||||
|
@ -4278,4 +4278,79 @@ class core_message_external extends external_api {
|
||||
self::get_conversation_member_structure(true)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of method parameters for get_conversation_counts() method.
|
||||
*
|
||||
* @return external_function_parameters
|
||||
*/
|
||||
public static function get_conversation_counts_parameters() {
|
||||
return new external_function_parameters(
|
||||
[
|
||||
'userid' => new external_value(PARAM_INT, 'id of the user, 0 for current user', VALUE_DEFAULT, 0)
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of conversation counts for the various types of conversations, including favourites.
|
||||
*
|
||||
* Return format:
|
||||
* [
|
||||
* 'favourites' => 0,
|
||||
* 'types' => [
|
||||
* \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
|
||||
* \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 0
|
||||
* ]
|
||||
* ]
|
||||
*
|
||||
* @param int $userid the id of the user whose counts we are fetching.
|
||||
* @return array the array of conversation counts, indexed by type.
|
||||
* @throws moodle_exception if the current user cannot perform this action.
|
||||
*/
|
||||
public static function get_conversation_counts(int $userid) {
|
||||
global $CFG, $USER;
|
||||
|
||||
// All the business logic checks that really shouldn't be in here.
|
||||
if (empty($CFG->messaging)) {
|
||||
throw new moodle_exception('disabled', 'message');
|
||||
}
|
||||
|
||||
if (empty($userid)) {
|
||||
$userid = $USER->id;
|
||||
}
|
||||
|
||||
$params = ['userid' => $userid];
|
||||
$params = self::validate_parameters(self::get_conversation_counts_parameters(), $params);
|
||||
|
||||
$systemcontext = context_system::instance();
|
||||
self::validate_context($systemcontext);
|
||||
|
||||
if (($USER->id != $params['userid']) && !has_capability('moodle/site:readallmessages', $systemcontext)) {
|
||||
throw new moodle_exception('You do not have permission to perform this action.');
|
||||
}
|
||||
|
||||
return \core_message\api::get_conversation_counts($params['userid']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get conversation counts return description.
|
||||
*
|
||||
* @return external_description
|
||||
*/
|
||||
public static function get_conversation_counts_returns() {
|
||||
return new external_single_structure(
|
||||
[
|
||||
'favourites' => new external_value(PARAM_INT, 'Total number of favourite conversations'),
|
||||
'types' => new external_single_structure(
|
||||
[
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => new external_value(PARAM_INT,
|
||||
'Total number of individual conversations'),
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => new external_value(PARAM_INT,
|
||||
'Total number of group conversations'),
|
||||
]
|
||||
),
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -5822,4 +5822,314 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
|
||||
$this->assertEquals($message2id, $conv['messages'][0]->id);
|
||||
$this->assertEquals($user2->id, $conv['messages'][0]->useridfrom);
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for test_get_conversation_counts().
|
||||
*/
|
||||
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];
|
||||
$conversations = [
|
||||
[
|
||||
'type' => $typeindividual,
|
||||
'users' => [$user1, $user2],
|
||||
'messages' => [$user1, $user2],
|
||||
'favourites' => [$user1],
|
||||
'enabled' => null // Individual conversations cannot be disabled.
|
||||
],
|
||||
[
|
||||
'type' => $typeindividual,
|
||||
'users' => [$user1, $user3],
|
||||
'messages' => [$user1, $user1],
|
||||
'favourites' => [],
|
||||
'enabled' => null // Individual conversations cannot be disabled.
|
||||
],
|
||||
[
|
||||
'type' => $typegroup,
|
||||
'users' => [$user1, $user2, $user3, $user4],
|
||||
'messages' => [$user1, $user2, $user3, $user4],
|
||||
'favourites' => [],
|
||||
'enabled' => true
|
||||
],
|
||||
[
|
||||
'type' => $typegroup,
|
||||
'users' => [$user6, $user7],
|
||||
'messages' => [$user6, $user7],
|
||||
'favourites' => [$user6],
|
||||
'enabled' => false
|
||||
],
|
||||
];
|
||||
|
||||
return [
|
||||
'No conversations' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => null,
|
||||
'deletemessages' => [],
|
||||
'arguments' => [$user5],
|
||||
'expected' => ['favourites' => 0, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 0
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'No individual conversations, 1 group conversation' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => null,
|
||||
'deletemessages' => [],
|
||||
'arguments' => [$user4],
|
||||
'expected' => ['favourites' => 0, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'2 individual conversations (one favourited), 1 group conversation' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => null,
|
||||
'deletemessages' => [],
|
||||
'arguments' => [$user1],
|
||||
'expected' => ['favourites' => 1, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'1 individual conversation, 1 group conversation' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => null,
|
||||
'deletemessages' => [],
|
||||
'arguments' => [$user2],
|
||||
'expected' => ['favourites' => 0, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'1 group conversation only' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => null,
|
||||
'deletemessages' => [],
|
||||
'arguments' => [$user4],
|
||||
'expected' => ['favourites' => 0, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'All conversation types, delete a message from individual favourited, messages remaining' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => $user1,
|
||||
'deletemessages' => [0],
|
||||
'arguments' => [$user1],
|
||||
'expected' => ['favourites' => 1, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'All conversation types, delete a message from individual non-favourited, messages remaining' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => $user1,
|
||||
'deletemessages' => [2],
|
||||
'arguments' => [$user1],
|
||||
'expected' => ['favourites' => 1, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'All conversation types, delete all messages from individual favourited, no messages remaining' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => $user1,
|
||||
'deletemessages' => [0, 1],
|
||||
'arguments' => [$user1],
|
||||
'expected' => ['favourites' => 0, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'All conversation types, delete all messages from individual non-favourited, no messages remaining' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => $user1,
|
||||
'deletemessages' => [2, 3],
|
||||
'arguments' => [$user1],
|
||||
'expected' => ['favourites' => 1, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'All conversation types, delete all messages from individual favourited, no messages remaining, different user' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => $user1,
|
||||
'deletemessages' => [0, 1],
|
||||
'arguments' => [$user2],
|
||||
'expected' => ['favourites' => 0, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'All conversation types, delete all messages from individual non-favourited, no messages remaining, different user' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => $user1,
|
||||
'deletemessages' => [2, 3],
|
||||
'arguments' => [$user3],
|
||||
'expected' => ['favourites' => 0, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'All conversation types, delete some messages from group non-favourited, messages remaining,' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => $user1,
|
||||
'deletemessages' => [4, 5],
|
||||
'arguments' => [$user1],
|
||||
'expected' => ['favourites' => 1, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'All conversation types, delete all messages from group non-favourited, no messages remaining,' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => $user1,
|
||||
'deletemessages' => [4, 5, 6, 7],
|
||||
'arguments' => [$user1],
|
||||
'expected' => ['favourites' => 1, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'All conversation types, another user soft deleted' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => null,
|
||||
'deletemessages' => [],
|
||||
'arguments' => [$user1],
|
||||
'expected' => ['favourites' => 1, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => [$user2]
|
||||
],
|
||||
'All conversation types, all group users soft deleted' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => null,
|
||||
'deletemessages' => [],
|
||||
'arguments' => [$user1],
|
||||
'expected' => ['favourites' => 1, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
|
||||
]],
|
||||
'deletedusers' => [$user2, $user3, $user4]
|
||||
],
|
||||
'Group conversation which is disabled, favourited' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => null,
|
||||
'deletemessages' => [],
|
||||
'arguments' => [$user6],
|
||||
'expected' => ['favourites' => 0, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 0
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
'Group conversation which is disabled, non-favourited' => [
|
||||
'conversationConfigs' => $conversations,
|
||||
'deletemessagesuser' => null,
|
||||
'deletemessages' => [],
|
||||
'arguments' => [$user7],
|
||||
'expected' => ['favourites' => 0, 'types' => [
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
|
||||
\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 0
|
||||
]],
|
||||
'deletedusers' => []
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the get_conversation_counts() function.
|
||||
*
|
||||
* @dataProvider test_get_conversation_counts_test_cases()
|
||||
* @param array $conversationconfigs Conversations to create
|
||||
* @param int $deletemessagesuser The user who is deleting the messages
|
||||
* @param array $deletemessages The list of messages to delete (by index)
|
||||
* @param array $arguments Arguments for the count conversations function
|
||||
* @param array $expected The expected result
|
||||
* @param array $deletedusers the array of users to soft delete.
|
||||
*/
|
||||
public function test_get_conversation_counts(
|
||||
$conversationconfigs,
|
||||
$deletemessagesuser,
|
||||
$deletemessages,
|
||||
$arguments,
|
||||
$expected,
|
||||
$deletedusers
|
||||
) {
|
||||
$this->resetAfterTest();
|
||||
$generator = $this->getDataGenerator();
|
||||
$users = [
|
||||
$generator->create_user(),
|
||||
$generator->create_user(),
|
||||
$generator->create_user(),
|
||||
$generator->create_user(),
|
||||
$generator->create_user(),
|
||||
$generator->create_user(),
|
||||
$generator->create_user()
|
||||
];
|
||||
|
||||
$deleteuser = !is_null($deletemessagesuser) ? $users[$deletemessagesuser] : null;
|
||||
$this->setUser($users[$arguments[0]]);
|
||||
$arguments[0] = $users[$arguments[0]]->id;
|
||||
$systemcontext = \context_system::instance();
|
||||
$conversations = [];
|
||||
$messageids = [];
|
||||
|
||||
foreach ($conversationconfigs as $config) {
|
||||
$conversation = \core_message\api::create_conversation(
|
||||
$config['type'],
|
||||
array_map(function($userindex) use ($users) {
|
||||
return $users[$userindex]->id;
|
||||
}, $config['users']),
|
||||
null,
|
||||
($config['enabled'] ?? true)
|
||||
);
|
||||
|
||||
foreach ($config['messages'] as $userfromindex) {
|
||||
$userfrom = $users[$userfromindex];
|
||||
$messageids[] = testhelper::send_fake_message_to_conversation($userfrom, $conversation->id);
|
||||
}
|
||||
|
||||
foreach ($config['favourites'] as $userfromindex) {
|
||||
$userfrom = $users[$userfromindex];
|
||||
$usercontext = \context_user::instance($userfrom->id);
|
||||
$ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
|
||||
$ufservice->create_favourite('core_message', 'message_conversations', $conversation->id, $systemcontext);
|
||||
}
|
||||
|
||||
$conversations[] = $conversation;
|
||||
}
|
||||
|
||||
foreach ($deletemessages as $messageindex) {
|
||||
\core_message\api::delete_message($deleteuser->id, $messageids[$messageindex]);
|
||||
}
|
||||
|
||||
foreach ($deletedusers as $deleteduser) {
|
||||
delete_user($users[$deleteduser]);
|
||||
}
|
||||
|
||||
$counts = core_message_external::get_conversation_counts(...$arguments);
|
||||
$counts = external_api::clean_returnvalue(core_message_external::get_conversation_counts_returns(), $counts);
|
||||
|
||||
$this->assertEquals($expected['favourites'], $counts['favourites']);
|
||||
$this->assertEquals($expected['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL],
|
||||
$counts['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL]);
|
||||
$this->assertEquals($expected['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP],
|
||||
$counts['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP]);
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,7 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$version = 2018112000.01; // YYYYMMDD = weekly release date of this DEV branch.
|
||||
$version = 2018112000.02; // YYYYMMDD = weekly release date of this DEV branch.
|
||||
// RR = release increments - 00 in DEV branches.
|
||||
// .XX = incremental changes.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user