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));
}
}