From e396714d314da127d9dcacdb21929b492b601745 Mon Sep 17 00:00:00 2001 From: philipp lang Date: Fri, 20 Jun 2025 01:02:43 +0200 Subject: [PATCH] Remove ValidateAction --- app/Contribution/Actions/GenerateAction.php | 13 +++--- .../Actions/GenerateApiAction.php | 4 +- app/Contribution/Actions/ValidateAction.php | 37 ----------------- .../Contracts/HasContributionData.php | 2 + app/Contribution/ContributionFactory.php | 10 +++++ resources/js/views/contribution/VIndex.vue | 41 +++++++++---------- routes/web.php | 3 -- tests/Feature/Contribution/StoreTest.php | 30 +++++++++++++- 8 files changed, 69 insertions(+), 71 deletions(-) delete mode 100644 app/Contribution/Actions/ValidateAction.php diff --git a/app/Contribution/Actions/GenerateAction.php b/app/Contribution/Actions/GenerateAction.php index 65ea29a4..f90e2e1e 100644 --- a/app/Contribution/Actions/GenerateAction.php +++ b/app/Contribution/Actions/GenerateAction.php @@ -6,7 +6,7 @@ use App\Contribution\Contracts\HasContributionData; use App\Contribution\ContributionFactory; use App\Contribution\Requests\GenerateRequest; use App\Rules\JsonBase64Rule; -use Illuminate\Support\Facades\Validator; +use Illuminate\Http\JsonResponse; use Lorisleiva\Actions\Concerns\AsAction; use Zoomyboy\Tex\BaseCompiler; use Zoomyboy\Tex\Tex; @@ -20,13 +20,14 @@ class GenerateAction return Tex::compile($request->type()::fromPayload($request)); } - public function asController(GenerateRequest $request): BaseCompiler + public function asController(GenerateRequest $request): BaseCompiler|JsonResponse { - $type = $request->type(); - ValidateAction::validateType($type); - Validator::make($request->payload(), app(ContributionFactory::class)->rules($type))->validate(); + app(ContributionFactory::class)->validateType($request); + app(ContributionFactory::class)->validatePayload($request); - return $this->handle($request); + return $request->input('validate') + ? response()->json([]) + : $this->handle($request); } /** diff --git a/app/Contribution/Actions/GenerateApiAction.php b/app/Contribution/Actions/GenerateApiAction.php index 9c186296..01e8f4dc 100644 --- a/app/Contribution/Actions/GenerateApiAction.php +++ b/app/Contribution/Actions/GenerateApiAction.php @@ -3,6 +3,7 @@ namespace App\Contribution\Actions; use App\Contribution\Contracts\HasContributionData; +use App\Contribution\ContributionFactory; use App\Contribution\Requests\GenerateApiRequest; use Lorisleiva\Actions\Concerns\AsAction; use Zoomyboy\Tex\BaseCompiler; @@ -22,8 +23,7 @@ class GenerateApiAction public function asController(GenerateApiRequest $request): BaseCompiler { - $type = $request->type(); - ValidateAction::validateType($type); + app(ContributionFactory::class)->validateType($request); return $this->handle($request); } diff --git a/app/Contribution/Actions/ValidateAction.php b/app/Contribution/Actions/ValidateAction.php deleted file mode 100644 index 2d497c26..00000000 --- a/app/Contribution/Actions/ValidateAction.php +++ /dev/null @@ -1,37 +0,0 @@ -json(['valid' => true]); - } - - /** - * @return array - */ - public function rules(): array - { - return app(ContributionFactory::class)->rules(request()->type); - } - - public function prepareForValidation(ActionRequest $request): void - { - static::validateType($request->input('type')); - } - - public static function validateType(?string $type = null): void - { - Validator::make(['type' => $type], app(ContributionFactory::class)->typeRule())->validate(); - } -} diff --git a/app/Contribution/Contracts/HasContributionData.php b/app/Contribution/Contracts/HasContributionData.php index 41953ab4..2f3039a7 100644 --- a/app/Contribution/Contracts/HasContributionData.php +++ b/app/Contribution/Contracts/HasContributionData.php @@ -25,4 +25,6 @@ interface HasContributionData { public function members(): Collection; public function country(): ?Country; + + public function payload(): array; } diff --git a/app/Contribution/ContributionFactory.php b/app/Contribution/ContributionFactory.php index ceae2e63..5a0f4d89 100644 --- a/app/Contribution/ContributionFactory.php +++ b/app/Contribution/ContributionFactory.php @@ -2,6 +2,7 @@ namespace App\Contribution; +use App\Contribution\Contracts\HasContributionData; use App\Contribution\Documents\BdkjHesse; use App\Contribution\Documents\ContributionDocument; use App\Contribution\Documents\RdpNrwDocument; @@ -10,6 +11,7 @@ use App\Contribution\Documents\CitySolingenDocument; use App\Contribution\Documents\CityFrankfurtMainDocument; use App\Contribution\Documents\WuppertalDocument; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; class ContributionFactory @@ -59,4 +61,12 @@ class ContributionFactory ...$type::rules(), ]; } + + public function validateType(HasContributionData $request) { + Validator::make(['type' => $request->type()], $this->typeRule())->validate(); + } + + public function validatePayload(HasContributionData $request) { + Validator::make($request->payload(), $this->rules($request->type()))->validate(); + } } diff --git a/resources/js/views/contribution/VIndex.vue b/resources/js/views/contribution/VIndex.vue index b5cde55c..6f4b4686 100644 --- a/resources/js/views/contribution/VIndex.vue +++ b/resources/js/views/contribution/VIndex.vue @@ -1,32 +1,31 @@ @@ -58,8 +57,8 @@ const values = ref({ async function submit(compiler) { values.value.type = compiler; - await axios.post('/contribution-validate', values.value); - var payload = btoa(encodeURIComponent(JSON.stringify(values.value))); + const payload = btoa(encodeURIComponent(JSON.stringify(values.value))); + await axios.get(`/contribution-generate?payload=${payload}&validate=1`); window.open(`/contribution-generate?payload=${payload}`); } function onSubmitMemberResult(selected) { diff --git a/routes/web.php b/routes/web.php index ef36e970..0c8c488a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,7 +11,6 @@ use App\Activity\Api\SubactivityStoreAction; use App\Activity\Api\SubactivityUpdateAction; use App\Contribution\Actions\FormAction as ContributionFormAction; use App\Contribution\Actions\GenerateAction as ContributionGenerateAction; -use App\Contribution\Actions\ValidateAction as ContributionValidateAction; use App\Course\Actions\CourseDestroyAction; use App\Course\Actions\CourseIndexAction; use App\Course\Actions\CourseStoreAction; @@ -70,7 +69,6 @@ use App\Member\Actions\MemberResyncAction; use App\Member\Actions\MemberShowAction; use App\Member\Actions\SearchAction; use App\Member\MemberController; -use App\Membership\Actions\IndexAction as MembershipIndexAction; use App\Membership\Actions\ListForGroupAction; use App\Membership\Actions\MassListAction; use App\Membership\Actions\MassStoreAction; @@ -112,7 +110,6 @@ Route::group(['middleware' => 'auth:web'], function (): void { // ------------------------------- Contributions ------------------------------- Route::get('/contribution', ContributionFormAction::class)->name('contribution.form'); Route::get('/contribution-generate', ContributionGenerateAction::class)->name('contribution.generate'); - Route::post('/contribution-validate', ContributionValidateAction::class)->name('contribution.validate'); // ----------------------------------- mail ------------------------------------ Route::post('/api/mailgateway', StoreAction::class)->name('mailgateway.store'); diff --git a/tests/Feature/Contribution/StoreTest.php b/tests/Feature/Contribution/StoreTest.php index 1aab1bae..aeb70a61 100644 --- a/tests/Feature/Contribution/StoreTest.php +++ b/tests/Feature/Contribution/StoreTest.php @@ -39,6 +39,30 @@ it('compiles documents via base64 param', function (string $type, array $bodyChe Tex::assertCompiled($type, fn ($document) => $document->hasAllContent($bodyChecks)); })->with('contribution-assertions'); +it('only validates', function (string $type) { + $this->withoutExceptionHandling(); + Tex::spy(); + $this->login()->loginNami(); + $member1 = Member::factory()->defaults()->male()->create(['address' => 'Maxstr 44', 'zip' => '42719', 'firstname' => 'Max', 'lastname' => 'Muster']); + $member2 = Member::factory()->defaults()->female()->create(['address' => 'Maxstr 44', 'zip' => '42719', 'firstname' => 'Jane', 'lastname' => 'Muster']); + + $response = $this->call('GET', '/contribution-generate', [ + 'validate' => '1', + 'payload' => ContributionRequestFactory::new()->type($type)->state([ + 'dateFrom' => '1991-06-15', + 'dateUntil' => '1991-06-16', + 'eventName' => 'Super tolles Lager', + 'members' => [$member1->id, $member2->id], + 'type' => $type, + 'zipLocation' => '42777 SG', + ])->toBase64(), + ]); + + $response->assertSessionDoesntHaveErrors(); + $response->assertOk(); + Tex::assertNotCompiled($type); +})->with('contribution-assertions'); + it('testItCompilesGroupNameInSolingenDocument', function () { $this->withoutExceptionHandling()->login()->loginNami(); Tex::spy(); @@ -91,8 +115,10 @@ it('testItValidatesInput', function (array $input, string $documentClass, string Country::factory()->create(); Member::factory()->defaults()->create(); - $this->postJson('/contribution-validate', ContributionRequestFactory::new()->type($documentClass)->state($input)->create()) - ->assertJsonValidationErrors($errorField); + $this->json('GET', '/contribution-generate?'.http_build_query([ + 'payload' => ContributionRequestFactory::new()->type($documentClass)->state($input)->toBase64(), + 'validate' => '1' + ]))->assertJsonValidationErrors($errorField); })->with('contribution-validation'); it('testItValidatesInputBeforeGeneration', function (array $input, string $documentClass, string $errorField) {