diff --git a/framework/core/src/Api/Resource/PostResource.php b/framework/core/src/Api/Resource/PostResource.php index 382bac8e4..a904079c0 100644 --- a/framework/core/src/Api/Resource/PostResource.php +++ b/framework/core/src/Api/Resource/PostResource.php @@ -129,16 +129,16 @@ class PostResource extends AbstractDatabaseResource $sort = $defaultExtracts['sort']; $filter = $defaultExtracts['filter']; - if (count($filter) > 1 || ! isset($filter['discussion']) || $sort) { + if (count($filter) > 1 || ! isset($filter['discussion']) || ($sort && $sort !== ['number' => 'asc'])) { throw new BadRequestException( 'You can only use page[near] with filter[discussion] and the default sort order' ); } $limit = $defaultExtracts['limit']; - $offset = $this->posts->getIndexForNumber((int) $filter['discussion'], $near, $context->getActor()); + $index = $this->posts->getIndexForNumber((int) $filter['discussion'], $near, $context->getActor()); - return max(0, $offset - $limit / 2); + return max(0, $index - $limit / 2); } return $defaultExtracts['offset']; @@ -150,6 +150,7 @@ class PostResource extends AbstractDatabaseResource 'hiddenUser', 'discussion' ]) + ->defaultSort('number') ->paginate(static::$defaultLimit), ]; } diff --git a/framework/core/src/Post/PostRepository.php b/framework/core/src/Post/PostRepository.php index 6ac36c71d..ffe6aa43d 100644 --- a/framework/core/src/Post/PostRepository.php +++ b/framework/core/src/Post/PostRepository.php @@ -85,23 +85,14 @@ class PostRepository */ public function getIndexForNumber(int $discussionId, int $number, ?User $actor = null): int { - if (! ($discussion = Discussion::find($discussionId))) { + if (! ($discussion = Discussion::query()->find($discussionId))) { return 0; } $query = $discussion->posts() ->whereVisibleTo($actor) - ->where('created_at', '<', function ($query) use ($discussionId, $number) { - $query->select('created_at') - ->from('posts') - ->where('discussion_id', $discussionId) - ->whereNotNull('number') - ->take(1) - - // We don't add $number as a binding because for some - // reason doing so makes the bindings go out of order. - ->orderByRaw('ABS(CAST(number AS SIGNED) - '.(int) $number.')'); - }); + ->where('number', '<=', $number) + ->orderBy('number'); return $query->count(); }