Remove using Idiorm from Newsletter::duplicate

[MAILPOET-2946]
This commit is contained in:
Jan Lysý
2020-10-21 20:49:14 +02:00
committed by Veljko V
parent 9955a2a250
commit c68728670e
4 changed files with 71 additions and 22 deletions

View File

@ -14,7 +14,6 @@ use MailPoet\Entities\NewsletterOptionFieldEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\InvalidStateException;
use MailPoet\Listing;
use MailPoet\Models\Newsletter;
use MailPoet\Newsletter\Listing\NewsletterListingRepository;
use MailPoet\Newsletter\NewsletterSaveController;
use MailPoet\Newsletter\NewslettersRepository;
@ -255,27 +254,15 @@ class Newsletters extends APIEndpoint {
}
public function duplicate($data = []) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$newsletter = Newsletter::findOne($id);
$newsletter = $this->getNewsletter($data);
if ($newsletter instanceof Newsletter) {
$data = [
'subject' => sprintf(__('Copy of %s', 'mailpoet'), $newsletter->subject),
];
$duplicate = $newsletter->duplicate($data);
$errors = $duplicate->getErrors();
if (!empty($errors)) {
return $this->errorResponse($errors);
} else {
if ($newsletter instanceof NewsletterEntity) {
$duplicate = $this->newsletterSaveController->duplicate($newsletter);
$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(),
$this->newslettersResponseBuilder->build($duplicate),
['count' => 1]
);
}
} else {
return $this->errorResponse([
APIError::NOT_FOUND => __('This email does not exist.', 'mailpoet'),

View File

@ -2,6 +2,7 @@
namespace MailPoet\Entities;
use DateTimeImmutable;
use DateTimeInterface;
use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
@ -157,6 +158,15 @@ class NewsletterEntity {
$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
*/

View File

@ -5,6 +5,7 @@ namespace MailPoet\Newsletter;
use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterQueueTask;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterOptionEntity;
use MailPoet\Entities\NewsletterOptionFieldEntity;
use MailPoet\Entities\NewsletterSegmentEntity;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\SegmentEntity;
@ -135,6 +136,56 @@ class NewsletterSaveController {
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 {
if (!isset($data['id'])) {
throw new UnexpectedValueException();

View File

@ -11,6 +11,7 @@ use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
use MailPoet\API\JSON\v1\Newsletters;
use MailPoet\Cron\CronHelper;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Listing\Handler;
use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterOption;
@ -379,7 +380,7 @@ class NewslettersTest extends \MailPoetTest {
$hookName = 'mailpoet_api_newsletters_duplicate_after';
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]);
expect($response->status)->equals(APIResponse::STATUS_OK);