From cf961f344e929ff56d8f98154b6de2601355bf16 Mon Sep 17 00:00:00 2001
From: Ron Lucke <lucke@elan-ev.de>
Date: Fri, 26 May 2023 08:58:15 +0000
Subject: [PATCH] fix #797

Closes #797

Merge request studip/studip!1814
---
 app/controllers/privacy.php                   |  2 +-
 lib/classes/Privacy.php                       | 15 +++++-
 lib/models/Courseware/Block.php               | 20 ++++++-
 lib/models/Courseware/BlockComment.php        | 19 ++++++-
 lib/models/Courseware/BlockFeedback.php       | 19 ++++++-
 lib/models/Courseware/Bookmark.php            | 19 ++++++-
 lib/models/Courseware/Container.php           | 20 ++++++-
 lib/models/Courseware/StructuralElement.php   | 20 ++++++-
 .../Courseware/StructuralElementComment.php   | 19 ++++++-
 .../Courseware/StructuralElementFeedback.php  | 19 ++++++-
 lib/models/Courseware/TaskFeedback.php        | 19 ++++++-
 lib/models/Courseware/TaskGroup.php           | 20 ++++++-
 lib/models/Courseware/Unit.php                | 19 ++++++-
 lib/models/Courseware/UserDataField.php       | 19 ++++++-
 lib/models/Courseware/UserProgress.php        | 19 ++++++-
 lib/modules/CoursewareModule.class.php        | 54 +------------------
 16 files changed, 254 insertions(+), 68 deletions(-)

diff --git a/app/controllers/privacy.php b/app/controllers/privacy.php
index 60d3c33488d..ee1f1574293 100644
--- a/app/controllers/privacy.php
+++ b/app/controllers/privacy.php
@@ -439,7 +439,7 @@ class PrivacyController extends AuthenticatedController
             'content' => [
                 'icon'        => Icon::create('forum2'),
                 'title'       => _('Inhalte'),
-                'description' => _('Dateien, Forum, Wiki, Literaturlisten'),
+                'description' => _('Courseware, Dateien, Forum, Wiki, Literaturlisten'),
             ],
             'quest' => [
                 'icon'        => Icon::create('vote'),
diff --git a/lib/classes/Privacy.php b/lib/classes/Privacy.php
index bb3bcddc60a..870e96ba3c8 100644
--- a/lib/classes/Privacy.php
+++ b/lib/classes/Privacy.php
@@ -43,7 +43,20 @@ class Privacy
         'content' => [
             'FileRef',
             'ForumEntry',
-            'WikiPage'
+            'WikiPage',
+            'Courseware\Unit',
+            'Courseware\StructuralElement',
+            'Courserware\StructuralElementComment',
+            'Courserware\StructuralElementFeedback',
+            'Courseware\TaskGroup',
+            'Courseware\TaskFeedback',
+            'Courseware\Bookmark',
+            'Courseware\Container',
+            'Courseware\Block',
+            'Courserware\BlockComment',
+            'Courserware\BlockFeedback',
+            'Courseware\UserDataField',
+            'Courseware\UserProgress'
         ],
         'quest' => [
             'Evaluation',
diff --git a/lib/models/Courseware/Block.php b/lib/models/Courseware/Block.php
index 05d5d45c1b1..bd0361897dd 100644
--- a/lib/models/Courseware/Block.php
+++ b/lib/models/Courseware/Block.php
@@ -36,7 +36,7 @@ use User;
  * @property \User                            $edit_blocker    belongs_to User
  * @property \Courseware\Container            $container       belongs_to Courseware\Container
  */
-class Block extends \SimpleORMap
+class Block extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -222,4 +222,22 @@ class Block extends \SimpleORMap
 
         return StructuralElement::build($structuralElement, false);
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $blocks = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_blocks WHERE owner_id = ? OR editor_id = ?',
+            [$storage->user_id, $storage->user_id]
+        );
+        if ($blocks) {
+            $storage->addTabularData(_('Courseware Blöcke'), 'cw_blocks', $blocks);
+        }
+        
+    }
 }
diff --git a/lib/models/Courseware/BlockComment.php b/lib/models/Courseware/BlockComment.php
index 16f3a73293d..fc6811120b1 100644
--- a/lib/models/Courseware/BlockComment.php
+++ b/lib/models/Courseware/BlockComment.php
@@ -23,7 +23,7 @@ use User;
  * @property \User             $user     belongs_to User
  * @property \Courseware\Block $block    belongs_to Courseware\Block
  */
