diff --git a/lib/Data.php b/lib/Data.php index b4d444bdf..3262175df 100644 --- a/lib/Data.php +++ b/lib/Data.php @@ -324,35 +324,38 @@ public function get(GroupHelper $groupHelper, UserSettings $userSettings, $user, * @throws \OutOfBoundsException If $since is not owned by $user */ protected function setOffsetFromSince(IQueryBuilder $query, $user, $since, $sort) { - if ($since) { - $queryBuilder = $this->connection->getQueryBuilder(); - $queryBuilder->select(['affecteduser', 'timestamp']) - ->from('activity') - ->where($queryBuilder->expr()->eq('activity_id', $queryBuilder->createNamedParameter((int)$since))); - $result = $queryBuilder->executeQuery(); - $activity = $result->fetch(); - $result->closeCursor(); - - if ($activity) { - if ($activity['affecteduser'] !== $user) { - throw new \OutOfBoundsException('Invalid since', 2); - } - $timestamp = (int)$activity['timestamp']; - - if ($sort === 'DESC') { - $query->andWhere($query->expr()->lte('timestamp', $query->createNamedParameter($timestamp))); - $query->andWhere($query->expr()->lt('activity_id', $query->createNamedParameter($since))); - } else { - $query->andWhere($query->expr()->gte('timestamp', $query->createNamedParameter($timestamp))); - $query->andWhere($query->expr()->gt('activity_id', $query->createNamedParameter($since))); - } - return []; - } + if (!$since) { + return $this->getFirstKnownActivityHeader($user, $sort); } - /** - * Couldn't find the since, so find the oldest one and set the header - */ + $queryBuilder = $this->connection->getQueryBuilder(); + $queryBuilder->select(['affecteduser', 'timestamp']) + ->from('activity') + ->where($queryBuilder->expr()->eq('activity_id', $queryBuilder->createNamedParameter((int)$since))); + $result = $queryBuilder->executeQuery(); + $activity = $result->fetch(); + $result->closeCursor(); + + if (!$activity) { + return $this->getFirstKnownActivityHeader($user, $sort); + } + + if ($activity['affecteduser'] !== $user) { + throw new \OutOfBoundsException('Invalid since', 2); + } + + $timestamp = (int)$activity['timestamp']; + if ($sort === 'DESC') { + $query->andWhere($query->expr()->lte('timestamp', $query->createNamedParameter($timestamp))); + $query->andWhere($query->expr()->lt('activity_id', $query->createNamedParameter($since))); + } else { + $query->andWhere($query->expr()->gte('timestamp', $query->createNamedParameter($timestamp))); + $query->andWhere($query->expr()->gt('activity_id', $query->createNamedParameter($since))); + } + return []; + } + + private function getFirstKnownActivityHeader(string $user, string $sort): array { $fetchQuery = $this->connection->getQueryBuilder(); $fetchQuery->select('activity_id') ->from('activity') @@ -364,11 +367,8 @@ protected function setOffsetFromSince(IQueryBuilder $query, $user, $since, $sort $result->closeCursor(); if ($activity !== false) { - return [ - 'X-Activity-First-Known' => (int)$activity['activity_id'], - ]; + return ['X-Activity-First-Known' => (int)$activity['activity_id']]; } - return []; } diff --git a/lib/MailQueueHandler.php b/lib/MailQueueHandler.php index 46be003e4..d00907e4c 100644 --- a/lib/MailQueueHandler.php +++ b/lib/MailQueueHandler.php @@ -158,16 +158,7 @@ protected function getAffectedUsers(?int $limit, int $latestSend, bool $forceSen } elseif ($restrictEmails === UserSettings::EMAIL_SEND_ASAP) { $query->where($query->expr()->eq('amq_timestamp', 'amq_latest_send')); } - - $result = $query->executeQuery(); - - $affectedUsers = []; - while ($row = $result->fetch()) { - $affectedUsers[] = $row['amq_affecteduser']; - } - $result->closeCursor(); - - return $affectedUsers; + return $this->fetchAffectedUsers($query); } if ($forceSending) { @@ -176,14 +167,16 @@ protected function getAffectedUsers(?int $limit, int $latestSend, bool $forceSen $query->where($query->expr()->lt('amq_latest_send', $query->createNamedParameter($latestSend))); } - $result = $query->executeQuery(); + return $this->fetchAffectedUsers($query); + } + private function fetchAffectedUsers(IQueryBuilder $query): array { + $result = $query->executeQuery(); $affectedUsers = []; while ($row = $result->fetch()) { $affectedUsers[] = $row['amq_affecteduser']; } $result->closeCursor(); - return $affectedUsers; }