Remove using Idiorm from Newsletter::create

[MAILPOET-2946]
This commit is contained in:
Jan Lysý
2020-10-21 10:00:27 +02:00
committed by Veljko V
parent a15a74d94f
commit ca50d6df1d
2 changed files with 45 additions and 71 deletions

View File

@ -8,14 +8,13 @@ use MailPoet\API\JSON\Response;
use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder; use MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Cron\CronHelper; use MailPoet\Cron\CronHelper;
use MailPoet\DI\ContainerWrapper; use MailPoet\Doctrine\Validator\ValidationException;
use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterOptionFieldEntity; use MailPoet\Entities\NewsletterOptionFieldEntity;
use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SendingQueueEntity;
use MailPoet\InvalidStateException;
use MailPoet\Listing; use MailPoet\Listing;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterOption;
use MailPoet\Models\NewsletterOptionField;
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;
@ -24,7 +23,6 @@ use MailPoet\Newsletter\Preview\SendPreviewException;
use MailPoet\Newsletter\Scheduler\PostNotificationScheduler; use MailPoet\Newsletter\Scheduler\PostNotificationScheduler;
use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Newsletter\Scheduler\Scheduler;
use MailPoet\Newsletter\Url as NewsletterUrl; use MailPoet\Newsletter\Url as NewsletterUrl;
use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\UnexpectedValueException; use MailPoet\UnexpectedValueException;
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature; use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
@ -191,7 +189,11 @@ class Newsletters extends APIEndpoint {
$task->getScheduledAt() <= Carbon::createFromTimestamp($this->wp->currentTime('timestamp')) && $task->getScheduledAt() <= Carbon::createFromTimestamp($this->wp->currentTime('timestamp')) &&
$task->getStatus() === SendingQueueEntity::STATUS_SCHEDULED $task->getStatus() === SendingQueueEntity::STATUS_SCHEDULED
) { ) {
$task->setScheduledAt(Carbon::createFromFormat('Y-m-d H:i:s', $nextRunDate)); $nextRunDate = $nextRunDate ? Carbon::createFromFormat('Y-m-d H:i:s', $nextRunDate) : null;
if ($nextRunDate === false) {
throw InvalidStateException::create()->withMessage('Invalid next run date generated');
}
$task->setScheduledAt($nextRunDate);
} }
} }
$this->postNotificationScheduler->createPostNotificationSendingTask($newsletter); $this->postNotificationScheduler->createPostNotificationSendingTask($newsletter);
@ -370,69 +372,13 @@ class Newsletters extends APIEndpoint {
} }
public function create($data = []) { public function create($data = []) {
$options = []; try {
if (isset($data['options'])) { $newsletter = $this->newsletterSaveController->save($data);
$options = $data['options']; } catch (ValidationException $exception) {
unset($data['options']); return $this->badRequest(['Please specify a type.']);
}
$newsletter = Newsletter::createOrUpdate($data);
$errors = $newsletter->getErrors();
if (!empty($errors)) {
return $this->badRequest($errors);
} else {
// try to load template data
$templateId = (isset($data['template']) ? (int)$data['template'] : false);
$template = ContainerWrapper::getInstance()->get(NewsletterTemplatesRepository::class)->findOneById($templateId);
if ($template) {
$newsletter->body = json_encode($template->getBody());
} else {
$newsletter->body = [];
}
}
$newsletter->save();
$errors = $newsletter->getErrors();
if (!empty($errors)) {
return $this->badRequest($errors);
} else {
if (!empty($options)) {
$optionFields = NewsletterOptionField::where(
'newsletter_type', $newsletter->type
)->findArray();
foreach ($optionFields as $optionField) {
if (isset($options[$optionField['name']])) {
$relation = NewsletterOption::create();
$relation->newsletterId = $newsletter->id;
$relation->optionFieldId = $optionField['id'];
$relation->value = $options[$optionField['name']];
$relation->save();
}
}
}
if (
empty($data['id'])
&&
isset($data['type'])
&&
$data['type'] === Newsletter::TYPE_NOTIFICATION
) {
$newsletter = Newsletter::filter('filterWithOptions', $data['type'])->findOne($newsletter->id);
assert($newsletter instanceof Newsletter);
$newsletterEntity = $this->newslettersRepository->findOneById($newsletter->id);
assert($newsletterEntity instanceof NewsletterEntity);
$this->postNotificationScheduler->processPostNotificationSchedule($newsletterEntity);
}
$newsletter = Newsletter::findOne($newsletter->id);
if(!$newsletter instanceof Newsletter) return $this->errorResponse();
return $this->successResponse(
$newsletter->asArray()
);
} }
$response = $this->newslettersResponseBuilder->build($newsletter);
return $this->successResponse($response);
} }
/** @return NewsletterEntity|null */ /** @return NewsletterEntity|null */

