From 72b851c45cbe4e4508ee990b65e427acb44f88ad Mon Sep 17 00:00:00 2001
From: Ron Lucke <lucke@elan-ev.de>
Date: Wed, 10 May 2023 13:40:08 +0000
Subject: [PATCH] fix #2161

Closes #2161

Merge request studip/studip!1771
---
 lib/models/Course.class.php            |  7 +++--
 lib/models/Courseware/Instance.php     | 41 --------------------------
 lib/models/User.class.php              |  7 +++--
 lib/modules/CoursewareModule.class.php | 19 +++++++++---
 4 files changed, 23 insertions(+), 51 deletions(-)

diff --git a/lib/models/Course.class.php b/lib/models/Course.class.php
index 315b52ede14..2d485490fc2 100644
--- a/lib/models/Course.class.php
+++ b/lib/models/Course.class.php
@@ -214,9 +214,10 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
             'on_delete'         => 'delete',
         ];
 
-        $config['has_one']['courseware'] = [
-            'class_name' => \Courseware\StructuralElement::class,
-            'assoc_func' => 'getCoursewareCourse',
+        $config['has_many']['courseware_units'] = [
+            'class_name' => \Courseware\Unit::class,
+            'assoc_foreign_key' => 'range_id',
+            'on_delete'  => 'delete',
         ];
 
         $config['default_values']['lesezugriff'] = 1;
diff --git a/lib/models/Courseware/Instance.php b/lib/models/Courseware/Instance.php
index 66c024c1906..b200f33ca78 100644
--- a/lib/models/Courseware/Instance.php
+++ b/lib/models/Courseware/Instance.php
@@ -13,47 +13,6 @@ namespace Courseware;
  */
 class Instance
 {
-    public static function deleteForRange(\Range $range): void
-    {
-        $root = null;
-        switch ($range->getRangeType()) {
-            case 'course':
-                $root = StructuralElement::getCoursewareCourse($range->getRangeId());
-                break;
-            case 'user':
-                $root = StructuralElement::getCoursewareUser($range->getRangeId());
-                break;
-            default:
-                throw new \InvalidArgumentException('Only ranges of type "user" and "course" are currently supported.');
-        }
-
-        // there is no courseware for this course
-        if (!$root) {
-            return;
-        }
-
-        $instance = new self($root);
-
-        $last_element_configs = \ConfigValue::findBySQL('field = ? AND value LIKE ?', [
-            'COURSEWARE_LAST_ELEMENT',
-            '%' . $range->getRangeId() . '%',
-        ]);
-        foreach ($last_element_configs as $config) {
-            $arr = json_decode($config->value, true);
-            $arr = array_filter(
-                $arr,
-                function ($key) use ($range) {
-                    return $key !== $range->id;
-                },
-                ARRAY_FILTER_USE_KEY
-            );
-            \UserConfig::get($config->range_id)->unsetValue('COURSEWARE_LAST_ELEMENT');
-            \UserConfig::get($config->range_id)->store('COURSEWARE_LAST_ELEMENT', $arr);
-        }
-
-        $root->delete();
-    }
-
     /**
      * @param \Range $range
      * @return ?static
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index 8219fa7dafc..4510e013017 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -182,9 +182,10 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
             'order_by'          => 'ORDER BY name',
         ];
 
-        $config['has_one']['courseware'] = [
-            'class_name' => \Courseware\StructuralElement::class,
-            'assoc_func' => 'getCoursewareUser'
+        $config['has_one']['courseware_units'] = [
+            'class_name' => \Courseware\Unit::class,
+            'assoc_foreign_key' => 'range_id',
+            'on_delete'  => 'delete',
         ];
 
         $config['has_many']['course_notifications'] = [
diff --git a/lib/modules/CoursewareModule.class.php b/lib/modules/CoursewareModule.class.php
index 7b96c55a5f0..2a9161ac727 100644
--- a/lib/modules/CoursewareModule.class.php
+++ b/lib/modules/CoursewareModule.class.php
@@ -12,11 +12,22 @@ class CoursewareModule extends CorePlugin implements SystemPlugin, StudipModule,
     {
         parent::__construct();
 
-        NotificationCenter::on('UserDidDelete', function ($event, $user) {
-            Instance::deleteForRange($user);
-        });
         NotificationCenter::on('CourseDidDelete', function ($event, $course) {
-            Instance::deleteForRange($course);
+            $last_element_configs = \ConfigValue::findBySQL('field = ? AND value LIKE ?', [
+                'COURSEWARE_LAST_ELEMENT',
+                '%' . $course->id . '%',
+            ]);
+            foreach ($last_element_configs as $config) {
+                $arr = json_decode($config->value, true);
+                $arr = array_filter(
+                    $arr,
+                    function ($key) use ($course) {
+                        return $key !== $course->id;
+                    },
+                    ARRAY_FILTER_USE_KEY
+                );
+                \UserConfig::get($config->range_id)->store('COURSEWARE_LAST_ELEMENT', $arr);
+            }
         });
     }
 
-- 
GitLab