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;
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) {
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]

View File

@ -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,10 +44,12 @@ class SegmentSaveController {
$this->checkSegmenUniqueName($duplicate->getName(), $duplicate->getId());
$this->segmentsRepository->persist($duplicate);
$this->segmentsRepository->flush();
$subscriberSegments = $this->subscriberSegmentRepository->findBy(['segment' => $segmentEntity]);
$this->entityManager->transactional(function (EntityManager $entityManager) use ($duplicate, $subscriberSegments) {
$entityManager->persist($duplicate);
$entityManager->flush();
foreach ($subscriberSegments as $subscriberSegment) {
$subscriber = $subscriberSegment->getSubscriber();
if (!$subscriber) {
@ -52,9 +60,10 @@ class SegmentSaveController {
$subscriber,
$subscriberSegment->getStatus()
);
$this->subscriberSegmentRepository->persist($subscriberDuplicate);
$entityManager->persist($subscriberDuplicate);
}
$this->subscriberSegmentRepository->flush();
$entityManager->flush();
});
return $duplicate;
}