Add a bulk unsubscribe server side action
[MAILPOET-2978]
This commit is contained in:
@ -513,6 +513,8 @@ class Subscribers extends APIEndpoint {
|
|||||||
$count = $this->subscribersRepository->bulkAddToSegment($segment, $ids);
|
$count = $this->subscribersRepository->bulkAddToSegment($segment, $ids);
|
||||||
} elseif ($data['action'] === 'moveToList' && $segment instanceof SegmentEntity) {
|
} elseif ($data['action'] === 'moveToList' && $segment instanceof SegmentEntity) {
|
||||||
$count = $this->subscribersRepository->bulkMoveToSegment($segment, $ids);
|
$count = $this->subscribersRepository->bulkMoveToSegment($segment, $ids);
|
||||||
|
} elseif ($data['action'] === 'unsubscribe') {
|
||||||
|
$count = $this->subscribersRepository->bulkUnsubscribe($ids);
|
||||||
} else {
|
} else {
|
||||||
throw UnexpectedValueException::create()
|
throw UnexpectedValueException::create()
|
||||||
->withErrors([APIError::BAD_REQUEST => "Invalid bulk action '{$data['action']}' provided."]);
|
->withErrors([APIError::BAD_REQUEST => "Invalid bulk action '{$data['action']}' provided."]);
|
||||||
|
@ -177,7 +177,7 @@ class SubscribersRepository extends Repository {
|
|||||||
->setParameter('ids', $ids)
|
->setParameter('ids', $ids)
|
||||||
->setParameter('segment', $segment)
|
->setParameter('segment', $segment)
|
||||||
->getQuery()->execute();
|
->getQuery()->execute();
|
||||||
|
|
||||||
$this->entityManager->transactional(function (EntityManager $entityManager) use ($subscribers, $segment) {
|
$this->entityManager->transactional(function (EntityManager $entityManager) use ($subscribers, $segment) {
|
||||||
foreach ($subscribers as $subscriber) {
|
foreach ($subscribers as $subscriber) {
|
||||||
$subscriberSegment = new SubscriberSegmentEntity($segment, $subscriber, SubscriberEntity::STATUS_SUBSCRIBED);
|
$subscriberSegment = new SubscriberSegmentEntity($segment, $subscriber, SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
@ -199,5 +199,17 @@ class SubscribersRepository extends Repository {
|
|||||||
|
|
||||||
$this->bulkRemoveFromAllSegments($ids);
|
$this->bulkRemoveFromAllSegments($ids);
|
||||||
return $this->bulkAddToSegment($segment, $ids);
|
return $this->bulkAddToSegment($segment, $ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function bulkUnsubscribe(array $ids): int {
|
||||||
|
$this->entityManager->createQueryBuilder()
|
||||||
|
->update(SubscriberEntity::class, 's')
|
||||||
|
->set('s.status', ':status')
|
||||||
|
->where('s.id IN (:ids)')
|
||||||
|
->setParameter('status', SubscriberEntity::STATUS_UNSUBSCRIBED)
|
||||||
|
->setParameter('ids', $ids)
|
||||||
|
->getQuery()->execute();
|
||||||
|
|
||||||
|
return count($ids);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ class SubscribersRepositoryTest extends \MailPoetTest {
|
|||||||
// don't restored subscriber
|
// don't restored subscriber
|
||||||
$subscriberTwo = $this->repository->findOneById($subscriberTwoId);
|
$subscriberTwo = $this->repository->findOneById($subscriberTwoId);
|
||||||
assert($subscriberTwo instanceof SubscriberEntity);
|
assert($subscriberTwo instanceof SubscriberEntity);
|
||||||
expect($subscriberTwo->getDeletedAt())->notNull();
|
expect($subscriberTwo->getDeletedAt())->notNull();
|
||||||
expect($this->subscriberSegmentRepository->findOneBy(['subscriber' => $subscriberTwoId]))->notNull();
|
expect($this->subscriberSegmentRepository->findOneBy(['subscriber' => $subscriberTwoId]))->notNull();
|
||||||
expect($this->subscriberCustomFieldRepository->findOneBy(['subscriber' => $subscriberTwoId]))->notNull();
|
expect($this->subscriberCustomFieldRepository->findOneBy(['subscriber' => $subscriberTwoId]))->notNull();
|
||||||
}
|
}
|
||||||
@ -141,7 +141,7 @@ class SubscribersRepositoryTest extends \MailPoetTest {
|
|||||||
]))->notNull();
|
]))->notNull();
|
||||||
|
|
||||||
// subscriber with removed segment two
|
// subscriber with removed segment two
|
||||||
expect($this->repository->findOneById($subscriberTwoId))->notNull();
|
expect($this->repository->findOneById($subscriberTwoId))->notNull();
|
||||||
expect($this->subscriberSegmentRepository->findOneBy([
|
expect($this->subscriberSegmentRepository->findOneBy([
|
||||||
'subscriber' => $subscriberTwoId,
|
'subscriber' => $subscriberTwoId,
|
||||||
'segment' => $segmentTwoId,
|
'segment' => $segmentTwoId,
|
||||||
@ -152,6 +152,30 @@ class SubscribersRepositoryTest extends \MailPoetTest {
|
|||||||
]))->notNull();
|
]))->notNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testItBulkUnsubscribes(): void {
|
||||||
|
$subscriberOne = $this->createSubscriber('one@removeAll.com', new DateTimeImmutable());
|
||||||
|
$subscriberTwo = $this->createSubscriber('two@removeAll.com', new DateTimeImmutable());
|
||||||
|
|
||||||
|
$subscriberOneId = $subscriberOne->getId();
|
||||||
|
$subscriberTwoId = $subscriberTwo->getId();
|
||||||
|
|
||||||
|
$this->repository->bulkUnsubscribe([$subscriberOneId]);
|
||||||
|
|
||||||
|
$this->entityManager->clear();
|
||||||
|
|
||||||
|
// subscriber with removed segments
|
||||||
|
$unsubscribedSubscriber = $this->repository->findOneById($subscriberOneId);
|
||||||
|
expect($unsubscribedSubscriber)->notNull();
|
||||||
|
assert($unsubscribedSubscriber instanceof SubscriberEntity);
|
||||||
|
expect($unsubscribedSubscriber->getStatus())->equals(SubscriberEntity::STATUS_UNSUBSCRIBED);
|
||||||
|
|
||||||
|
// subscriber still subscribed
|
||||||
|
$subscribedSubscriber = $this->repository->findOneById($subscriberTwoId);
|
||||||
|
expect($subscribedSubscriber)->notNull();
|
||||||
|
assert($subscribedSubscriber instanceof SubscriberEntity);
|
||||||
|
expect($subscribedSubscriber->getStatus())->equals(SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
|
}
|
||||||
|
|
||||||
public function testItBulkRemoveSubscriberFromAllSegments(): void {
|
public function testItBulkRemoveSubscriberFromAllSegments(): void {
|
||||||
$subscriberOne = $this->createSubscriber('one@removeAll.com', new DateTimeImmutable());
|
$subscriberOne = $this->createSubscriber('one@removeAll.com', new DateTimeImmutable());
|
||||||
$subscriberTwo = $this->createSubscriber('two@removeAll.com', new DateTimeImmutable());
|
$subscriberTwo = $this->createSubscriber('two@removeAll.com', new DateTimeImmutable());
|
||||||
@ -176,7 +200,7 @@ class SubscribersRepositoryTest extends \MailPoetTest {
|
|||||||
expect($this->subscriberSegmentRepository->findBy(['subscriber' => $subscriberOneId]))->count(0);
|
expect($this->subscriberSegmentRepository->findBy(['subscriber' => $subscriberOneId]))->count(0);
|
||||||
|
|
||||||
// subscriber with segments
|
// subscriber with segments
|
||||||
expect($this->repository->findOneById($subscriberTwoId))->notNull();
|
expect($this->repository->findOneById($subscriberTwoId))->notNull();
|
||||||
expect($this->subscriberSegmentRepository->findOneBy([
|
expect($this->subscriberSegmentRepository->findOneBy([
|
||||||
'subscriber' => $subscriberTwoId,
|
'subscriber' => $subscriberTwoId,
|
||||||
'segment' => $segmentOneId,
|
'segment' => $segmentOneId,
|
||||||
@ -208,7 +232,7 @@ class SubscribersRepositoryTest extends \MailPoetTest {
|
|||||||
]))->notNull();
|
]))->notNull();
|
||||||
|
|
||||||
// subscriber without segment
|
// subscriber without segment
|
||||||
expect($this->repository->findOneById($subscriberTwoId))->notNull();
|
expect($this->repository->findOneById($subscriberTwoId))->notNull();
|
||||||
expect($this->subscriberSegmentRepository->findBy(['subscriber' => $subscriberTwoId]))->count(0);
|
expect($this->subscriberSegmentRepository->findBy(['subscriber' => $subscriberTwoId]))->count(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,7 +265,7 @@ class SubscribersRepositoryTest extends \MailPoetTest {
|
|||||||
]))->notNull();
|
]))->notNull();
|
||||||
|
|
||||||
// subscriber which stay in segment two
|
// subscriber which stay in segment two
|
||||||
expect($this->repository->findOneById($subscriberTwoId))->notNull();
|
expect($this->repository->findOneById($subscriberTwoId))->notNull();
|
||||||
expect($this->subscriberSegmentRepository->findOneBy([
|
expect($this->subscriberSegmentRepository->findOneBy([
|
||||||
'subscriber' => $subscriberTwoId,
|
'subscriber' => $subscriberTwoId,
|
||||||
'segment' => $segmentOneId,
|
'segment' => $segmentOneId,
|
||||||
@ -283,6 +307,7 @@ class SubscribersRepositoryTest extends \MailPoetTest {
|
|||||||
$subscriber->setEmail($email);
|
$subscriber->setEmail($email);
|
||||||
$subscriber->setFirstName('John');
|
$subscriber->setFirstName('John');
|
||||||
$subscriber->setLastName('Doe');
|
$subscriber->setLastName('Doe');
|
||||||
|
$subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED);
|
||||||
$subscriber->setDeletedAt($deletedAt);
|
$subscriber->setDeletedAt($deletedAt);
|
||||||
$this->entityManager->persist($subscriber);
|
$this->entityManager->persist($subscriber);
|
||||||
$this->entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
Reference in New Issue
Block a user