middleware( function ($request, $next) { $this->repository = app(AccountRepositoryInterface::class); // new way of user group validation $userGroup = $this->validateUserGroup($request); $this->repository->setUserGroup($userGroup); return $next($request); } ); } /** * TODO the sort instructions need proper repeatable documentation. * TODO see autocomplete/account controller for list. */ public function index(IndexRequest $request): JsonResponse { $this->repository->resetAccountOrder(); $types = $request->getAccountTypes(); $sorting = $request->getSortInstructions('accounts'); $filters = $request->getFilterInstructions('accounts'); $accounts = $this->repository->getAccountsByType($types, $sorting, $filters); $pageSize = $this->parameters->get('limit'); $count = $accounts->count(); // depending on the sort parameters, this list must not be split, because the // order is calculated in the account transformer and by that time it's too late. $first = array_key_first($sorting); $disablePagination = in_array($first, ['last_activity', 'balance_difference'], true); if (!$disablePagination) { $accounts = $accounts->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); } $paginator = new LengthAwarePaginator($accounts, $count, $pageSize, $this->parameters->get('page')); $transformer = new AccountTransformer(); $this->parameters->set('disablePagination', $disablePagination); $this->parameters->set('pageSize', $pageSize); $this->parameters->set('sort', $sorting); $this->parameters->set('filters', $filters); $transformer->setParameters($this->parameters); // give params to transformer return response() ->json($this->jsonApiList('accounts', $paginator, $transformer)) ->header('Content-Type', self::CONTENT_TYPE); } }