MDL-62601 editor_atto: Do not use context_user
authorAndrew Nicols <andrew@nicols.co.uk>
Thu, 25 Oct 2018 02:47:29 +0000 (10:47 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Wed, 31 Oct 2018 05:45:00 +0000 (13:45 +0800)
lib/editor/atto/classes/privacy/provider.php

index 44effe0..4c64685 100644 (file)
@@ -72,15 +72,16 @@ class provider implements
         // This block doesn't know who information is stored against unless it
         // is at the user context.
         $contextlist = new \core_privacy\local\request\contextlist();
         // This block doesn't know who information is stored against unless it
         // is at the user context.
         $contextlist = new \core_privacy\local\request\contextlist();
-        $contextuser = \context_user::instance($userid);
 
 
-        $sql = "SELECT contextid FROM {editor_atto_autosave} WHERE userid = :userid OR contextid = :contextid";
-        $params = [
-            'userid' => $userid,
-            'contextid' => $contextuser->id,
-        ];
+        $sql = "SELECT
+                    c.id
+                  FROM {editor_atto_autosave} eas
+                  JOIN {context} c ON c.id = eas.contextid
+                 WHERE contextlevel = :contextuser AND c.instanceid = :userid";
+        $contextlist->add_from_sql($sql, ['contextuser' => CONTEXT_USER, 'userid' => $userid]);
 
 
-        $contextlist->add_from_sql($sql, $params);
+        $sql = "SELECT contextid FROM {editor_atto_autosave} WHERE userid = :userid";
+        $contextlist->add_from_sql($sql, ['userid' => $userid]);
 
         return $contextlist;
     }
 
         return $contextlist;
     }
@@ -95,20 +96,34 @@ class provider implements
 
         $user = $contextlist->get_user();
 
 
         $user = $contextlist->get_user();
 
+        $sql = "SELECT *
+                  FROM {editor_atto_autosave}
+                 WHERE userid = :userid AND contextid {$contextsql}";
+
         list($contextsql, $contextparams) = $DB->get_in_or_equal($contextlist->get_contextids(), SQL_PARAMS_NAMED);
         $contextparams['userid'] = $contextlist->get_user()->id;
         list($contextsql, $contextparams) = $DB->get_in_or_equal($contextlist->get_contextids(), SQL_PARAMS_NAMED);
         $contextparams['userid'] = $contextlist->get_user()->id;
+        $autosaves = $DB->get_recordset_sql($sql, $contextparams);
+        self::export_autosaves($user, $autosaves);
 
         $sql = "SELECT *
                   FROM {editor_atto_autosave}
 
         $sql = "SELECT *
                   FROM {editor_atto_autosave}
-                 WHERE
-                    (userid = :userid AND contextid {$contextsql})
-                    OR
-                    (contextid = :usercontext)";
+                  JOIN {context} c ON c.id = eas.contextid
+                 WHERE c.id {$contextsql} AND contextlevel = :contextuser AND c.instanceid = :userid";
 
 
-        $usercontext = \context_user::instance($user->id);
-        $contextparams['usercontext'] = $usercontext->id;
+        list($contextsql, $contextparams) = $DB->get_in_or_equal($contextlist->get_contextids(), SQL_PARAMS_NAMED);
+        $contextparams['userid'] = $contextlist->get_user()->id;
+        $contextparams['contextuser'] = CONTEXT_USER;
         $autosaves = $DB->get_recordset_sql($sql, $contextparams);
         $autosaves = $DB->get_recordset_sql($sql, $contextparams);
+        self::export_autosaves($user, $autosaves);
+    }
 
 
+    /**
+     * Export all autosave records in the recordset, and close the recordset when finished.
+     *
+     * @param   \stdClass   $user The user whose data is to be exported
+     * @param   \moodle_recordset $autosaves The recordset containing the data to export
+     */
+    protected static function export_autosaves(\stdClass $user, \moodle_recordset $autosaves) {
         foreach ($autosaves as $autosave) {
             $context = \context::instance_by_id($autosave->contextid);
             $subcontext = [
         foreach ($autosaves as $autosave) {
             $context = \context::instance_by_id($autosave->contextid);
             $subcontext = [