<?php
namespace CopywritelyBundle\EventListener;
use ApiBundle\Event\ProcessCreatedTaskEvent;
use CopywritelyBundle\Entity\CopywritelyTask;
use CopywritelyBundle\Event\EditedTaskEvent;
use CopywritelyBundle\Model\TaskDataExtractor;
use CopywritelyBundle\Service\TaskCreators\TaskCreatorContext;
use CopywritelyBundle\Utils\HtmlFormatter;
use CoreBundle\Entity\Language;
use CoreBundle\Exception\ArticleExtractorException;
use Exception;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\PropertyAccess\PropertyAccess;
/**
* Class FormatNewCopywritelyTask
*/
class FormatNewCopywritelyTask
{
const URL_CREATOR_ERROR = 'uncheckedUrl';
const URL_TEXT_LENGTH_LIMIT = 'url_text_length_limit';
const TEXT_LENGTH_LIMIT_ERROR = 'text_length_limit';
const PUBLIC_USER_URL_CHECK_LIMIT = 2500;
/** @var HtmlFormatter */
private $htmlFormatter;
/** @var ContainerInterface */
protected $container;
/**
* FormatNewCopywritelyTask constructor.
* @param HtmlFormatter $htmlFormatter
* @param ContainerInterface $container
*/
public function __construct(HtmlFormatter $htmlFormatter, ContainerInterface $container)
{
$this->htmlFormatter = $htmlFormatter;
$this->container = $container;
}
/**
* @TODO rewrite with single form for all data
* @param FormEvent $event
* @throws Exception
*/
public function onFormSubmit(FormEvent $event)
{
$formData = $event->getData();
/** @var CopywritelyTask $task */
$task = $event->getForm()->getData();
if ($event->getForm()->getName() === 'copywritely_public_task') {
$user = $this->container
->get('doctrine.orm.entity_manager')
->find("CoreBundle:User", $this->container->getParameter("public_user_id"));
} else {
$user = $this->container->get('security.token_storage')->getToken()->getUser();
}
$task->setUser($user);
if (!empty($formData['url'])) {
$urlTaskService = $this->container->get('url_task_service');
$taskCreatorContext = new TaskCreatorContext($urlTaskService);
$taskData = $taskCreatorContext->createTask(new TaskDataExtractor($formData));
if(isset($taskData['error'])) {
throw new Exception($taskData['error']);
}
if ($taskData['content']) {
$task->setContent($taskData['content']);
}
if (!isset($formData['plagiarismIgnoreDomainUrl'])) {
$formData['plagiarismIgnoreDomainUrl'] = $formData['url'];
}
if (!isset($formData['html']) && !empty($taskData['html'])) {
$formData['html'] = $taskData['html'];
}
if (!isset($formData['title']) && !empty($taskData['title'])) {
$formData['title'] = $taskData['title'];
}
foreach ($formData as $key => $value) {
$formData[$key] = $taskData[$key] ?? $value;
}
if (isset($taskData['language']) && $taskData['language'] instanceof Language) {
$task->setLanguage($taskData['language']);
$formData['language'] = $taskData['language']->getSmallTitle();
}
$event->setData($formData);
} elseif ($formData['html']) {
$textTaskService = $this->container->get('text_task_service');
$taskCreatorContext = new TaskCreatorContext($textTaskService);
$taskData = $taskCreatorContext->createTask(new TaskDataExtractor($formData));
foreach ($formData as $key => $value) {
$formData[$key] = $taskData[$key] ?? $value;
}
if (isset($taskData['language']) && $taskData['language'] instanceof Language) {
$task->setLanguage($taskData['language']);
$formData['language'] = $taskData['language']->getSmallTitle();
}
$event->setData($formData);
}
}
/**
* @param EditedTaskEvent $event
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function onEdited(EditedTaskEvent $event)
{
$task = $event->getTask();
try {
$response = $this->htmlFormatter->parseHtml($task->getHtml());
$task->setHtml($response['html']);
} catch (\Exception $exception) {}
if ($task->getContent()) {
try {
$response = $this->htmlFormatter->parseHtml($task->getContent());
$task->setContent($response['html']);
} catch (\Exception $exception) {}
}
}
/**
* @param ProcessCreatedTaskEvent $event
* @throws ArticleExtractorException
* @throws Exception
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function onCreated(ProcessCreatedTaskEvent $event)
{
$task = $event->getTask();
$source = $event->getSource();
switch ($source) {
case ProcessCreatedTaskEvent::PROCESS_URL_CREATE:
$urlTaskService = $this->container->get('url_task_service');
$taskCreatorContext = new TaskCreatorContext($urlTaskService);
$taskData = $taskCreatorContext->createTask(new TaskDataExtractor([
'url' => $task->getUrl()
]));
if(isset($taskData['error'])) {
throw new Exception($taskData['error']);
}
$propertyAccessor = PropertyAccess::createPropertyAccessorBuilder()
->getPropertyAccessor();
foreach ($taskData as $key => $value) {
if ($propertyAccessor->isWritable($task, $key)) {
$propertyAccessor->setValue($task, $key, $value);
}
}
break;
case ProcessCreatedTaskEvent::PROCESS_TEXT_CREATE:
try {
$html = $this->getFormattedHtml($task->getHtml());
$task->setHtml($html);
} catch (Exception $exception) {}
break;
}
}
/**
* @param string $html
* @return string
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
private function getFormattedHtml(string $html)
{
try {
$response = $this->htmlFormatter->parseHtml($html);
return $response['html'];
} catch (\Exception $exception) {
return $html;
}
}
}