Save or update subscriber's tags

[MAILPOET-4440]
This commit is contained in:
Jan Lysý
2022-06-20 19:17:33 +02:00
committed by Veljko V
parent 79b27e005d
commit 6baf4b21c3
3 changed files with 68 additions and 0 deletions

View File

@ -8,10 +8,12 @@ use MailPoet\Doctrine\Validator\ValidationException;
use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\SubscriberSegmentEntity;
use MailPoet\Entities\SubscriberTagEntity;
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\Track\Unsubscribes;
use MailPoet\Tags\TagRepository;
use MailPoet\Util\Security;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon;
@ -38,6 +40,12 @@ class SubscriberSaveController {
/** @var SubscriberSegmentRepository */
private $subscriberSegmentRepository;
/** @var SubscriberTagRepository */
private $subscriberTagRepository;
/** @var TagRepository */
private $tagRepository;
/** @var Unsubscribes */
private $unsubscribesTracker;
@ -55,6 +63,8 @@ class SubscriberSaveController {
SubscriberCustomFieldRepository $subscriberCustomFieldRepository,
SubscribersRepository $subscribersRepository,
SubscriberSegmentRepository $subscriberSegmentRepository,
SubscriberTagRepository $subscriberTagRepository,
TagRepository $tagRepository,
Unsubscribes $unsubscribesTracker,
WelcomeScheduler $welcomeScheduler,
WPFunctions $wp
@ -66,9 +76,11 @@ class SubscriberSaveController {
$this->subscriberSegmentRepository = $subscriberSegmentRepository;
$this->subscribersRepository = $subscribersRepository;
$this->subscriberCustomFieldRepository = $subscriberCustomFieldRepository;
$this->tagRepository = $tagRepository;
$this->unsubscribesTracker = $unsubscribesTracker;
$this->welcomeScheduler = $welcomeScheduler;
$this->wp = $wp;
$this->subscriberTagRepository = $subscriberTagRepository;
}
public function filterOutReservedColumns(array $subscriberData): array {
@ -107,6 +119,10 @@ class SubscriberSaveController {
$data['segments'] = array_merge($data['segments'], $this->getNonDefaultSubscribedSegments($data));
$newSegments = $this->findNewSegments($data);
if (empty($data['tags'])) {
$data['tags'] = [];
}
$oldSubscriber = $this->findSubscriber($data);
$oldStatus = $oldSubscriber ? $oldSubscriber->getStatus() : null;
if (
@ -131,6 +147,7 @@ class SubscriberSaveController {
$subscriber = $this->createOrUpdate($data, $oldSubscriber);
$this->updateCustomFields($data, $subscriber);
$this->updateTags($data, $subscriber);
$segments = isset($data['segments']) ? $this->findSegments($data['segments']) : null;
// check for status change
@ -277,4 +294,27 @@ class SubscriberSaveController {
$this->subscriberCustomFieldRepository->createOrUpdate($subscriber, $customField, $customFieldsMap[$customField->getId()]);
}
}
private function updateTags(array $data, SubscriberEntity $subscriber): void {
foreach ($subscriber->getSubscriberTags() as $subscriberTag) {
$tag = $subscriberTag->getTag();
if (!$tag) {
continue;
}
if (!in_array($tag->getName(), $data['tags'], true)) {
$subscriber->getSubscriberTags()->removeElement($subscriberTag);
}
}
foreach ($data['tags'] as $tagName) {
$tag = $this->tagRepository->createOrUpdate(['name' => $tagName]);
$subscriberTag = $subscriber->getSubscriberTag($tag);
if (!$subscriberTag) {
$subscriberTag = new SubscriberTagEntity($tag, $subscriber);
$subscriber->getSubscriberTags()->add($subscriberTag);
$this->subscriberTagRepository->persist($subscriberTag);
}
}
$this->subscriberTagRepository->flush();
}
}