Use DB transaction when duplicating Segment

[MAILPOET-3170]
This commit is contained in:
Jan Lysý
2021-01-25 15:02:24 +01:00
committed by Veljko V
parent f5987359c7
commit c579a35980
2 changed files with 34 additions and 17 deletions

View File

@ -2,9 +2,11 @@
namespace MailPoet\API\JSON\v1; namespace MailPoet\API\JSON\v1;
use Exception;
use InvalidArgumentException; use InvalidArgumentException;
use MailPoet\API\JSON\Endpoint as APIEndpoint; use MailPoet\API\JSON\Endpoint as APIEndpoint;
use MailPoet\API\JSON\Error as APIError; use MailPoet\API\JSON\Error as APIError;
use MailPoet\API\JSON\Response;
use MailPoet\API\JSON\ResponseBuilders\SegmentsResponseBuilder; use MailPoet\API\JSON\ResponseBuilders\SegmentsResponseBuilder;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Doctrine\Validator\ValidationException; use MailPoet\Doctrine\Validator\ValidationException;
@ -188,7 +190,13 @@ class Segments extends APIEndpoint {
$segment = $this->getSegment($data); $segment = $this->getSegment($data);
if ($segment instanceof SegmentEntity) { if ($segment instanceof SegmentEntity) {
$duplicate = $this->segmentSavecontroller->duplicate($segment); try {
$duplicate = $this->segmentSavecontroller->duplicate($segment);
} catch (Exception $e) {
return $this->errorResponse([
APIError::UNKNOWN => __('Duplicating of segment failed.', 'mailpoet'),
], [], Response::STATUS_UNKNOWN);
}
return $this->successResponse( return $this->successResponse(
$this->segmentsResponseBuilder->build($duplicate), $this->segmentsResponseBuilder->build($duplicate),
['count' => 1] ['count' => 1]

View File

@ -6,6 +6,7 @@ use InvalidArgumentException;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Entities\SubscriberSegmentEntity;
use MailPoet\Subscribers\SubscriberSegmentRepository; use MailPoet\Subscribers\SubscriberSegmentRepository;
use MailPoetVendor\Doctrine\ORM\EntityManager;
class SegmentSaveController { class SegmentSaveController {
/** @var SegmentsRepository */ /** @var SegmentsRepository */
@ -14,12 +15,17 @@ class SegmentSaveController {
/** @var SubscriberSegmentRepository */ /** @var SubscriberSegmentRepository */
private $subscriberSegmentRepository; private $subscriberSegmentRepository;
/** @var EntityManager */
private $entityManager;
public function __construct( public function __construct(
SegmentsRepository $segmentsRepository, SegmentsRepository $segmentsRepository,
SubscriberSegmentRepository $subscriberSegmentRepository SubscriberSegmentRepository $subscriberSegmentRepository,
EntityManager $entityManager
) { ) {
$this->segmentsRepository = $segmentsRepository; $this->segmentsRepository = $segmentsRepository;
$this->subscriberSegmentRepository = $subscriberSegmentRepository; $this->subscriberSegmentRepository = $subscriberSegmentRepository;
$this->entityManager = $entityManager;
} }
public function save(array $data = []): SegmentEntity { public function save(array $data = []): SegmentEntity {
@ -38,23 +44,26 @@ class SegmentSaveController {
$this->checkSegmenUniqueName($duplicate->getName(), $duplicate->getId()); $this->checkSegmenUniqueName($duplicate->getName(), $duplicate->getId());
$this->segmentsRepository->persist($duplicate);
$this->segmentsRepository->flush();
$subscriberSegments = $this->subscriberSegmentRepository->findBy(['segment' => $segmentEntity]); $subscriberSegments = $this->subscriberSegmentRepository->findBy(['segment' => $segmentEntity]);
foreach ($subscriberSegments as $subscriberSegment) {
$subscriber = $subscriberSegment->getSubscriber(); $this->entityManager->transactional(function (EntityManager $entityManager) use ($duplicate, $subscriberSegments) {
if (!$subscriber) { $entityManager->persist($duplicate);
continue; $entityManager->flush();
foreach ($subscriberSegments as $subscriberSegment) {
$subscriber = $subscriberSegment->getSubscriber();
if (!$subscriber) {
continue;
}
$subscriberDuplicate = new SubscriberSegmentEntity(
$duplicate,
$subscriber,
$subscriberSegment->getStatus()
);
$entityManager->persist($subscriberDuplicate);
} }
$subscriberDuplicate = new SubscriberSegmentEntity( $entityManager->flush();
$duplicate, });
$subscriber,
$subscriberSegment->getStatus()
);
$this->subscriberSegmentRepository->persist($subscriberDuplicate);
}
$this->subscriberSegmentRepository->flush();
return $duplicate; return $duplicate;
} }