MDL-62035 core_comment: Update to deletion methods.
[moodle.git] / comment / classes / privacy / provider.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Privacy class for requesting user data.
19  *
20  * @package    core_comment
21  * @copyright  2018 Adrian Greeve <adrian@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core_comment\privacy;
27 defined('MOODLE_INTERNAL') || die();
29 use \core_privacy\local\metadata\collection;
30 use \core_privacy\local\request\transform;
32 require_once($CFG->dirroot . '/comment/lib.php');
34 /**
35  * Privacy class for requesting user data.
36  *
37  * @package    core_comment
38  * @copyright  2018 Adrian Greeve <adrian@moodle.com>
39  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
40  */
41 class provider implements \core_privacy\local\metadata\provider, \core_privacy\local\request\subsystem\plugin_provider {
43     /**
44      * Returns meta data about this system.
45      *
46      * @param   collection     $collection The initialised collection to add items to.
47      * @return  collection     A listing of user data stored through this system.
48      */
49     public static function get_metadata(collection $collection) : collection {
50         $collection->add_database_table('comments', [
51                 'content' => 'privacy:metadata:comment:content',
52                 'timecreated' => 'privacy:metadata:comment:timecreated',
53                 'userid' => 'privacy:metadata:comment:userid',
54             ], 'privacy:metadata:comment');
56         return $collection;
57     }
59     /**
60      * Writes user data to the writer for the user to download.
61      *
62      * @param  \context $context The context to export data for.
63      * @param  string $component The component that is calling this function
64      * @param  string $commentarea The comment area related to the component
65      * @param  int    $itemid An identifier for a group of comments
66      * @param  array  $subcontext The sub-context in which to export this data
67      * @param  bool   $onlyforthisuser  Only return the comments this user made.
68      */
69     public static function export_comments(\context $context, string $component, string $commentarea, int $itemid,
70             array $subcontext, bool $onlyforthisuser = true) {
71         $data = new \stdClass;
72         $data->context   = $context;
73         $data->area      = $commentarea;
74         $data->itemid    = $itemid;
75         $data->component = $component;
77         $commentobject = new \comment($data);
78         $commentobject->set_view_permission(true);
79         $comments = $commentobject->get_comments(0);
80         $subcontext[] = get_string('commentsubcontext', 'core_comment');
82         $comments = array_filter($comments, function($comment) use ($onlyforthisuser) {
83             global $USER;
85             return (!$onlyforthisuser || $comment->userid == $USER->id);
86         });
88         $comments = array_map(function($comment) {
89             return (object) [
90                 'content' => $comment->content,
91                 'time' => transform::datetime($comment->timecreated),
92                 'userid' => transform::user($comment->userid),
93             ];
94         }, $comments);
96         if (!empty($comments)) {
97             \core_privacy\local\request\writer::with_context($context)
98                 ->export_data($subcontext, (object) [
99                     'comments' => $comments,
100                 ]);
101         }
102     }
104     /**
105      * Deletes all comments for a specified context, component, and commentarea.
106      *
107      * @param  \context $context Details about which context to delete comments for.
108      * @param  string $component Component to delete.
109      * @param  string $commentarea Comment area to delete.
110      * @param  int $itemid The item ID for use with deletion.
111      */
112     public static function delete_comments_for_all_users(\context $context, string $component, string $commentarea = null,
113             int $itemid = null) {
114         global $DB;
115         $params = [
116             'contextid' => $context->id,
117             'component' => $component
118         ];
119         if (isset($commentarea)) {
120             $params['commentarea'] = $commentarea;
121         }
122         if (isset($itemid)) {
123             $params['itemid'] = $itemid;
124         }
125         $DB->delete_records('comments', $params);
126     }
128     /**
129      * Deletes all records for a user from a list of approved contexts.
130      *
131      * @param  \core_privacy\local\request\approved_contextlist $contextlist Contains the user ID and a list of contexts to be
132      * deleted from.
133      * @param  string $component Component to delete from.
134      * @param  string $commentarea Area to delete from.
135      * @param  int $itemid The item id to delete from.
136      */
137     public static function delete_comments_for_user(\core_privacy\local\request\approved_contextlist $contextlist,
138             string $component, string $commentarea = null, int $itemid = null) {
139         global $DB;
141         $userid = $contextlist->get_user()->id;
142         $contextids = implode(',', $contextlist->get_contextids());
143         $params = [
144             'userid' => $userid,
145             'component' => $component,
146         ];
147         $areasql = '';
148         if (isset($commentarea)) {
149             $params['commentarea'] = $commentarea;
150             $areasql = 'AND commentarea = :commentarea';
151         }
152         $itemsql = '';
153         if (isset($itemid)) {
154             $params['itemid'] = $itemid;
155             $itemsql = 'AND itemid = :itemid';
156         }
157         list($insql, $inparams) = $DB->get_in_or_equal($contextlist->get_contextids(), SQL_PARAMS_NAMED);
158         $params += $inparams;
160         $select = "userid = :userid AND component = :component $areasql $itemsql AND contextid $insql";
161         $DB->delete_records_select('comments', $select, $params);
162     }