translate-laravel/src/Jobs/ProcessTranslate.php
Leonid Nikitin 55b04f0eab
Add DTOs, exceptions, and jobs for translation service.
Introduced new Data Transfer Objects (DTOs), exceptions, and jobs to enhance the translation service functionality. Updated namespaces for consistency and added rate limiting to the translation provider. Expanded the README with detailed usage instructions.
2024-10-11 00:22:46 +05:00

86 lines
2.4 KiB
PHP

<?php declare(strict_types=1);
namespace KorElf\TranslateLaravel\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\Middleware\RateLimited;
use Illuminate\Support\Facades\Cache;
use KorElf\TranslateLaravel\Contracts\ProcessTranslateContract;
use KorElf\TranslateLaravel\DTO\ProcessTranslateDto;
use KorElf\TranslateLaravel\DTO\ProcessTranslateLimit;
use KorElf\TranslateLaravel\Facades\Translate;
final class ProcessTranslate implements ShouldQueue, ShouldBeEncrypted, ProcessTranslateContract
{
use Dispatchable, InteractsWithQueue, Queueable;
/**
* Create a new job instance.
*/
public function __construct(
private readonly ProcessTranslateDto $param
) { }
/**
* Get the middleware the job should pass through.
*
* @return array<int, object>
*/
public function middleware(): array
{
return [
new RateLimited('kor-elf-translate'),
];
}
public function getLimited(): ProcessTranslateLimit
{
$driver = $this->param->getDriver();
if ($driver === null) {
$driver = Translate::getDefaultDriver();
}
$limit = Translate::getLimit($driver);
return new ProcessTranslateLimit(
maxRequest: $limit['max_request'] ?? 1000000000,
rateSeconds: $limit['rate_seconds'] ?? 1,
driver: $driver,
);
}
/**
* Execute the job.
*/
public function handle(): void
{
$param = $this->param;
$groupName = $param->getGroupName();
$translated = Cache::get($groupName, []);
if (!isset($translated[$param->getKey()])) {
$translated[$param->getKey()] = [];
}
$translate = Translate::service($param->getDriver());
$function = $param->getTextType()->functionName();
$key = $param->getKey();
$part = $param->getPart();
$translated[$key][$part] = $param->getText();
if (\trim($param->getText()) !== '') {
$translated[$key][$part] = $translate->{$function}(
$param->getText(),
$param->getTargetLanguageCode(),
$param->getSourceLanguageCode()
);
}
Cache::put($groupName, $translated, 86400);
}
}