91 lines
3.5 KiB
PHP
91 lines
3.5 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace App\Services\Translate\Completed\Project;
|
|
|
|
use App\Dto\Service\ProjectTranslationServiceHash\Hashes;
|
|
use App\Exceptions\Services\Translate\CompletedException;
|
|
use App\Jobs\Translate\ProcessProjectDocumentationContent;
|
|
use App\Models\Documentation;
|
|
use App\Models\DocumentationContent;
|
|
use App\Repositories\DocumentationRepository;
|
|
use App\Services\ProjectTranslationService\NoTranslateAttributeHandler;
|
|
use App\Services\ProjectTranslationServiceHash\CompletionChecker;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
use KorElf\TranslateLaravel\Contracts\TranslationCompletedListener;
|
|
|
|
final readonly class DocumentationContentService implements TranslationCompletedListener
|
|
{
|
|
public function __construct(
|
|
private DocumentationRepository $documentationRepository,
|
|
private NoTranslateAttributeHandler $noTranslateAttributeHandler,
|
|
private CompletionChecker $completionChecker,
|
|
) { }
|
|
|
|
/**
|
|
* @throws CompletedException
|
|
*/
|
|
public function onTranslationCompleted(array $translatedText, array $data = []): void
|
|
{
|
|
if (
|
|
!isset($data['projectDocumentId'])
|
|
|| !isset($data['languageId'])
|
|
|| !isset($data['hashes'])
|
|
) {
|
|
throw new CompletedException('Required data is missing: projectDocumentId, languageId, or hashes.');
|
|
}
|
|
|
|
$documentation = $this->documentationRepository->getDocumentationById((int) $data['projectDocumentId']);
|
|
if ($documentation === null) {
|
|
return;
|
|
}
|
|
|
|
$documentationContent = DB::transaction(function () use ($data, $documentation, $translatedText) {
|
|
$values = [];
|
|
$hashes = $this->completionChecker->execute(
|
|
$this->getHashes($data['hashes']),
|
|
);
|
|
|
|
foreach ($translatedText as $translatedTextKey => $translatedTextValue) {
|
|
if ($hashes->isStatusWaiting($translatedTextKey) !== true) {
|
|
continue;
|
|
}
|
|
|
|
$translatedTextValue = $this->noTranslateAttributeHandler->handleRemoveAttribute($translatedTextValue);
|
|
$values[$translatedTextKey] = $translatedTextValue;
|
|
}
|
|
if (\count($values) === 0) {
|
|
return null;
|
|
}
|
|
|
|
$documentationContent = $documentation->contents()->where('language_id', $data['languageId'])->first();
|
|
if ($documentationContent !== null) {
|
|
$documentationContent->update($values);
|
|
return $documentationContent;
|
|
}
|
|
|
|
$values['language_id'] = $data['languageId'];
|
|
return $documentation->contents()->create($values);
|
|
});
|
|
if (\config('translation_service.enable', false) && $documentationContent !== null) {
|
|
$this->translateContent($documentation, $documentationContent, $data);
|
|
}
|
|
}
|
|
|
|
private function translateContent(Documentation $documentation, DocumentationContent $documentationContent, array $data): void
|
|
{
|
|
$translateExceptLanguages = $data['exceptLanguages'] ?? [];
|
|
$translateExceptLanguages[] = $data['languageId'];
|
|
ProcessProjectDocumentationContent::dispatch($documentation->id, [$documentationContent->id], $translateExceptLanguages);
|
|
}
|
|
|
|
private function getHashes(array $hashes): Hashes
|
|
{
|
|
$hashesDto = new Hashes();
|
|
foreach ($hashes as $field => $hash) {
|
|
$hashesDto->add((int) $hash['hashId'], $field, $hash['hash']);
|
|
}
|
|
return $hashesDto;
|
|
}
|
|
}
|