View File

@ -21,6 +21,7 @@ use MailPoet\NotFoundException;
use MailPoet\Services\AuthorizedEmailsController; use MailPoet\Services\AuthorizedEmailsController;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\UnexpectedValueException; use MailPoet\UnexpectedValueException;
use MailPoet\Util\Security;
use MailPoet\WP\Emoji; use MailPoet\WP\Emoji;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\EntityManager;
@ -59,6 +60,9 @@ class NewsletterSaveController {
/** @var SettingsController */ /** @var SettingsController */
private $settings; private $settings;
/** @var Security */
private $security;
public function __construct( public function __construct(
AuthorizedEmailsController $authorizedEmailsController, AuthorizedEmailsController $authorizedEmailsController,
Emoji $emoji, Emoji $emoji,
@ -70,7 +74,8 @@ class NewsletterSaveController {
NewsletterTemplatesRepository $newsletterTemplatesRepository, NewsletterTemplatesRepository $newsletterTemplatesRepository,
PostNotificationScheduler $postNotificationScheduler, PostNotificationScheduler $postNotificationScheduler,
ScheduledTasksRepository $scheduledTasksRepository, ScheduledTasksRepository $scheduledTasksRepository,
SettingsController $settings SettingsController $settings,
Security $security
) { ) {
$this->authorizedEmailsController = $authorizedEmailsController; $this->authorizedEmailsController = $authorizedEmailsController;
$this->emoji = $emoji; $this->emoji = $emoji;
@ -83,6 +88,7 @@ class NewsletterSaveController {
$this->postNotificationScheduler = $postNotificationScheduler; $this->postNotificationScheduler = $postNotificationScheduler;
$this->scheduledTasksRepository = $scheduledTasksRepository; $this->scheduledTasksRepository = $scheduledTasksRepository;
$this->settings = $settings; $this->settings = $settings;
$this->security = $security;
} }
public function save(array $data = []): NewsletterEntity { public function save(array $data = []): NewsletterEntity {
@ -97,10 +103,11 @@ class NewsletterSaveController {
$data['body'] = $this->emoji->encodeForUTF8Column(MP_NEWSLETTERS_TABLE, 'body', $data['body']); $data['body'] = $this->emoji->encodeForUTF8Column(MP_NEWSLETTERS_TABLE, 'body', $data['body']);
} }
$newsletter = $this->getNewsletter($data); $newsletter = isset($data['id']) ? $this->getNewsletter($data) : $this->createNewsletter($data);
$oldSenderAddress = $newsletter->getSenderAddress(); $oldSenderAddress = $newsletter->getSenderAddress();
$this->updateNewsletter($newsletter, $data); $this->updateNewsletter($newsletter, $data);
$this->newslettersRepository->flush();
if (!empty($data['segments'])) { if (!empty($data['segments'])) {
$this->updateSegments($newsletter, $data['segments']); $this->updateSegments($newsletter, $data['segments']);
} }
@ -140,6 +147,29 @@ class NewsletterSaveController {
return $newsletter; return $newsletter;
} }
private function createNewsletter(array $data): NewsletterEntity {
$newsletter = new NewsletterEntity();
$newsletter->setUnsubscribeToken($this->security->generateUnsubscribeTokenByEntity($newsletter));
$newsletter->setHash(Security::generateHash());
// set default sender based on settings
if (empty($data['sender'])) {
$sender = $this->settings->get('sender', []);
$data['sender_name'] = $sender['name'] ?? '';
$data['sender_address'] = $sender['address'] ?? '';
}
// set default reply_to based on settings
if (empty($data['reply_to'])) {
$replyTo = $this->settings->get('reply_to', []);
$data['reply_to_name'] = $replyTo['name'] ?? '';
$data['reply_to_address'] = $replyTo['address'] ?? '';
}
$this->updateNewsletter($newsletter, $data);
$this->newslettersRepository->persist($newsletter);
return $newsletter;
}
private function updateNewsletter(NewsletterEntity $newsletter, array $data) { private function updateNewsletter(NewsletterEntity $newsletter, array $data) {
if (array_key_exists('type', $data)) { if (array_key_exists('type', $data)) {
$newsletter->setType($data['type']); $newsletter->setType($data['type']);
@ -176,8 +206,6 @@ class NewsletterSaveController {
if (array_key_exists('reply_to_address', $data)) { if (array_key_exists('reply_to_address', $data)) {
$newsletter->setReplyToAddress($data['reply_to_address'] ?? ''); $newsletter->setReplyToAddress($data['reply_to_address'] ?? '');
} }
$this->newslettersRepository->flush();
} }
private function updateSegments(NewsletterEntity $newsletter, array $segments) { private function updateSegments(NewsletterEntity $newsletter, array $segments) {