-class BlockComment extends \SimpleORMap
+class BlockComment extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -57,4 +57,21 @@ class BlockComment extends \SimpleORMap
 
         return StructuralElement::build($structuralElement, false);
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $comments = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_block_comments WHERE user_id = ?',
+            [$storage->user_id]
+        );
+        if ($comments) {
+            $storage->addTabularData(_('Courseware Block Kommentare'), 'cw_block_comments', $comments);
+        }
+    }
 }
diff --git a/lib/models/Courseware/BlockFeedback.php b/lib/models/Courseware/BlockFeedback.php
index 422577097a1..21eed5d0a37 100644
--- a/lib/models/Courseware/BlockFeedback.php
+++ b/lib/models/Courseware/BlockFeedback.php
@@ -21,7 +21,7 @@ use User;
  * @property \User             $user      belongs_to User
  * @property \Courseware\Block $block     belongs_to Courseware\Block
  */
-class BlockFeedback extends \SimpleORMap
+class BlockFeedback extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -55,4 +55,21 @@ class BlockFeedback extends \SimpleORMap
 
         return StructuralElement::build($structuralElement, false);
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $feedback = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_block_feedbacks WHERE user_id = ?',
+            [$storage->user_id]
+        );
+        if ($feedback) {
+            $storage->addTabularData(_('Courseware Block Feedback'), 'cw_block_feedback', $feedback);
+        }
+    }
 }
diff --git a/lib/models/Courseware/Bookmark.php b/lib/models/Courseware/Bookmark.php
index e11954825cc..ddff953a289 100644
--- a/lib/models/Courseware/Bookmark.php
+++ b/lib/models/Courseware/Bookmark.php
@@ -20,7 +20,7 @@ namespace Courseware;
  * @property \User                         $user       belongs_to User
  * @property \Courseware\StructuralElement $element    belongs_to Courseware\StructuralElement
  */
-class Bookmark extends \SimpleORMap
+class Bookmark extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -62,4 +62,21 @@ class Bookmark extends \SimpleORMap
     {
         return self::findBySQL('user_id = ? ORDER BY chdate', [$user->id]);
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $bookmarks = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_bookmarks WHERE user_id = ?',
+            [$storage->user_id]
+        );
+        if ($bookmarks) {
+            $storage->addTabularData(_('Courseware Lesezeichen'), 'cw_bookmarks', $bookmarks);
+        }
+    }
 }
diff --git a/lib/models/Courseware/Container.php b/lib/models/Courseware/Container.php
index 088f53959c4..082a9a01769 100644
--- a/lib/models/Courseware/Container.php
+++ b/lib/models/Courseware/Container.php
@@ -33,7 +33,7 @@ use User;
  * @property \User                                    $edit_blocker          belongs_to User
  * @property \Courseware\StructuralElement            $structural_element    belongs_to Courseware\StructuralElement
  */
-class Container extends \SimpleORMap
+class Container extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -142,4 +142,22 @@ class Container extends \SimpleORMap
 
         return [$blockMap, $newBlockList];
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $containers = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_containers WHERE owner_id = ? OR editor_id = ?',
+            [$storage->user_id, $storage->user_id]
+        );
+        if ($containers) {
+            $storage->addTabularData(_('Courseware Abschnitte'), 'cw_containers', $containers);
+        }
+        
+    }
 }
diff --git a/lib/models/Courseware/StructuralElement.php b/lib/models/Courseware/StructuralElement.php
index deaab1a177c..3e405f3b2f0 100644
--- a/lib/models/Courseware/StructuralElement.php
+++ b/lib/models/Courseware/StructuralElement.php
@@ -53,7 +53,7 @@ use User;
  * @SuppressWarnings(PHPMD.TooManyPublicMethods)
  * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
  */
-class StructuralElement extends \SimpleORMap
+class StructuralElement extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -1091,4 +1091,22 @@ SQL;
             }
         }
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $structuralElements = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_structural_elements WHERE ? IN (owner_id, editor_id, range_id)',
+            [$storage->user_id]
+        );
+        if ($structuralElements) {
+            $storage->addTabularData(_('Courseware Seiten'), 'cw_structural_elements', $structuralElements);
+        }
+        
+    }
 }
diff --git a/lib/models/Courseware/StructuralElementComment.php b/lib/models/Courseware/StructuralElementComment.php
index e5fbc818a9c..1e046c4d4e7 100644
--- a/lib/models/Courseware/StructuralElementComment.php
+++ b/lib/models/Courseware/StructuralElementComment.php
@@ -21,7 +21,7 @@ use User;
  * @property \User                          $user                    belongs_to User
  * @property \Courseware\StructuralElement  $structural_element      belongs_to Courseware\StructuralElement
  */
