59 lines
1.6 KiB
PHP
59 lines
1.6 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace App\Jobs\Translate;
|
|
|
|
use App\Services\Translate\Project\ProjectContentService;
|
|
use Exception;
|
|
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
use Illuminate\Foundation\Bus\Dispatchable;
|
|
use Illuminate\Foundation\Queue\Queueable;
|
|
use Illuminate\Queue\Middleware\WithoutOverlapping;
|
|
|
|
final class ProcessProjectContent implements ShouldQueue, ShouldBeEncrypted
|
|
{
|
|
use Dispatchable, Queueable;
|
|
|
|
/**
|
|
* Get the middleware the job should pass through.
|
|
*
|
|
* @return array<int, object>
|
|
*/
|
|
public function middleware(): array
|
|
{
|
|
return [
|
|
(new WithoutOverlapping($this->uniqueId()))->expireAfter(180),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Create a new job instance.
|
|
*/
|
|
public function __construct(
|
|
private readonly int $projectId,
|
|
private readonly array $contentIds = [],
|
|
private readonly array $exceptLanguages = [],
|
|
) { }
|
|
|
|
/**
|
|
* Get the unique ID for the job.
|
|
*/
|
|
public function uniqueId(): string
|
|
{
|
|
return 'project-' . $this->projectId;
|
|
}
|
|
|
|
/**
|
|
* Execute the job.
|
|
* @throws Exception
|
|
*/
|
|
public function handle(ProjectContentService $projectContentService): void
|
|
{
|
|
$result = $projectContentService->translate($this->projectId, $this->contentIds, $this->exceptLanguages);
|
|
if ($result->isError() && $result->getCode() !== 404) {
|
|
cache()->lock($this->uniqueId())->forceRelease();
|
|
throw new Exception($result->getMessage());
|
|
}
|
|
}
|
|
}
|