70 lines
2.6 KiB
PHP
70 lines
2.6 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace App\Services\ProjectTranslationServiceHash;
|
|
|
|
use App\Dto\Service\ProjectTranslationServiceHash\Fields;
|
|
use App\Dto\Service\ProjectTranslationServiceHash\TranslateFields;
|
|
use App\Enums\Morph;
|
|
use App\Enums\ProjectTranslationServiceHashes\Status;
|
|
use App\Models\ProjectTranslationServiceHash;
|
|
use App\Repositories\ProjectTranslationServiceHashRepository;
|
|
|
|
final readonly class HashTrackerCommand
|
|
{
|
|
public function __construct(
|
|
private ProjectTranslationServiceHashRepository $hashRepository,
|
|
private ProjectTranslationServiceHashCommandHandler $commandHandler,
|
|
) { }
|
|
|
|
public function execute(Morph $morph, int $morphId, array $languages, Fields $fields): TranslateFields
|
|
{
|
|
$hashes = $this->hashRepository->getHashes($morph, $morphId, $languages, $fields->getNames())->all();
|
|
|
|
$translateFields = new TranslateFields();
|
|
foreach ($fields->getFields() as $fieldName => $fieldValue) {
|
|
$textHash = $this->generateHashFromText((string) $fieldValue);
|
|
foreach ($languages as $language) {
|
|
$modelHash = $hashes->where('language_id', $language)->firstWhere('field', $fieldName);
|
|
if ($modelHash === null) {
|
|
$modelHash = $this->commandHandler->handleStore([
|
|
'language_id' => $language,
|
|
'morph_type' => $morph,
|
|
'morph_id' => $morphId,
|
|
'field' => $fieldName,
|
|
'hash' => $textHash,
|
|
'status' => Status::Waiting,
|
|
]);
|
|
$translateFields->add($language, $fieldName, $textHash, $modelHash->id);
|
|
continue;
|
|
}
|
|
|
|
if ($modelHash->hash === $textHash && $this->isSuccess($modelHash)) {
|
|
continue;
|
|
}
|
|
|
|
$translateFields->add($language, $fieldName, $textHash, $modelHash->id);
|
|
$this->commandHandler->handleUpdate($modelHash, [
|
|
'hash' => $textHash,
|
|
'status' => Status::Waiting,
|
|
]);
|
|
}
|
|
}
|
|
|
|
return $translateFields;
|
|
}
|
|
|
|
private function generateHashFromText(string $text): string
|
|
{
|
|
return \hash('sha256', $text);
|
|
}
|
|
|
|
private function isSuccess(ProjectTranslationServiceHash $modelHash): bool
|
|
{
|
|
if ($modelHash->status === Status::Success) {
|
|
return true;
|
|
}
|
|
|
|
return ($modelHash->updated_at >= now()->subMinutes(10));
|
|
}
|
|
}
|