-class StructuralElementComment extends \SimpleORMap
+class StructuralElementComment extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -39,4 +39,21 @@ class StructuralElementComment extends \SimpleORMap
 
         parent::configure($config);
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $comments = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_structural_element_comments WHERE user_id = ?',
+            [$storage->user_id]
+        );
+        if ($comments) {
+            $storage->addTabularData(_('Courseware Seiten Kommentare'), 'cw_structural_element_comments', $comments);
+        }
+    }
 }
diff --git a/lib/models/Courseware/StructuralElementFeedback.php b/lib/models/Courseware/StructuralElementFeedback.php
index a2e3b8b97ab..c7435d06b67 100644
--- a/lib/models/Courseware/StructuralElementFeedback.php
+++ b/lib/models/Courseware/StructuralElementFeedback.php
@@ -21,7 +21,7 @@ use User;
  * @property \User                          $user                    belongs_to User
  * @property \Courseware\StructuralElement  $structural_element      belongs_to Courseware\StructuralElement
  */
-class StructuralElementFeedback extends \SimpleORMap
+class StructuralElementFeedback extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -39,4 +39,21 @@ class StructuralElementFeedback extends \SimpleORMap
 
         parent::configure($config);
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $feedback = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_structural_element_feedbacks WHERE user_id = ?',
+            [$storage->user_id]
+        );
+        if ($feedback) {
+            $storage->addTabularData(_('Courseware Seiten Feedback'), 'cw_structural_element_feedbacks', $feedback);
+        }
+    }
 }
diff --git a/lib/models/Courseware/TaskFeedback.php b/lib/models/Courseware/TaskFeedback.php
index 57e2ce07053..987aae9f5c0 100644
--- a/lib/models/Courseware/TaskFeedback.php
+++ b/lib/models/Courseware/TaskFeedback.php
@@ -22,7 +22,7 @@ use User;
 * @property \User                          $lecturer               belongs_to User
 * @property \Courseware\Task               $task                   belongs_to Courseware\Task
 */
-class TaskFeedback extends \SimpleORMap
+class TaskFeedback extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -55,4 +55,21 @@ class TaskFeedback extends \SimpleORMap
 
         return StructuralElement::build($structuralElement, false);
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $feedback = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_task_feedbacks WHERE lecturer_id = ?',
+            [$storage->user_id]
+        );
+        if ($feedback) {
+            $storage->addTabularData(_('Courseware Aufgaben Feedback'), 'cw_task_feedbacks', $feedback);
+        }
+    }
 }
diff --git a/lib/models/Courseware/TaskGroup.php b/lib/models/Courseware/TaskGroup.php
index 7ca6eb1fa12..d32866390a9 100644
--- a/lib/models/Courseware/TaskGroup.php
+++ b/lib/models/Courseware/TaskGroup.php
@@ -25,7 +25,7 @@ use User;
  * @property \Courseware\StructuralElement $structural_element    belongs_to Courseware\StructuralElement
  * @property \SimpleORMapCollection        $tasks                 has_many Courseware\Task
  */
-class TaskGroup extends \SimpleORMap
+class TaskGroup extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -58,4 +58,22 @@ class TaskGroup extends \SimpleORMap
 
         return $solvers;
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $task_groups = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_task_groups WHERE lecturer_id = ?',
+            [$storage->user_id]
+        );
+        if ($task_groups) {
+            $storage->addTabularData(_('Courseware Aufgaben'), 'cw_task_groups', $task_groups);
+        }
+        
+    }
 }
diff --git a/lib/models/Courseware/Unit.php b/lib/models/Courseware/Unit.php
index 5c470c901ff..647f9f9fb70 100644
--- a/lib/models/Courseware/Unit.php
+++ b/lib/models/Courseware/Unit.php
@@ -31,7 +31,7 @@ use User;
  * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
  */
 
-class Unit extends \SimpleORMap
+class Unit extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -110,4 +110,21 @@ class Unit extends \SimpleORMap
 
         return $newUnit;
     }
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $units = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_units WHERE creator_id = ?',
+            [$storage->user_id]
+        );
+        if ($units) {
+            $storage->addTabularData(_('Courseware Lernmaterialien'), 'cw_units', $units);
+        }
+        
+    }
 }
diff --git a/lib/models/Courseware/UserDataField.php b/lib/models/Courseware/UserDataField.php
index 914cab03615..af608809acd 100644
--- a/lib/models/Courseware/UserDataField.php
+++ b/lib/models/Courseware/UserDataField.php
@@ -21,7 +21,7 @@ namespace Courseware;
  * @property \Courseware\Block $block    belongs_to Courseware\Block
  * @property \User             $user     belongs_to User
  */
