From 01c0344d902c5995b7c54e5a16dcd1d15db959e0 Mon Sep 17 00:00:00 2001 From: Krystian Duma Date: Sun, 25 Dec 2022 22:36:24 +0100 Subject: [PATCH] CheckPromiseAbilityToBePrintedAction & ConvertPromiseToJobAction --- .../CheckPromiseAbilityToBePrintedAction.php | 26 ++++++++++++ .../Promises/ConvertPromiseToJobAction.php | 40 +++++++++++++++++++ .../PrintJobPromisesContentController.php | 15 +++++-- .../PrintJobPromisesController.php | 26 ++++++++---- .../WebPrintApi/PrintJobsController.php | 11 +++-- app/Http/Livewire/PrintDialog.php | 13 ++++-- app/Models/PrintJobPromise.php | 37 ----------------- 7 files changed, 113 insertions(+), 55 deletions(-) create mode 100644 app/Actions/Promises/CheckPromiseAbilityToBePrintedAction.php create mode 100644 app/Actions/Promises/ConvertPromiseToJobAction.php diff --git a/app/Actions/Promises/CheckPromiseAbilityToBePrintedAction.php b/app/Actions/Promises/CheckPromiseAbilityToBePrintedAction.php new file mode 100644 index 0000000..0d58024 --- /dev/null +++ b/app/Actions/Promises/CheckPromiseAbilityToBePrintedAction.php @@ -0,0 +1,26 @@ +status, $ready ? [ + PrintJobPromiseStatusEnum::Ready, + ] : [ + PrintJobPromiseStatusEnum::Ready, PrintJobPromiseStatusEnum::New, + ])) { + return false; + } + + if (! $promise->content && ! $promise->content_file) { + return false; + } + + return (bool) $promise->printer_id; + } +} diff --git a/app/Actions/Promises/ConvertPromiseToJobAction.php b/app/Actions/Promises/ConvertPromiseToJobAction.php new file mode 100644 index 0000000..8394a74 --- /dev/null +++ b/app/Actions/Promises/ConvertPromiseToJobAction.php @@ -0,0 +1,40 @@ +checkPromiseAbilityToBePrintedAction->handle($promise)) { + return null; + } + + $job = new PrintJob(); + $job->client_application_id = $promise->client_application_id; + $job->printer_id = $promise->printer_id; + $job->name = $promise->name; + $job->ppd = $promise->type == 'ppd'; + $job->ppd_options = $promise->ppd_options; + $job->content = $promise->content; + $job->content_file = $promise->content_file; + $job->file_name = $promise->file_name; + $job->size = $promise->size; + $job->save(); + + $promise->print_job_id = $job->id; + $promise->status = PrintJobPromiseStatusEnum::SentToPrinter; + $promise->save(); + + return $job; + } +} diff --git a/app/Http/Controllers/WebPrintApi/PrintJobPromisesContentController.php b/app/Http/Controllers/WebPrintApi/PrintJobPromisesContentController.php index d7a368a..361fddd 100644 --- a/app/Http/Controllers/WebPrintApi/PrintJobPromisesContentController.php +++ b/app/Http/Controllers/WebPrintApi/PrintJobPromisesContentController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers\WebPrintApi; +use App\Actions\Promises\CheckPromiseAbilityToBePrintedAction; +use App\Actions\Promises\ConvertPromiseToJobAction; use App\Actions\Promises\SetPromiseContentAction; use App\Http\Controllers\Controller; use App\Models\ClientApplication; @@ -61,8 +63,13 @@ public function index(PrintJobPromise $promise) * * @throws \Illuminate\Auth\Access\AuthorizationException */ - public function store(Request $request, PrintJobPromise $promise, SetPromiseContentAction $setPromiseContentAction) - { + public function store( + Request $request, + PrintJobPromise $promise, + SetPromiseContentAction $setPromiseContentAction, + ConvertPromiseToJobAction $convertPromiseToJobAction, + CheckPromiseAbilityToBePrintedAction $checkPromiseAbilityToBePrintedAction + ) { $this->authorize('update', $promise); if ($request->hasFile('content')) { @@ -90,8 +97,8 @@ public function store(Request $request, PrintJobPromise $promise, SetPromiseCont $promise->save(); - if ($promise->isReadyToPrint()) { - $promise->sendForPrinting(); + if ($checkPromiseAbilityToBePrintedAction->handle($promise, true)) { + $convertPromiseToJobAction->handle($promise); } return response()->noContent(); diff --git a/app/Http/Controllers/WebPrintApi/PrintJobPromisesController.php b/app/Http/Controllers/WebPrintApi/PrintJobPromisesController.php index 9b31c41..e9fc2ab 100644 --- a/app/Http/Controllers/WebPrintApi/PrintJobPromisesController.php +++ b/app/Http/Controllers/WebPrintApi/PrintJobPromisesController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\WebPrintApi; use App\Actions\Promises\CancelPromiseAction; +use App\Actions\Promises\CheckPromiseAbilityToBePrintedAction; +use App\Actions\Promises\ConvertPromiseToJobAction; use App\Actions\Promises\SetPromiseContentAction; use App\Http\Controllers\Controller; use App\Http\Resources\PrintJobPromiseResource; @@ -56,8 +58,12 @@ public function index(Request $request) * * @return PrintJobPromiseResource|\Illuminate\Http\Response */ - public function store(Request $request, SetPromiseContentAction $setPromiseContentAction): PrintJobPromiseResource - { + public function store( + Request $request, + SetPromiseContentAction $setPromiseContentAction, + ConvertPromiseToJobAction $convertPromiseToJobAction, + CheckPromiseAbilityToBePrintedAction $checkPromiseAbilityToBePrintedAction + ): PrintJobPromiseResource { /** @var ClientApplication $client_application */ $client_application = $request->user(); @@ -123,8 +129,8 @@ public function store(Request $request, SetPromiseContentAction $setPromiseConte $promise->save(); } - if ($promise->isReadyToPrint()) { - $promise->sendForPrinting(); + if ($checkPromiseAbilityToBePrintedAction->handle($promise, true)) { + $convertPromiseToJobAction->handle($promise); } $promise->load(['AvailablePrinters', 'Printer', 'PrintJob']); @@ -149,8 +155,12 @@ public function show(PrintJobPromise $promise): PrintJobPromiseResource * * @return \Illuminate\Http\Response */ - public function update(Request $request, PrintJobPromise $promise) - { + public function update( + Request $request, + PrintJobPromise $promise, + ConvertPromiseToJobAction $convertPromiseToJobAction, + CheckPromiseAbilityToBePrintedAction $checkPromiseAbilityToBePrintedAction + ) { $available_printers = $promise->AvailablePrinters()->pluck('ulid'); $validated = $request->validate([ 'status' => ['nullable', 'in:ready'], @@ -170,8 +180,8 @@ public function update(Request $request, PrintJobPromise $promise) $promise->save(); - if ($promise->isReadyToPrint()) { - $promise->sendForPrinting(); + if ($checkPromiseAbilityToBePrintedAction->handle($promise, true)) { + $convertPromiseToJobAction->handle($promise); } return response()->noContent(); diff --git a/app/Http/Controllers/WebPrintApi/PrintJobsController.php b/app/Http/Controllers/WebPrintApi/PrintJobsController.php index edb38b5..5625fef 100644 --- a/app/Http/Controllers/WebPrintApi/PrintJobsController.php +++ b/app/Http/Controllers/WebPrintApi/PrintJobsController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers\WebPrintApi; +use App\Actions\Promises\CheckPromiseAbilityToBePrintedAction; +use App\Actions\Promises\ConvertPromiseToJobAction; use App\Http\Controllers\Controller; use App\Models\ClientApplication; use App\Models\Enums\PrintJobPromiseStatusEnum; @@ -44,7 +46,10 @@ public function index(): void * * @return \Illuminate\Http\Response */ - public function store(Request $request) + public function store( + Request $request, + CheckPromiseAbilityToBePrintedAction $checkPromiseAbilityToBePrintedAction, + ConvertPromiseToJobAction $convertPromiseToJobAction) { $validated = $request->validate([ 'promise' => ['required', Rule::exists('print_job_promises', 'ulid') @@ -53,13 +58,13 @@ public function store(Request $request) $promise = PrintJobPromise::where('ulid', $validated['promise'])->firstOrFail(); - abort_unless($promise->isPossibleToPrint(), 412); + abort_unless($checkPromiseAbilityToBePrintedAction->handle($promise), 412); if ($promise->status != PrintJobPromiseStatusEnum::Ready) { $promise->status = PrintJobPromiseStatusEnum::Ready; $promise->save(); } - $promise->sendForPrinting(); + $convertPromiseToJobAction->handle($promise); return response()->noContent(); } diff --git a/app/Http/Livewire/PrintDialog.php b/app/Http/Livewire/PrintDialog.php index 67d5999..6a25a1b 100644 --- a/app/Http/Livewire/PrintDialog.php +++ b/app/Http/Livewire/PrintDialog.php @@ -2,10 +2,13 @@ namespace App\Http\Livewire; +use App\Actions\Promises\CheckPromiseAbilityToBePrintedAction; +use App\Actions\Promises\ConvertPromiseToJobAction; use App\Models\Enums\PrintDialogStatusEnum; use App\Models\Enums\PrintJobPromiseStatusEnum; use App\Models\PrintDialog as PrintDialogModel; use App\Models\Printer; +use Illuminate\Support\Facades\App; use Illuminate\Support\Str; use League\Uri\Uri; use Livewire\Component; @@ -22,6 +25,7 @@ class PrintDialog extends Component public string $view = 'main'; + public function mount(PrintDialogModel $dialog): void { $this->dialog = $dialog; @@ -106,7 +110,10 @@ public function cancel() } } - public function sendToPrint() + public function sendToPrint( + CheckPromiseAbilityToBePrintedAction $checkPromiseAbilityToBePrintedAction, + ConvertPromiseToJobAction $convertPromiseToJobAction, + ) { if (! $this->dialog->is_active) { return null; @@ -126,8 +133,8 @@ public function sendToPrint() if ($this->dialog->auto_print) { $promise->status = 'ready'; $promise->save(); - if ($promise->isPossibleToPrint()) { - $promise->sendForPrinting(); + if ($checkPromiseAbilityToBePrintedAction->handle($promise)) { + $convertPromiseToJobAction->handle($promise); } } diff --git a/app/Models/PrintJobPromise.php b/app/Models/PrintJobPromise.php index d4faf86..4d9bc49 100644 --- a/app/Models/PrintJobPromise.php +++ b/app/Models/PrintJobPromise.php @@ -47,41 +47,4 @@ public function AvailablePrinters(): BelongsToMany { return $this->belongsToMany(Printer::class, 'pivot_print_job_printer'); } - - public function isReadyToPrint(): bool - { - return $this->status == PrintJobPromiseStatusEnum::Ready && $this->isPossibleToPrint(); - } - - public function isPossibleToPrint(): bool - { - return in_array($this->status, [ - PrintJobPromiseStatusEnum::Ready, PrintJobPromiseStatusEnum::New, - ]) && ($this->content || $this->content_file) && $this->printer_id; - } - - public function sendForPrinting(): ?PrintJob - { - if (! $this->isReadyToPrint()) { - return null; - } - - $job = new PrintJob(); - $job->client_application_id = $this->client_application_id; - $job->printer_id = $this->printer_id; - $job->name = $this->name; - $job->ppd = $this->type == 'ppd'; - $job->ppd_options = $this->ppd_options; - $job->content = $this->content; - $job->content_file = $this->content_file; - $job->file_name = $this->file_name; - $job->size = $this->size; - $job->save(); - - $this->print_job_id = $job->id; - $this->status = PrintJobPromiseStatusEnum::SentToPrinter; - $this->save(); - - return $job; - } }