Spaces:
No application file
No application file
namespace MauticPlugin\MauticSocialBundle\Model; | |
use Mautic\CoreBundle\Model\AjaxLookupModelInterface; | |
use Mautic\CoreBundle\Model\FormModel; | |
use Mautic\LeadBundle\Entity\Lead; | |
use MauticPlugin\MauticSocialBundle\Entity\Tweet; | |
use MauticPlugin\MauticSocialBundle\Entity\TweetRepository; | |
use MauticPlugin\MauticSocialBundle\Entity\TweetStat; | |
use MauticPlugin\MauticSocialBundle\Entity\TweetStatRepository; | |
use MauticPlugin\MauticSocialBundle\Event as Events; | |
use MauticPlugin\MauticSocialBundle\Form\Type\TweetType; | |
use MauticPlugin\MauticSocialBundle\SocialEvents; | |
use Symfony\Component\Form\FormFactoryInterface; | |
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; | |
use Symfony\Contracts\EventDispatcher\Event; | |
/** | |
* @extends FormModel<Tweet> | |
* | |
* @implements AjaxLookupModelInterface<Tweet> | |
*/ | |
class TweetModel extends FormModel implements AjaxLookupModelInterface | |
{ | |
/** | |
* @param string $filter | |
* @param int $limit | |
* @param int $start | |
* @param array $options | |
*/ | |
public function getLookupResults($type, $filter = '', $limit = 10, $start = 0, $options = []): array | |
{ | |
$results = []; | |
switch ($type) { | |
case 'social.tweet': | |
case 'tweet': | |
if (isset($filter['tweet_text'])) { | |
// This tweet was created as the campaign action param and these params are not the filter. Clear the filter. | |
$filter = ''; | |
} | |
$tweetRepo = $this->getRepository(); | |
$tweetRepo->setCurrentUser($this->userHelper->getUser()); | |
$entities = $tweetRepo->getTweetList( | |
$filter, | |
$limit, | |
$start, | |
$this->security->isGranted($this->getPermissionBase().':viewother') | |
); | |
foreach ($entities as $entity) { | |
$results[$entity['language']][$entity['id']] = $entity['name']; | |
} | |
// sort by language | |
ksort($results); | |
unset($entities); | |
break; | |
} | |
return $results; | |
} | |
/** | |
* Create/update Tweet Stat and update sent count for Tweet. | |
* | |
* @param string $source | |
* @param int $sourceId | |
* | |
* @return $this | |
*/ | |
public function registerSend(Tweet $tweet, Lead $lead, array $sendResponse, $source = null, $sourceId = null) | |
{ | |
$statRepo = $this->getStatRepository(); | |
// Update failed tweet | |
$stat = $statRepo->findOneBy( | |
[ | |
'lead' => $lead->getId(), | |
'tweet' => $tweet->getId(), | |
'source' => $source, | |
'sourceId' => $sourceId, | |
'isFailed' => true, | |
] | |
); | |
if (!$stat) { | |
// Create new entity | |
$stat = new TweetStat(); | |
} else { | |
// Or add 1 to the retry count | |
$stat->retryCountUp(); | |
} | |
$stat->setTweet($tweet); | |
$stat->setLead($lead); | |
$stat->setResponseDetails($sendResponse); | |
$stat->setSource($source); | |
$stat->setSourceId($sourceId); | |
$fields = $lead->getProfileFields(); | |
if (!empty($fields['twitter'])) { | |
$stat->setHandle($fields['twitter']); | |
} | |
if (!empty($sendResponse['id_str'])) { | |
$stat->setDateSent(new \DateTime()); | |
$stat->setTwitterTweetId($sendResponse['id_str']); | |
$tweet->sentCountUp(); | |
$this->saveEntity($tweet); | |
} else { | |
$stat->setIsFailed(true); | |
} | |
$statRepo->saveEntity($stat); | |
return $this; | |
} | |
/** | |
* @param Tweet $entity | |
* @param array<mixed> $options | |
* | |
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException | |
*/ | |
public function createForm($entity, FormFactoryInterface $formFactory, $action = null, $options = []): \Symfony\Component\Form\FormInterface | |
{ | |
if (!$entity instanceof Tweet) { | |
throw new MethodNotAllowedHttpException(['Tweet']); | |
} | |
if (!empty($action)) { | |
$options['action'] = $action; | |
} | |
return $formFactory->create(TweetType::class, $entity, $options); | |
} | |
/** | |
* Get a specific entity or generate a new one if id is empty. | |
* | |
* @param int $id | |
*/ | |
public function getEntity($id = null): ?Tweet | |
{ | |
if (null === $id) { | |
return new Tweet(); | |
} | |
return parent::getEntity($id); | |
} | |
/** | |
* @throws MethodNotAllowedHttpException | |
*/ | |
protected function dispatchEvent($action, &$entity, $isNew = false, Event $event = null): ?Event | |
{ | |
if (!$entity instanceof Tweet) { | |
throw new MethodNotAllowedHttpException(['Tweet']); | |
} | |
switch ($action) { | |
case 'pre_save': | |
$name = SocialEvents::TWEET_PRE_SAVE; | |
break; | |
case 'post_save': | |
$name = SocialEvents::TWEET_POST_SAVE; | |
break; | |
case 'pre_delete': | |
$name = SocialEvents::TWEET_PRE_DELETE; | |
break; | |
case 'post_delete': | |
$name = SocialEvents::TWEET_POST_DELETE; | |
break; | |
default: | |
return null; | |
} | |
if ($this->dispatcher->hasListeners($name)) { | |
if (empty($event)) { | |
$event = new Events\SocialEvent($entity, $isNew); | |
} | |
$this->dispatcher->dispatch($event, $name); | |
return $event; | |
} else { | |
return null; | |
} | |
} | |
public function getRepository(): TweetRepository | |
{ | |
return $this->em->getRepository(Tweet::class); | |
} | |
public function getStatRepository(): TweetStatRepository | |
{ | |
return $this->em->getRepository(TweetStat::class); | |
} | |
public function getPermissionBase(): string | |
{ | |
return 'mauticSocial:tweets'; | |
} | |
} | |