From 360c8a08f99a28d71089adba861602e9c51cbb4d Mon Sep 17 00:00:00 2001 From: pirs1337 Date: Sun, 19 Oct 2025 15:07:21 +0600 Subject: [PATCH 01/13] feat: add relations validation in get and search requests refs: https://github.com/RonasIT/laravel-entity-generator/issues/206 --- src/Generators/RequestsGenerator.php | 3 ++- stubs/request.blade.php | 16 +++++++++++++++- tests/fixtures/CommandTest/get_request.php | 12 +++++++++++- tests/fixtures/CommandTest/search_request.php | 12 +++++++++++- .../search_request_subfolder_model.php | 12 +++++++++++- .../RequestGeneratorTest/get_request.php | 12 +++++++++++- .../RequestGeneratorTest/search_request.php | 12 +++++++++++- 7 files changed, 72 insertions(+), 7 deletions(-) diff --git a/src/Generators/RequestsGenerator.php b/src/Generators/RequestsGenerator.php index 504b2229..c0b566da 100644 --- a/src/Generators/RequestsGenerator.php +++ b/src/Generators/RequestsGenerator.php @@ -76,6 +76,7 @@ protected function createRequest($method, $needToValidate = true, $parameters = 'namespace' => $this->getNamespace('requests'), 'servicesNamespace' => $this->getNamespace('services'), 'entityNamespace' => $this->getModelClass($this->model), + 'needToValidateWith' => !is_null(Arr::first($parameters, fn ($parameter) => $parameter['name'] === 'with.*')), ]); $this->saveClass('requests', "{$method}{$modelName}Request", @@ -195,7 +196,7 @@ protected function getRules($name, $type, $required, $nullable, $present): array $rules[] = 'present'; } - if ($name === 'order_by') { + if (in_array($name, ['order_by', 'with.*'])) { $rules[] = 'in:'; } diff --git a/stubs/request.blade.php b/stubs/request.blade.php index bb8fb4b8..7153ce43 100644 --- a/stubs/request.blade.php +++ b/stubs/request.blade.php @@ -16,9 +16,13 @@ class {{ $method }}{{ $entity }}Request extends Request public function rules(): array { @if(!empty($parameters)) +@if($needToValidateWith) + $availableRelations = implode(',', $this->getAvailableRelations()); + +@endif return [ @foreach($parameters as $parameter) - '{{ $parameter['name'] }}' => '{!! implode('|', $parameter['rules']) !!}'@if ($parameter['name'] === 'order_by') . $this->getOrderableFields({{ Str::singular($entity) }}::class)@endif, + '{{ $parameter['name'] }}' => '{!! implode('|', $parameter['rules']) !!}'@if ($parameter['name'] === 'order_by') . $this->getOrderableFields({{ Str::singular($entity) }}::class)@elseif($parameter['name'] === 'with.*'){{ ' . $availableRelations' }}@endif, @endforeach ]; @else @@ -41,4 +45,14 @@ public function validateResolved(): void } } @endif +@if($needToValidateWith) + + //TODO: don't forget to review relations list + protected function getAvailableRelations(): array + { + return [ + 'role', + ]; + } +@endif } \ No newline at end of file diff --git a/tests/fixtures/CommandTest/get_request.php b/tests/fixtures/CommandTest/get_request.php index 4440a220..a51c8252 100644 --- a/tests/fixtures/CommandTest/get_request.php +++ b/tests/fixtures/CommandTest/get_request.php @@ -10,9 +10,11 @@ class GetPostRequest extends Request { public function rules(): array { + $availableRelations = implode(',', $this->getAvailableRelations()); + return [ 'with' => 'array', - 'with.*' => 'string|required', + 'with.*' => 'string|required|in:' . $availableRelations, ]; } @@ -26,4 +28,12 @@ public function validateResolved(): void throw new NotFoundHttpException(__('validation.exceptions.not_found', ['entity' => 'Post'])); } } + + //TODO: don't forget to review relations list + protected function getAvailableRelations(): array + { + return [ + 'role', + ]; + } } \ No newline at end of file diff --git a/tests/fixtures/CommandTest/search_request.php b/tests/fixtures/CommandTest/search_request.php index 10096829..75e398cb 100644 --- a/tests/fixtures/CommandTest/search_request.php +++ b/tests/fixtures/CommandTest/search_request.php @@ -9,6 +9,8 @@ class SearchPostsRequest extends Request { public function rules(): array { + $availableRelations = implode(',', $this->getAvailableRelations()); + return [ 'page' => 'integer', 'per_page' => 'integer', @@ -17,7 +19,15 @@ public function rules(): array 'all' => 'boolean', 'with' => 'array', 'query' => 'string|nullable', - 'with.*' => 'string', + 'with.*' => 'string|in:' . $availableRelations, + ]; + } + + //TODO: don't forget to review relations list + protected function getAvailableRelations(): array + { + return [ + 'role', ]; } } \ No newline at end of file diff --git a/tests/fixtures/CommandTest/search_request_subfolder_model.php b/tests/fixtures/CommandTest/search_request_subfolder_model.php index 39db73e5..968c69a6 100644 --- a/tests/fixtures/CommandTest/search_request_subfolder_model.php +++ b/tests/fixtures/CommandTest/search_request_subfolder_model.php @@ -9,6 +9,8 @@ class SearchPostsRequest extends Request { public function rules(): array { + $availableRelations = implode(',', $this->getAvailableRelations()); + return [ 'page' => 'integer', 'per_page' => 'integer', @@ -17,7 +19,15 @@ public function rules(): array 'all' => 'boolean', 'with' => 'array', 'query' => 'string|nullable', - 'with.*' => 'string', + 'with.*' => 'string|in:' . $availableRelations, + ]; + } + + //TODO: don't forget to review relations list + protected function getAvailableRelations(): array + { + return [ + 'role', ]; } } \ No newline at end of file diff --git a/tests/fixtures/RequestGeneratorTest/get_request.php b/tests/fixtures/RequestGeneratorTest/get_request.php index 4440a220..a51c8252 100644 --- a/tests/fixtures/RequestGeneratorTest/get_request.php +++ b/tests/fixtures/RequestGeneratorTest/get_request.php @@ -10,9 +10,11 @@ class GetPostRequest extends Request { public function rules(): array { + $availableRelations = implode(',', $this->getAvailableRelations()); + return [ 'with' => 'array', - 'with.*' => 'string|required', + 'with.*' => 'string|required|in:' . $availableRelations, ]; } @@ -26,4 +28,12 @@ public function validateResolved(): void throw new NotFoundHttpException(__('validation.exceptions.not_found', ['entity' => 'Post'])); } } + + //TODO: don't forget to review relations list + protected function getAvailableRelations(): array + { + return [ + 'role', + ]; + } } \ No newline at end of file diff --git a/tests/fixtures/RequestGeneratorTest/search_request.php b/tests/fixtures/RequestGeneratorTest/search_request.php index 580a4f17..5d058156 100644 --- a/tests/fixtures/RequestGeneratorTest/search_request.php +++ b/tests/fixtures/RequestGeneratorTest/search_request.php @@ -9,6 +9,8 @@ class SearchPostsRequest extends Request { public function rules(): array { + $availableRelations = implode(',', $this->getAvailableRelations()); + return [ 'user_id' => 'integer|exists:users,id|required', 'page' => 'integer', @@ -19,7 +21,15 @@ public function rules(): array 'with' => 'array', 'order_by' => 'string|in:' . $this->getOrderableFields(Post::class), 'query' => 'string|nullable', - 'with.*' => 'string', + 'with.*' => 'string|in:' . $availableRelations, + ]; + } + + //TODO: don't forget to review relations list + protected function getAvailableRelations(): array + { + return [ + 'role', ]; } } \ No newline at end of file From 65d5f6c3571d2872f51c00ec8b7371ce686cc5d5 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 11:54:48 +0600 Subject: [PATCH 02/13] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- stubs/request.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/request.blade.php b/stubs/request.blade.php index 7153ce43..9b93fc66 100644 --- a/stubs/request.blade.php +++ b/stubs/request.blade.php @@ -17,7 +17,7 @@ public function rules(): array { @if(!empty($parameters)) @if($needToValidateWith) - $availableRelations = implode(',', $this->getAvailableRelations()); + $availableRelations = implode(',', $this->getAvailableRelations()); @endif return [ From 6e813a776ac1f91523fc153ff64820e6ac6c7c02 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 11:55:00 +0600 Subject: [PATCH 03/13] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/fixtures/CommandTest/search_request.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/CommandTest/search_request.php b/tests/fixtures/CommandTest/search_request.php index 75e398cb..bc9698aa 100644 --- a/tests/fixtures/CommandTest/search_request.php +++ b/tests/fixtures/CommandTest/search_request.php @@ -9,7 +9,7 @@ class SearchPostsRequest extends Request { public function rules(): array { - $availableRelations = implode(',', $this->getAvailableRelations()); + $availableRelations = implode(',', $this->getAvailableRelations()); return [ 'page' => 'integer', From 2dbc9d1dfb96f4364f8418181153f156d6cee671 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 11:55:15 +0600 Subject: [PATCH 04/13] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/fixtures/CommandTest/search_request_subfolder_model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/CommandTest/search_request_subfolder_model.php b/tests/fixtures/CommandTest/search_request_subfolder_model.php index 968c69a6..23651335 100644 --- a/tests/fixtures/CommandTest/search_request_subfolder_model.php +++ b/tests/fixtures/CommandTest/search_request_subfolder_model.php @@ -9,7 +9,7 @@ class SearchPostsRequest extends Request { public function rules(): array { - $availableRelations = implode(',', $this->getAvailableRelations()); + $availableRelations = implode(',', $this->getAvailableRelations()); return [ 'page' => 'integer', From cd3c2ed0885abaf73696fb0250d9ff8d1dd4206e Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 11:55:30 +0600 Subject: [PATCH 05/13] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/fixtures/RequestGeneratorTest/get_request.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/RequestGeneratorTest/get_request.php b/tests/fixtures/RequestGeneratorTest/get_request.php index a51c8252..b950492c 100644 --- a/tests/fixtures/RequestGeneratorTest/get_request.php +++ b/tests/fixtures/RequestGeneratorTest/get_request.php @@ -10,7 +10,7 @@ class GetPostRequest extends Request { public function rules(): array { - $availableRelations = implode(',', $this->getAvailableRelations()); + $availableRelations = implode(',', $this->getAvailableRelations()); return [ 'with' => 'array', From da4e8ad1a2a820ae17342d7a2aa1a6480a458940 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 11:55:50 +0600 Subject: [PATCH 06/13] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/fixtures/RequestGeneratorTest/search_request.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/RequestGeneratorTest/search_request.php b/tests/fixtures/RequestGeneratorTest/search_request.php index 5d058156..bd3dbfde 100644 --- a/tests/fixtures/RequestGeneratorTest/search_request.php +++ b/tests/fixtures/RequestGeneratorTest/search_request.php @@ -9,7 +9,7 @@ class SearchPostsRequest extends Request { public function rules(): array { - $availableRelations = implode(',', $this->getAvailableRelations()); + $availableRelations = implode(',', $this->getAvailableRelations()); return [ 'user_id' => 'integer|exists:users,id|required', From 1820a48c50ce52cc48a31fa8ab0485047fd733f4 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 12:04:19 +0600 Subject: [PATCH 07/13] Apply suggestion from @DenTray --- tests/fixtures/RequestGeneratorTest/search_request.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fixtures/RequestGeneratorTest/search_request.php b/tests/fixtures/RequestGeneratorTest/search_request.php index bd3dbfde..7e76ce95 100644 --- a/tests/fixtures/RequestGeneratorTest/search_request.php +++ b/tests/fixtures/RequestGeneratorTest/search_request.php @@ -29,7 +29,6 @@ public function rules(): array protected function getAvailableRelations(): array { return [ - 'role', ]; } } \ No newline at end of file From 495ade61631af119d1e811c656f04187507455f7 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 12:05:00 +0600 Subject: [PATCH 08/13] Apply suggestion from @DenTray --- tests/fixtures/RequestGeneratorTest/get_request.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fixtures/RequestGeneratorTest/get_request.php b/tests/fixtures/RequestGeneratorTest/get_request.php index b950492c..0f3e2bd2 100644 --- a/tests/fixtures/RequestGeneratorTest/get_request.php +++ b/tests/fixtures/RequestGeneratorTest/get_request.php @@ -33,7 +33,6 @@ public function validateResolved(): void protected function getAvailableRelations(): array { return [ - 'role', ]; } } \ No newline at end of file From e62502ca5d6379ae1eef2c91e89cd337cec5f1b7 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 12:05:15 +0600 Subject: [PATCH 09/13] Apply suggestion from @DenTray --- tests/fixtures/CommandTest/search_request_subfolder_model.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fixtures/CommandTest/search_request_subfolder_model.php b/tests/fixtures/CommandTest/search_request_subfolder_model.php index 23651335..ff7dc4ec 100644 --- a/tests/fixtures/CommandTest/search_request_subfolder_model.php +++ b/tests/fixtures/CommandTest/search_request_subfolder_model.php @@ -27,7 +27,6 @@ public function rules(): array protected function getAvailableRelations(): array { return [ - 'role', ]; } } \ No newline at end of file From 24fb45024448bb21bf50fef771353c26f04fd3f1 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 12:05:27 +0600 Subject: [PATCH 10/13] Apply suggestion from @DenTray --- tests/fixtures/CommandTest/search_request.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fixtures/CommandTest/search_request.php b/tests/fixtures/CommandTest/search_request.php index bc9698aa..a6c6c801 100644 --- a/tests/fixtures/CommandTest/search_request.php +++ b/tests/fixtures/CommandTest/search_request.php @@ -27,7 +27,6 @@ public function rules(): array protected function getAvailableRelations(): array { return [ - 'role', ]; } } \ No newline at end of file From 9d5a7afae92068703a7ee476fbbcfb390fb5e529 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 12:05:38 +0600 Subject: [PATCH 11/13] Apply suggestion from @DenTray --- tests/fixtures/CommandTest/get_request.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fixtures/CommandTest/get_request.php b/tests/fixtures/CommandTest/get_request.php index a51c8252..20627062 100644 --- a/tests/fixtures/CommandTest/get_request.php +++ b/tests/fixtures/CommandTest/get_request.php @@ -33,7 +33,6 @@ public function validateResolved(): void protected function getAvailableRelations(): array { return [ - 'role', ]; } } \ No newline at end of file From da9092587054332eadb3bcc7c3661824d9fe2c76 Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 12:06:04 +0600 Subject: [PATCH 12/13] Apply suggestion from @DenTray --- stubs/request.blade.php | 1 - 1 file changed, 1 deletion(-) diff --git a/stubs/request.blade.php b/stubs/request.blade.php index 9b93fc66..bde58190 100644 --- a/stubs/request.blade.php +++ b/stubs/request.blade.php @@ -51,7 +51,6 @@ public function validateResolved(): void protected function getAvailableRelations(): array { return [ - 'role', ]; } @endif From 6d1dc74b9475ab82b7990cbc5fa308846b09a7ba Mon Sep 17 00:00:00 2001 From: DenTray Date: Thu, 23 Oct 2025 12:17:03 +0600 Subject: [PATCH 13/13] Apply suggestion from @DenTray --- tests/fixtures/CommandTest/get_request.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/CommandTest/get_request.php b/tests/fixtures/CommandTest/get_request.php index 20627062..0f3e2bd2 100644 --- a/tests/fixtures/CommandTest/get_request.php +++ b/tests/fixtures/CommandTest/get_request.php @@ -10,7 +10,7 @@ class GetPostRequest extends Request { public function rules(): array { - $availableRelations = implode(',', $this->getAvailableRelations()); + $availableRelations = implode(',', $this->getAvailableRelations()); return [ 'with' => 'array',