MDL-63724 core_message: split up event and processor code in the manager

This was couple before, but we're going to want this to be separate for
group conversation messages, where we'll call many users' processors,
but only create a single 'group_message_sent' event.
This commit is contained in:
Jake Dallimore 2018-11-08 11:23:33 +08:00
parent 9f82758c01
commit 947d32895e

View File

@ -62,21 +62,7 @@ class manager {
if (empty($processorlist)) {
// Trigger event for sending a message or notification - we need to do this before marking as read!
if ($eventdata->notification) {
\core\event\notification_sent::create_from_ids(
$eventdata->userfrom->id,
$eventdata->userto->id,
$savemessage->id,
$eventdata->courseid
)->trigger();
} else { // Must be a message.
\core\event\message_sent::create_from_ids(
$eventdata->userfrom->id,
$eventdata->userto->id,
$savemessage->id,
$eventdata->courseid
)->trigger();
}
self::trigger_message_events($eventdata, $savemessage);
if ($eventdata->notification or empty($CFG->messaging)) {
// If they have deselected all processors and its a notification mark it read. The user doesn't want to be bothered.
@ -110,7 +96,6 @@ class manager {
// We cannot communicate with external systems in DB transactions,
// buffer the messages if necessary.
if ($DB->is_transaction_started()) {
// We need to clone all objects so that devs may not modify it from outside later.
$eventdata = clone($eventdata);
@ -125,33 +110,11 @@ class manager {
return $savemessage->id;
}
foreach ($processorlist as $procname) {
// Let new messaging class add custom content based on the processor.
$proceventdata = ($eventdata instanceof message) ? $eventdata->get_eventobject_for_processor($procname) : $eventdata;
$stdproc = new \stdClass();
$stdproc->name = $procname;
$processor = \core_message\api::get_processed_processor_object($stdproc);
if (!$processor->object->send_message($proceventdata)) {
debugging('Error calling message processor ' . $procname);
}
}
// Send the message to processors.
self::call_processors($eventdata, $processorlist);
// Trigger event for sending a message or notification - we need to do this before marking as read!
if ($eventdata->notification) {
\core\event\notification_sent::create_from_ids(
$eventdata->userfrom->id,
$eventdata->userto->id,
$savemessage->id,
$eventdata->courseid
)->trigger();
} else { // Must be a message.
\core\event\message_sent::create_from_ids(
$eventdata->userfrom->id,
$eventdata->userto->id,
$savemessage->id,
$eventdata->courseid
)->trigger();
}
self::trigger_message_events($eventdata, $savemessage);
if (empty($CFG->messaging)) {
// If they have deselected all processors and its a notification mark it read. The user doesn't want to be bothered.
@ -201,4 +164,48 @@ class manager {
self::send_message_to_processors($eventdata, $savemessage, $processorlist);
}
}
/**
* Trigger an appropriate message creation event, based on the supplied $eventdata and $savemessage.
*
* @param message $eventdata the eventdata for the message.
* @param \stdClass $savemessage the message record.
* @throws \coding_exception
*/
protected static function trigger_message_events(message $eventdata, \stdClass $savemessage) {
if ($eventdata->notification) {
\core\event\notification_sent::create_from_ids(
$eventdata->userfrom->id,
$eventdata->userto->id,
$savemessage->id,
$eventdata->courseid
)->trigger();
} else { // Must be a message.
\core\event\message_sent::create_from_ids(
$eventdata->userfrom->id,
$eventdata->userto->id,
$savemessage->id,
$eventdata->courseid
)->trigger();
}
}
/**
* For each processor, call it's send_message() method.
*
* @param message $eventdata the message object.
* @param array $processorlist the list of processors for a single user.
*/
protected static function call_processors(message $eventdata, array $processorlist) {
foreach ($processorlist as $procname) {
// Let new messaging class add custom content based on the processor.
$proceventdata = ($eventdata instanceof message) ? $eventdata->get_eventobject_for_processor($procname) : $eventdata;
$stdproc = new \stdClass();
$stdproc->name = $procname;
$processor = \core_message\api::get_processed_processor_object($stdproc);
if (!$processor->object->send_message($proceventdata)) {
debugging('Error calling message processor ' . $procname);
}
}
}
}