diff --git a/lib/API/JSON/v1/Segments.php b/lib/API/JSON/v1/Segments.php index d616bdf42a..9da640d144 100644 --- a/lib/API/JSON/v1/Segments.php +++ b/lib/API/JSON/v1/Segments.php @@ -2,9 +2,11 @@ namespace MailPoet\API\JSON\v1; +use Exception; use InvalidArgumentException; use MailPoet\API\JSON\Endpoint as APIEndpoint; use MailPoet\API\JSON\Error as APIError; +use MailPoet\API\JSON\Response; use MailPoet\API\JSON\ResponseBuilders\SegmentsResponseBuilder; use MailPoet\Config\AccessControl; use MailPoet\Doctrine\Validator\ValidationException; @@ -188,7 +190,13 @@ class Segments extends APIEndpoint { $segment = $this->getSegment($data); 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( $this->segmentsResponseBuilder->build($duplicate), ['count' => 1] diff --git a/lib/Segments/SegmentSaveController.php b/lib/Segments/SegmentSaveController.php index 3fa0cd411a..9f8b2e8935 100644 --- a/lib/Segments/SegmentSaveController.php +++ b/lib/Segments/SegmentSaveController.php @@ -6,6 +6,7 @@ use InvalidArgumentException; use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Subscribers\SubscriberSegmentRepository; +use MailPoetVendor\Doctrine\ORM\EntityManager; class SegmentSaveController { /** @var SegmentsRepository */ @@ -14,12 +15,17 @@ class SegmentSaveController { /** @var SubscriberSegmentRepository */ private $subscriberSegmentRepository; + /** @var EntityManager */ + private $entityManager; + public function __construct( SegmentsRepository $segmentsRepository, - SubscriberSegmentRepository $subscriberSegmentRepository + SubscriberSegmentRepository $subscriberSegmentRepository, + EntityManager $entityManager ) { $this->segmentsRepository = $segmentsRepository; $this->subscriberSegmentRepository = $subscriberSegmentRepository; + $this->entityManager = $entityManager; } public function save(array $data = []): SegmentEntity { @@ -38,23 +44,26 @@ class SegmentSaveController { $this->checkSegmenUniqueName($duplicate->getName(), $duplicate->getId()); - $this->segmentsRepository->persist($duplicate); - $this->segmentsRepository->flush(); - $subscriberSegments = $this->subscriberSegmentRepository->findBy(['segment' => $segmentEntity]); - foreach ($subscriberSegments as $subscriberSegment) { - $subscriber = $subscriberSegment->getSubscriber(); - if (!$subscriber) { - continue; + + $this->entityManager->transactional(function (EntityManager $entityManager) use ($duplicate, $subscriberSegments) { + $entityManager->persist($duplicate); + $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( - $duplicate, - $subscriber, - $subscriberSegment->getStatus() - ); - $this->subscriberSegmentRepository->persist($subscriberDuplicate); - } - $this->subscriberSegmentRepository->flush(); + $entityManager->flush(); + }); return $duplicate; }