From 31c474da594269bed05657df46bcc75365f84547 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Tue, 31 Mar 2015 10:48:35 +0200 Subject: [PATCH 1/3] MDL-49501 messages: New external function mark_message_read --- message/externallib.php | 78 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/message/externallib.php b/message/externallib.php index 043c419309f..345d042e9ea 100644 --- a/message/externallib.php +++ b/message/externallib.php @@ -927,6 +927,84 @@ class core_message_external extends external_api { ); } + /** + * Returns description of method parameters + * + * @return external_function_parameters + * @since 2.9 + */ + public static function mark_message_read_parameters() { + return new external_function_parameters( + array( + 'messageid' => new external_value(PARAM_INT, 'id of the message (in the message table)'), + 'timeread' => new external_value(PARAM_INT, 'timestamp for when the message should be marked read') + ) + ); + } + + /** + * Mark a single message as read, trigger message_viewed event + * + * @param int $messageid id of the message (in the message table) + * @param int $timeread timestamp for when the message should be marked read + * @return external_description + * @throws invalid_parameter_exception + * @throws moodle_exception + * @since 2.9 + */ + public static function mark_message_read($messageid, $timeread) { + global $CFG, $DB, $USER; + require_once($CFG->dirroot . "/message/lib.php"); + + // Check if private messaging between users is allowed. + if (empty($CFG->messaging)) { + throw new moodle_exception('disabled', 'message'); + } + + // Warnings array, it can be empty at the end but is mandatory. + $warnings = array(); + + // Validate params. + $params = array( + 'messageid' => $messageid, + 'timeread' => $timeread + ); + $params = self::validate_parameters(self::mark_message_read_parameters(), $params); + + // Validate context. + $context = context_system::instance(); + self::validate_context($context); + + $message = $DB->get_record('message', array('id' => $params['messageid']), '*', MUST_EXIST); + + if ($message->useridto != $USER->id) { + throw new invalid_parameter_exception('Invalid messageid, you don\'t have permissions to mark this message as read'); + } + + $messageid = message_mark_message_read($message, $params['timeread']); + + $results = array( + 'messageid' => $messageid, + 'warnings' => $warnings + ); + return $results; + } + + /** + * Returns description of method result value + * + * @return external_description + * @since 2.9 + */ + public static function mark_message_read_returns() { + return new external_single_structure( + array( + 'messageid' => new external_value(PARAM_INT, 'the id of the message in the message_read table'), + 'warnings' => new external_warnings() + ) + ); + } + } /** From a84f89ca234a92184f5229cc72c0afae2c26eac8 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Tue, 31 Mar 2015 10:49:16 +0200 Subject: [PATCH 2/3] MDL-49501 messages: Add mark_message_read to the mobile service --- lib/db/services.php | 10 ++++++++++ version.php | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/db/services.php b/lib/db/services.php index 0383b29e1e4..6b95cf8e6a2 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -838,6 +838,15 @@ $functions = array( 'capabilities' => '', ), + 'core_message_mark_message_read' => array( + 'classname' => 'core_message_external', + 'methodname' => 'mark_message_read', + 'classpath' => 'message/externallib.php', + 'description' => 'Mark a single message as read, trigger message_viewed event.', + 'type' => 'write', + 'capabilities' => '', + ), + // === notes related functions === 'moodle_notes_create_notes' => array( @@ -1068,6 +1077,7 @@ $services = array( 'core_course_view_course', 'core_completion_get_activities_completion_status', 'core_notes_get_course_notes', + 'core_message_mark_message_read', ), 'enabled' => 0, 'restrictedusers' => 0, diff --git a/version.php b/version.php index 385d10921d1..31a138f1061 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2015040200.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2015040200.01; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes. From b679582707e838e2b37eeef9e06fb1f3f466affc Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Tue, 31 Mar 2015 11:16:26 +0200 Subject: [PATCH 3/3] MDL-49501 messages: Unit tests for mark_message_read --- message/tests/externallib_test.php | 60 ++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/message/tests/externallib_test.php b/message/tests/externallib_test.php index 4be0b61133c..09a73869e8e 100644 --- a/message/tests/externallib_test.php +++ b/message/tests/externallib_test.php @@ -618,4 +618,64 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { } + /** + * Test mark_message_read. + */ + public function test_mark_message_read() { + $this->resetAfterTest(true); + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + $user3 = self::getDataGenerator()->create_user(); + + // Login as user1. + $this->setUser($user1); + $this->assertEquals(array(), core_message_external::create_contacts( + array($user2->id, $user3->id))); + + // The user2 sends a couple of messages to user1. + $this->send_message($user2, $user1, 'Hello there!'); + $this->send_message($user2, $user1, 'How you goin?'); + $this->send_message($user3, $user1, 'How you goin?'); + $this->send_message($user3, $user2, 'How you goin?'); + + // Retrieve all messages sent by user2 (they are currently unread). + $lastmessages = message_get_messages($user1->id, $user2->id, 0, false); + + $messageids = array(); + foreach ($lastmessages as $m) { + $messageid = core_message_external::mark_message_read($m->id, time()); + $messageids[] = external_api::clean_returnvalue(core_message_external::mark_message_read_returns(), $messageid); + } + + // Retrieve all messages sent (they are currently read). + $lastmessages = message_get_messages($user1->id, $user2->id, 0, true); + $this->assertCount(2, $lastmessages); + $this->assertArrayHasKey($messageids[0]['messageid'], $lastmessages); + $this->assertArrayHasKey($messageids[1]['messageid'], $lastmessages); + + // Retrieve all messages sent by any user (that are currently unread). + $lastmessages = message_get_messages($user1->id, 0, 0, false); + $this->assertCount(1, $lastmessages); + + // Invalid message ids. + try { + $messageid = core_message_external::mark_message_read($messageids[0]['messageid'] * 2, time()); + $this->fail('Exception expected due invalid messageid.'); + } catch (dml_missing_record_exception $e) { + $this->assertEquals('invalidrecord', $e->errorcode); + } + + // A message to a different user. + $lastmessages = message_get_messages($user2->id, $user3->id, 0, false); + $messageid = array_pop($lastmessages)->id; + try { + $messageid = core_message_external::mark_message_read($messageid, time()); + $this->fail('Exception expected due invalid messageid.'); + } catch (invalid_parameter_exception $e) { + $this->assertEquals('invalidparameter', $e->errorcode); + } + + } + }