From bac35e9a73aecefedd8f70d54dd72e0d3082abe0 Mon Sep 17 00:00:00 2001
From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de>
Date: Thu, 21 Jul 2022 13:37:40 +0000
Subject: [PATCH] don't skip DoGarbageCollect() completely when
 NEWS_DISABLE_GARBAGE_COLLECT is set, fixes #1355

Closes #1355

Merge request studip/studip!837
---
 lib/cronjobs/garbage_collector.class.php |  6 +-
 lib/models/StudipNews.class.php          | 74 ++++++++++++------------
 2 files changed, 41 insertions(+), 39 deletions(-)

diff --git a/lib/cronjobs/garbage_collector.class.php b/lib/cronjobs/garbage_collector.class.php
index 80d59f6403e..8bb0cbbe3bd 100644
--- a/lib/cronjobs/garbage_collector.class.php
+++ b/lib/cronjobs/garbage_collector.class.php
@@ -58,7 +58,11 @@ class GarbageCollectorJob extends CronJob
         }
 
         // delete outdated news
-        $news_deletion_days = $parameters['news_deletion_days'] * 86400;
+        if (Config::get()->NEWS_DISABLE_GARBAGE_COLLECT) {
+            $news_deletion_days = false;
+        } else {
+            $news_deletion_days = $parameters['news_deletion_days'] * 86400;
+        }
         $deleted_news = StudipNews::DoGarbageCollect($news_deletion_days);
 
         // delete messages
diff --git a/lib/models/StudipNews.class.php b/lib/models/StudipNews.class.php
index 2d5652aa14f..0c8c6f7e82d 100644
--- a/lib/models/StudipNews.class.php
+++ b/lib/models/StudipNews.class.php
@@ -398,47 +398,45 @@ class StudipNews extends SimpleORMap implements PrivacyObject
     public static function DoGarbageCollect($news_deletion_days = false)
     {
         $db = DBManager::get();
-        if (!Config::get()->NEWS_DISABLE_GARBAGE_COLLECT) {
-            $queries = [];
-            $parameters = [];
-
-            if ($news_deletion_days !== false) {
-                $queries[] = "SELECT news.news_id
-                              FROM news
-                              WHERE date + expire + ? < UNIX_TIMESTAMP()";
-                $parameters[] = (int) $news_deletion_days;
-            }
+        $queries = [];
+        $parameters = [];
 
-            $queries[] = "SELECT news_range.news_id
-                          FROM news_range
-                          LEFT JOIN news USING (news_id)
-                          WHERE news.news_id IS NULL";
+        if ($news_deletion_days !== false) {
             $queries[] = "SELECT news.news_id
                           FROM news
-                          LEFT JOIN news_range USING (news_id)
-                          WHERE range_id IS NULL";
-
-            $query = implode(' UNION DISTINCT ', $queries);
-            $stm = $db->prepare($query);
-            $stm->execute($parameters);
-            $result = $stm->fetchAll(PDO::FETCH_COLUMN);
-
-            if (count($result) > 0) {
-                $query = "DELETE FROM news WHERE news_id IN (?)";
-                $statement = DBManager::get()->prepare($query);
-                $statement->execute([$result]);
-                $killed = $statement->rowCount();
-
-                $query = "DELETE FROM news_range WHERE news_id IN (?)";
-                $statement = DBManager::get()->prepare($query);
-                $statement->execute([$result]);
-
-                object_kill_visits(null, $result);
-                object_kill_views($result);
-                StudipComment::DeleteCommentsByObject($result);
-            }
-            return $killed;
-        }
+                          WHERE date + expire + ? < UNIX_TIMESTAMP()";
+            $parameters[] = (int) $news_deletion_days;
+        }
+
+        $queries[] = "SELECT news_range.news_id
+                      FROM news_range
+                      LEFT JOIN news USING (news_id)
+                      WHERE news.news_id IS NULL";
+        $queries[] = "SELECT news.news_id
+                      FROM news
+                      LEFT JOIN news_range USING (news_id)
+                      WHERE range_id IS NULL";
+
+        $query = implode(' UNION DISTINCT ', $queries);
+        $stm = $db->prepare($query);
+        $stm->execute($parameters);
+        $result = $stm->fetchAll(PDO::FETCH_COLUMN);
+
+        if (count($result) > 0) {
+            $query = "DELETE FROM news WHERE news_id IN (?)";
+            $statement = $db->prepare($query);
+            $statement->execute([$result]);
+            $killed = $statement->rowCount();
+
+            $query = "DELETE FROM news_range WHERE news_id IN (?)";
+            $statement = $db->prepare($query);
+            $statement->execute([$result]);
+
+            object_kill_visits(null, $result);
+            object_kill_views($result);
+            StudipComment::DeleteCommentsByObject($result);
+        }
+        return $killed;
     }
 
     public static function DeleteNewsRanges($range_id)
-- 
GitLab