diff --git a/lib/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilder.php b/lib/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilder.php index b0091d0694..640b2fc4ad 100644 --- a/lib/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilder.php +++ b/lib/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilder.php @@ -2,6 +2,7 @@ namespace MailPoet\API\JSON\ResponseBuilders; +use MailPoet\Entities\DynamicSegmentFilterEntity; use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Segments\SegmentSubscribersRepository; @@ -29,6 +30,16 @@ class DynamicSegmentsResponseBuilder { $this->wp = $wp; } + public function build(SegmentEntity $segmentEntity) { + $data = $this->segmentsResponseBuilder->build($segmentEntity); + // So far we allow dynamic segments to have only one filter + $filter = $segmentEntity->getDynamicFilters()->first(); + if (!$filter instanceof DynamicSegmentFilterEntity) { + return $data; + } + return array_merge($data, $filter->getFilterData() ?? []); + } + public function buildForListing(array $segments): array { $data = []; foreach ($segments as $segment) { diff --git a/lib/API/JSON/v1/DynamicSegments.php b/lib/API/JSON/v1/DynamicSegments.php index e37e568276..5286967265 100644 --- a/lib/API/JSON/v1/DynamicSegments.php +++ b/lib/API/JSON/v1/DynamicSegments.php @@ -13,10 +13,12 @@ use MailPoet\DynamicSegments\Mappers\DBMapper; use MailPoet\DynamicSegments\Mappers\FormDataMapper; use MailPoet\DynamicSegments\Persistence\Loading\SingleSegmentLoader; use MailPoet\DynamicSegments\Persistence\Saver; +use MailPoet\Entities\SegmentEntity; use MailPoet\Listing\BulkActionController; use MailPoet\Listing\Handler; use MailPoet\Models\Model; use MailPoet\Segments\DynamicSegments\DynamicSegmentsListingRepository; +use MailPoet\Segments\SegmentsRepository; use MailPoet\WP\Functions as WPFunctions; class DynamicSegments extends APIEndpoint { @@ -43,6 +45,9 @@ class DynamicSegments extends APIEndpoint { /** @var DynamicSegmentsListingRepository */ private $dynamicSegmentsListingRepository; + /** @var SegmentsRepository */ + private $segmentsRepository; + /** @var DynamicSegmentsResponseBuilder */ private $segmentsResponseBuilder; @@ -51,6 +56,7 @@ class DynamicSegments extends APIEndpoint { Handler $handler, DynamicSegmentsListingRepository $dynamicSegmentsListingRepository, DynamicSegmentsResponseBuilder $segmentsResponseBuilder, + SegmentsRepository $segmentsRepository, $mapper = null, $saver = null, $dynamicSegmentsLoader = null @@ -62,6 +68,7 @@ class DynamicSegments extends APIEndpoint { $this->dynamicSegmentsLoader = $dynamicSegmentsLoader ?: new SingleSegmentLoader(new DBMapper()); $this->dynamicSegmentsListingRepository = $dynamicSegmentsListingRepository; $this->segmentsResponseBuilder = $segmentsResponseBuilder; + $this->segmentsRepository = $segmentsRepository; } public function get($data = []) { @@ -73,21 +80,14 @@ class DynamicSegments extends APIEndpoint { ]); } - try { - $segment = $this->dynamicSegmentsLoader->load($id); - - $filters = $segment->getFilters(); - - return $this->successResponse(array_merge([ - 'name' => $segment->name, - 'description' => $segment->description, - 'id' => $segment->id, - ], $filters[0]->toArray())); - } catch (\InvalidArgumentException $e) { + $segment = $this->segmentsRepository->findOneById($id); + if (!$segment instanceof SegmentEntity) { return $this->errorResponse([ Error::NOT_FOUND => WPFunctions::get()->__('This segment does not exist.', 'mailpoet'), ]); } + + return $this->successResponse($this->segmentsResponseBuilder->build($segment)); } public function save($data) { diff --git a/tests/integration/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilderTest.php b/tests/integration/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilderTest.php index 9083095986..18711d4ef8 100644 --- a/tests/integration/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilderTest.php +++ b/tests/integration/API/JSON/ResponseBuilders/DynamicSegmentsResponseBuilderTest.php @@ -13,6 +13,27 @@ class DynamicSegmentsResponseBuilderTest extends \MailPoetTest { $this->cleanup(); } + public function testItBuildsGetResponse() { + $name = 'Response Listings Builder Test'; + $description = 'Testing description'; + $segment = $this->createDynamicSegmentEntity($name, $description); + $this->entityManager->flush(); + + /** @var DynamicSegmentsResponseBuilder $responseBuilder */ + $responseBuilder = $this->diContainer->get(DynamicSegmentsResponseBuilder::class); + $response = $responseBuilder->build($segment); + expect($response)->array(); + expect($response['id'])->equals($segment->getId()); + expect($response['name'])->equals($name); + expect($response['description'])->equals($description); + expect($response['type'])->equals(SegmentEntity::TYPE_DYNAMIC); + expect($response['segmentType'])->equals(DynamicSegmentFilterEntity::TYPE_USER_ROLE); + expect($response['wordpressRole'])->equals('editor'); + expect($response)->hasKey('created_at'); + expect($response)->hasKey('updated_at'); + expect($response)->hasKey('deleted_at'); + } + public function testItBuildsListingsResponse() { $name = 'Response Listings Builder Test'; $description = 'Testing description'; diff --git a/tests/integration/API/JSON/v1/DynamicSegmentsTest.php b/tests/integration/API/JSON/v1/DynamicSegmentsTest.php index 27655b7ff0..ddf1dcde2d 100644 --- a/tests/integration/API/JSON/v1/DynamicSegmentsTest.php +++ b/tests/integration/API/JSON/v1/DynamicSegmentsTest.php @@ -8,13 +8,15 @@ use MailPoet\API\JSON\ResponseBuilders\DynamicSegmentsResponseBuilder; use MailPoet\DI\ContainerWrapper; use MailPoet\DynamicSegments\Exceptions\ErrorSavingException; use MailPoet\DynamicSegments\Exceptions\InvalidSegmentTypeException; -use MailPoet\DynamicSegments\Filters\UserRole; +use MailPoet\Entities\DynamicSegmentFilterEntity; +use MailPoet\Entities\SegmentEntity; use MailPoet\Listing\BulkActionController; use MailPoet\Listing\Handler; use MailPoet\Models\DynamicSegment; use MailPoet\Models\DynamicSegmentFilter; use MailPoet\Models\Model; use MailPoet\Segments\DynamicSegments\DynamicSegmentsListingRepository; +use MailPoet\Segments\SegmentsRepository; class DynamicSegmentsTest extends \MailPoetTest { @@ -32,47 +34,37 @@ class DynamicSegmentsTest extends \MailPoetTest { private $listingRepository; /** @var DynamicSegmentsResponseBuilder */ private $responseBuilder; + /** @var SegmentsRepository */ + private $segmentsRepository; public function _before() { $this->bulkAction = ContainerWrapper::getInstance()->get(BulkActionController::class); $this->listingHandler = ContainerWrapper::getInstance()->get(Handler::class); $this->listingRepository = ContainerWrapper::getInstance()->get(DynamicSegmentsListingRepository::class); $this->responseBuilder = ContainerWrapper::getInstance()->get(DynamicSegmentsResponseBuilder::class); + $this->segmentsRepository = ContainerWrapper::getInstance()->get(SegmentsRepository::class); } public function testGetReturnsResponse() { - $loader = Stub::makeEmpty('\MailPoet\DynamicSegments\Persistence\Loading\SingleSegmentLoader', [ - 'load' => function () { - $dynamicSegment = DynamicSegment::create(); - $dynamicSegment->hydrate([ - 'name' => 's1', - 'description' => '', - ]); - $dynamicSegment->setFilters([new UserRole('Editor', 'or')]); - return $dynamicSegment; - }, - ]); - $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, null, null, $loader); - $response = $endpoint->get(['id' => 5]); + $segment = $this->createDynamicSegmentEntity('s1', ''); + $endpoint = new DynamicSegments( + $this->bulkAction, + $this->listingHandler, + $this->listingRepository, + $this->responseBuilder, + $this->segmentsRepository, + null, + null, + null + ); + $response = $endpoint->get(['id' => $segment->getId()]); expect($response)->isInstanceOf('\MailPoet\API\JSON\SuccessResponse'); expect($response->status)->equals(self::SUCCESS_RESPONSE_CODE); - expect($response->data)->equals([ - 'id' => null, - 'name' => 's1', - 'description' => '', - 'segmentType' => 'userRole', - 'wordpressRole' => 'Editor', - 'connect' => 'or', - ]); + expect($response->data['id'])->equals($segment->getId()); } public function testGetReturnsError() { - $loader = Stub::makeEmpty('\MailPoet\DynamicSegments\Persistence\Loading\SingleSegmentLoader', [ - 'load' => function () { - throw new \InvalidArgumentException('segment not found'); - }, - ]); - $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, null, null, $loader); + $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $this->segmentsRepository, null, null, null); $response = $endpoint->get(['id' => 5]); expect($response)->isInstanceOf('\MailPoet\API\JSON\ErrorResponse'); expect($response->status)->equals(self::SEGMENT_NOT_FOUND_RESPONSE_CODE); @@ -89,7 +81,7 @@ class DynamicSegmentsTest extends \MailPoetTest { })]); $saver = Stub::makeEmpty('\MailPoet\DynamicSegments\Persistence\Saver', ['save' => Expected::once()]); - $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $mapper, $saver); + $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $this->segmentsRepository, $mapper, $saver); $response = $endpoint->save([]); expect($response)->isInstanceOf('\MailPoet\API\JSON\SuccessResponse'); expect($response->status)->equals(self::SUCCESS_RESPONSE_CODE); @@ -101,7 +93,7 @@ class DynamicSegmentsTest extends \MailPoetTest { })]); $saver = Stub::makeEmpty('\MailPoet\DynamicSegments\Persistence\Saver', ['save' => Expected::never()]); - $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $mapper, $saver); + $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $this->segmentsRepository, $mapper, $saver); $response = $endpoint->save([]); expect($response)->isInstanceOf('\MailPoet\API\JSON\ErrorResponse'); expect($response->status)->equals(self::INVALID_DATA_RESPONSE_CODE); @@ -120,7 +112,7 @@ class DynamicSegmentsTest extends \MailPoetTest { throw new ErrorSavingException('Error saving data', Model::DUPLICATE_RECORD); })]); - $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $mapper, $saver); + $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $this->segmentsRepository, $mapper, $saver); $response = $endpoint->save([]); expect($response)->isInstanceOf('\MailPoet\API\JSON\ErrorResponse'); expect($response->status)->equals(self::SERVER_ERROR_RESPONSE_CODE); @@ -139,7 +131,7 @@ class DynamicSegmentsTest extends \MailPoetTest { }, ]); - $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, null, null, $loader); + $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $this->segmentsRepository, null, null, $loader); $response = $endpoint->trash(['id' => $dynamicSegment->id]); expect($response->status)->equals(self::SUCCESS_RESPONSE_CODE); @@ -165,7 +157,7 @@ class DynamicSegmentsTest extends \MailPoetTest { }, ]); - $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, null, null, $loader); + $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $this->segmentsRepository, null, null, $loader); $response = $endpoint->restore(['id' => $dynamicSegment->id]); expect($response->status)->equals(self::SUCCESS_RESPONSE_CODE); @@ -194,7 +186,7 @@ class DynamicSegmentsTest extends \MailPoetTest { }, ]); - $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, null, null, $loader); + $endpoint = new DynamicSegments($this->bulkAction, $this->listingHandler, $this->listingRepository, $this->responseBuilder, $this->segmentsRepository, null, null, $loader); $response = $endpoint->delete(['id' => $dynamicSegment->id]); expect($response->status)->equals(self::SUCCESS_RESPONSE_CODE); @@ -224,6 +216,7 @@ class DynamicSegmentsTest extends \MailPoetTest { $this->listingHandler, $this->listingRepository, $this->responseBuilder, + $this->segmentsRepository, null, null, null @@ -253,4 +246,17 @@ class DynamicSegmentsTest extends \MailPoetTest { expect(DynamicSegment::count())->equals(0); expect(DynamicSegmentFilter::findOne($filter->id))->equals(false); } + + private function createDynamicSegmentEntity(string $name, string $description): SegmentEntity { + $segment = new SegmentEntity($name, SegmentEntity::TYPE_DYNAMIC, $description); + $dynamicFilter = new DynamicSegmentFilterEntity($segment, [ + 'wordpressRole' => 'editor', + 'segmentType' => DynamicSegmentFilterEntity::TYPE_USER_ROLE, + ]); + $segment->getDynamicFilters()->add($dynamicFilter); + $this->entityManager->persist($segment); + $this->entityManager->persist($dynamicFilter); + $this->entityManager->flush(); + return $segment; + } }