diff --git a/src/Model/Post.php b/src/Model/Post.php index f4ab71eac6..bdefda76c3 100644 --- a/src/Model/Post.php +++ b/src/Model/Post.php @@ -607,6 +607,17 @@ class Post return self::selectFirstForUser($uid, $original_selected, ['uri-id' => $result['thr-parent-id'], 'uid' => [0, $uid]], $params); } + /** + * Retrieves a list of up to 100 unseen posts for a user + * @param int $uid User ID + * @return array Array containing the URI IDs of unseen posts + */ + public static function getUnseenPosts(int $uid): array + { + $posts = DBA::selectToArray('post-user', ['uri-id'], ['unseen' => true, 'uid' => $uid], ['limit' => 100]); + return array_column($posts, 'uri-id'); + } + /** * Update existing post entries * diff --git a/src/Module/Conversation/Network.php b/src/Module/Conversation/Network.php index ce4b8d9dd3..46e6de58e6 100644 --- a/src/Module/Conversation/Network.php +++ b/src/Module/Conversation/Network.php @@ -35,13 +35,11 @@ use Friendica\Core\L10n; use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; use Friendica\Core\Renderer; use Friendica\Core\Session\Capability\IHandleUserSessions; -use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\Database\Database; use Friendica\Event\ArrayFilterEvent; use Friendica\Model\Contact; use Friendica\Model\Circle; -use Friendica\Model\Post; use Friendica\Model\Profile; use Friendica\Module\Response; use Friendica\Module\Security\Login; @@ -522,16 +520,8 @@ class Network extends Timeline return $items; } - $this->setItemsSeenByCondition(['unseen' => true, 'uid' => $this->session->getLocalUserId(), 'parent-uri-id' => array_column($items, 'uri-id')]); + $this->setItemsSeenForUser($this->session->getLocalUserId()); - $posts = Post::selectToArray(['uri-id'], ['unseen' => true, 'uid' => $this->session->getLocalUserId()], ['limit' => 100]); - if (!empty($posts)) { - $this->setItemsSeenByCondition(['unseen' => true, 'uid' => $this->session->getLocalUserId(), 'uri-id' => array_column($posts, 'uri-id')]); - } - - if (count($posts) == 100) { - Worker::add(Worker::PRIORITY_MEDIUM, 'SetSeen', $this->session->getLocalUserId()); - } return $items; } diff --git a/src/Module/Conversation/Timeline.php b/src/Module/Conversation/Timeline.php index 95ad1946ad..4cd568af93 100644 --- a/src/Module/Conversation/Timeline.php +++ b/src/Module/Conversation/Timeline.php @@ -23,6 +23,7 @@ use Friendica\Core\L10n; use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; use Friendica\Core\Renderer; use Friendica\Core\Session\Capability\IHandleUserSessions; +use Friendica\Core\Worker; use Friendica\Model\Contact; use Friendica\Model\User; use Friendica\Database\Database; @@ -295,8 +296,7 @@ class Timeline extends BaseModule $selected_items = $items; } - $condition = ['unseen' => true, 'uid' => $uid, 'parent-uri-id' => array_column($selected_items, 'uri-id')]; - $this->setItemsSeenByCondition($condition); + $this->setItemsSeenForUser($uid); return $selected_items; } @@ -443,8 +443,7 @@ class Timeline extends BaseModule $items = array_reverse($items, true); } - $condition = ['unseen' => true, 'uid' => $uid, 'parent-uri-id' => array_column($items, 'uri-id')]; - $this->setItemsSeenByCondition($condition); + $this->setItemsSeenForUser($uid); return $items; } @@ -701,12 +700,6 @@ class Timeline extends BaseModule } if ($maxpostperauthor === 0) { - $this->setItemsSeenByCondition([ - 'unseen' => true, - 'uid' => $this->session->getLocalUserId(), - 'parent-uri-id' => array_column($items, 'uri-id') - ]); - return $items; } @@ -749,9 +742,6 @@ class Timeline extends BaseModule } } - $condition = ['unseen' => true, 'uid' => $this->session->getLocalUserId(), 'parent-uri-id' => array_column($selected_items, 'uri-id')]; - $this->setItemsSeenByCondition($condition); - return $selected_items; } @@ -834,22 +824,18 @@ class Timeline extends BaseModule } /** - * Sets items as seen - * - * @param array $condition The array with the SQL condition - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * Sets all unseen items for a user as seen + * @param int $uid User ID */ - protected function setItemsSeenByCondition(array $condition) + protected function setItemsSeenForUser(int $uid) { - if (empty($condition) || $this->ping) { - return; + $posts = Post::getUnseenPosts($uid); + if (!empty($posts)) { + Item::update(['unseen' => false], ['unseen' => true, 'uid' => $uid, 'uri-id' => $posts]); } - $unseen = Post::exists($condition); - - if ($unseen) { - /// @todo handle huge "unseen" updates in the background to avoid timeout errors - Item::update(['unseen' => false], $condition); + if (count($posts) == 100) { + Worker::add(Worker::PRIORITY_MEDIUM, 'SetSeen', $uid); } } }