MDL-61308 assign_submission: Privacy code for user rights.
[moodle.git] / mod / assign / submission / comments / 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    assignsubmission_comments
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 assignsubmission_comments\privacy;
27 defined('MOODLE_INTERNAL') || die();
29 require_once($CFG->dirroot . '/mod/assign/locallib.php');
31 use \core_privacy\local\metadata\collection;
32 use \core_privacy\local\metadata\provider as metadataprovider;
33 use \core_comment\privacy\provider as comments_provider;
34 use \core_privacy\local\request\contextlist;
35 use \mod_assign\privacy\assign_plugin_request_data;
37 /**
38  * Privacy class for requesting user data.
39  *
40  * @package    assignsubmission_comments
41  * @copyright  2018 Adrian Greeve <adrian@moodle.com>
42  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
43  */
44 class provider implements metadataprovider, \mod_assign\privacy\assignsubmission_provider {
46     /**
47      * Return meta data about this plugin.
48      *
49      * @param  collection $collection A list of information to add to.
50      * @return collection Return the collection after adding to it.
51      */
52     public static function get_metadata(collection $collection) : collection {
53         $collection->link_subsystem('core_comment', 'privacy:metadata:commentpurpose');
54         return $collection;
55     }
57     /**
58      * It is possible to make a comment as a teacher without creating an entry in the submission table, so this is required
59      * to find those entries.
60      *
61      * @param  int $userid The user ID that we are finding contexts for.
62      * @param  contextlist $contextlist A context list to add sql and params to for contexts.
63      */
64     public static function get_context_for_userid_within_submission(int $userid, contextlist $contextlist) {
65         $sql = "SELECT contextid
66                   FROM {comments}
67                  WHERE component = :component
68                        AND commentarea = :commentarea
69                        AND userid = :userid";
70         $params = ['userid' => $userid, 'component' => 'assignsubmission_comments', 'commentarea' => 'submission_comments'];
71         $contextlist->add_from_sql($sql, $params);
72     }
74     /**
75      * Due to the fact that we can't rely on the queries in the mod_assign provider we have to add some additional sql.
76      *
77      * @param  \mod_assign\privacy\useridlist $useridlist An object for obtaining user IDs of students.
78      */
79     public static function get_student_user_ids(\mod_assign\privacy\useridlist $useridlist) {
80         $params = ['assignid' => $useridlist->get_assignid(), 'commentuserid' => $useridlist->get_teacherid(),
81                 'commentuserid2' => $useridlist->get_teacherid()];
82         $sql = "SELECT DISTINCT c.userid AS id
83                   FROM {comments} c
84                   JOIN (SELECT c.itemid
85                           FROM {comments} c
86                           JOIN {assign_submission} s ON s.id = c.itemid AND s.assignment = :assignid
87                          WHERE c.userid = :commentuserid) aa ON aa.itemid = c.itemid
88                  WHERE c.userid NOT IN (:commentuserid2)";
89         $useridlist->add_from_sql($sql, $params);
90     }
92     /**
93      * Export all user data for this plugin.
94      *
95      * @param  assign_plugin_request_data $exportdata Data used to determine which context and user to export and other useful
96      * information to help with exporting.
97      */
98     public static function export_submission_user_data(assign_plugin_request_data $exportdata) {
99         $component = 'assignsubmission_comments';
100         $commentarea = 'submission_comments';
102         $userid = ($exportdata->get_user() != null);
103         $submission = $exportdata->get_pluginobject();
105         // For the moment we are only showing the comments made by this user.
106         comments_provider::export_comments($exportdata->get_context(), $component, $commentarea, $submission->id,
107                 $exportdata->get_subcontext(), $userid);
108     }
110     /**
111      * Delete all the comments made for this context.
112      *
113      * @param  assign_plugin_request_data $requestdata Data to fulfill the deletion request.
114      */
115     public static function delete_submission_for_context(assign_plugin_request_data $requestdata) {
116         comments_provider::delete_comments_for_all_users($requestdata->get_context(), 'assignsubmission_comments',
117                 'submission_comments');
118     }
120     /**
121      * A call to this method should delete user data (where practical) using the userid and submission.
122      *
123      * @param  assign_plugin_request_data $exportdata Details about the user and context to focus the deletion.
124      */
125     public static function delete_submission_for_userid(assign_plugin_request_data $exportdata) {
126         // Create an approved context list to delete the comments.
127         $contextlist = new \core_privacy\local\request\approved_contextlist($exportdata->get_user(), 'assignsubmission_comments',
128             [$exportdata->get_context()->id]);
129         comments_provider::delete_comments_for_user($contextlist, 'assignsubmission_comments', 'submission_comments');
130     }