Use findBy() instead of getReference() to get segment entities

Initially, I had opted to use getReference() to avoid querying the
database to get the segment entities as all we need is the segment ID.
But I hadn't realized that this could cause problems if a segment that
is saved in the settings in the option woocommerce.segments is deleted.
Using findBy() here protects against this problem as, if the segment
doesn't exist anymore, it won't be returned.

[MAILPOET-4365]
This commit is contained in:
Rodrigo Primo
2022-08-19 12:27:44 -03:00
committed by Aschepikov
parent 6bf36d4211
commit f21c47528e

View File

@ -2,7 +2,6 @@
namespace MailPoet\WooCommerce; namespace MailPoet\WooCommerce;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Entities\SubscriberSegmentEntity;
@ -16,7 +15,6 @@ use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Doctrine\ORM\EntityManager;
class Subscription { class Subscription {
const CHECKOUT_OPTIN_INPUT_NAME = 'mailpoet_woocommerce_checkout_optin'; const CHECKOUT_OPTIN_INPUT_NAME = 'mailpoet_woocommerce_checkout_optin';
@ -73,9 +71,6 @@ class Subscription {
/** @var SubscriberSegmentRepository */ /** @var SubscriberSegmentRepository */
private $subscriberSegmentRepository; private $subscriberSegmentRepository;
/** @var EntityManager */
private $entityManager;
public function __construct( public function __construct(
SettingsController $settings, SettingsController $settings,
ConfirmationEmailMailer $confirmationEmailMailer, ConfirmationEmailMailer $confirmationEmailMailer,
@ -84,8 +79,7 @@ class Subscription {
SubscribersRepository $subscribersRepository, SubscribersRepository $subscribersRepository,
Unsubscribes $unsubscribesTracker, Unsubscribes $unsubscribesTracker,
SegmentsRepository $segmentsRepository, SegmentsRepository $segmentsRepository,
SubscriberSegmentRepository $subscriberSegmentRepository, SubscriberSegmentRepository $subscriberSegmentRepository
EntityManager $entityManager
) { ) {
$this->settings = $settings; $this->settings = $settings;
$this->wp = $wp; $this->wp = $wp;
@ -95,7 +89,6 @@ class Subscription {
$this->unsubscribesTracker = $unsubscribesTracker; $this->unsubscribesTracker = $unsubscribesTracker;
$this->segmentsRepository = $segmentsRepository; $this->segmentsRepository = $segmentsRepository;
$this->subscriberSegmentRepository = $subscriberSegmentRepository; $this->subscriberSegmentRepository = $subscriberSegmentRepository;
$this->entityManager = $entityManager;
} }
public function extendWooCommerceCheckoutForm() { public function extendWooCommerceCheckoutForm() {
@ -219,7 +212,12 @@ class Subscription {
*/ */
public function handleSubscriberOptin(SubscriberEntity $subscriber, bool $checkoutOptinEnabled, bool $checkoutOptin): bool { public function handleSubscriberOptin(SubscriberEntity $subscriber, bool $checkoutOptinEnabled, bool $checkoutOptin): bool {
$wcSegment = $this->segmentsRepository->getWooCommerceSegment(); $wcSegment = $this->segmentsRepository->getWooCommerceSegment();
$moreSegmentsToSubscribe = $this->getOptinSegments();
$segmentIds = (array)$this->settings->get(self::OPTIN_SEGMENTS_SETTING_NAME, []);
$moreSegmentsToSubscribe = [];
if (!empty($segmentIds)) {
$moreSegmentsToSubscribe = $this->segmentsRepository->findBy(['id' => $segmentIds]);
}
$signupConfirmation = $this->settings->get('signup_confirmation'); $signupConfirmation = $this->settings->get('signup_confirmation');
if (!$checkoutOptin) { if (!$checkoutOptin) {
@ -287,15 +285,4 @@ class Subscription {
$this->unsubscribesTracker->track((int)$subscriber->getId(), StatisticsUnsubscribeEntity::SOURCE_ORDER_CHECKOUT); $this->unsubscribesTracker->track((int)$subscriber->getId(), StatisticsUnsubscribeEntity::SOURCE_ORDER_CHECKOUT);
} }
} }
private function getOptinSegments(): array {
$segments = [];
$segmentsIds = (array)$this->settings->get(self::OPTIN_SEGMENTS_SETTING_NAME, []);
foreach ($segmentsIds as $segmentId) {
$segments[] = $this->entityManager->getReference(SegmentEntity::class, $segmentId);
}
return $segments;
}
} }