<?php
declare(strict_types=1);
namespace App\Domains\Word\Application\Controller;
use App\Domains\Shared\Response\UnifiedResponse;
use App\Domains\Word\Application\UseCase\TranslateUseCase;
use App\Domains\Word\Application\Request\TranslateWordRequest;
use App\Domains\Word\Application\Response\TranslateResponse;
use DomainException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class TranslateController extends AbstractController
{
public function __construct(
private readonly TranslateUseCase $translateUseCase,
private readonly ValidatorInterface $validator,
) {
}
#[Route('/api/translate', name: 'translate', methods: ['POST'])]
public function index(TranslateWordRequest $request): JsonResponse
{
// This will automatically check if the user is authenticated
$user = $this->getUser();
if (!$user) {
throw new AccessDeniedException('Token is invalid or expired');
}
try {
$word = $this->translateUseCase->execute(
$request->getWord(),
$request->getLanguageFrom(),
$request->getLanguageTo(),
$user,
);
// Create controlled domain response
$translateResponse = new TranslateResponse(
word: $word->getWord(),
translation: $word->getTranslation(),
meaning: $word->getMeaning(),
synonyms: $word->getSynonyms(),
usage: $word->getUsage(),
examples: $word->getExamples(),
imageFilename: $word->getImageFilename(),
);
// Return custom response object directly for success
return $this->json($translateResponse->toArray());
} catch (DomainException $e) {
$response = UnifiedResponse::failure($e->getMessage());
} catch (\Exception $e) {
$response = UnifiedResponse::failure('An unexpected error occurred while translating the word.');
}
return $this->json($response->toArray());
}
}