Skip to content
46 changes: 31 additions & 15 deletions Controller/EditInPlaceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,45 @@

namespace Translation\Bundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Translation\Bundle\Exception\MessageValidationException;
use Translation\Bundle\Service\CacheClearer;
use Translation\Bundle\Service\StorageManager;
use Translation\Bundle\Service\StorageService;
use Translation\Common\Model\Message;
use Translation\Common\Model\MessageInterface;

/**
* @author Damien Alexandre <dalexandre@jolicode.com>
*/
class EditInPlaceController extends Controller
class EditInPlaceController extends AbstractController
{
/**
* @param string $configName
* @param string $locale
*
* @return Response
* @var StorageManager
*/
private $storageManager;

/**
* @var CacheClearer
*/
private $cacheClearer;

/**
* @var ValidatorInterface
*/
public function editAction(Request $request, $configName, $locale)
private $validator;

public function __construct(StorageManager $storageManager, CacheClearer $cacheClearer, ValidatorInterface $validator)
{
$this->storageManager = $storageManager;
$this->cacheClearer = $cacheClearer;
$this->validator = $validator;
}

public function editAction(Request $request, string $configName, string $locale): Response
{
try {
$messages = $this->getMessages($request, $locale, ['Edit']);
Expand All @@ -39,39 +58,36 @@ public function editAction(Request $request, $configName, $locale)
}

/** @var StorageService $storage */
$storage = $this->get('php_translation.storage_manager')->getStorage($configName);
$storage = $this->storageManager->getStorage($configName);

foreach ($messages as $message) {
$storage->update($message);
}

$cacheClearer = $this->get('php_translation.cache_clearer');
$cacheClearer->clearAndWarmUp($locale);
$this->cacheClearer->clearAndWarmUp($locale);

return new Response();
}

/**
* Get and validate messages from the request.
*
* @param string $locale
*
* @return MessageInterface[]
*
* @throws MessageValidationException
*/
private function getMessages(Request $request, $locale, array $validationGroups = [])
private function getMessages(Request $request, string $locale, array $validationGroups = [])
{
$json = $request->getContent();
$data = \json_decode($json, true);
$messages = [];
$validator = $this->get('validator');

foreach ($data as $key => $value) {
list($domain, $translationKey) = \explode('|', $key);

$message = new Message($translationKey, $domain, $locale, $value);
$errors = $this->validator->validate($message, null, $validationGroups);

$errors = $validator->validate($message, null, $validationGroups);
if (\count($errors) > 0) {
throw MessageValidationException::create();
}
Expand Down
86 changes: 35 additions & 51 deletions Controller/SymfonyProfilerController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@

namespace Translation\Bundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Profiler\Profiler;
use Symfony\Component\Translation\DataCollectorTranslator;
use Symfony\Component\VarDumper\Cloner\Data;
use Translation\Bundle\Model\SfProfilerMessage;
Expand All @@ -23,14 +24,25 @@
/**
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
*/
class SymfonyProfilerController extends Controller
class SymfonyProfilerController extends AbstractController
{
/**
* @param string $token
*
* @return Response
* @var StorageService
*/
private $storageService;

/**
* @var Profiler
*/
public function editAction(Request $request, $token)
private $profiler;

public function __construct(StorageService $storageService, Profiler $profiler)
{
$this->storageService = $storageService;
$this->profiler = $profiler;
}

public function editAction(Request $request, string $token): Response
{
if (!$this->getParameter('php_translation.toolbar.allow_edit')) {
return new Response('You are not allowed to edit the translations.');
Expand All @@ -41,11 +53,9 @@ public function editAction(Request $request, $token)
}

$message = $this->getMessage($request, $token);
/** @var StorageService $storage */
$storage = $this->get('php_translation.storage');

if ($request->isMethod('GET')) {
$translation = $storage->syncAndFetchMessage($message->getLocale(), $message->getDomain(), $message->getKey());
$translation = $this->storageService->syncAndFetchMessage($message->getLocale(), $message->getDomain(), $message->getKey());

return $this->render('@Translation/SymfonyProfiler/edit.html.twig', [
'message' => $translation,
Expand All @@ -55,26 +65,19 @@ public function editAction(Request $request, $token)

//Assert: This is a POST request
$message->setTranslation($request->request->get('translation'));
$storage->update($message->convertToMessage());
$this->storageService->update($message->convertToMessage());

return new Response($message->getTranslation());
}

/**
* @param string $token
*
* @return Response
*/
public function syncAction(Request $request, $token)
public function syncAction(Request $request, string $token): Response
{
if (!$request->isXmlHttpRequest()) {
return $this->redirectToRoute('_profiler', ['token' => $token]);
}

/** @var StorageService $storage */
$storage = $this->get('php_translation.storage');
$sfMessage = $this->getMessage($request, $token);
$message = $storage->syncAndFetchMessage($sfMessage->getLocale(), $sfMessage->getDomain(), $sfMessage->getKey());
$message = $this->storageService->syncAndFetchMessage($sfMessage->getLocale(), $sfMessage->getDomain(), $sfMessage->getKey());

if (null !== $message) {
return new Response($message->getTranslation());
Expand All @@ -83,20 +86,13 @@ public function syncAction(Request $request, $token)
return new Response('Asset not found', 404);
}

/**
* @param $token
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse|Response
*/
public function syncAllAction(Request $request, $token)
public function syncAllAction(Request $request, string $token): Response
{
if (!$request->isXmlHttpRequest()) {
return $this->redirectToRoute('_profiler', ['token' => $token]);
}

/** @var StorageService $storage */
$storage = $this->get('php_translation.storage');
$storage->sync();
$this->storageService->sync();

return new Response('Started synchronization of all translations');
}
Expand All @@ -105,12 +101,8 @@ public function syncAllAction(Request $request, $token)
* Save the selected translation to resources.
*
* @author Damien Alexandre (damienalexandre)
*
* @param string $token
*
* @return Response
*/
public function createAssetsAction(Request $request, $token)
public function createAssetsAction(Request $request, string $token): Response
{
if (!$request->isXmlHttpRequest()) {
return $this->redirectToRoute('_profiler', ['token' => $token]);
Expand All @@ -122,29 +114,23 @@ public function createAssetsAction(Request $request, $token)
}

$uploaded = [];
/** @var StorageService $storage */
$storage = $this->get('php_translation.storage');

foreach ($messages as $message) {
$storage->create($message);
$this->storageService->create($message);
$uploaded[] = $message;
}

return new Response(\sprintf('%s new assets created!', \count($uploaded)));
}

/**
* @param string $token
*
* @return SfProfilerMessage
*/
private function getMessage(Request $request, $token)
private function getMessage(Request $request, string $token): SfProfilerMessage
{
$profiler = $this->get('profiler');
$profiler->disable();
$this->profiler->disable();

$messageId = $request->request->get('message_id', $request->query->get('message_id'));

$profile = $profiler->loadProfile($token);
$profile = $this->profiler->loadProfile($token);

if (null === $dataCollector = $profile->getCollector('translation')) {
throw $this->createNotFoundException('No collector with name "translation" was found.');
}
Expand All @@ -158,6 +144,7 @@ private function getMessage(Request $request, $token)
if (!isset($collectorMessages[$messageId])) {
throw $this->createNotFoundException(\sprintf('No message with key "%s" was found.', $messageId));
}

$message = SfProfilerMessage::create($collectorMessages[$messageId]);

if (DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK === $message->getState()) {
Expand All @@ -169,21 +156,18 @@ private function getMessage(Request $request, $token)
}

/**
* @param string $token
*
* @return MessageInterface[]
*/
protected function getSelectedMessages(Request $request, $token)
protected function getSelectedMessages(Request $request, string $token)
{
$profiler = $this->get('profiler');
$profiler->disable();
$this->profiler->disable();

$selected = $request->request->get('selected');
if (!$selected || 0 == \count($selected)) {
return [];
}

$profile = $profiler->loadProfile($token);
$profile = $this->profiler->loadProfile($token);
$dataCollector = $profile->getCollector('translation');
$messages = $dataCollector->getMessages();

Expand Down
Loading