getContainer()->get('hookManager'); } public function run() { $id = $_GET['id'] ?? null; $emailAddress = $_GET['emailAddress'] ?? null; $hash = $_GET['hash'] ?? null; if ($emailAddress && $hash) { $this->processWithHash($emailAddress, $hash); return; } if (!$id) { throw new BadRequest(); } $queueItemId = $id; $queueItem = $this->getEntityManager()->getEntity('EmailQueueItem', $queueItemId); if (!$queueItem) { throw new NotFound(); } $campaign = null; $target = null; $massEmailId = $queueItem->get('massEmailId'); if ($massEmailId) { $massEmail = $this->getEntityManager()->getEntity('MassEmail', $massEmailId); if ($massEmail) { $campaignId = $massEmail->get('campaignId'); if ($campaignId) { $campaign = $this->getEntityManager()->getEntity('Campaign', $campaignId); } $targetType = $queueItem->get('targetType'); $targetId = $queueItem->get('targetId'); if ($targetType && $targetId) { $target = $this->getEntityManager()->getEntity($targetType, $targetId); if (!$target) { throw new NotFound(); } if ($massEmail->get('optOutEntirely')) { $emailAddress = $target->get('emailAddress'); if ($emailAddress) { $ea = $this->getEntityManager()->getRepository('EmailAddress')->getByAddress($emailAddress); if ($ea) { $ea->set('optOut', false); $this->getEntityManager()->saveEntity($ea); } } } $link = null; $m = [ 'Account' => 'accounts', 'Contact' => 'contacts', 'Lead' => 'leads', 'User' => 'users', ]; if (!empty($m[$target->getEntityType()])) { $link = $m[$target->getEntityType()]; } if ($link) { $targetListList = $massEmail->get('targetLists'); foreach ($targetListList as $targetList) { $optedInResult = $this->getEntityManager()->getRepository('TargetList')->updateRelation($targetList, $link, $target->id, array( 'optedOut' => false )); if ($optedInResult) { $hookData = [ 'link' => $link, 'targetId' => $targetId, 'targetType' => $targetType ]; $this->getHookManager()->process('TargetList', 'afterCancelOptOut', $targetList, [], $hookData); } } $this->getHookManager()->process($target->getEntityType(), 'afterCancelOptOut', $target, [], []); $this->display(['queueItemId' => $queueItemId]); } } } } if ($campaign && $target) { $logRecord = $this->getEntityManager()->getRepository('CampaignLogRecord')->where(array( 'queueItemId' => $queueItemId, 'action' => 'Opted Out' ))->order('createdAt', true)->findOne(); if ($logRecord) { $this->getEntityManager()->removeEntity($logRecord); } } } protected function display(array $actionData) { $data = [ 'actionData' => $actionData, 'view' => $this->getMetadata()->get(['clientDefs', 'Campaign', 'subscribeView']), 'template' => $this->getMetadata()->get(['clientDefs', 'Campaign', 'subscribeTemplate']), ]; $runScript = " Espo.require('crm:controllers/unsubscribe', function (Controller) { var controller = new Controller(app.baseController.params, app.getControllerInjection()); controller.masterView = app.masterView; controller.doAction('subscribeAgain', ".json_encode($data)."); }); "; $this->getClientManager()->display($runScript); } protected function processWithHash(string $emailAddress, string $hash) { $secretKey = $this->getConfig()->get('hashSecretKey'); $hash2 = $this->getContainer()->get('hasher')->hash($emailAddress); if ($hash2 !== $hash) { throw new NotFound(); } $repository = $this->getEntityManager()->getRepository('EmailAddress'); $ea = $repository->getByAddress($emailAddress); if ($ea) { $entityList = $repository->getEntityListByAddressId($ea->id); if ($ea->get('optOut')) { $ea->set('optOut', false); $this->getEntityManager()->saveEntity($ea); foreach ($entityList as $entity) { $this->getHookManager()->process($entity->getEntityType(), 'afterCancelOptOut', $entity, [], []); } } $this->display([ 'emailAddress' => $emailAddress, 'hash' => $hash, ]); } else { throw new NotFound(); } } }