MDL-62257 mnetservice_enrol: Implement Privacy API
[moodle.git] / mnet / service / enrol / 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 mnetservice_enrol.
18  *
19  * @package    mnetservice_enrol
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 mnetservice_enrol\privacy;
24 defined('MOODLE_INTERNAL') || die();
25 use core_privacy\local\metadata\collection;
26 use core_privacy\local\request\approved_contextlist;
27 use core_privacy\local\request\context;
28 use core_privacy\local\request\contextlist;
29 use core_privacy\local\request\transform;
30 use core_privacy\local\request\writer;
31 /**
32  * Privacy Subsystem for mnetservice_enrol implementing metadata and plugin providers.
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\subsystem\provider {
40     /**
41      * Returns meta data about this system.
42      *
43      * @param   collection $collection The initialised collection to add items to.
44      * @return  collection     A listing of user data stored through this system.
45      */
46     public static function get_metadata(collection $collection) : collection {
47         $collection->add_database_table(
48             'mnetservice_enrol_enrolments',
49             [
50                 'hostid' => 'privacy:metadata:mnetservice_enrol_enrolments:hostid',
51                 'userid' => 'privacy:metadata:mnetservice_enrol_enrolments:userid',
52                 'remotecourseid' => 'privacy:metadata:mnetservice_enrol_enrolments:remotecourseid',
53                 'rolename' => 'privacy:metadata:mnetservice_enrol_enrolments:rolename',
54                 'enroltime' => 'privacy:metadata:mnetservice_enrol_enrolments:enroltime',
55                 'enroltype' => 'privacy:metadata:mnetservice_enrol_enrolments:enroltype'
56             ],
57             'privacy:metadata:mnetservice_enrol_enrolments:tableexplanation'
58         );
60         return $collection;
61     }
62     /**
63      * Get the list of contexts that contain user information for the specified user.
64      *
65      * @param   int $userid The user to search.
66      * @return  contextlist   $contextlist  The contextlist containing the list of contexts used in this plugin.
67      */
68     public static function get_contexts_for_userid(int $userid) : contextlist {
69         $sql = "SELECT c.id
70                   FROM {context} c
71                   JOIN {mnetservice_enrol_enrolments} me
72                     ON me.userid = c.instanceid
73                    AND c.contextlevel = :contextlevel
74                  WHERE me.userid = :userid";
75         $params = [
76             'contextlevel' => CONTEXT_USER,
77             'userid'       => $userid
78         ];
79         $contextlist = new contextlist();
80         $contextlist->add_from_sql($sql, $params);
81         return $contextlist;
82     }
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         global $DB;
90         if (empty($contextlist->count())) {
91             return;
92         }
93         $userid = $contextlist->get_user()->id;
94         $contextuser = \context_user::instance($userid);
95         list($insql, $inparams) = $DB->get_in_or_equal($contextlist->get_contextids(), SQL_PARAMS_NAMED);
96         $params = [
97             'userid' => $userid,
98             'contextlevel' => CONTEXT_USER
99          ];
100         $params += $inparams;
101         $sql = "SELECT me.id,
102                        me.rolename,
103                        me.enroltime,
104                        me.enroltype,
105                        mh.name as hostname,
106                        mc.fullname
107                   FROM {mnetservice_enrol_enrolments} me
108                   JOIN {context} ctx
109                     ON ctx.instanceid = me.userid
110                    AND ctx.contextlevel = :contextlevel
111                   JOIN {mnet_host} mh
112                     ON mh.id = me.hostid
113                   JOIN {mnetservice_enrol_courses} mc
114                     ON mc.remoteid = me.remotecourseid
115                  WHERE me.userid = :userid
116                    AND ctx.id {$insql}";
117         $mnetenrolments = $DB->get_records_sql($sql, $params);
118         foreach ($mnetenrolments as $mnetenrolment) {
119             // The core_enrol data export is organised in:
120             // {User Context}/User enrolments/data.json.
121             $data[] = (object) [
122                 'host' => $mnetenrolment->hostname,
123                 'remotecourseid' => $mnetenrolment->fullname,
124                 'rolename' => $mnetenrolment->rolename,
125                 'enroltime' => transform::datetime($mnetenrolment->enroltime),
126                 'enroltype' => $mnetenrolment->enroltype
127             ];
128         }
129         writer::with_context($contextuser)->export_data(
130                 [get_string('privacy:metadata:mnetservice_enrol_enrolments', 'mnetservice_enrol')],
131                 (object)$data
132             );
133     }
134     /**
135      * Delete all data for all users in the specified context.
136      *
137      * @param   context $context The specific context to delete data for.
138      */
139     public static function delete_data_for_all_users_in_context(\context $context) {
140         if (empty($context)) {
141             return;
142         }
143         // Sanity check that context is at the User context level.
144         if ($context->contextlevel == CONTEXT_USER) {
145             static::delete_user_data($context->instanceid);
146         }
147     }
148     /**
149      * Delete all user data for the specified user, in the specified contexts.
150      *
151      * @param   approved_contextlist $contextlist The approved contexts and user information to delete information for.
152      */
153     public static function delete_data_for_user(approved_contextlist $contextlist) {
154         if (empty($contextlist->count())) {
155             return;
156         }
157         $user = $contextlist->get_user();
158         foreach ($contextlist->get_contexts() as $context) {
159             // Verify the context is a user context and that the instanceid matches the userid of the contextlist.
160             if ($context->contextlevel == CONTEXT_USER && $context->instanceid == $user->id) {
161                 // Get the data and write it.
162                  static::delete_user_data($user->id);
163             }
164         }
165     }
166     /**
167      * This does the deletion of user data for the auth_oauth2.
168      *
169      * @param  int $userid The user ID
170      */
171     protected static function delete_user_data(int $userid) {
172         global $DB;
173         // Because we only use user contexts the instance ID is the user ID.
174         $DB->delete_records('mnetservice_enrol_enrolments', ['userid' => $userid]);
175     }