From 5248566335cd124c95b8218551acf5a9a21c2371 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Wed, 8 Nov 2023 13:44:17 +0000
Subject: [PATCH] clean up forum visits and ensure entries are deleted when
 either a user or a...

Closes #2738

Merge request studip/studip!1856
---
 lib/cronjobs/garbage_collector.class.php |  7 +++++++
 lib/models/Course.class.php              |  4 ++++
 lib/models/User.class.php                | 12 ++++++++++++
 3 files changed, 23 insertions(+)

diff --git a/lib/cronjobs/garbage_collector.class.php b/lib/cronjobs/garbage_collector.class.php
index 7adb0cd38f8..eff3d6db839 100644
--- a/lib/cronjobs/garbage_collector.class.php
+++ b/lib/cronjobs/garbage_collector.class.php
@@ -148,6 +148,13 @@ class GarbageCollectorJob extends CronJob
 
         Studip\Activity\Activity::doGarbageCollect();
 
+        // Remove outdated entries from forum_visits
+        $query = "DELETE FROM `forum_visits`
+                  WHERE GREATEST(`visitdate`, `last_visitdate`) < UNIX_TIMESTAMP() - :threshold";
+        DBManager::get()->execute($query, [
+            ':threshold' => ForumVisit::LAST_VISIT_MAX,
+        ]);
+
         // clean db cache
         $cache = new StudipDbCache();
         $cache->purge();
diff --git a/lib/models/Course.class.php b/lib/models/Course.class.php
index 4c471ea64e4..bbfa9835ccd 100644
--- a/lib/models/Course.class.php
+++ b/lib/models/Course.class.php
@@ -271,6 +271,10 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe
                 "UPDATE `seminare` SET `parent_course` = NULL WHERE `parent_course` = :course",
                 ['course' => $course->id]
             );
+            DBManager::get()->execute(
+                "DELETE FROM `forum_visits` WHERE `seminar_id` = ?",
+                [$course->id]
+            );
         };
 
         parent::configure($config);
diff --git a/lib/models/User.class.php b/lib/models/User.class.php
index 99a06ef09d5..aa6f5feca67 100644
--- a/lib/models/User.class.php
+++ b/lib/models/User.class.php
@@ -206,6 +206,7 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
         };
 
         $config['registered_callbacks']['after_delete'][] = 'cbRemoveFeedback';
+        $config['registered_callbacks']['after_delete'][] = 'cbRemoveForumVisits';
         $config['registered_callbacks']['before_store'][] = 'cbClearCaches';
         $config['registered_callbacks']['before_store'][] = 'cbStudipLog';
 
@@ -1485,6 +1486,17 @@ class User extends AuthUserMd5 implements Range, PrivacyObject
         FeedbackEntry::deleteBySQL('user_id = ?', [$this->id]);
     }
 
+    /**
+     * This callback is called after deleting a User.
+     * It removes forum visit entries that are associated with the User.
+     */
+    public function cbRemoveForumVisits()
+    {
+        $query = "DELETE FROM `forum_visits`
+                  WHERE `user_id` = ?";
+        DBManager::get()->execute($query, [$this->id]);
+    }
+
     public function cbClearCaches()
     {
         if ($this->isFieldDirty('perms')) {
-- 
GitLab