From 0f79e648741dd179ec83c6cadcb0e67209cc9085 Mon Sep 17 00:00:00 2001
From: noackorama <noackorama@gmail.com>
Date: Fri, 8 Oct 2021 18:18:44 +0200
Subject: [PATCH] add lost object_set_visit to files and try to mimic old
 behaviour on my_courses

---
 app/controllers/course/files.php |  1 +
 lib/object.inc.php               | 83 +++++++++++++++++++++++++++++++-
 2 files changed, 83 insertions(+), 1 deletion(-)

diff --git a/app/controllers/course/files.php b/app/controllers/course/files.php
index 25233af9c57..3e6e1356db4 100644
--- a/app/controllers/course/files.php
+++ b/app/controllers/course/files.php
@@ -26,6 +26,7 @@ class Course_FilesController extends AuthenticatedController
             throw new CheckObjectException(_('Es wurde keine passende Veranstaltung gefunden.'));
         }
         $this->course = Context::get();
+        object_set_visit_module($this->studip_module->getPluginId());
         $this->last_visitdate = object_get_visit($this->course->id, $this->studip_module->getPluginId());
 
         PageLayout::setHelpKeyword('Basis.Dateien');
diff --git a/lib/object.inc.php b/lib/object.inc.php
index dcb310e8ad1..04190ba60cd 100644
--- a/lib/object.inc.php
+++ b/lib/object.inc.php
@@ -171,7 +171,7 @@ function get_objects_visits(array $object_ids, $plugin_id, $mode = 'last', $user
     $thresholds = array_combine($plugin_ids, array_fill(
         0,
         count($plugin_ids),
-        $mode === null ? ['last_visitdate' => $threshold, 'visitdate' => $threshold] : $threshold
+        $mode === null ? ['last_visitdate' => null, 'visitdate' => null] : null
     ));
     $result = array_combine(
         $object_ids,
@@ -206,6 +206,45 @@ function get_objects_visits(array $object_ids, $plugin_id, $mode = 'last', $user
         $result[$row['object_id']][$row['plugin_id']] = $return;
     }
 
+    foreach ($result as $object_id => $plugins) {
+        $seminar_data = $plugins[0];
+        if ($mode === null && !isset($seminar_data['visitdate'])) {
+            $seminar_data = ['last_visitdate' => $threshold, 'visitdate' => $threshold];
+            $result[$object_id][0] = $seminar_data;
+        }
+        if ($mode !== null && !isset($seminar_data)) {
+            $seminar_data = $threshold;
+            $result[$object_id][0] = $seminar_data;
+        }
+        foreach ($plugins as $plugin_id => $data) {
+            if ($plugin_id == 0) continue;
+            if ($mode === null) {
+                if (isset($data['visitdate']) || object_id_to_type($plugin_id)) {
+                    $result[$object_id][$plugin_id] = [
+                        'visitdate'      => $data['visitdate'] ?? max($threshold, (int)$data['visitdate']),
+                        'last_visitdate' => $data['last_visitdate'] ?? max($threshold, (int)$data['last_visitdate'])
+                    ];
+                } else {
+                    $result[$object_id][$plugin_id] = [
+                        'visitdate'      => $data['visitdate'] ?? max($seminar_data['visitdate'], (int)$data['visitdate']),
+                        'last_visitdate' => $data['last_visitdate'] ?? max($seminar_data['last_visitdate'], (int)$data['last_visitdate'])
+                    ];
+                }
+            } elseif ($mode === 'last') {
+                if (isset($data) || object_id_to_type($plugin_id)) {
+                    $result[$object_id][$plugin_id] = $data ?? max($threshold, (int)$data);
+                } else {
+                    $result[$object_id][$plugin_id] = $data ?? max($seminar_data['last_visitdate'], (int)$data);
+                }
+            } else {
+                if (isset($data) || object_id_to_type($plugin_id)) {
+                    $result[$object_id][$plugin_id] = $data ?? max($threshold, (int)$data);
+                } else {
+                    $result[$object_id][$plugin_id] = $data ?? max($seminar_data['visitdate'], (int)$data);
+                }
+            }
+        }
+    }
     // Reduce array if not additional types were passed
     if (func_num_args() < 5) {
         // Unfortunately array_column() will dispose the array key
@@ -337,3 +376,45 @@ function object_type_to_id($type)
     }
 
 }
+
+/**
+ * converts a plugin id to old ouv type
+ * @param $id int former used type of visited objects or module (i.e. news, documents, wiki)
+ * @return string
+ */
+function object_id_to_type($id)
+{
+    if (!is_numeric($id)) {
+        return null;
+    }
+    $ouv_mapping = [
+        'sem' => 0,
+        'inst'=> 0,
+        'basicdata' => 0,
+        'vote' => -1,
+        'eval' => -2,
+        'news' => 'CoreOverview',
+        'documents' => 'CoreDocuments',
+        'schedule' => 'CoreSchedule',
+        'scm' =>  'CoreScm',
+        'wiki' => 'CoreWiki',
+        'elearning_interface' => 'CoreElearningInterface',
+        'ilias_interface' => 'IliasInterfaceModule',
+        'participants' => 'CoreParticipants'
+    ];
+
+    if (!in_array($id, [0, -1, -2])) {
+        $plugin = PluginManager::getInstance()->getPluginById($id);
+        if ($plugin) {
+            $search = get_class($plugin);
+        }
+    } else {
+        $search = (int)$id;
+    }
+    if (isset($search)) {
+        return array_search($search, $ouv_mapping, true) ?: null;
+    } else {
+        return null;
+    }
+
+}
-- 
GitLab