From d74fcab024cf1b4e61b542db1e0118c18c9d0935 Mon Sep 17 00:00:00 2001 From: philipp lang Date: Wed, 18 Jun 2025 17:01:28 +0200 Subject: [PATCH] Add Contribution Request --- app/Contribution/Actions/GenerateAction.php | 29 +++----- .../Actions/GenerateApiAction.php | 18 ++--- .../Contracts/HasContributionData.php | 28 ++++++++ app/Contribution/Documents/BdkjHesse.php | 33 +++------ .../Documents/CityFrankfurtMainDocument.php | 33 +++------ .../Documents/CityRemscheidDocument.php | 38 +++-------- .../Documents/CitySolingenDocument.php | 29 ++------ .../Documents/ContributionDocument.php | 11 +-- app/Contribution/Documents/RdpNrwDocument.php | 33 +++------ .../Documents/WuppertalDocument.php | 33 +++------ .../Requests/GenerateApiRequest.php | 67 +++++++++++++++++++ app/Contribution/Requests/GenerateRequest.php | 62 +++++++++++++++++ 12 files changed, 223 insertions(+), 191 deletions(-) create mode 100644 app/Contribution/Contracts/HasContributionData.php create mode 100644 app/Contribution/Requests/GenerateApiRequest.php create mode 100644 app/Contribution/Requests/GenerateRequest.php diff --git a/app/Contribution/Actions/GenerateAction.php b/app/Contribution/Actions/GenerateAction.php index f26caa60..65ea29a4 100644 --- a/app/Contribution/Actions/GenerateAction.php +++ b/app/Contribution/Actions/GenerateAction.php @@ -2,11 +2,11 @@ namespace App\Contribution\Actions; +use App\Contribution\Contracts\HasContributionData; use App\Contribution\ContributionFactory; -use App\Contribution\Documents\ContributionDocument; +use App\Contribution\Requests\GenerateRequest; use App\Rules\JsonBase64Rule; use Illuminate\Support\Facades\Validator; -use Lorisleiva\Actions\ActionRequest; use Lorisleiva\Actions\Concerns\AsAction; use Zoomyboy\Tex\BaseCompiler; use Zoomyboy\Tex\Tex; @@ -15,23 +15,18 @@ class GenerateAction { use AsAction; - /** - * @param class-string $document - * @param array $payload - */ - public function handle(string $document, array $payload): BaseCompiler + public function handle(HasContributionData $request): BaseCompiler { - return Tex::compile($document::fromRequest($payload)); + return Tex::compile($request->type()::fromPayload($request)); } - public function asController(ActionRequest $request): BaseCompiler + public function asController(GenerateRequest $request): BaseCompiler { - $payload = $this->payload($request); - $type = data_get($payload, 'type'); + $type = $request->type(); ValidateAction::validateType($type); - Validator::make($payload, app(ContributionFactory::class)->rules($type))->validate(); + Validator::make($request->payload(), app(ContributionFactory::class)->rules($type))->validate(); - return $this->handle($type, $payload); + return $this->handle($request); } /** @@ -43,12 +38,4 @@ class GenerateAction 'payload' => [new JsonBase64Rule()], ]; } - - /** - * @return array - */ - private function payload(ActionRequest $request): array - { - return json_decode(rawurldecode(base64_decode($request->input('payload', ''))), true); - } } diff --git a/app/Contribution/Actions/GenerateApiAction.php b/app/Contribution/Actions/GenerateApiAction.php index fc8de068..37d4d563 100644 --- a/app/Contribution/Actions/GenerateApiAction.php +++ b/app/Contribution/Actions/GenerateApiAction.php @@ -2,8 +2,8 @@ namespace App\Contribution\Actions; -use App\Contribution\Documents\ContributionDocument; -use Lorisleiva\Actions\ActionRequest; +use App\Contribution\Contracts\HasContributionData; +use App\Contribution\Requests\GenerateApiRequest; use Lorisleiva\Actions\Concerns\AsAction; use Zoomyboy\Tex\BaseCompiler; use Zoomyboy\Tex\Tex; @@ -13,19 +13,19 @@ class GenerateApiAction use AsAction; /** - * @param class-string $document - * @param array $payload + * @todo merge this with GenerateAction */ - public function handle(string $document, array $payload): BaseCompiler + public function handle(HasContributionData $request): BaseCompiler { - return Tex::compile($document::fromApiRequest($payload)); + return Tex::compile($request->type()::fromPayload($request)); } - public function asController(ActionRequest $request): BaseCompiler + public function asController(GenerateApiRequest $request): BaseCompiler { - ValidateAction::validateType($request->input('type')); + $type = $request->type(); + ValidateAction::validateType($type); - return $this->handle($request->input('type'), $request->input()); + return $this->handle($request); } /** diff --git a/app/Contribution/Contracts/HasContributionData.php b/app/Contribution/Contracts/HasContributionData.php new file mode 100644 index 00000000..41953ab4 --- /dev/null +++ b/app/Contribution/Contracts/HasContributionData.php @@ -0,0 +1,28 @@ + + */ + public function type(): string; + + /** + * @return Collection + */ + public function members(): Collection; + + public function country(): ?Country; +} diff --git a/app/Contribution/Documents/BdkjHesse.php b/app/Contribution/Documents/BdkjHesse.php index 2911b979..adb0bc8a 100644 --- a/app/Contribution/Documents/BdkjHesse.php +++ b/app/Contribution/Documents/BdkjHesse.php @@ -2,6 +2,7 @@ namespace App\Contribution\Documents; +use App\Contribution\Contracts\HasContributionData; use App\Contribution\Data\MemberData; use App\Contribution\Traits\HasPdfBackground; use App\Country; @@ -39,33 +40,15 @@ class BdkjHesse extends ContributionDocument return Carbon::parse($this->dateUntil)->format('d.m.Y'); } - /** - * {@inheritdoc} - */ - public static function fromRequest(array $request): self + public static function fromPayload(HasContributionData $request): self { return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), - members: MemberData::fromModels($request['members'])->chunk(20), - eventName: $request['eventName'], - ); - } - - /** - * {@inheritdoc} - */ - public static function fromApiRequest(array $request): self - { - return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), - members: MemberData::fromApi($request['member_data'])->chunk(20), - eventName: $request['eventName'], + dateFrom: $request->dateFrom(), + dateUntil: $request->dateUntil(), + zipLocation: $request->zipLocation(), + country: $request->country(), + members: $request->members()->chunk(20), + eventName: $request->eventName(), ); } diff --git a/app/Contribution/Documents/CityFrankfurtMainDocument.php b/app/Contribution/Documents/CityFrankfurtMainDocument.php index 63e6acdd..98d5c6ed 100644 --- a/app/Contribution/Documents/CityFrankfurtMainDocument.php +++ b/app/Contribution/Documents/CityFrankfurtMainDocument.php @@ -2,6 +2,7 @@ namespace App\Contribution\Documents; +use App\Contribution\Contracts\HasContributionData; use App\Contribution\Data\MemberData; use App\Contribution\Traits\FormatsDates; use App\Contribution\Traits\HasPdfBackground; @@ -33,33 +34,15 @@ class CityFrankfurtMainDocument extends ContributionDocument $this->fromName = app(InvoiceSettings::class)->from_long; } - /** - * {@inheritdoc} - */ - public static function fromRequest(array $request): self + public static function fromPayload(HasContributionData $request): self { return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), - members: MemberData::fromModels($request['members'])->chunk(15), - eventName: $request['eventName'], - ); - } - - /** - * {@inheritdoc} - */ - public static function fromApiRequest(array $request): self - { - return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), - members: MemberData::fromApi($request['member_data'])->chunk(15), - eventName: $request['eventName'], + dateFrom: $request->dateFrom(), + dateUntil: $request->dateUntil(), + zipLocation: $request->zipLocation(), + country: $request->country(), + members: $request->members()->chunk(15), + eventName: $request->eventName(), ); } diff --git a/app/Contribution/Documents/CityRemscheidDocument.php b/app/Contribution/Documents/CityRemscheidDocument.php index d97b2162..ff80403c 100644 --- a/app/Contribution/Documents/CityRemscheidDocument.php +++ b/app/Contribution/Documents/CityRemscheidDocument.php @@ -2,7 +2,7 @@ namespace App\Contribution\Documents; -use App\Contribution\Data\MemberData; +use App\Contribution\Contracts\HasContributionData; use App\Contribution\Traits\FormatsDates; use App\Contribution\Traits\HasPdfBackground; use App\Country; @@ -32,40 +32,18 @@ class CityRemscheidDocument extends ContributionDocument $this->setEventName($eventName); } - /** - * {@inheritdoc} - */ - public static function fromRequest(array $request): self + public static function fromPayload(HasContributionData $request): self { - [$leaders, $children] = MemberData::fromModels($request['members'])->partition(fn ($member) => $member->isLeader); + [$leaders, $children] = $request->members()->partition(fn ($member) => $member->isLeader); return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), + dateFrom: $request->dateFrom(), + dateUntil: $request->dateUntil(), + zipLocation: $request->zipLocation(), + country: $request->country(), leaders: $leaders->values()->toBase()->chunk(6), children: $children->values()->toBase()->chunk(20), - eventName: $request['eventName'], - ); - } - - /** - * {@inheritdoc} - */ - public static function fromApiRequest(array $request): self - { - $members = MemberData::fromApi($request['member_data']); - [$leaders, $children] = $members->partition(fn ($member) => $member->isLeader); - - return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), - leaders: $leaders->values()->toBase()->chunk(6), - children: $children->values()->toBase()->chunk(20), - eventName: $request['eventName'], + eventName: $request->eventName(), ); } diff --git a/app/Contribution/Documents/CitySolingenDocument.php b/app/Contribution/Documents/CitySolingenDocument.php index ee3ed070..fc0acbf3 100644 --- a/app/Contribution/Documents/CitySolingenDocument.php +++ b/app/Contribution/Documents/CitySolingenDocument.php @@ -2,6 +2,7 @@ namespace App\Contribution\Documents; +use App\Contribution\Contracts\HasContributionData; use App\Contribution\Data\MemberData; use App\Invoice\InvoiceSettings; use Carbon\Carbon; @@ -30,28 +31,14 @@ class CitySolingenDocument extends ContributionDocument /** * {@inheritdoc} */ - public static function fromRequest(array $request): static + public static function fromPayload(HasContributionData $request): static { return new static( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - members: MemberData::fromModels($request['members']), - eventName: $request['eventName'], - ); - } - - /** - * {@inheritdoc} - */ - public static function fromApiRequest(array $request): static - { - return new static( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - members: MemberData::fromApi($request['member_data']), - eventName: $request['eventName'], + dateFrom: $request->dateFrom(), + dateUntil: $request->dateUntil(), + zipLocation: $request->zipLocation(), + members: $request->members(), + eventName: $request->eventName(), ); } @@ -75,8 +62,6 @@ class CitySolingenDocument extends ContributionDocument public function checkboxes(): string { - $output = ''; - $firstRow = collect(['B' => 'Jugendbildungsmaßnahme', 'G' => 'Gruppenleiter/innenschulung', 'FK' => 'Ferienkolonie', 'F' => 'Freizeitnaßnahme'])->map(function ($item, $key) { return ($this->type === $key ? '\\checkedcheckbox' : '\\checkbox') . '{' . $item . '}'; })->implode(' & ') . ' \\\\'; diff --git a/app/Contribution/Documents/ContributionDocument.php b/app/Contribution/Documents/ContributionDocument.php index 61f8a02f..989e72bd 100644 --- a/app/Contribution/Documents/ContributionDocument.php +++ b/app/Contribution/Documents/ContributionDocument.php @@ -2,6 +2,7 @@ namespace App\Contribution\Documents; +use App\Contribution\Contracts\HasContributionData; use Zoomyboy\Tex\Document; use Zoomyboy\Tex\Template; @@ -11,15 +12,7 @@ abstract class ContributionDocument extends Document abstract public static function getName(): string; - /** - * @param ContributionRequestArray $request - */ - abstract public static function fromRequest(array $request): self; - - /** - * @param ContributionApiRequestArray $request - */ - abstract public static function fromApiRequest(array $request): self; + abstract public static function fromPayload(HasContributionData $request): self; /** * @return array diff --git a/app/Contribution/Documents/RdpNrwDocument.php b/app/Contribution/Documents/RdpNrwDocument.php index 1672d6d1..c537d372 100644 --- a/app/Contribution/Documents/RdpNrwDocument.php +++ b/app/Contribution/Documents/RdpNrwDocument.php @@ -2,6 +2,7 @@ namespace App\Contribution\Documents; +use App\Contribution\Contracts\HasContributionData; use App\Contribution\Data\MemberData; use App\Contribution\Traits\FormatsDates; use App\Contribution\Traits\HasPdfBackground; @@ -29,33 +30,15 @@ class RdpNrwDocument extends ContributionDocument $this->setEventName($eventName); } - /** - * {@inheritdoc} - */ - public static function fromRequest(array $request): self + public static function fromPayload(HasContributionData $request): self { return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), - members: MemberData::fromModels($request['members'])->chunk(17), - eventName: $request['eventName'], - ); - } - - /** - * {@inheritdoc} - */ - public static function fromApiRequest(array $request): self - { - return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), - members: MemberData::fromApi($request['member_data'])->chunk(17), - eventName: $request['eventName'], + dateFrom: $request->dateFrom(), + dateUntil: $request->dateUntil(), + zipLocation: $request->zipLocation(), + country: $request->country(), + members: $request->members()->chunk(17), + eventName: $request->eventName(), ); } diff --git a/app/Contribution/Documents/WuppertalDocument.php b/app/Contribution/Documents/WuppertalDocument.php index 54d45ce1..3bf474ec 100644 --- a/app/Contribution/Documents/WuppertalDocument.php +++ b/app/Contribution/Documents/WuppertalDocument.php @@ -2,6 +2,7 @@ namespace App\Contribution\Documents; +use App\Contribution\Contracts\HasContributionData; use App\Contribution\Data\MemberData; use App\Contribution\Traits\FormatsDates; use App\Contribution\Traits\HasPdfBackground; @@ -30,33 +31,15 @@ class WuppertalDocument extends ContributionDocument $this->setEventName($eventName); } - /** - * {@inheritdoc} - */ - public static function fromRequest(array $request): self + public static function fromPayload(HasContributionData $request): self { return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), - members: MemberData::fromModels($request['members'])->chunk(14), - eventName: $request['eventName'], - ); - } - - /** - * {@inheritdoc} - */ - public static function fromApiRequest(array $request): self - { - return new self( - dateFrom: $request['dateFrom'], - dateUntil: $request['dateUntil'], - zipLocation: $request['zipLocation'], - country: Country::where('id', $request['country'])->firstOrFail(), - members: MemberData::fromApi($request['member_data'])->chunk(14), - eventName: $request['eventName'], + dateFrom: $request->dateFrom(), + dateUntil: $request->dateUntil(), + zipLocation: $request->zipLocation(), + country: $request->country(), + members: $request->members()->chunk(14), + eventName: $request->eventName(), ); } diff --git a/app/Contribution/Requests/GenerateApiRequest.php b/app/Contribution/Requests/GenerateApiRequest.php new file mode 100644 index 00000000..62b47bea --- /dev/null +++ b/app/Contribution/Requests/GenerateApiRequest.php @@ -0,0 +1,67 @@ + + */ + public function payload(): array + { + return $this->input(); + } + + /** + * @return string|array + */ + public function value(string $key): string|array + { + if (!Arr::has($this->payload(), $key)) { + throw new RuntimeException('Wert für '.$key.' nicht gefunden.'); + } + return data_get($this->payload(), $key); + } + + /** + * @return class-string + */ + public function type(): string + { + return $this->value('type'); + } + + public function dateFrom(): Carbon { + return Carbon::parse($this->value('dateFrom')); + } + + public function dateUntil(): Carbon { + return Carbon::parse($this->value('dateUntil')); + } + + public function zipLocation(): string { + return $this->value('zipLocation'); + } + + public function eventName(): string { + return $this->value('eventName'); + } + + public function members(): Collection { + return MemberData::fromApi($this->value('member_data')); + } + + public function country(): ?Country { + return Country::where('id', $this->value('country'))->first(); + } + +} diff --git a/app/Contribution/Requests/GenerateRequest.php b/app/Contribution/Requests/GenerateRequest.php new file mode 100644 index 00000000..08841338 --- /dev/null +++ b/app/Contribution/Requests/GenerateRequest.php @@ -0,0 +1,62 @@ + + */ + public function payload(): array + { + return json_decode(rawurldecode(base64_decode($this->input('payload', ''))), true); + } + + /** + * @return string|array + */ + public function value(string $key): string|array + { + return data_get($this->payload(), $key); + } + + /** + * @return class-string + */ + public function type(): string + { + return $this->value('type'); + } + + public function dateFrom(): Carbon { + return Carbon::parse($this->value('dateFrom')); + } + + public function dateUntil(): Carbon { + return Carbon::parse($this->value('dateUntil')); + } + + public function zipLocation(): string { + return $this->value('zipLocation'); + } + + public function eventName(): string { + return $this->value('eventName'); + } + + public function members(): Collection { + return MemberData::fromModels($this->value('members')); + } + + public function country(): ?Country { + return Country::where('id', $this->value('country'))->first(); + } + +}