MDL-61899 tool_dataprivacy: Addition of plugin compliance registry.
[moodle.git] / admin / tool / dataprivacy / classes / metadata_registry.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  * Class containing helper methods for processing data requests.
19  *
20  * @package    tool_dataprivacy
21  * @copyright  2018 Adrian Greeve
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 namespace tool_dataprivacy;
26 defined('MOODLE_INTERNAL') || die();
28 /**
29  * Class containing helper methods for processing data requests.
30  *
31  * @copyright  2018 Adrian Greeve
32  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
33  */
34 class metadata_registry {
36     /**
37      * Returns plugin types / plugins and the user data that it stores in a format that can be sent to a template.
38      *
39      * @return array An array with all of the plugin types / plugins and the user data they store.
40      */
41     public function get_registry_metadata() {
42         $manager = new \core_privacy\manager();
43         $pluginman = \core_plugin_manager::instance();
44         $contributedplugins = $this->get_contrib_list();
45         $metadata = $manager->get_metadata_for_components();
46         $fullyrichtree = $this->get_full_component_list();
47         foreach ($fullyrichtree as $branch => $leaves) {
48             $plugintype = $leaves['plugin_type'];
49             $plugins = array_map(function($component) use ($manager, $metadata, $contributedplugins, $plugintype, $pluginman) {
50                 // Use the plugin name for the plugins, ignore for core subsystems.
51                 $internaldata = ($plugintype == 'core') ? ['component' => $component] :
52                         ['component' => $pluginman->plugin_name($component)];
53                 $internaldata['raw_component'] = $component;
54                 if ($manager->component_is_compliant($component)) {
55                     $internaldata['compliant'] = true;
56                     if (isset($metadata[$component])) {
57                         $collection = $metadata[$component]->get_collection();
58                         $internaldata = $this->format_metadata($collection, $component, $internaldata);
59                     } else {
60                         // Call get_reason for null provider.
61                         $internaldata['nullprovider'] = get_string($manager->get_null_provider_reason($component), $component);
62                     }
63                 } else {
64                     $internaldata['compliant'] = false;
65                 }
66                 // Check to see if we are an external plugin.
67                 $componentshortname = explode('_', $component);
68                 $shortname = array_pop($componentshortname);
69                 if (isset($contributedplugins[$plugintype][$shortname])) {
70                     $internaldata['external'] = true;
71                 }
72                 return $internaldata;
73             }, $leaves['plugins']);
74             $fullyrichtree[$branch]['plugin_type_raw'] = $plugintype;
75             // We're done using the plugin type. Convert it to a readable string.
76             $fullyrichtree[$branch]['plugin_type'] = $pluginman->plugintype_name($plugintype);
77             $fullyrichtree[$branch]['plugins'] = $plugins;
78         }
79         return $fullyrichtree;
80     }
82     /**
83      * Formats the metadata for use with a template.
84      *
85      * @param  array $collection The collection associated with the component that we want to expand and format.
86      * @param  string $component The component that we are dealing in
87      * @param  array $internaldata The array to add the formatted metadata to.
88      * @return array The internal data array with the formatted metadata.
89      */
90     protected function format_metadata($collection, $component, $internaldata) {
91         foreach ($collection as $collectioninfo) {
92             $privacyfields = $collectioninfo->get_privacy_fields();
93             $fields = '';
94             if (!empty($privacyfields)) {
95                 $fields = array_map(function($key, $field) use ($component) {
96                     return [
97                         'field_name' => $key,
98                         'field_summary' => get_string($field, $component)
99                     ];
100                 }, array_keys($privacyfields), $privacyfields);
101             }
102             // Can the metadata types be located somewhere else besides core?
103             $items = explode('\\', get_class($collectioninfo));
104             $type = array_pop($items);
105             $typedata = [
106                 'name' => $collectioninfo->get_name(),
107                 'type' => $type,
108                 'fields' => $fields,
109                 'summary' => get_string($collectioninfo->get_summary(), $component)
110             ];
111             if (strpos($type, 'subsystem_link') === 0 || strpos($type, 'plugintype_link') === 0) {
112                 $typedata['link'] = true;
113             }
114             $internaldata['metadata'][] = $typedata;
115         }
116         return $internaldata;
117     }
119     /**
120      * Return the full list of components.
121      *
122      * @return array An array of plugin types which contain plugin data.
123      */
124     protected function get_full_component_list() {
125         $list = \core_component::get_component_list();
126         $formattedlist = [];
127         foreach ($list as $plugintype => $plugin) {
128             $formattedlist[] = ['plugin_type' => $plugintype, 'plugins' => array_keys($plugin)];
129         }
130         return $formattedlist;
131     }
133     /**
134      * Returns a list of contributed plugins installed on the system.
135      *
136      * @return array A list of contributed plugins installed.
137      */
138     protected function get_contrib_list() {
139         return array_map(function($plugins) {
140             return array_filter($plugins, function($plugindata) {
141                 return !$plugindata->is_standard();
142             });    
143         }, \core_plugin_manager::instance()->get_plugins());
144     }