Remove ValidateAction
This commit is contained in:
parent
af13bb1cde
commit
e396714d31
|
@ -6,7 +6,7 @@ use App\Contribution\Contracts\HasContributionData;
|
||||||
use App\Contribution\ContributionFactory;
|
use App\Contribution\ContributionFactory;
|
||||||
use App\Contribution\Requests\GenerateRequest;
|
use App\Contribution\Requests\GenerateRequest;
|
||||||
use App\Rules\JsonBase64Rule;
|
use App\Rules\JsonBase64Rule;
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Http\JsonResponse;
|
||||||
use Lorisleiva\Actions\Concerns\AsAction;
|
use Lorisleiva\Actions\Concerns\AsAction;
|
||||||
use Zoomyboy\Tex\BaseCompiler;
|
use Zoomyboy\Tex\BaseCompiler;
|
||||||
use Zoomyboy\Tex\Tex;
|
use Zoomyboy\Tex\Tex;
|
||||||
|
@ -20,13 +20,14 @@ class GenerateAction
|
||||||
return Tex::compile($request->type()::fromPayload($request));
|
return Tex::compile($request->type()::fromPayload($request));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function asController(GenerateRequest $request): BaseCompiler
|
public function asController(GenerateRequest $request): BaseCompiler|JsonResponse
|
||||||
{
|
{
|
||||||
$type = $request->type();
|
app(ContributionFactory::class)->validateType($request);
|
||||||
ValidateAction::validateType($type);
|
app(ContributionFactory::class)->validatePayload($request);
|
||||||
Validator::make($request->payload(), app(ContributionFactory::class)->rules($type))->validate();
|
|
||||||
|
|
||||||
return $this->handle($request);
|
return $request->input('validate')
|
||||||
|
? response()->json([])
|
||||||
|
: $this->handle($request);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
namespace App\Contribution\Actions;
|
namespace App\Contribution\Actions;
|
||||||
|
|
||||||
use App\Contribution\Contracts\HasContributionData;
|
use App\Contribution\Contracts\HasContributionData;
|
||||||
|
use App\Contribution\ContributionFactory;
|
||||||
use App\Contribution\Requests\GenerateApiRequest;
|
use App\Contribution\Requests\GenerateApiRequest;
|
||||||
use Lorisleiva\Actions\Concerns\AsAction;
|
use Lorisleiva\Actions\Concerns\AsAction;
|
||||||
use Zoomyboy\Tex\BaseCompiler;
|
use Zoomyboy\Tex\BaseCompiler;
|
||||||
|
@ -22,8 +23,7 @@ class GenerateApiAction
|
||||||
|
|
||||||
public function asController(GenerateApiRequest $request): BaseCompiler
|
public function asController(GenerateApiRequest $request): BaseCompiler
|
||||||
{
|
{
|
||||||
$type = $request->type();
|
app(ContributionFactory::class)->validateType($request);
|
||||||
ValidateAction::validateType($type);
|
|
||||||
|
|
||||||
return $this->handle($request);
|
return $this->handle($request);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Contribution\Actions;
|
|
||||||
|
|
||||||
use App\Contribution\ContributionFactory;
|
|
||||||
use Illuminate\Http\JsonResponse;
|
|
||||||
use Illuminate\Support\Facades\Validator;
|
|
||||||
use Lorisleiva\Actions\ActionRequest;
|
|
||||||
use Lorisleiva\Actions\Concerns\AsAction;
|
|
||||||
|
|
||||||
class ValidateAction
|
|
||||||
{
|
|
||||||
use AsAction;
|
|
||||||
|
|
||||||
public function asController(): JsonResponse
|
|
||||||
{
|
|
||||||
return response()->json(['valid' => true]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return array<string, mixed>
|
|
||||||
*/
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,4 +25,6 @@ interface HasContributionData {
|
||||||
public function members(): Collection;
|
public function members(): Collection;
|
||||||
|
|
||||||
public function country(): ?Country;
|
public function country(): ?Country;
|
||||||
|
|
||||||
|
public function payload(): array;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App\Contribution;
|
namespace App\Contribution;
|
||||||
|
|
||||||
|
use App\Contribution\Contracts\HasContributionData;
|
||||||
use App\Contribution\Documents\BdkjHesse;
|
use App\Contribution\Documents\BdkjHesse;
|
||||||
use App\Contribution\Documents\ContributionDocument;
|
use App\Contribution\Documents\ContributionDocument;
|
||||||
use App\Contribution\Documents\RdpNrwDocument;
|
use App\Contribution\Documents\RdpNrwDocument;
|
||||||
|
@ -10,6 +11,7 @@ use App\Contribution\Documents\CitySolingenDocument;
|
||||||
use App\Contribution\Documents\CityFrankfurtMainDocument;
|
use App\Contribution\Documents\CityFrankfurtMainDocument;
|
||||||
use App\Contribution\Documents\WuppertalDocument;
|
use App\Contribution\Documents\WuppertalDocument;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
class ContributionFactory
|
class ContributionFactory
|
||||||
|
@ -59,4 +61,12 @@ class ContributionFactory
|
||||||
...$type::rules(),
|
...$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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,17 @@
|
||||||
<template>
|
<template>
|
||||||
<page-layout>
|
<page-layout>
|
||||||
<form target="_BLANK" class="max-w-4xl w-full mx-auto gap-6 grid-cols-2 grid p-6">
|
<form target="_BLANK" class="max-w-4xl w-full mx-auto gap-6 grid-cols-2 grid p-6">
|
||||||
<f-text id="eventName" v-model="values.eventName" class="col-span-2" label="Veranstaltungs-Name" required></f-text>
|
<f-text id="eventName" v-model="values.eventName" class="col-span-2" label="Veranstaltungs-Name" required />
|
||||||
<f-text id="dateFrom" v-model="values.dateFrom" type="date" label="Datum von" required></f-text>
|
<f-text id="dateFrom" v-model="values.dateFrom" type="date" label="Datum von" required />
|
||||||
<f-text id="dateUntil" v-model="values.dateUntil" type="date" label="Datum bis" required></f-text>
|
<f-text id="dateUntil" v-model="values.dateUntil" type="date" label="Datum bis" required />
|
||||||
|
|
||||||
<f-text id="zipLocation" v-model="values.zipLocation" label="PLZ / Ort" required></f-text>
|
<f-text id="zipLocation" v-model="values.zipLocation" label="PLZ / Ort" required />
|
||||||
<f-select id="country" v-model="values.country" :options="countries" name="country" label="Land" required></f-select>
|
<f-select id="country" v-model="values.country" :options="countries" name="country" label="Land" required />
|
||||||
|
|
||||||
<div class="border-gray-200 shadow shadow-primary-700 p-3 shadow-[0_0_4px_gray] col-span-2">
|
<div class="border-gray-200 shadow shadow-primary-700 p-3 shadow-[0_0_4px_gray] col-span-2">
|
||||||
<f-text id="search_text" ref="searchInput" v-model="searchString" class="col-span-2" label="Suchen …" size="sm" @keypress.enter.prevent="onSubmitFirstMemberResult"></f-text>
|
<f-text id="search_text" ref="searchInput" v-model="searchString" class="col-span-2" label="Suchen …" size="sm" @keypress.enter.prevent="onSubmitFirstMemberResult" />
|
||||||
<div class="mt-2 grid grid-cols-[repeat(auto-fill,minmax(180px,1fr))] gap-2 col-span-2">
|
<div class="mt-2 grid grid-cols-[repeat(auto-fill,minmax(180px,1fr))] gap-2 col-span-2">
|
||||||
<f-switch
|
<f-switch v-for="member in results.hits"
|
||||||
v-for="member in results.hits"
|
|
||||||
:id="`members-${member.id}`"
|
:id="`members-${member.id}`"
|
||||||
:key="member.id"
|
:key="member.id"
|
||||||
v-model="values.members"
|
v-model="values.members"
|
||||||
|
@ -22,11 +21,11 @@
|
||||||
size="sm"
|
size="sm"
|
||||||
inline
|
inline
|
||||||
@keypress.enter.prevent="onSubmitMemberResult(member)"
|
@keypress.enter.prevent="onSubmitMemberResult(member)"
|
||||||
></f-switch>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button v-for="(compiler, index) in compilers" :key="index" class="btn btn-primary mt-3 inline-block" @click.prevent="submit(compiler.class)" v-text="compiler.title"></button>
|
<button v-for="(compiler, index) in compilers" :key="index" class="btn btn-primary mt-3 inline-block" @click.prevent="submit(compiler.class)" v-text="compiler.title" />
|
||||||
</form>
|
</form>
|
||||||
</page-layout>
|
</page-layout>
|
||||||
</template>
|
</template>
|
||||||
|
@ -58,8 +57,8 @@ const values = ref({
|
||||||
|
|
||||||
async function submit(compiler) {
|
async function submit(compiler) {
|
||||||
values.value.type = compiler;
|
values.value.type = compiler;
|
||||||
await axios.post('/contribution-validate', values.value);
|
const payload = btoa(encodeURIComponent(JSON.stringify(values.value)));
|
||||||
var payload = btoa(encodeURIComponent(JSON.stringify(values.value)));
|
await axios.get(`/contribution-generate?payload=${payload}&validate=1`);
|
||||||
window.open(`/contribution-generate?payload=${payload}`);
|
window.open(`/contribution-generate?payload=${payload}`);
|
||||||
}
|
}
|
||||||
function onSubmitMemberResult(selected) {
|
function onSubmitMemberResult(selected) {
|
||||||
|
|
|
@ -11,7 +11,6 @@ use App\Activity\Api\SubactivityStoreAction;
|
||||||
use App\Activity\Api\SubactivityUpdateAction;
|
use App\Activity\Api\SubactivityUpdateAction;
|
||||||
use App\Contribution\Actions\FormAction as ContributionFormAction;
|
use App\Contribution\Actions\FormAction as ContributionFormAction;
|
||||||
use App\Contribution\Actions\GenerateAction as ContributionGenerateAction;
|
use App\Contribution\Actions\GenerateAction as ContributionGenerateAction;
|
||||||
use App\Contribution\Actions\ValidateAction as ContributionValidateAction;
|
|
||||||
use App\Course\Actions\CourseDestroyAction;
|
use App\Course\Actions\CourseDestroyAction;
|
||||||
use App\Course\Actions\CourseIndexAction;
|
use App\Course\Actions\CourseIndexAction;
|
||||||
use App\Course\Actions\CourseStoreAction;
|
use App\Course\Actions\CourseStoreAction;
|
||||||
|
@ -70,7 +69,6 @@ use App\Member\Actions\MemberResyncAction;
|
||||||
use App\Member\Actions\MemberShowAction;
|
use App\Member\Actions\MemberShowAction;
|
||||||
use App\Member\Actions\SearchAction;
|
use App\Member\Actions\SearchAction;
|
||||||
use App\Member\MemberController;
|
use App\Member\MemberController;
|
||||||
use App\Membership\Actions\IndexAction as MembershipIndexAction;
|
|
||||||
use App\Membership\Actions\ListForGroupAction;
|
use App\Membership\Actions\ListForGroupAction;
|
||||||
use App\Membership\Actions\MassListAction;
|
use App\Membership\Actions\MassListAction;
|
||||||
use App\Membership\Actions\MassStoreAction;
|
use App\Membership\Actions\MassStoreAction;
|
||||||
|
@ -112,7 +110,6 @@ Route::group(['middleware' => 'auth:web'], function (): void {
|
||||||
// ------------------------------- Contributions -------------------------------
|
// ------------------------------- Contributions -------------------------------
|
||||||
Route::get('/contribution', ContributionFormAction::class)->name('contribution.form');
|
Route::get('/contribution', ContributionFormAction::class)->name('contribution.form');
|
||||||
Route::get('/contribution-generate', ContributionGenerateAction::class)->name('contribution.generate');
|
Route::get('/contribution-generate', ContributionGenerateAction::class)->name('contribution.generate');
|
||||||
Route::post('/contribution-validate', ContributionValidateAction::class)->name('contribution.validate');
|
|
||||||
|
|
||||||
// ----------------------------------- mail ------------------------------------
|
// ----------------------------------- mail ------------------------------------
|
||||||
Route::post('/api/mailgateway', StoreAction::class)->name('mailgateway.store');
|
Route::post('/api/mailgateway', StoreAction::class)->name('mailgateway.store');
|
||||||
|
|
|
@ -39,6 +39,30 @@ it('compiles documents via base64 param', function (string $type, array $bodyChe
|
||||||
Tex::assertCompiled($type, fn ($document) => $document->hasAllContent($bodyChecks));
|
Tex::assertCompiled($type, fn ($document) => $document->hasAllContent($bodyChecks));
|
||||||
})->with('contribution-assertions');
|
})->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 () {
|
it('testItCompilesGroupNameInSolingenDocument', function () {
|
||||||
$this->withoutExceptionHandling()->login()->loginNami();
|
$this->withoutExceptionHandling()->login()->loginNami();
|
||||||
Tex::spy();
|
Tex::spy();
|
||||||
|
@ -91,8 +115,10 @@ it('testItValidatesInput', function (array $input, string $documentClass, string
|
||||||
Country::factory()->create();
|
Country::factory()->create();
|
||||||
Member::factory()->defaults()->create();
|
Member::factory()->defaults()->create();
|
||||||
|
|
||||||
$this->postJson('/contribution-validate', ContributionRequestFactory::new()->type($documentClass)->state($input)->create())
|
$this->json('GET', '/contribution-generate?'.http_build_query([
|
||||||
->assertJsonValidationErrors($errorField);
|
'payload' => ContributionRequestFactory::new()->type($documentClass)->state($input)->toBase64(),
|
||||||
|
'validate' => '1'
|
||||||
|
]))->assertJsonValidationErrors($errorField);
|
||||||
})->with('contribution-validation');
|
})->with('contribution-validation');
|
||||||
|
|
||||||
it('testItValidatesInputBeforeGeneration', function (array $input, string $documentClass, string $errorField) {
|
it('testItValidatesInputBeforeGeneration', function (array $input, string $documentClass, string $errorField) {
|
||||||
|
|
Loading…
Reference in New Issue