. * * @package LibreNMS * @link http://librenms.org * @copyright 2018 Tony Murray * @author Tony Murray */ namespace App\Http\Controllers\Table; use App\Http\Controllers\PaginatedAjaxController; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; abstract class TableController extends PaginatedAjaxController { final protected function baseRules() { return [ 'current' => 'int', 'rowCount' => 'int', 'searchPhrase' => 'nullable|string', 'sort.*' => 'in:asc,desc', ]; } public function __invoke(Request $request) { $this->validate($request, $this->rules()); /** @var Builder $query */ $query = $this->baseQuery($request); $this->search($request->get('searchPhrase'), $query, $this->searchFields($request)); $sort = $request->get('sort', []); foreach ($sort as $column => $direction) { $query->orderBy($column, $direction); } $limit = $request->get('rowCount', 25); $page = $request->get('current', 1); $paginator = $query->paginate($limit, ['*'], 'page', $page); return $this->formatResponse($paginator); } /** * @param LengthAwarePaginator $paginator * @return \Illuminate\Http\JsonResponse */ protected function formatResponse($paginator) { return response()->json([ 'current' => $paginator->currentPage(), 'rowCount' => $paginator->count(), 'rows' => collect($paginator->items())->map([$this, 'formatItem']), 'total' => $paginator->total(), ]); } }