Add unique name check to segments repository

[MAILPOET-3998]
This commit is contained in:
John Oleksowicz
2021-12-20 11:10:42 -06:00
committed by Veljko V
parent 0191bf6968
commit c23d8cae53
2 changed files with 15 additions and 0 deletions

View File

@@ -3,6 +3,7 @@
namespace MailPoet\Segments; namespace MailPoet\Segments;
use DateTime; use DateTime;
use MailPoet\ConflictException;
use MailPoet\Doctrine\Repository; use MailPoet\Doctrine\Repository;
use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterData;
use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoet\Entities\DynamicSegmentFilterEntity;
@@ -94,6 +95,8 @@ class SegmentsRepository extends Repository {
/** /**
* @param DynamicSegmentFilterData[] $filtersData * @param DynamicSegmentFilterData[] $filtersData
* @throws ConflictException
* @throws NotFoundException
*/ */
public function createOrUpdate( public function createOrUpdate(
string $name, string $name,
@@ -110,6 +113,9 @@ class SegmentsRepository extends Repository {
$segment->setName($name); $segment->setName($name);
$segment->setDescription($description); $segment->setDescription($description);
} else { } else {
if (!$this->isNameUnique($name, $id)) {
throw new ConflictException("Could not create new segment with name [{$name}] because a segment with that name already exists.");
}
$segment = new SegmentEntity($name, $type, $description); $segment = new SegmentEntity($name, $type, $description);
$this->persist($segment); $this->persist($segment);
} }

View File

@@ -2,6 +2,7 @@
namespace MailPoet\Segments; namespace MailPoet\Segments;
use MailPoet\ConflictException;
use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\DynamicSegmentFilterData;
use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoet\Entities\DynamicSegmentFilterEntity;
use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterEntity;
@@ -107,6 +108,14 @@ class SegmentsRepositoryTest extends \MailPoetTest {
expect($count)->equals(2); expect($count)->equals(2);
} }
public function testItChecksForDuplicateNameWhenCreatingNewSegment() {
$this->createDefaultSegment('Existing Segment');
$this->segmentsRepository->flush();
$this->expectException(ConflictException::class);
$this->expectExceptionMessage("Could not create new segment with name [Existing Segment] because a segment with that name already exists.");
$this->segmentsRepository->createOrUpdate('Existing Segment');
}
private function createDefaultSegment(string $name): SegmentEntity { private function createDefaultSegment(string $name): SegmentEntity {
$segment = new SegmentEntity($name, SegmentEntity::TYPE_DEFAULT, 'description'); $segment = new SegmentEntity($name, SegmentEntity::TYPE_DEFAULT, 'description');
$this->entityManager->persist($segment); $this->entityManager->persist($segment);