From d73d99c5966017261450071bf183b6d67d517fbb Mon Sep 17 00:00:00 2001 From: Chen Asraf Date: Mon, 23 Mar 2026 02:06:10 +0200 Subject: [PATCH] fix: stats rebuild task --- lib/Service/StatsService.php | 41 +++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/lib/Service/StatsService.php b/lib/Service/StatsService.php index 58d8863..325e3e4 100644 --- a/lib/Service/StatsService.php +++ b/lib/Service/StatsService.php @@ -225,7 +225,6 @@ class StatsService { $updateQb->update('forum_categories') ->set('thread_count', $updateQb->createNamedParameter($threadCount, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT)) ->set('post_count', $updateQb->createNamedParameter($postCount, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT)) - ->set('updated_at', $updateQb->createNamedParameter(time(), \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT)) ->where($updateQb->expr()->eq('id', $updateQb->createNamedParameter($categoryId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT))); $updateQb->executeStatement(); } @@ -267,7 +266,7 @@ class StatsService { * @return void */ public function rebuildThreadStats(int $threadId): void { - // Count non-deleted posts in this thread (excluding first post) + // Count non-deleted reply posts in this thread (excluding first post) $postQb = $this->db->getQueryBuilder(); $postQb->select($postQb->func()->count('*', 'count')) ->from('forum_posts') @@ -278,11 +277,47 @@ class StatsService { $postCount = (int)($postResult->fetchOne() ?? 0); $postResult->closeCursor(); + // Find the latest non-deleted post in this thread (for last_post_id) + $lastPostQb = $this->db->getQueryBuilder(); + $lastPostQb->select('id', 'author_id', 'created_at', 'is_first_post') + ->from('forum_posts') + ->where($lastPostQb->expr()->eq('thread_id', $lastPostQb->createNamedParameter($threadId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT))) + ->andWhere($lastPostQb->expr()->isNull('deleted_at')) + ->orderBy('created_at', 'DESC') + ->setMaxResults(1); + $lastPostResult = $lastPostQb->executeQuery(); + $lastPost = $lastPostResult->fetch(); + $lastPostResult->closeCursor(); + + // Find the latest non-deleted reply (for last_reply_at and last_reply_author_id) + $lastReplyQb = $this->db->getQueryBuilder(); + $lastReplyQb->select('id', 'author_id', 'created_at') + ->from('forum_posts') + ->where($lastReplyQb->expr()->eq('thread_id', $lastReplyQb->createNamedParameter($threadId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT))) + ->andWhere($lastReplyQb->expr()->isNull('deleted_at')) + ->andWhere($lastReplyQb->expr()->eq('is_first_post', $lastReplyQb->createNamedParameter(false, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_BOOL))) + ->orderBy('created_at', 'DESC') + ->setMaxResults(1); + $lastReplyResult = $lastReplyQb->executeQuery(); + $lastReply = $lastReplyResult->fetch(); + $lastReplyResult->closeCursor(); + // Update thread stats $updateQb = $this->db->getQueryBuilder(); $updateQb->update('forum_threads') ->set('post_count', $updateQb->createNamedParameter($postCount, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT)) - ->set('updated_at', $updateQb->createNamedParameter(time(), \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT)) + ->set('last_post_id', $updateQb->createNamedParameter( + $lastPost ? (int)$lastPost['id'] : null, + \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT + )) + ->set('last_reply_author_id', $updateQb->createNamedParameter( + $lastReply ? $lastReply['author_id'] : null, + \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_STR + )) + ->set('last_reply_at', $updateQb->createNamedParameter( + $lastReply ? (int)$lastReply['created_at'] : null, + \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT + )) ->where($updateQb->expr()->eq('id', $updateQb->createNamedParameter($threadId, \OCP\DB\QueryBuilder\IQueryBuilder::PARAM_INT))); $updateQb->executeStatement(); }