MDL-62030 profilefield_menu: Add privacy files and unit tests
[moodle.git] / user / profile / field / menu / 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    profilefield_menu
21  * @copyright  2018 Mihail Geshoski <mihail@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace profilefield_menu\privacy;
27 defined('MOODLE_INTERNAL') || die();
29 use \core_privacy\local\metadata\collection;
30 use \core_privacy\local\request\contextlist;
31 use \core_privacy\local\request\approved_contextlist;
33 /**
34  * Privacy class for requesting user data.
35  *
36  * @copyright  2018 Mihail Geshoski <mihail@moodle.com>
37  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class provider implements
40     \core_privacy\local\metadata\provider,
41     \core_privacy\local\request\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         return $collection->add_database_table('user_info_data', [
51             'userid' => 'privacy:metadata:profilefield_menu:userid',
52             'fieldid' => 'privacy:metadata:profilefield_menu:fieldid',
53             'data' => 'privacy:metadata:profilefield_menu:data',
54             'dataformat' => 'privacy:metadata:profilefield_menu:dataformat'
55         ], 'privacy:metadata:profilefield_menu:tableexplanation');
56     }
58     /**
59      * Get the list of contexts that contain user information for the specified user.
60      *
61      * @param   int         $userid     The user to search.
62      * @return  contextlist $contextlist  The contextlist containing the list of contexts used in this plugin.
63      */
64     public static function get_contexts_for_userid(int $userid) : contextlist {
65         $sql = "SELECT ctx.id
66                   FROM {user_info_data} uda
67                   JOIN {user_info_field} uif ON uda.fieldid = uif.id
68                   JOIN {context} ctx ON ctx.instanceid = uda.userid
69                        AND ctx.contextlevel = :contextlevel
70                  WHERE uda.userid = :userid
71                        AND uif.datatype = :datatype";
72         $params = [
73             'userid' => $userid,
74             'contextlevel' => CONTEXT_USER,
75             'datatype' => 'menu'
76         ];
77         $contextlist = new contextlist();
78         $contextlist->add_from_sql($sql, $params);
80         return $contextlist;
81     }
83     /**
84      * Export all user data for the specified user, in the specified contexts.
85      *
86      * @param approved_contextlist $contextlist The approved contexts to export information for.
87      */
88     public static function export_user_data(approved_contextlist $contextlist) {
89         $user = $contextlist->get_user();
90         foreach ($contextlist->get_contexts() as $context) {
91             // Check if the context is a user context.
92             if ($context->contextlevel == CONTEXT_USER && $context->instanceid == $user->id) {
93                 $results = static::get_records($user->id);
94                 foreach ($results as $result) {
95                     $data = (object) [
96                         'name' => $result->name,
97                         'description' => $result->description,
98                         'data' => $result->data
99                     ];
100                     \core_privacy\local\request\writer::with_context($context)->export_data([
101                         get_string('pluginname', 'profilefield_menu')], $data);
102                 }
103             }
104         }
105     }
107     /**
108      * Delete all user data which matches the specified context.
109      *
110      * @param   context $context A user context.
111      */
112     public static function delete_data_for_all_users_in_context(\context $context) {
113         // Delete data only for user context.
114         if ($context->contextlevel == CONTEXT_USER) {
115             static::delete_data($context->instanceid);
116         }
117     }
119     /**
120      * Delete all user data for the specified user, in the specified contexts.
121      *
122      * @param   approved_contextlist    $contextlist    The approved contexts and user information to delete information for.
123      */
124     public static function delete_data_for_user(approved_contextlist $contextlist) {
125         $user = $contextlist->get_user();
126         foreach ($contextlist->get_contexts() as $context) {
127             // Check if the context is a user context.
128             if ($context->contextlevel == CONTEXT_USER && $context->instanceid == $user->id) {
129                 static::delete_data($context->instanceid);
130             }
131         }
132     }
134     /**
135      * Delete data related to a userid.
136      *
137      * @param  int $userid The user ID
138      */
139     protected static function delete_data($userid) {
140         global $DB;
142         $params = [
143             'userid' => $userid,
144             'datatype' => 'menu'
145         ];
147         $DB->delete_records_select('user_info_data', "fieldid IN (
148                 SELECT id FROM {user_info_field} WHERE datatype = :datatype)
149                 AND userid = :userid", $params);
150     }
152     /**
153      * Get records related to this plugin and user.
154      *
155      * @param  int $userid The user ID
156      * @return array An array of records.
157      */
158     protected static function get_records($userid) {
159         global $DB;
161         $sql = "SELECT *
162                   FROM {user_info_data} uda
163                   JOIN {user_info_field} uif ON uda.fieldid = uif.id
164                  WHERE uda.userid = :userid
165                        AND uif.datatype = :datatype";
166         $params = [
167             'userid' => $userid,
168             'datatype' => 'menu'
169         ];
171         return $DB->get_records_sql($sql, $params);
172     }