Create tags when do not exist

[MAILPOET-4557]
This commit is contained in:
Jan Lysý
2022-09-08 12:52:08 +02:00
committed by Aschepikov
parent 7644ce9833
commit 7e6f708df8
2 changed files with 46 additions and 0 deletions

View File

@ -20,6 +20,7 @@ use MailPoet\Form\PreviewPage;
use MailPoet\Form\Templates\TemplateRepository; use MailPoet\Form\Templates\TemplateRepository;
use MailPoet\Listing; use MailPoet\Listing;
use MailPoet\Settings\UserFlagsController; use MailPoet\Settings\UserFlagsController;
use MailPoet\Tags\TagRepository;
use MailPoet\UnexpectedValueException; use MailPoet\UnexpectedValueException;
use MailPoet\WP\Emoji; use MailPoet\WP\Emoji;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@ -56,6 +57,9 @@ class Forms extends APIEndpoint {
/** @var ApiDataSanitizer */ /** @var ApiDataSanitizer */
private $dataSanitizer; private $dataSanitizer;
/** @var TagRepository */
private $tagRepository;
/** @var FormSaveController */ /** @var FormSaveController */
private $formSaveController; private $formSaveController;
@ -69,6 +73,7 @@ class Forms extends APIEndpoint {
WPFunctions $wp, WPFunctions $wp,
Emoji $emoji, Emoji $emoji,
ApiDataSanitizer $dataSanitizer, ApiDataSanitizer $dataSanitizer,
TagRepository $tagRepository,
FormSaveController $formSaveController FormSaveController $formSaveController
) { ) {
$this->listingHandler = $listingHandler; $this->listingHandler = $listingHandler;
@ -80,6 +85,7 @@ class Forms extends APIEndpoint {
$this->formsResponseBuilder = $formsResponseBuilder; $this->formsResponseBuilder = $formsResponseBuilder;
$this->emoji = $emoji; $this->emoji = $emoji;
$this->dataSanitizer = $dataSanitizer; $this->dataSanitizer = $dataSanitizer;
$this->tagRepository = $tagRepository;
$this->formSaveController = $formSaveController; $this->formSaveController = $formSaveController;
} }
@ -201,6 +207,11 @@ class Forms extends APIEndpoint {
$settings['segments_selected_by'] = 'admin'; $settings['segments_selected_by'] = 'admin';
} }
// check tags and create them if they don't exist
if (isset($settings['tags'])) {
$this->createTagsIfDoNotExist($settings['tags']);
}
// Check Custom HTML block permissions // Check Custom HTML block permissions
$customHtmlBlocks = $formEntity->getBlocksByTypes([FormEntity::HTML_BLOCK_TYPE]); $customHtmlBlocks = $formEntity->getBlocksByTypes([FormEntity::HTML_BLOCK_TYPE]);
if (count($customHtmlBlocks) && !$this->wp->currentUserCan('administrator')) { if (count($customHtmlBlocks) && !$this->wp->currentUserCan('administrator')) {
@ -338,4 +349,10 @@ class Forms extends APIEndpoint {
$form = $formTemplate->toFormEntity(); $form = $formTemplate->toFormEntity();
return $form->toArray(); return $form->toArray();
} }
private function createTagsIfDoNotExist(array $tagNames): void {
foreach ($tagNames as $tagName) {
$this->tagRepository->createOrUpdate(['name' => $tagName]);
}
}
} }

View File

@ -7,9 +7,12 @@ use MailPoet\API\JSON\v1\Forms;
use MailPoet\DI\ContainerWrapper; use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\FormEntity; use MailPoet\Entities\FormEntity;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\TagEntity;
use MailPoet\Form\FormsRepository; use MailPoet\Form\FormsRepository;
use MailPoet\Form\PreviewPage; use MailPoet\Form\PreviewPage;
use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SegmentsRepository;
use MailPoet\Tags\TagRepository;
use MailPoet\Test\DataFactories\Tag;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
class FormsTest extends \MailPoetTest { class FormsTest extends \MailPoetTest {
@ -26,10 +29,14 @@ class FormsTest extends \MailPoetTest {
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
/** @var TagRepository */
private $tagRepository;
public function _before() { public function _before() {
parent::_before(); parent::_before();
$this->endpoint = ContainerWrapper::getInstance()->get(Forms::class); $this->endpoint = ContainerWrapper::getInstance()->get(Forms::class);
$this->formsRepository = ContainerWrapper::getInstance()->get(FormsRepository::class); $this->formsRepository = ContainerWrapper::getInstance()->get(FormsRepository::class);
$this->tagRepository = ContainerWrapper::getInstance()->get(TagRepository::class);
$this->wp = WPFunctions::get(); $this->wp = WPFunctions::get();
$this->form1 = $this->createForm('Form 1'); $this->form1 = $this->createForm('Form 1');
$this->form2 = $this->createForm('Form 2'); $this->form2 = $this->createForm('Form 2');
@ -179,6 +186,28 @@ class FormsTest extends \MailPoetTest {
expect($response->data['settings']['segments'])->equals([2, 4]); expect($response->data['settings']['segments'])->equals([2, 4]);
} }
public function testItCreatesTagsDuringSavingFormEditor(): void {
$tag = (new Tag())
->withName('Tag 1')
->create();
$tagName = 'Tag 2';
$response = $this->endpoint->saveEditor([
'settings' => [
'tags' => [
$tag->getName(),
$tagName,
],
],
]);
expect($response->status)->equals(APIResponse::STATUS_OK);
$tag1 = $this->tagRepository->findOneBy(['name' => $tag->getName()]);
$this->assertEquals($tag1, $tag);
$tag2 = $this->tagRepository->findOneBy(['name' => $tagName]);
$this->assertInstanceOf(TagEntity::class, $tag2);
$this->assertEquals($tag2->getName(), $tagName);
}
public function testItCanRestoreAForm() { public function testItCanRestoreAForm() {
$this->form1->setDeletedAt(new \DateTime()); $this->form1->setDeletedAt(new \DateTime());
$this->formsRepository->flush(); $this->formsRepository->flush();