From bfd277065c7bfd28779c585549dd9e9e577eabdf Mon Sep 17 00:00:00 2001 From: Alexandre Alapetite Date: Mon, 26 Feb 2024 09:01:25 +0100 Subject: Improve feed refresh (#6117) * Improve feed refresh Better account for some edge cases for cron and automatic labels fix https://github.com/FreshRSS/FreshRSS/issues/6089 fix https://github.com/FreshRSS/FreshRSS/issues/6109 * Apply labels also to new entries already marked as read * Add case most relevant for cron --- app/Controllers/feedController.php | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'app/Controllers/feedController.php') diff --git a/app/Controllers/feedController.php b/app/Controllers/feedController.php index 63c358da7..4ec4b5a55 100644 --- a/app/Controllers/feedController.php +++ b/app/Controllers/feedController.php @@ -742,11 +742,12 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { } /** - * @param array $newUnreadEntriesPerFeed * @return int|false The number of articles marked as read, of false if error */ - private static function keepMaxUnreads(array $newUnreadEntriesPerFeed) { + private static function keepMaxUnreads() { $affected = 0; + $entryDAO = FreshRSS_Factory::createEntryDao(); + $newUnreadEntriesPerFeed = $entryDAO->newUnreadEntriesPerFeed(); $feedDAO = FreshRSS_Factory::createFeedDao(); $feeds = $feedDAO->listFeedsOrderUpdate(-1); foreach ($feeds as $feed) { @@ -801,26 +802,23 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { return $tagDAO->tagEntries($applyLabels); } - public static function commitNewEntries(): bool { + public static function commitNewEntries(): void { $entryDAO = FreshRSS_Factory::createEntryDao(); - $newUnreadEntriesPerFeed = $entryDAO->newUnreadEntriesPerFeed(); - $nbNewEntries = array_sum($newUnreadEntriesPerFeed); + ['all' => $nbNewEntries, 'unread' => $nbNewUnreadEntries] = $entryDAO->countNewEntries(); if ($nbNewEntries > 0) { if (!$entryDAO->inTransaction()) { $entryDAO->beginTransaction(); } if ($entryDAO->commitNewEntries()) { - self::keepMaxUnreads($newUnreadEntriesPerFeed); self::applyLabelActions($nbNewEntries); + if ($nbNewUnreadEntries > 0) { + self::keepMaxUnreads(); + } } if ($entryDAO->inTransaction()) { $entryDAO->commit(); } } - - $databaseDAO = FreshRSS_Factory::createDatabaseDAO(); - $databaseDAO->minorDbMaintenance(); - return true; } /** @@ -846,6 +844,12 @@ class FreshRSS_feed_Controller extends FreshRSS_ActionController { self::commitNewEntries(); } else { if ($id === 0 && $url === '') { + // Case of a batch refresh (e.g. cron) + $databaseDAO = FreshRSS_Factory::createDatabaseDAO(); + $databaseDAO->minorDbMaintenance(); + Minz_ExtensionManager::callHookVoid('freshrss_user_maintenance'); + + FreshRSS_feed_Controller::commitNewEntries(); FreshRSS_category_Controller::refreshDynamicOpmls(); } [$updated_feeds, $feed, $nbNewArticles] = self::actualizeFeeds($id, $url, $maxFeeds); -- cgit v1.2.3