Skip to content

Commit

Permalink
CheckPromiseAbilityToBePrintedAction & ConvertPromiseToJobAction
Browse files Browse the repository at this point in the history
  • Loading branch information
kduma committed Dec 25, 2022
1 parent b688c3a commit 454198e
Show file tree
Hide file tree
Showing 7 changed files with 108 additions and 54 deletions.
26 changes: 26 additions & 0 deletions app/Actions/Promises/CheckPromiseAbilityToBePrintedAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace App\Actions\Promises;

use App\Models\Enums\PrintJobPromiseStatusEnum;
use App\Models\PrintJobPromise;

class CheckPromiseAbilityToBePrintedAction
{
public function handle(PrintJobPromise $promise, bool $ready = false): bool
{
if (! in_array($promise->status, $ready ? [
PrintJobPromiseStatusEnum::Ready,
] : [
PrintJobPromiseStatusEnum::Ready, PrintJobPromiseStatusEnum::New,
])) {
return false;
}

if (! $promise->content && ! $promise->content_file) {
return false;
}

return (bool) $promise->printer_id;
}
}
40 changes: 40 additions & 0 deletions app/Actions/Promises/ConvertPromiseToJobAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace App\Actions\Promises;

use App\Models\Enums\PrintJobPromiseStatusEnum;
use App\Models\PrintJob;
use App\Models\PrintJobPromise;

class ConvertPromiseToJobAction
{
public function __construct(
protected CheckPromiseAbilityToBePrintedAction $checkPromiseAbilityToBePrintedAction,
) {
}

public function handle(PrintJobPromise $promise): ?PrintJob
{
if (! $this->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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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')) {
Expand Down Expand Up @@ -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();
Expand Down
26 changes: 18 additions & 8 deletions app/Http/Controllers/WebPrintApi/PrintJobPromisesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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']);
Expand All @@ -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'],
Expand All @@ -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();
Expand Down
11 changes: 8 additions & 3 deletions app/Http/Controllers/WebPrintApi/PrintJobsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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')
Expand All @@ -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();
}
Expand Down
7 changes: 5 additions & 2 deletions app/Http/Livewire/PrintDialog.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -126,8 +129,8 @@ public function sendToPrint()
if ($this->dialog->auto_print) {
$promise->status = 'ready';
$promise->save();
if ($promise->isPossibleToPrint()) {
$promise->sendForPrinting();
if (App::get(CheckPromiseAbilityToBePrintedAction::class)->handle($promise)) {
App::get(ConvertPromiseToJobAction::class)->handle($promise);
}
}

Expand Down
37 changes: 0 additions & 37 deletions app/Models/PrintJobPromise.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}

0 comments on commit 454198e

Please sign in to comment.