Remove using Idiorm from Newsletter::duplicate
[MAILPOET-2946]
This commit is contained in:
@ -14,7 +14,6 @@ use MailPoet\Entities\NewsletterOptionFieldEntity;
|
|||||||
use MailPoet\Entities\SendingQueueEntity;
|
use MailPoet\Entities\SendingQueueEntity;
|
||||||
use MailPoet\InvalidStateException;
|
use MailPoet\InvalidStateException;
|
||||||
use MailPoet\Listing;
|
use MailPoet\Listing;
|
||||||
use MailPoet\Models\Newsletter;
|
|
||||||
use MailPoet\Newsletter\Listing\NewsletterListingRepository;
|
use MailPoet\Newsletter\Listing\NewsletterListingRepository;
|
||||||
use MailPoet\Newsletter\NewsletterSaveController;
|
use MailPoet\Newsletter\NewsletterSaveController;
|
||||||
use MailPoet\Newsletter\NewslettersRepository;
|
use MailPoet\Newsletter\NewslettersRepository;
|
||||||
@ -255,27 +254,15 @@ class Newsletters extends APIEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function duplicate($data = []) {
|
public function duplicate($data = []) {
|
||||||
$id = (isset($data['id']) ? (int)$data['id'] : false);
|
$newsletter = $this->getNewsletter($data);
|
||||||
$newsletter = Newsletter::findOne($id);
|
|
||||||
|
|
||||||
if ($newsletter instanceof Newsletter) {
|
if ($newsletter instanceof NewsletterEntity) {
|
||||||
$data = [
|
$duplicate = $this->newsletterSaveController->duplicate($newsletter);
|
||||||
'subject' => sprintf(__('Copy of %s', 'mailpoet'), $newsletter->subject),
|
$this->wp->doAction('mailpoet_api_newsletters_duplicate_after', $newsletter, $duplicate);
|
||||||
];
|
return $this->successResponse(
|
||||||
$duplicate = $newsletter->duplicate($data);
|
$this->newslettersResponseBuilder->build($duplicate),
|
||||||
$errors = $duplicate->getErrors();
|
['count' => 1]
|
||||||
|
);
|
||||||
if (!empty($errors)) {
|
|
||||||
return $this->errorResponse($errors);
|
|
||||||
} else {
|
|
||||||
$this->wp->doAction('mailpoet_api_newsletters_duplicate_after', $newsletter, $duplicate);
|
|
||||||
$duplicate = Newsletter::findOne($duplicate->id);
|
|
||||||
if(!$duplicate instanceof Newsletter) return $this->errorResponse();
|
|
||||||
return $this->successResponse(
|
|
||||||
$duplicate->asArray(),
|
|
||||||
['count' => 1]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return $this->errorResponse([
|
return $this->errorResponse([
|
||||||
APIError::NOT_FOUND => __('This email does not exist.', 'mailpoet'),
|
APIError::NOT_FOUND => __('This email does not exist.', 'mailpoet'),
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace MailPoet\Entities;
|
namespace MailPoet\Entities;
|
||||||
|
|
||||||
|
use DateTimeImmutable;
|
||||||
use DateTimeInterface;
|
use DateTimeInterface;
|
||||||
use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
|
use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
|
||||||
use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
|
use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
|
||||||
@ -157,6 +158,15 @@ class NewsletterEntity {
|
|||||||
$this->queues = new ArrayCollection();
|
$this->queues = new ArrayCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function __clone() {
|
||||||
|
// reset ID
|
||||||
|
$this->id = null;
|
||||||
|
// reset timestamps
|
||||||
|
$this->setCreatedAt(new DateTimeImmutable());
|
||||||
|
$this->setUpdatedAt(new DateTimeImmutable());
|
||||||
|
$this->setDeletedAt(null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string|null
|
* @return string|null
|
||||||
*/
|
*/
|
||||||
|
@ -5,6 +5,7 @@ namespace MailPoet\Newsletter;
|
|||||||
use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterQueueTask;
|
use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterQueueTask;
|
||||||
use MailPoet\Entities\NewsletterEntity;
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
use MailPoet\Entities\NewsletterOptionEntity;
|
use MailPoet\Entities\NewsletterOptionEntity;
|
||||||
|
use MailPoet\Entities\NewsletterOptionFieldEntity;
|
||||||
use MailPoet\Entities\NewsletterSegmentEntity;
|
use MailPoet\Entities\NewsletterSegmentEntity;
|
||||||
use MailPoet\Entities\ScheduledTaskEntity;
|
use MailPoet\Entities\ScheduledTaskEntity;
|
||||||
use MailPoet\Entities\SegmentEntity;
|
use MailPoet\Entities\SegmentEntity;
|
||||||
@ -135,6 +136,56 @@ class NewsletterSaveController {
|
|||||||
return $newsletter;
|
return $newsletter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function duplicate(NewsletterEntity $newsletter): NewsletterEntity {
|
||||||
|
$duplicate = clone $newsletter;
|
||||||
|
|
||||||
|
$duplicate->setSubject(sprintf(__('Copy of %s', 'mailpoet'), $newsletter->getSubject()));
|
||||||
|
// generate new unsubscribe token
|
||||||
|
$duplicate->setUnsubscribeToken($this->security->generateUnsubscribeTokenByEntity($duplicate));
|
||||||
|
// reset status
|
||||||
|
$duplicate->setStatus(NewsletterEntity::STATUS_DRAFT);
|
||||||
|
// reset hash
|
||||||
|
$duplicate->setHash(null);
|
||||||
|
// reset sent at date
|
||||||
|
$duplicate->setSentAt(null);
|
||||||
|
|
||||||
|
$this->newslettersRepository->persist($duplicate);
|
||||||
|
$this->newslettersRepository->flush();
|
||||||
|
|
||||||
|
// create relationships between duplicate and segments
|
||||||
|
foreach ($newsletter->getNewsletterSegments() as $newsletterSegment) {
|
||||||
|
$segment = $newsletterSegment->getSegment();
|
||||||
|
if (!$segment) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$duplicateSegment = new NewsletterSegmentEntity($duplicate, $segment);
|
||||||
|
$duplicate->getNewsletterSegments()->add($duplicateSegment);
|
||||||
|
$this->newsletterSegmentRepository->persist($duplicateSegment);
|
||||||
|
}
|
||||||
|
|
||||||
|
// duplicate options
|
||||||
|
$ignoredOptions = [
|
||||||
|
NewsletterOptionFieldEntity::NAME_IS_SCHEDULED,
|
||||||
|
NewsletterOptionFieldEntity::NAME_SCHEDULED_AT,
|
||||||
|
];
|
||||||
|
foreach ($newsletter->getOptions() as $newsletterOption) {
|
||||||
|
$optionField = $newsletterOption->getOptionField();
|
||||||
|
if (!$optionField) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (in_array($optionField->getName(), $ignoredOptions, true)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$duplicateOption = new NewsletterOptionEntity($duplicate, $optionField);
|
||||||
|
$duplicateOption->setValue($newsletterOption->getValue());
|
||||||
|
$duplicate->getOptions()->add($duplicateOption);
|
||||||
|
$this->newsletterOptionsRepository->persist($duplicateOption);
|
||||||
|
}
|
||||||
|
$this->newslettersRepository->flush();
|
||||||
|
|
||||||
|
return $duplicate;
|
||||||
|
}
|
||||||
|
|
||||||
private function getNewsletter(array $data): NewsletterEntity {
|
private function getNewsletter(array $data): NewsletterEntity {
|
||||||
if (!isset($data['id'])) {
|
if (!isset($data['id'])) {
|
||||||
throw new UnexpectedValueException();
|
throw new UnexpectedValueException();
|
||||||
|
@ -11,6 +11,7 @@ use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
|
|||||||
use MailPoet\API\JSON\v1\Newsletters;
|
use MailPoet\API\JSON\v1\Newsletters;
|
||||||
use MailPoet\Cron\CronHelper;
|
use MailPoet\Cron\CronHelper;
|
||||||
use MailPoet\DI\ContainerWrapper;
|
use MailPoet\DI\ContainerWrapper;
|
||||||
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
use MailPoet\Listing\Handler;
|
use MailPoet\Listing\Handler;
|
||||||
use MailPoet\Models\Newsletter;
|
use MailPoet\Models\Newsletter;
|
||||||
use MailPoet\Models\NewsletterOption;
|
use MailPoet\Models\NewsletterOption;
|
||||||
@ -379,7 +380,7 @@ class NewslettersTest extends \MailPoetTest {
|
|||||||
|
|
||||||
$hookName = 'mailpoet_api_newsletters_duplicate_after';
|
$hookName = 'mailpoet_api_newsletters_duplicate_after';
|
||||||
expect(WPHooksHelper::isActionDone($hookName))->true();
|
expect(WPHooksHelper::isActionDone($hookName))->true();
|
||||||
expect(WPHooksHelper::getActionDone($hookName)[0] instanceof Newsletter)->true();
|
expect(WPHooksHelper::getActionDone($hookName)[0] instanceof NewsletterEntity)->true();
|
||||||
|
|
||||||
$response = $this->endpoint->duplicate(['id' => $this->postNotification->id]);
|
$response = $this->endpoint->duplicate(['id' => $this->postNotification->id]);
|
||||||
expect($response->status)->equals(APIResponse::STATUS_OK);
|
expect($response->status)->equals(APIResponse::STATUS_OK);
|
||||||
|
Reference in New Issue
Block a user