src/Controller/Api/TranslationsController.php line 116

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Controller\BaseController;
  4. use App\Entity\Project;
  5. use App\Entity\Translation;
  6. use App\Response\ResponseService;
  7. use Psr\Log\LoggerInterface;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. /**
  12.  * @package App\Controller
  13.  * @Route("/api/translations")
  14.  */
  15. class TranslationsController extends BaseController
  16. {
  17.     private $locales;
  18.     public function __construct(string $locales)
  19.     {
  20.         $this->locales explode('|'$locales);
  21.     }
  22.     /**
  23.      * @Route("/locales", name="api.translations.locales", methods={"GET"})
  24.      * @param Request $request
  25.      * @param LoggerInterface $logger
  26.      * @param ResponseService $responseService
  27.      * @return JsonResponse
  28.      */
  29.     public function locales(Request $requestLoggerInterface $loggerResponseService $responseService): JsonResponse
  30.     {
  31.         if (false === $request->headers->has('X-Auth-Token')) {
  32.             $logger->alert(sprintf(
  33.                 'Translations for project: received a request with missing X-Auth-Token from IP: %s.',
  34.                 $request->getClientIp()
  35.             ));
  36.             return $this->json(null403);
  37.         }
  38.         $authToken $request->headers->get('X-Auth-Token');
  39.         $project $this->manager()
  40.             ->getRepository(Project::class)
  41.             ->findOneBy(['authToken' => $authToken]);
  42.         if (!$project) {
  43.             $logger->alert(sprintf(
  44.                 'Translations for project: received a request with invalid X-Auth-Token: %s, from IP: %s.',
  45.                 $authToken,
  46.                 $request->getClientIp()
  47.             ));
  48.             return $this->json(null404);
  49.         }
  50.         $locales $this->manager()->getRepository(Translation::class)->locales($project);
  51.         return $responseService->successResponse([
  52.             'locales' => $locales,
  53.         ]);
  54.     }
  55.     /**
  56.      * @Route("/domains", name="api.translations.domains", methods={"GET"})
  57.      * @param Request $request
  58.      * @param LoggerInterface $logger
  59.      * @param ResponseService $responseService
  60.      * @return JsonResponse
  61.      */
  62.     public function domains(Request $requestLoggerInterface $loggerResponseService $responseService): JsonResponse
  63.     {
  64.         if (false === $request->headers->has('X-Auth-Token')) {
  65.             $logger->alert(sprintf(
  66.                 'Translations for project: received a request with missing X-Auth-Token from IP: %s.',
  67.                 $request->getClientIp()
  68.             ));
  69.             return $this->json(null403);
  70.         }
  71.         $authToken $request->headers->get('X-Auth-Token');
  72.         $project $this->manager()
  73.             ->getRepository(Project::class)
  74.             ->findOneBy(['authToken' => $authToken]);
  75.         if (!$project) {
  76.             $logger->alert(sprintf(
  77.                 'Translations for project: received a request with invalid X-Auth-Token: %s, from IP: %s.',
  78.                 $authToken,
  79.                 $request->getClientIp()
  80.             ));
  81.             return $this->json(null404);
  82.         }
  83.         $domains $this->manager()->getRepository(Translation::class)->domains($project);
  84.         return $responseService->successResponse([
  85.             'domains' => $domains,
  86.         ]);
  87.     }
  88.     /**
  89.      * @Route("/list", name="api.translations.list", methods={"GET"})
  90.      * @param Request $request
  91.      * @param LoggerInterface $logger
  92.      * @param ResponseService $responseService
  93.      * @return JsonResponse
  94.      */
  95.     public function list(Request $requestLoggerInterface $loggerResponseService $responseService): JsonResponse
  96.     {
  97.         if (false === $request->headers->has('X-Auth-Token')) {
  98.             $logger->alert(sprintf(
  99.                 'Translations for project: received a request with missing X-Auth-Token from IP: %s.',
  100.                 $request->getClientIp()
  101.             ));
  102.             return $this->json(null403);
  103.         }
  104.         $authToken $request->headers->get('X-Auth-Token');
  105.         $project $this->manager()
  106.             ->getRepository(Project::class)
  107.             ->findOneBy(['authToken' => $authToken]);
  108.         if (!$project) {
  109.             $logger->alert(sprintf(
  110.                 'Translations for project: received a request with invalid X-Auth-Token: %s, from IP: %s.',
  111.                 $authToken,
  112.                 $request->getClientIp()
  113.             ));
  114.             return $this->json(null404);
  115.         }
  116.         $locale $request->query->get('locale'$project->getDefaultLocale());
  117.         $locales $this->manager()->getRepository(Translation::class)->locales($project);
  118.         if ($locale === $project->getDefaultLocale()) {
  119.             $nonDefaultLocales array_values(array_diff($locales, [$project->getDefaultLocale()]));
  120.             $currentDefaultLocale $nonDefaultLocales[0];
  121.         } else {
  122.             $currentDefaultLocale $project->getDefaultLocale();
  123.         }
  124.         $translations $this->manager()
  125.             ->getRepository(Translation::class)
  126.             ->forProjectRaw($project$locale$currentDefaultLocale$request->query->all());
  127.         return $responseService->successResponse([
  128.             'translations' => $translations,
  129.             'defaultLocale' => $currentDefaultLocale,
  130.         ]);
  131.     }
  132.     /**
  133.      * @Route("/{id}/update", name="api.translations.update", methods={"POST"})
  134.      * @param Request $request
  135.      * @param Translation $translation
  136.      * @param LoggerInterface $logger
  137.      * @return JsonResponse
  138.      */
  139.     public function update(Request $requestTranslation $translationLoggerInterface $logger): JsonResponse
  140.     {
  141.         if (false === $request->headers->has('X-Auth-Token')) {
  142.         $logger->alert(sprintf(
  143.             'Translations for project: received a request with missing X-Auth-Token from IP: %s.',
  144.             $request->getClientIp()
  145.         ));
  146.         return $this->json(null403);
  147.     }
  148.         $authToken $request->headers->get('X-Auth-Token');
  149.         $project $this->manager()
  150.             ->getRepository(Project::class)
  151.             ->findOneBy(['authToken' => $authToken]);
  152.         if (!$project) {
  153.             $logger->alert(sprintf(
  154.                 'Translations for project: received a request with invalid X-Auth-Token: %s, from IP: %s.',
  155.                 $authToken,
  156.                 $request->getClientIp()
  157.             ));
  158.             return $this->json(null404);
  159.         }
  160.         if ($translation->getProject() !== $project) {
  161.             return $this->json(null403);
  162.         }
  163.         $value $request->request->get('value');
  164.         $translation->setTranslationValue($value);
  165.         $this->manager()->flush();
  166.         return $this->json(null);
  167.     }
  168.     /**
  169.      * @Route("", name="api.translations.send", methods={"GET"})
  170.      * @param Request $request
  171.      * @param ResponseService $responseService
  172.      * @param LoggerInterface $logger
  173.      * @return JsonResponse
  174.      */
  175.     public function send(Request $requestResponseService $responseServiceLoggerInterface $logger): JsonResponse
  176.     {
  177.         if (false === $request->headers->has('X-Auth-Token')) {
  178.             $logger->alert(sprintf(
  179.                 'Translations for project: received a request with missing X-Auth-Token from IP: %s.',
  180.                 $request->getClientIp()
  181.             ));
  182.             return $this->json(null403);
  183.         }
  184.         $authToken $request->headers->get('X-Auth-Token');
  185.         $project $this->manager()
  186.             ->getRepository(Project::class)
  187.             ->findOneBy(['authToken' => $authToken]);
  188.         if (!$project) {
  189.             $logger->alert(sprintf(
  190.                 'Translations for project: received a request with invalid X-Auth-Token: %s, from IP: %s.',
  191.                 $authToken,
  192.                 $request->getClientIp()
  193.             ));
  194.             return $this->json(null404);
  195.         }
  196.         $translations $this->manager()
  197.             ->getRepository(Translation::class)
  198.             ->forProject($project);
  199.         $translations $this->groupByLocaleAndDomain($translations);
  200.         return $responseService->successResponse($translations);
  201.     }
  202.     /**
  203.      * @Route("", name="api.translations.receive", methods={"POST"})
  204.      * @param Request $request
  205.      * @param LoggerInterface $logger
  206.      * @return JsonResponse
  207.      */
  208.     public function receive(Request $requestLoggerInterface $logger): JsonResponse
  209.     {
  210.         if (false === $request->headers->has('X-Auth-Token')) {
  211.             $logger->alert(sprintf(
  212.                 'Translations for project: received a request with missing X-Auth-Token from IP: %s.',
  213.                 $request->getClientIp()
  214.             ));
  215.             return $this->json(null403);
  216.         }
  217.         $authToken $request->headers->get('X-Auth-Token');
  218.         $project $this->manager()
  219.             ->getRepository(Project::class)
  220.             ->findOneBy(['authToken' => $authToken]);
  221.         if (!$project) {
  222.             $logger->alert(sprintf(
  223.                 'Translations for project: received a request with invalid X-Auth-Token: %s, from IP: %s.',
  224.                 $authToken,
  225.                 $request->getClientIp()
  226.             ));
  227.             return $this->json(null404);
  228.         }
  229.         $data json_decode($request->getContent(), true);
  230.         if (empty($data)) {
  231.             return $this->json(null400);
  232.         }
  233.         // Iterate translation messages
  234.         $index 1;
  235.         foreach ($data as $translationItem) {
  236.             $newTranslation = (new Translation)
  237.                 ->setProject($project)
  238.                 ->setLocale($translationItem['locale'])
  239.                 ->setDomain($translationItem['domain'])
  240.                 ->setTranslationKey($translationItem['translationKey'])
  241.                 ->setTranslationValue($translationItem['translationValue'])
  242.                 ;
  243.             $this->manager()->persist($newTranslation);
  244.             if ($index 100 === 0) {
  245.                 $this->manager()->flush();
  246.             }
  247.             $index++;
  248.         }
  249.         $this->manager()->flush();
  250.         // Return success response
  251.         return new JsonResponse();
  252.     }
  253.     /**
  254.      * @Route("/existing-translations", name="api.translations.existing_translations_for_project", methods={"GET"})
  255.      * @param Request $request
  256.      * @param LoggerInterface $logger
  257.      * @param ResponseService $responseService
  258.      * @return JsonResponse
  259.      */
  260.     public function existingTranslationsForProject(Request $requestLoggerInterface $loggerResponseService $responseService): JsonResponse
  261.     {
  262.         if (false === $request->headers->has('X-Auth-Token')) {
  263.             $logger->alert(sprintf(
  264.                 'Existing translations for project: received a request with missing X-Auth-Token from IP: %s.',
  265.                 $request->getClientIp()
  266.             ));
  267.             return $this->json(null403);
  268.         }
  269.         $authToken $request->headers->get('X-Auth-Token');
  270.         $project $this->manager()
  271.             ->getRepository(Project::class)
  272.             ->findOneBy(['authToken' => $authToken]);
  273.         if (!$project) {
  274.             $logger->alert(sprintf(
  275.                 'Existing translations for project: received a request with invalid X-Auth-Token: %s, from IP: %s.',
  276.                 $authToken,
  277.                 $request->getClientIp()
  278.             ));
  279.             return $this->json(null404);
  280.         }
  281.         $translations $this->manager()
  282.             ->getRepository(Translation::class)
  283.             ->existingTranslationsForProject($project);
  284.         return $responseService->successResponse($translations);
  285.     }
  286.     /**
  287.      * @param array $translations
  288.      * @return Translation[]
  289.      */
  290.     private function groupByLocaleAndDomain(array $translations): array
  291.     {
  292.         $result = [];
  293.         foreach ($translations as $translation) {
  294.             /**
  295.              * @var $translation Translation
  296.              */
  297.             $result[$translation->getLocale()][$translation->getDomain()][] = $translation;
  298.         }
  299.         return $result;
  300.     }
  301. }