MDL-61692 core_privacy: add privacyfields to link_ methods
authorJake Dallimore <jake@moodle.com>
Tue, 20 Mar 2018 07:20:22 +0000 (15:20 +0800)
committerJake Dallimore <jake@moodle.com>
Wed, 4 Apr 2018 02:00:39 +0000 (10:00 +0800)
Some subsystems are like conduits, passing data along to plugins which,
in turn, send the data externally. Only the component linking to (using)
the subsystem will know what data it is sending along to the eventual
external system, so should be able to specify this at the time of
linking. The same goes for plugintypes.

privacy/classes/local/metadata/collection.php
privacy/classes/local/metadata/types/plugintype_link.php
privacy/classes/local/metadata/types/subsystem_link.php
privacy/tests/collection_test.php
privacy/tests/types_plugintype_link_test.php
privacy/tests/types_subsystem_link_test.php

index f82a92d..0e7668e 100644 (file)
@@ -86,12 +86,28 @@ class collection {
     /**
      * Function to link a subsystem to the component.
      *
-     * @param   string  $name the name of the subsystem to link.
-     * @param   string  $summary A description of what is stored within this subsystem.
+     * @param   string $name the name of the subsystem to link.
+     * @param   array $privacyfields An optional associative array of fieldname to description.
+     * @param   string $summary A description of what is stored within this subsystem.
+     * @return  $this
+     */
+    public function add_subsystem_link($name, array $privacyfields = [], $summary = '') {
+        $this->add_type(new types\subsystem_link($name, $privacyfields, $summary));
+
+        return $this;
+    }
+
+    /**
+     * Old function to link a subsystem to the component.
+     *
+     * This function is legacy and is not recommended. Please use add_subsystem_link() instead.
+     *
+     * @param   string $name the name of the subsystem to link.
+     * @param   string $summary A description of what is stored within this subsystem.
      * @return  $this
      */
     public function link_subsystem($name, $summary = '') {
-        $this->add_type(new types\subsystem_link($name, $summary));
+        $this->add_type(new types\subsystem_link($name, [], $summary));
 
         return $this;
     }
@@ -100,11 +116,27 @@ class collection {
      * Function to link a plugin to the component.
      *
      * @param   string  $name the name of the plugin to link.
-     * @param   string  $summary A description of what tis stored within this plugin.
+     * @param   array $privacyfields An optional associative array of fieldname to description.
+     * @param   string  $summary A description of what is stored within this plugin.
+     * @return  $this
+     */
+    public function add_plugintype_link($name, array $privacyfields = [], $summary = '') {
+        $this->add_type(new types\plugintype_link($name, $privacyfields, $summary));
+
+        return $this;
+    }
+
+    /**
+     * Old function to link a plugin to the component.
+     *
+     * This function is legacy and is not recommended. Please use add_plugintype_link() instead.
+     *
+     * @param   string  $name the name of the plugin to link.
+     * @param   string  $summary A description of what is stored within this plugin.
      * @return  $this
      */
     public function link_plugintype($name, $summary = '') {
-        $this->add_type(new types\plugintype_link($name, $summary));
+        $this->add_type(new types\plugintype_link($name, [], $summary));
 
         return $this;
     }
@@ -118,6 +150,23 @@ class collection {
      *                           within the component.
      * @return  $this
      */
+    public function add_external_location_link($name, array $privacyfields, $summary = '') {
+        $this->add_type(new types\external_location($name, $privacyfields, $summary));
+
+        return $this;
+    }
+
+    /**
+     * Old function to indicate that data may be exported to an external location.
+     *
+     * This function is legacy and is not recommended. Please use add_external_location_link() instead.
+     *
+     * @param   string  $name A name for the type of data exported.
+     * @param   array   $privacyfields A list of fields with their description.
+     * @param   string  $summary A description of what the table is used for. This is a language string identifier
+     *                           within the component.
+     * @return  $this
+     */
     public function link_external_location($name, array $privacyfields, $summary = '') {
         $this->add_type(new types\external_location($name, $privacyfields, $summary));
 
index 54b29cf..08e3b94 100644 (file)
@@ -38,6 +38,11 @@ class plugintype_link implements type {
      */
     protected $name;
 
+    /**
+     * @var array The list of data names and descriptions.
+     */
+    protected $privacyfields;
+
     /**
      * @var string A description of what this plugintype is used to store.
      */
@@ -49,7 +54,7 @@ class plugintype_link implements type {
      * @param   string  $name The name of the plugintype to link.
      * @param   string  $summary A description of what is stored within this plugintype.
      */
-    public function __construct($name, $summary = '') {
+    public function __construct($name, $privacyfields = [], $summary = '') {
         if (debugging('', DEBUG_DEVELOPER)) {
             $teststring = clean_param($summary, PARAM_STRINGID);
             if ($teststring !== $summary) {
@@ -60,6 +65,7 @@ class plugintype_link implements type {
         }
 
         $this->name = $name;
+        $this->privacyfields = $privacyfields;
         $this->summary = $summary;
     }
 
@@ -78,7 +84,7 @@ class plugintype_link implements type {
      * @return  array
      */
     public function get_privacy_fields() : array {
-        return null;
+        return $this->privacyfields;
     }
 
     /**
index 88eedb5..05e5a3a 100644 (file)
@@ -38,6 +38,11 @@ class subsystem_link implements type {
      */
     protected $name;
 
+    /**
+     * @var array The list of data names and descriptions.
+     */
+    protected $privacyfields;
+
     /**
      * @var string A description of what this subsystem is used to store.
      */
@@ -47,9 +52,10 @@ class subsystem_link implements type {
      * Constructor for the subsystem_link.
      *
      * @param   string  $name The name of the subsystem to link.
+     * @param   array   $privacyfields An optional array of fields and their descriptions.
      * @param   string  $summary A description of what is stored within this subsystem.
      */
-    public function __construct($name, $summary = '') {
+    public function __construct($name, array $privacyfields = [], $summary = '') {
         if (debugging('', DEBUG_DEVELOPER)) {
             $teststring = clean_param($summary, PARAM_STRINGID);
             if ($teststring !== $summary) {
@@ -60,6 +66,7 @@ class subsystem_link implements type {
         }
 
         $this->name = $name;
+        $this->privacyfields = $privacyfields;
         $this->summary = $summary;
     }
 
@@ -78,7 +85,7 @@ class subsystem_link implements type {
      * @return  array
      */
     public function get_privacy_fields() : array {
-        return null;
+        return $this->privacyfields;
     }
 
     /**
index f8a324d..3835175 100644 (file)
@@ -60,7 +60,7 @@ class core_privacy_metadata_collection extends advanced_testcase {
     public function test_add_type_known_type() {
         $collection = new collection('core_privacy');
 
-        $linked = new types\subsystem_link('example', 'langstring');
+        $linked = new types\subsystem_link('example', [], 'langstring');
         $collection->add_type($linked);
 
         $items = $collection->get_collection();
@@ -74,10 +74,10 @@ class core_privacy_metadata_collection extends advanced_testcase {
     public function test_add_type_multiple() {
         $collection = new collection('core_privacy');
 
-        $a = new types\subsystem_link('example', 'langstring');
+        $a = new types\subsystem_link('example', [], 'langstring');
         $collection->add_type($a);
 
-        $b = new types\subsystem_link('example', 'langstring');
+        $b = new types\subsystem_link('example', [], 'langstring');
         $collection->add_type($b);
 
         $items = $collection->get_collection();
index fcb43bf..82e3052 100644 (file)
@@ -44,8 +44,8 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase {
      * @param   string  $name Name
      * @param   string  $summary Summary
      */
-    public function test_invalid_configs($name, $summary) {
-        $record = new plugintype_link($name, $summary);
+    public function test_invalid_configs($name, $privacyfields, $summary) {
+        $record = new plugintype_link($name, $privacyfields, $summary);
         $this->assertDebuggingCalled();
     }
 
@@ -56,12 +56,12 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase {
      * @param   string  $name Name
      * @param   string  $summary Summary
      */
-    public function test_invalid_configs_debug_normal($name, $summary) {
+    public function test_invalid_configs_debug_normal($name, $privacyfields, $summary) {
         global $CFG;
         $this->resetAfterTest();
 
         $CFG->debug = DEBUG_NORMAL;
-        $record = new plugintype_link($name, $summary);
+        $record = new plugintype_link($name, $privacyfields, $summary);
         $this->assertDebuggingNotCalled();
     }
 
@@ -72,8 +72,8 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase {
      * @param   string  $name Name
      * @param   string  $summary Summary
      */
-    public function test_valid_configs($name, $summary) {
-        $record = new plugintype_link($name, $summary);
+    public function test_valid_configs($name, $privacyfields, $summary) {
+        $record = new plugintype_link($name, $privacyfields, $summary);
         $this->assertDebuggingNotCalled();
     }
 
@@ -86,10 +86,12 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase {
         return [
             'Space in summary' => [
                 'example',
+                [],
                 'This table is used for purposes.',
             ],
             'Comma in summary' => [
                 'example',
+                [],
                 'privacy,foo',
             ],
         ];
@@ -104,6 +106,7 @@ class core_privacy_metadata_types_plugintype_link extends advanced_testcase {
         return [
             'Valid combination' => [
                 'example',
+                [],
                 'privacy:example:valid',
             ],
         ];
index 9a6438d..780aa79 100644 (file)
@@ -44,8 +44,8 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase {
      * @param   string  $name Name
      * @param   string  $summary Summary
      */
-    public function test_invalid_configs($name, $summary) {
-        $record = new subsystem_link($name, $summary);
+    public function test_invalid_configs($name, $privacyfields, $summary) {
+        $record = new subsystem_link($name, $privacyfields, $summary);
         $this->assertDebuggingCalled();
     }
 
@@ -56,12 +56,12 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase {
      * @param   string  $name Name
      * @param   string  $summary Summary
      */
-    public function test_invalid_configs_debug_normal($name, $summary) {
+    public function test_invalid_configs_debug_normal($name, $privacyfields, $summary) {
         global $CFG;
         $this->resetAfterTest();
 
         $CFG->debug = DEBUG_NORMAL;
-        $record = new subsystem_link($name, $summary);
+        $record = new subsystem_link($name, $privacyfields, $summary);
         $this->assertDebuggingNotCalled();
     }
 
@@ -72,8 +72,8 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase {
      * @param   string  $name Name
      * @param   string  $summary Summary
      */
-    public function test_valid_configs($name, $summary) {
-        $record = new subsystem_link($name, $summary);
+    public function test_valid_configs($name, $privacyfields, $summary) {
+        $record = new subsystem_link($name, $privacyfields, $summary);
         $this->assertDebuggingNotCalled();
     }
 
@@ -86,10 +86,12 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase {
         return [
             'Space in summary' => [
                 'example',
+                [],
                 'This table is used for purposes.',
             ],
             'Comma in summary' => [
                 'example',
+                [],
                 'privacy,foo',
             ],
         ];
@@ -104,6 +106,7 @@ class core_privacy_metadata_types_subsystem_link extends advanced_testcase {
         return [
             'Valid combination' => [
                 'example',
+                [],
                 'privacy:example:valid',
             ],
         ];