MDL-67800 core_contentbank: Creating events for contentbank
authorAmaia Anabitarte <amaia@moodle.com>
Tue, 28 Apr 2020 13:30:03 +0000 (15:30 +0200)
committerAmaia Anabitarte <amaia@moodle.com>
Tue, 5 May 2020 08:20:20 +0000 (10:20 +0200)
contentbank/classes/content.php
contentbank/classes/contenttype.php
contentbank/contenttype/h5p/classes/contenttype.php
lang/en/contentbank.php
lib/classes/event/contentbank_content_created.php [new file with mode: 0644]
lib/classes/event/contentbank_content_deleted.php [new file with mode: 0644]
lib/classes/event/contentbank_content_updated.php [new file with mode: 0644]
lib/classes/event/contentbank_content_uploaded.php [new file with mode: 0644]
lib/classes/event/contentbank_content_viewed.php [new file with mode: 0644]

index 27975cb..13996a9 100644 (file)
@@ -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;
     }
 
     /**
index 05922b7..7f7fbf5 100644 (file)
@@ -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 '';
     }
index 076ec99..806205d 100644 (file)
@@ -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());
index 1d3b885..06958d6 100644 (file)
@@ -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 <em>\'{$a->name}\'</em> 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 (file)
index 0000000..bf651c7
--- /dev/null
@@ -0,0 +1,137 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Contentbank content created event.
+ *
+ * @package    core
+ * @copyright  2020 Amaia Anabitarte <amaia@moodle.com>
+ * @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 <amaia@moodle.com>
+ * @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 (file)
index 0000000..6021d5a
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Contentbank content deleted event.
+ *
+ * @package    core
+ * @copyright  2020 Amaia Anabitarte <amaia@moodle.com>
+ * @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 <amaia@moodle.com>
+ * @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 (file)
index 0000000..74a3420
--- /dev/null
@@ -0,0 +1,137 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Contentbank content uploaded event.
+ *
+ * @package    core
+ * @copyright  2020 Amaia Anabitarte <amaia@moodle.com>
+ * @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 <amaia@moodle.com>
+ * @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 (file)
index 0000000..1080407
--- /dev/null
@@ -0,0 +1,137 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Contentbank content uploaded event.
+ *
+ * @package    core
+ * @copyright  2020 Amaia Anabitarte <amaia@moodle.com>
+ * @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 <amaia@moodle.com>
+ * @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 (file)
index 0000000..cd8b4d2
--- /dev/null
@@ -0,0 +1,137 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Contentbank content viewed event.
+ *
+ * @package    core
+ * @copyright  2020 Amaia Anabitarte <amaia@moodle.com>
+ * @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 <amaia@moodle.com>
+ * @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;
+    }
+}