src/Domains/Word/Application/UseCase/TranslateUseCase.php line 31

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Domains\Word\Application\UseCase;
  4. use App\Domains\User\Domain\Entity\User;
  5. use App\Domains\Word\Domain\Entity\Word;
  6. use App\Domains\Word\Domain\Enum\Language;
  7. use App\Domains\Word\Domain\Mapper\WordMapper;
  8. use App\Domains\Word\Domain\Service\ImageGenerationService;
  9. use App\Domains\Word\Domain\Service\TranslateService;
  10. use App\Domains\Word\Domain\Service\WordCacheService;
  11. use App\Domains\Word\Domain\Service\WordService;
  12. use App\Domains\Word\Infrastructure\Adapter\UserAdapter;
  13. use App\Domains\Word\Infrastructure\Adapter\UserWordAdapter;
  14. final class TranslateUseCase
  15. {
  16.     public function __construct(
  17.         private readonly TranslateService $translateService,
  18.         private readonly WordService $wordService,
  19.         private readonly WordCacheService $wordCacheService,
  20.         private readonly WordMapper $wordMapper,
  21.         private readonly UserWordAdapter $userWordAdapter,
  22.         private readonly UserAdapter $userAdapter,
  23.         private readonly ImageGenerationService $imageGenerationService,
  24.     ) {
  25.     }
  26.     public function execute(
  27.         string $wordToTranslate,
  28.         Language $languageFrom,
  29.         Language $languageTo,
  30.         User $user,
  31.     ): Word {
  32.         $cached $this->wordCacheService->getWord(
  33.             $wordToTranslate,
  34.             $languageFrom->value,
  35.             $languageTo->value,
  36.             $user->getId(),
  37.         );
  38. //        if ($cached !== null) {
  39. //            return $this->translationResponseMapper->fromWordObject(
  40. //                $this->wordMapper->fromArray($cached)
  41. //            );
  42. //        }
  43.         $word $this->wordService->isWordExist(
  44.             word$wordToTranslate,
  45.             languageFrom$languageFrom,
  46.             languageTo$languageTo,
  47.         );
  48.         if ($word) {
  49.             $isWordAssignedToUser $this->userWordAdapter->isWordAssignedToUser(
  50.                 $word,
  51.                 $user,
  52.             );
  53.             if (!$isWordAssignedToUser) {
  54.                 $this->userWordAdapter->addWordToUser(
  55.                     $word,
  56.                     $user,
  57.                 );
  58.             }
  59.         } else {
  60.             $word $this->translateService->translate(
  61.                 $wordToTranslate,
  62.                 $languageFrom,
  63.                 $languageTo,
  64.                 $user,
  65.             );
  66.             $this->userWordAdapter->addWordToUser(
  67.                 $word,
  68.                 $user,
  69.             );
  70.             // Generate image for new words only
  71.             $imageFilename $this->imageGenerationService->generateWordImage($word);
  72.             if ($imageFilename) {
  73.                 $word->setImageFilename($imageFilename);
  74.             }
  75.         }
  76.         // cash the result into the redis
  77.         $this->wordCacheService->cacheWord(
  78.             $this->wordMapper->toArray($word),
  79.             $user->getId()
  80.         );
  81.         // Record user usage
  82.         $this->userAdapter->recordUserUsage($user);
  83.         // TODO: metrics, how long does it take, how many requests
  84.         return $word;
  85.     }
  86. }