-class UserDataField extends \SimpleORMap
+class UserDataField extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -67,4 +67,21 @@ class UserDataField extends \SimpleORMap
 
         return $userDataField;
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $userData = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_user_data_fields WHERE user_id = ?',
+            [$storage->user_id]
+        );
+        if ($userData) {
+            $storage->addTabularData(_('Courseware Nutzerdaten'), 'cw_user_data_fields', $userData);
+        }
+    }
 }
diff --git a/lib/models/Courseware/UserProgress.php b/lib/models/Courseware/UserProgress.php
index d4355f55454..195fd89222b 100644
--- a/lib/models/Courseware/UserProgress.php
+++ b/lib/models/Courseware/UserProgress.php
@@ -21,7 +21,7 @@ namespace Courseware;
  * @property \Courseware\Block $block    belongs_to Courseware\Block
  * @property \User             $user     belongs_to User
  */
-class UserProgress extends \SimpleORMap
+class UserProgress extends \SimpleORMap implements \PrivacyObject
 {
     protected static function configure($config = [])
     {
@@ -63,4 +63,21 @@ class UserProgress extends \SimpleORMap
 
         return $progress;
     }
+
+    /**
+     * Export available data of a given user into a storage object
+     * (an instance of the StoredUserData class) for that user.
+     *
+     * @param StoredUserData $storage object to store data into
+     */
+    public static function exportUserData(\StoredUserData $storage)
+    {
+        $userProgresses = \DBManager::get()->fetchAll(
+            'SELECT * FROM cw_user_progresses WHERE user_id = ?',
+            [$storage->user_id]
+        );
+        if ($userProgresses) {
+            $storage->addTabularData(_('Courseware Fortschritt'), 'cw_user_progresses', $userProgresses);
+        }
+    }
 }
diff --git a/lib/modules/CoursewareModule.class.php b/lib/modules/CoursewareModule.class.php
index 2a9161ac727..56a205c2f05 100644
--- a/lib/modules/CoursewareModule.class.php
+++ b/lib/modules/CoursewareModule.class.php
@@ -3,7 +3,7 @@
 use Courseware\Instance;
 use Courseware\StructuralElement;
 
-class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModule, PrivacyPlugin
+class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModule
 {
     /**
      * {@inheritdoc}
@@ -146,58 +146,6 @@ class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModule,
         ];
     }
 
-    /**
-     * {@inheritdoc}
-     */
-    public function exportUserData(StoredUserData $storage)
-    {
-        $db = DBManager::get();
-
-        $structuralElements = $db->fetchAll(
-            'SELECT * FROM cw_structural_elements WHERE owner_id = ? OR editor_id = ? OR range_id = ?',
-            [$storage->user_id, $storage->user_id, $storage->user_id]
-        );
-        $storage->addTabularData(_('Courseware-Strukturelemente-Ergebnisse'), 'cw_structural_elements', $structuralElements);
-
-        $containers = $db->fetchAll(
-            'SELECT * FROM cw_containers WHERE owner_id = ? OR editor_id = ?',
-            [$storage->user_id, $storage->user_id]
-        );
-        $storage->addTabularData(_('Courseware-Container-Ergebnisse'), 'cw_containers', $containers);
-
-        $blocks = $db->fetchAll(
-            'SELECT * FROM cw_blocks WHERE owner_id = ? OR editor_id = ?',
-            [$storage->user_id, $storage->user_id]
-        );
-        $storage->addTabularData(_('Courseware-Blöcke-Ergebnisse'), 'cw_blocks', $blocks);
-
-        $comments = $db->fetchAll(
-            'SELECT * FROM cw_block_comments WHERE user_id = ?',
-            [$storage->user_id]
-        );
-        $storage->addTabularData(_('Courseware-Kommentare-Ergebnisse'), 'cw_block_comments', $comments);
-
-        $userData = $db->fetchAll(
-            'SELECT * FROM cw_user_data_fields WHERE user_id = ?',
-            [$storage->user_id]
-        );
-        $storage->addTabularData(_('Courseware-Nutzer-Daten-Ergebnisse'), 'cw_user_data_fields', $userData);
-
-        $userProgresses = $db->fetchAll(
-            'SELECT * FROM cw_user_progresses WHERE user_id = ?',
-            [$storage->user_id]
-        );
-        $storage->addTabularData(_('Courseware-Nutzer-Fortschritt-Ergebnisse'), 'cw_user_progresses', $userProgresses);
-
-        $bookmarks = $db->fetchAll(
-            'SELECT * FROM cw_bookmarks WHERE user_id = ?',
-            [$storage->user_id]
-        );
-        $storage->addTabularData(_('Courseware-Lesezeichen-Ergebnisse'), 'cw_bookmarks', $bookmarks);
-
-
-    }
-
     public function isActivatableForContext(Range $context)
     {
         return $context->getRangeType() === 'course';
-- 
GitLab