MDL-61944 tool_mobile: Implement Privacy API
[moodle.git] / admin / tool / mobile / 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/>.
16 /**
17  * Privacy Subsystem implementation for tool_mobile.
18  *
19  * @package    tool_mobile
20  * @copyright  2018 Carlos Escobedo <carlos@moodle.com>
21  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
22  */
23 namespace tool_mobile\privacy;
24 defined('MOODLE_INTERNAL') || die();
25 use \core_privacy\local\request\writer;
26 use \core_privacy\local\metadata\collection;
27 use \core_privacy\local\request\contextlist;
28 use \core_privacy\local\request\approved_contextlist;
29 use \core_privacy\local\request\transform;
31 /**
32  * Privacy provider for tool_mobile.
33  *
34  * @copyright  2018 Carlos Escobedo <carlos@moodle.com>
35  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class provider implements
38     \core_privacy\local\metadata\provider,
39     \core_privacy\local\request\user_preference_provider,
40     \core_privacy\local\request\plugin\provider {
41     /**
42      * Returns meta data about this system.
43      *
44      * @param   collection     $collection The initialised item collection to add items to.
45      * @return  collection     A listing of user data stored through this system.
46      */
47     public static function get_metadata(collection $collection) : collection {
48         // There is a one user preference.
49         $collection->add_user_preference('tool_mobile_autologin_request_last',
50             'privacy:metadata:preference:tool_mobile_autologin_request_last');
51         $collection->add_subsystem_link('core_userkey', [], 'privacy:metadata:core_userkey');
53         return $collection;
54     }
55     /**
56      * Get the list of contexts that contain user information for the specified user.
57      *
58      * @param int $userid The user to search.
59      * @return contextlist $contextlist The contextlist containing the list of contexts used in this plugin.
60      */
61     public static function get_contexts_for_userid(int $userid) : contextlist {
62         $sql = "SELECT ctx.id
63                   FROM {user_private_key} k
64                   JOIN {user} u ON k.userid = u.id
65                   JOIN {context} ctx ON ctx.instanceid = u.id AND ctx.contextlevel = :contextlevel
66                  WHERE k.userid = :userid AND k.script = 'tool_mobile'";
67         $params = ['userid' => $userid, 'contextlevel' => CONTEXT_USER];
68         $contextlist = new contextlist();
69         $contextlist->add_from_sql($sql, $params);
71         return $contextlist;
72     }
73     /**
74      * Export all user data for the specified user, in the specified contexts.
75      *
76      * @param approved_contextlist $contextlist The approved contexts to export information for.
77      */
78     public static function export_user_data(approved_contextlist $contextlist) {
79         // If the user has data, then only the CONTEXT_USER should be present so get the first context.
80         $contexts = $contextlist->get_contexts();
81         if (count($contexts) == 0) {
82             return;
83         }
84         $context = reset($contexts);
85         // Sanity check that context is at the user context level, then get the userid.
86         if ($context->contextlevel !== CONTEXT_USER) {
87             return;
88         }
89         // Export associated userkeys.
90         \core_userkey\privacy\provider::export_userkeys($context, [], 'tool_mobile');
91     }
92     /**
93      * Export all user preferences for the plugin.
94      *
95      * @param   int         $userid The userid of the user whose data is to be exported.
96      */
97     public static function export_user_preferences(int $userid) {
98         $autologinrequestlast = get_user_preferences('tool_mobile_autologin_request_last', null, $userid);
99         if ($autologinrequestlast !== null) {
100             $time = transform::datetime($autologinrequestlast);
101             writer::export_user_preference('tool_mobile',
102                 'tool_mobile_autologin_request_last',
103                 $time,
104                 get_string('privacy:metadata:preference:tool_mobile_autologin_request_last', 'tool_mobile')
105             );
106         }
107     }
108     /**
109      * Delete all use data which matches the specified deletion_criteria.
110      *
111      * @param context $context A user context.
112      */
113     public static function delete_data_for_all_users_in_context(\context $context) {
114         // Sanity check that context is at the user context level, then get the userid.
115         if ($context->contextlevel !== CONTEXT_USER) {
116             return;
117         }
118         $userid = $context->instanceid;
119         // Delete all the userkeys.
120         \core_userkey\privacy\provider::delete_userkeys('tool_mobile', $userid);
121     }
122     /**
123      * Delete all user data for the specified user, in the specified contexts.
124      *
125      * @param approved_contextlist $contextlist The approved contexts and user information to delete information for.
126      */
127     public static function delete_data_for_user(approved_contextlist $contextlist) {
128         // If the user has data, then only the user context should be present so get the first context.
129         $contexts = $contextlist->get_contexts();
130         if (count($contexts) == 0) {
131             return;
132         }
133         $context = reset($contexts);
134         // Sanity check that context is at the user context level, then get the userid.
135         if ($context->contextlevel !== CONTEXT_USER) {
136             return;
137         }
138         $userid = $context->instanceid;
139         // Delete all the userkeys.
140         \core_userkey\privacy\provider::delete_userkeys('tool_mobile', $userid);
141     }