Files
my-projects-website/app/application/app/Services/Translate/Completed/Project/DocumentationContentService.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;
}
}