filterer = $filterer; $this->posts = $posts; $this->url = $url; } /** * {@inheritdoc} */ protected function data(ServerRequestInterface $request, Document $document) { $actor = $request->getAttribute('actor'); $filters = $this->extractFilter($request); $sort = $this->extractSort($request); $limit = $this->extractLimit($request); $offset = $this->extractOffset($request); $include = $this->extractInclude($request); $results = $this->filterer->filter(new QueryCriteria($actor, $filters, $sort), $limit, $offset); $document->addPaginationLinks( $this->url->to('api')->route('posts.index'), $request->getQueryParams(), $offset, $limit, $results->areMoreResults() ? null : 0 ); // Eager load discussion for use in the policies, // eager loading does not affect the JSON response, // the response only includes relations included in the request. if (! in_array('discussion', $include)) { $include[] = 'discussion'; } if (in_array('user', $include)) { $include[] = 'user.groups'; } return $results->getResults()->load($include); } /** * {@inheritdoc} */ protected function extractOffset(ServerRequestInterface $request) { $actor = $request->getAttribute('actor'); $queryParams = $request->getQueryParams(); $sort = $this->extractSort($request); $limit = $this->extractLimit($request); $filter = $this->extractFilter($request); if (($near = Arr::get($queryParams, 'page.near')) > 1) { if (count($filter) > 1 || ! isset($filter['discussion']) || $sort) { throw new InvalidParameterException( 'You can only use page[near] with filter[discussion] and the default sort order' ); } $offset = $this->posts->getIndexForNumber($filter['discussion'], $near, $actor); return max(0, $offset - $limit / 2); } return parent::extractOffset($request); } }