79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Lib\JobMiddleware;
 | 
						|
 | 
						|
use App\Lib\Events\JobFailed;
 | 
						|
use App\Lib\Events\JobFinished;
 | 
						|
use App\Lib\Events\JobStarted;
 | 
						|
use Closure;
 | 
						|
use Lorisleiva\Actions\Decorators\JobDecorator;
 | 
						|
use Ramsey\Uuid\Lazy\LazyUuidFromString;
 | 
						|
use Ramsey\Uuid\UuidInterface;
 | 
						|
use Throwable;
 | 
						|
 | 
						|
class WithJobState
 | 
						|
{
 | 
						|
 | 
						|
    public ?JobStarted $beforeMessage = null;
 | 
						|
    public ?JobFinished $afterMessage = null;
 | 
						|
    public ?JobFailed $failedMessage = null;
 | 
						|
 | 
						|
    private function __construct(public string $channel, public UuidInterface $jobId)
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
    public static function make(string $channel, UuidInterface $jobId): self
 | 
						|
    {
 | 
						|
        return new self($channel, $jobId);
 | 
						|
    }
 | 
						|
 | 
						|
    public function before(string $message): self
 | 
						|
    {
 | 
						|
        $this->beforeMessage = JobStarted::on($this->channel, $this->jobId)->withMessage($message);
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    public function after(string $message): self
 | 
						|
    {
 | 
						|
        $this->afterMessage = JobFinished::on($this->channel, $this->jobId)->withMessage($message);
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    public function failed(string $message): self
 | 
						|
    {
 | 
						|
        $this->failedMessage = JobFailed::on($this->channel, $this->jobId)->withMessage($message);
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    public function shouldReload(): self
 | 
						|
    {
 | 
						|
        $this->afterMessage?->shouldReload();
 | 
						|
        $this->failedMessage?->shouldReload();
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    public function handle(JobDecorator $job, Closure $next): void
 | 
						|
    {
 | 
						|
        if ($this->beforeMessage) {
 | 
						|
            event($this->beforeMessage);
 | 
						|
        }
 | 
						|
 | 
						|
        try {
 | 
						|
            $next($job);
 | 
						|
        } catch (Throwable $e) {
 | 
						|
            if ($this->failedMessage) {
 | 
						|
                event($this->failedMessage);
 | 
						|
            }
 | 
						|
            throw $e;
 | 
						|
        }
 | 
						|
 | 
						|
        if ($this->afterMessage) {
 | 
						|
            event($this->afterMessage);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |