diff --git a/src/Concerns/Resource/Paginable.php b/src/Concerns/Resource/Paginable.php index a96becb..80ec607 100644 --- a/src/Concerns/Resource/Paginable.php +++ b/src/Concerns/Resource/Paginable.php @@ -17,11 +17,13 @@ trait Paginable */ public function paginate($query, RestRequest $request) { + $defaultLimit = $this->defaultLimit ?? 50; + // In case we have a scout builder if ($query instanceof Builder) { - return $query->paginate($request->input('search.limit', 50), 'page', $request->input('search.page', 1)); + return $query->paginate($request->input('search.limit', $defaultLimit), 'page', $request->input('search.page', 1)); } - return $query->paginate($request->input('search.limit', 50), ['*'], 'page', $request->input('search.page', 1)); + return $query->paginate($request->input('search.limit', $defaultLimit), ['*'], 'page', $request->input('search.page', 1)); } } diff --git a/src/Console/stubs/resource.stub b/src/Console/stubs/resource.stub index 2fa9d70..bf60b3c 100644 --- a/src/Console/stubs/resource.stub +++ b/src/Console/stubs/resource.stub @@ -13,6 +13,13 @@ class {{ class }} extends RestResource */ public static $model = \{{ namespacedModel }}::class; + /** + * The default value for the pagination limit. + * + * @var int + */ + public int $defaultLimit = 50; + /** * The exposed fields that could be provided * @param RestRequest $request diff --git a/src/Console/stubs/user-resource.stub b/src/Console/stubs/user-resource.stub index a058a17..aa1a43b 100644 --- a/src/Console/stubs/user-resource.stub +++ b/src/Console/stubs/user-resource.stub @@ -13,6 +13,13 @@ class UserResource extends RestResource */ public static $model = \App\User::class; + /** + * The default value for the pagination limit. + * + * @var int + */ + public int $defaultLimit = 50; + /** * The exposed fields that could be provided * @param RestRequest $request diff --git a/src/Http/Resource.php b/src/Http/Resource.php index 9541529..b4fa922 100644 --- a/src/Http/Resource.php +++ b/src/Http/Resource.php @@ -46,6 +46,13 @@ class Resource implements \JsonSerializable */ public static $response = Response::class; + /** + * The default value for the pagination limit. + * + * @var int + */ + public int $defaultLimit = 50; + /** * Get a fresh instance of the model represented by the resource. * diff --git a/src/Query/ScoutBuilder.php b/src/Query/ScoutBuilder.php index 53f7f13..5d375dc 100644 --- a/src/Query/ScoutBuilder.php +++ b/src/Query/ScoutBuilder.php @@ -49,7 +49,8 @@ public function search(array $parameters = []) $this->applyInstructions($parameters['instructions']); }); - $this->queryBuilder->take($parameters['limit'] ?? 50); + $defaultLimit = $this->resource->defaultLimit ?? 50; + $this->queryBuilder->take($parameters['limit'] ?? $defaultLimit); $this->queryBuilder ->query(function (Builder $query) use ($parameters) { diff --git a/tests/Feature/Controllers/SearchPaginateOperationsTest.php b/tests/Feature/Controllers/SearchPaginateOperationsTest.php index 3a7458b..e297f51 100644 --- a/tests/Feature/Controllers/SearchPaginateOperationsTest.php +++ b/tests/Feature/Controllers/SearchPaginateOperationsTest.php @@ -82,4 +82,22 @@ public function test_getting_a_list_of_resources_paginating_with_many_records(): new ModelResource() ); } + + public function test_to_get_a_list_of_paginated_resources_from_the_default_limit(): void + { + ModelFactory::new()->count(100)->create()->fresh(); + + Gate::policy(Model::class, GreenPolicy::class); + + $response = $this->post( + '/api/model-with-default-limit/search', + [], + ['Accept' => 'application/json'] + ); + + $response->assertStatus(200); + $response->assertJsonPath('per_page', 32); + $response->assertJsonPath('last_page', 4); + $response->assertJsonCount(32, 'data'); + } } diff --git a/tests/Support/Http/Controllers/ModelWithDefaultLimitController.php b/tests/Support/Http/Controllers/ModelWithDefaultLimitController.php new file mode 100644 index 0000000..832fe9c --- /dev/null +++ b/tests/Support/Http/Controllers/ModelWithDefaultLimitController.php @@ -0,0 +1,11 @@ +withSoftDeletes(); \Lomkit\Rest\Facades\Rest::resource('model-withs', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelWithController::class); + \Lomkit\Rest\Facades\Rest::resource('model-with-default-limit', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelWithDefaultLimitController::class); \Lomkit\Rest\Facades\Rest::resource('no-relationship-authorization-models', \Lomkit\Rest\Tests\Support\Http\Controllers\NoRelationshipAuthorizationModelController::class); \Lomkit\Rest\Facades\Rest::resource('no-exposed-fields', \Lomkit\Rest\Tests\Support\Http\Controllers\NoExposedFieldsController::class);