From fb302d3848c499e85a9c12a6a16f5c5cfb8310d9 Mon Sep 17 00:00:00 2001 From: Amaia Anabitarte Date: Tue, 28 Apr 2020 15:30:03 +0200 Subject: [PATCH] MDL-67800 core_contentbank: Creating events for contentbank --- contentbank/classes/content.php | 8 +- contentbank/classes/contenttype.php | 32 +++- .../contenttype/h5p/classes/contenttype.php | 5 + lang/en/contentbank.php | 5 + .../event/contentbank_content_created.php | 137 ++++++++++++++++++ .../event/contentbank_content_deleted.php | 126 ++++++++++++++++ .../event/contentbank_content_updated.php | 137 ++++++++++++++++++ .../event/contentbank_content_uploaded.php | 137 ++++++++++++++++++ .../event/contentbank_content_viewed.php | 137 ++++++++++++++++++ 9 files changed, 721 insertions(+), 3 deletions(-) create mode 100644 lib/classes/event/contentbank_content_created.php create mode 100644 lib/classes/event/contentbank_content_deleted.php create mode 100644 lib/classes/event/contentbank_content_updated.php create mode 100644 lib/classes/event/contentbank_content_uploaded.php create mode 100644 lib/classes/event/contentbank_content_viewed.php diff --git a/contentbank/classes/content.php b/contentbank/classes/content.php index 27975cb61f4..13996a9875d 100644 --- a/contentbank/classes/content.php +++ b/contentbank/classes/content.php @@ -100,7 +100,13 @@ abstract class content { } $this->content->usermodified = $USER->id; $this->content->timemodified = time(); - return $DB->update_record('contentbank_content', $this->content); + $result = $DB->update_record('contentbank_content', $this->content); + if ($result) { + // Trigger an event for updating this content. + $event = contentbank_content_updated::create_from_record($this->content); + $event->trigger(); + } + return $result; } /** diff --git a/contentbank/classes/contenttype.php b/contentbank/classes/contenttype.php index 05922b7e01c..7f7fbf59694 100644 --- a/contentbank/classes/contenttype.php +++ b/contentbank/classes/contenttype.php @@ -24,6 +24,9 @@ namespace core_contentbank; +use core\event\contentbank_content_created; +use core\event\contentbank_content_deleted; +use core\event\contentbank_content_viewed; use moodle_url; /** @@ -71,10 +74,15 @@ abstract class contenttype { $entry->usermodified = $entry->usercreated; $entry->timemodified = $entry->timecreated; $entry->configdata = $record->configdata ?? ''; + $entry->instanceid = $record->instanceid ?? 0; $entry->id = $DB->insert_record('contentbank_content', $entry); if ($entry->id) { $classname = '\\'.$entry->contenttype.'\\content'; - return new $classname($entry); + $content = new $classname($entry); + // Trigger an event for creating the content. + $event = contentbank_content_created::create_from_record($content->get_content()); + $event->trigger(); + return $content; } return null; } @@ -95,7 +103,23 @@ abstract class contenttype { } // Delete the contentbank DB entry. - return $DB->delete_records('contentbank_content', ['id' => $content->get_id()]); + $result = $DB->delete_records('contentbank_content', ['id' => $content->get_id()]); + if ($result) { + // Trigger an event for deleting this content. + $record = $content->get_content(); + $event = contentbank_content_deleted::create([ + 'objectid' => $content->get_id(), + 'relateduserid' => $record->usercreated, + 'context' => \context::instance_by_id($record->contextid), + 'other' => [ + 'contenttype' => $content->get_content_type(), + 'name' => $content->get_name() + ] + ]); + $event->add_record_snapshot('contentbank_content', $record); + $event->trigger(); + } + return $result; } /** @@ -149,6 +173,10 @@ abstract class contenttype { * @return string HTML code to include in view.php. */ public function get_view_content(\stdClass $record): string { + // Trigger an event for viewing this content. + $event = contentbank_content_viewed::create_from_record($record); + $event->trigger(); + // Main contenttype class can visualize the content, but plugins could overwrite visualization. return ''; } diff --git a/contentbank/contenttype/h5p/classes/contenttype.php b/contentbank/contenttype/h5p/classes/contenttype.php index 076ec9939fb..806205d4f63 100644 --- a/contentbank/contenttype/h5p/classes/contenttype.php +++ b/contentbank/contenttype/h5p/classes/contenttype.php @@ -24,6 +24,7 @@ namespace contenttype_h5p; +use core\event\contentbank_content_viewed; use stdClass; use html_writer; @@ -60,6 +61,10 @@ class contenttype extends \core_contentbank\contenttype { * @return string HTML code to include in view.php. */ public function get_view_content(\stdClass $record): string { + // Trigger an event for viewing this content. + $event = contentbank_content_viewed::create_from_record($record); + $event->trigger(); + $content = new content($record); $fileurl = $content->get_file_url(); $html = html_writer::tag('h2', $content->get_name()); diff --git a/lang/en/contentbank.php b/lang/en/contentbank.php index 1d3b885f488..06958d6feca 100644 --- a/lang/en/contentbank.php +++ b/lang/en/contentbank.php @@ -28,6 +28,11 @@ $string['contentname'] = 'Content name'; $string['contentnotdeleted'] = 'An error was encountered while trying to delete the content.'; $string['contentnotrenamed'] = 'An error was encountered while trying to rename the content.'; $string['contentrenamed'] = 'The content has been renamed.'; +$string['eventcontentcreated'] = 'Content created'; +$string['eventcontentdeleted'] = 'Content deleted'; +$string['eventcontentupdated'] = 'Content updated'; +$string['eventcontentuploaded'] = 'Content uploaded'; +$string['eventcontentviewed'] = 'Content viewed'; $string['deletecontent'] = 'Delete content'; $string['deletecontentconfirm'] = 'Are you sure you want to delete the content \'{$a->name}\' and all associated files? This action cannot be undone.'; $string['file'] = 'Upload content'; diff --git a/lib/classes/event/contentbank_content_created.php b/lib/classes/event/contentbank_content_created.php new file mode 100644 index 00000000000..bf651c7de02 --- /dev/null +++ b/lib/classes/event/contentbank_content_created.php @@ -0,0 +1,137 @@ +. + +/** + * Contentbank content created event. + * + * @package core + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +/** + * Content bank content created class. + * + * @property-read array $other { + * Extra information about event. + * - string contenttype: the contenttype of the content. + * - string name: the name of the content. + * } + * + * @package core + * @since Moodle 3.9 + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class contentbank_content_created extends base { + + /** + * Initialise the event data. + */ + protected function init() { + $this->data['objecttable'] = 'contentbank_content'; + $this->data['crud'] = 'c'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from content bank content object + * + * @since Moodle 3.9 + * @param \stdClass $record Data to create the event + * @return contentbank_content_created + */ + public static function create_from_record(\stdClass $record) { + $event = self::create([ + 'objectid' => $record->id, + 'relateduserid' => $record->usercreated, + 'context' => \context::instance_by_id($record->contextid), + 'other' => [ + 'contenttype' => $record->contenttype, + 'name' => $record->name + ] + ]); + return $event; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventcontentcreated', 'core_contentbank'); + } + + /** + * Returns non-localised description of what happened. + * + * @return string + */ + public function get_description() { + return "The user with id '$this->userid' created the content with id '$this->objectid'."; + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['contenttype'])) { + throw new \coding_exception('The \'contenttype\' value must be set in other.'); + } + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + $url = new \moodle_url('/contentbank/view.php'); + $url->param('id', $this->objectid); + return $url; + } + + /** + * Used for mapping events on restore + * + * @return array + */ + public static function get_objectid_mapping() { + return array('db' => 'contentbank_content', 'restore' => 'contentbank_content'); + } + + /** + * Used for mapping events on restore + * + * @return bool + */ + public static function get_other_mapping() { + // No mapping required. + return false; + } +} diff --git a/lib/classes/event/contentbank_content_deleted.php b/lib/classes/event/contentbank_content_deleted.php new file mode 100644 index 00000000000..6021d5a178b --- /dev/null +++ b/lib/classes/event/contentbank_content_deleted.php @@ -0,0 +1,126 @@ +. + +/** + * Contentbank content deleted event. + * + * @package core + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +/** + * Content bank content deleted class. + * + * @property-read array $other { + * Extra information about event. + * - string contenttype: the contenttype of the content. + * - string name: the name of the content. + * } + * + * @package core + * @since Moodle 3.9 + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class contentbank_content_deleted extends base { + + /** + * Initialise the event data. + */ + protected function init() { + $this->data['objecttable'] = 'contentbank_content'; + $this->data['crud'] = 'd'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from content bank content object + * + * @since Moodle 3.9 + * @param \stdClass $record Data to create the event + * @return contentbank_content_deleted + */ + public static function create_from_record(\stdClass $record) { + $event = self::create([ + 'objectid' => $record->id, + 'relateduserid' => $record->usercreated, + 'context' => \context::instance_by_id($record->contextid), + 'other' => [ + 'contenttype' => $record->contenttype, + 'name' => $record->name + ] + ]); + return $event; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventcontentdeleted', 'core_contentbank'); + } + + /** + * Returns non-localised description of what happened. + * + * @return string + */ + public function get_description() { + return "The user with id '$this->userid' deleted the content with id '$this->objectid'."; + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['contenttype'])) { + throw new \coding_exception('The \'contenttype\' value must be set in other.'); + } + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + } + + /** + * Used for mapping events on restore + * + * @return array + */ + public static function get_objectid_mapping() { + return array('db' => 'contentbank_content', 'restore' => 'contentbank_content'); + } + + /** + * Used for mapping events on restore + * + * @return bool + */ + public static function get_other_mapping() { + // No mapping required. + return false; + } +} diff --git a/lib/classes/event/contentbank_content_updated.php b/lib/classes/event/contentbank_content_updated.php new file mode 100644 index 00000000000..74a3420ead3 --- /dev/null +++ b/lib/classes/event/contentbank_content_updated.php @@ -0,0 +1,137 @@ +. + +/** + * Contentbank content uploaded event. + * + * @package core + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +/** + * Content bank content updated class. + * + * @property-read array $other { + * Extra information about event. + * - string contenttype: the contenttype of the content. + * - string name: the name of the content. + * } + * + * @package core + * @since Moodle 3.9 + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class contentbank_content_updated extends base { + + /** + * Initialise the event data. + */ + protected function init() { + $this->data['objecttable'] = 'contentbank_content'; + $this->data['crud'] = 'u'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from content bank content object + * + * @since Moodle 3.9 + * @param \stdClass $record Data to create the event + * @return contentbank_content_updated + */ + public static function create_from_record(\stdClass $record) { + $event = self::create([ + 'objectid' => $record->id, + 'relateduserid' => $record->usercreated, + 'context' => \context::instance_by_id($record->contextid), + 'other' => [ + 'contenttype' => $record->contenttype, + 'name' => $record->name + ] + ]); + return $event; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventcontentupdated', 'core_contentbank'); + } + + /** + * Returns non-localised description of what happened. + * + * @return string + */ + public function get_description() { + return "The user with id '$this->userid' updated the content with id '$this->objectid'."; + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['contenttype'])) { + throw new \coding_exception('The \'contenttype\' value must be set in other.'); + } + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + $url = new \moodle_url('/contentbank/view.php'); + $url->param('id', $this->objectid); + return $url; + } + + /** + * Used for mapping events on restore + * + * @return array + */ + public static function get_objectid_mapping() { + return array('db' => 'contentbank_content', 'restore' => 'contentbank_content'); + } + + /** + * Used for mapping events on restore + * + * @return bool + */ + public static function get_other_mapping() { + // No mapping required. + return false; + } +} diff --git a/lib/classes/event/contentbank_content_uploaded.php b/lib/classes/event/contentbank_content_uploaded.php new file mode 100644 index 00000000000..1080407e32e --- /dev/null +++ b/lib/classes/event/contentbank_content_uploaded.php @@ -0,0 +1,137 @@ +. + +/** + * Contentbank content uploaded event. + * + * @package core + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +/** + * Content bank content uploaded class. + * + * @property-read array $other { + * Extra information about event. + * - string contenttype: the contenttype of the content. + * - string name: the name of the content. + * } + * + * @package core + * @since Moodle 3.9 + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class contentbank_content_uploaded extends base { + + /** + * Initialise the event data. + */ + protected function init() { + $this->data['objecttable'] = 'contentbank_content'; + $this->data['crud'] = 'c'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from content bank content object + * + * @since Moodle 3.9 + * @param \stdClass $record Data to create the event + * @return contentbank_content_uploaded + */ + public static function create_from_record(\stdClass $record) { + $event = self::create([ + 'objectid' => $record->id, + 'relateduserid' => $record->usercreated, + 'context' => \context::instance_by_id($record->contextid), + 'other' => [ + 'contenttype' => $record->contenttype, + 'name' => $record->name + ] + ]); + return $event; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventcontentuploaded', 'core_contentbank'); + } + + /** + * Returns non-localised description of what happened. + * + * @return string + */ + public function get_description() { + return "The user with id '$this->userid' uploaded the content with id '$this->objectid'."; + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['contenttype'])) { + throw new \coding_exception('The \'contenttype\' value must be set in other.'); + } + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + $url = new \moodle_url('/contentbank/view.php'); + $url->param('id', $this->objectid); + return $url; + } + + /** + * Used for mapping events on restore + * + * @return array + */ + public static function get_objectid_mapping() { + return array('db' => 'contentbank_content', 'restore' => 'contentbank_content'); + } + + /** + * Used for mapping events on restore + * + * @return bool + */ + public static function get_other_mapping() { + // No mapping required. + return false; + } +} diff --git a/lib/classes/event/contentbank_content_viewed.php b/lib/classes/event/contentbank_content_viewed.php new file mode 100644 index 00000000000..cd8b4d2dd4c --- /dev/null +++ b/lib/classes/event/contentbank_content_viewed.php @@ -0,0 +1,137 @@ +. + +/** + * Contentbank content viewed event. + * + * @package core + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core\event; + +/** + * Content bank content updated class. + * + * @property-read array $other { + * Extra information about event. + * - string contenttype: the contenttype of the content. + * - string name: the name of the content. + * } + * + * @package core + * @since Moodle 3.9 + * @copyright 2020 Amaia Anabitarte + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class contentbank_content_viewed extends base { + + /** + * Initialise the event data. + */ + protected function init() { + $this->data['objecttable'] = 'contentbank_content'; + $this->data['crud'] = 'r'; + $this->data['edulevel'] = self::LEVEL_OTHER; + } + + /** + * Creates an event from content bank content object + * + * @since Moodle 3.9 + * @param \stdClass $record Data to create the event + * @return contentbank_content_viewed + */ + public static function create_from_record(\stdClass $record) { + $event = self::create([ + 'objectid' => $record->id, + 'relateduserid' => $record->usercreated, + 'context' => \context::instance_by_id($record->contextid), + 'other' => [ + 'contenttype' => $record->contenttype, + 'name' => $record->name + ] + ]); + return $event; + } + + /** + * Returns localised general event name. + * + * @return string + */ + public static function get_name() { + return get_string('eventcontentviewed', 'core_contentbank'); + } + + /** + * Returns non-localised description of what happened. + * + * @return string + */ + public function get_description() { + return "The user with id '$this->userid' viewed the content with id '$this->objectid'."; + } + + /** + * Custom validation. + * + * @throws \coding_exception + * @return void + */ + protected function validate_data() { + parent::validate_data(); + + if (!isset($this->other['contenttype'])) { + throw new \coding_exception('The \'contenttype\' value must be set in other.'); + } + + if (!isset($this->other['name'])) { + throw new \coding_exception('The \'name\' value must be set in other.'); + } + } + + /** + * Returns relevant URL. + * + * @return \moodle_url + */ + public function get_url() { + $url = new \moodle_url('/contentbank/view.php'); + $url->param('id', $this->objectid); + return $url; + } + + /** + * Used for mapping events on restore + * + * @return array + */ + public static function get_objectid_mapping() { + return array('db' => 'contentbank_content', 'restore' => 'contentbank_content'); + } + + /** + * Used for mapping events on restore + * + * @return bool + */ + public static function get_other_mapping() { + // No mapping required. + return false; + } +}