diff --git a/mailpoet/lib/API/JSON/v1/Tags.php b/mailpoet/lib/API/JSON/v1/Tags.php new file mode 100644 index 0000000000..aeaa99998e --- /dev/null +++ b/mailpoet/lib/API/JSON/v1/Tags.php @@ -0,0 +1,54 @@ +repository = $repository; + } + + public function save($data = []) { + if (!isset($data['name'])) { + throw InvalidStateException::create()->withError( + 'tag_without_name', + __('A tag needs to have a name.', 'mailpoet') + ); + } + + $data['name'] = sanitize_text_field(wp_unslash($data['name'])); + $data['description'] = isset($data['description']) ? sanitize_text_field(wp_unslash($data['description'])) : ''; + + return $this->successResponse( + $this->mapTagEntity($this->repository->createOrUpdate($data)) + ); + } + + public function listing() { + return $this->successResponse( + array_map( + [$this, 'mapTagEntity'], + $this->repository->findAll() + ) + ); + } + + private function mapTagEntity(TagEntity $tag): array { + return [ + 'id' => $tag->getId(), + 'name' => $tag->getName(), + 'description' => $tag->getDescription(), + 'created' => $tag->getCreatedAt(), + 'updated' => $tag->getUpdatedAt(), + ]; + } +} diff --git a/mailpoet/lib/DI/ContainerConfigurator.php b/mailpoet/lib/DI/ContainerConfigurator.php index 9b41e852c7..12f6a227c7 100644 --- a/mailpoet/lib/DI/ContainerConfigurator.php +++ b/mailpoet/lib/DI/ContainerConfigurator.php @@ -73,6 +73,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\API\JSON\v1\Forms::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\ImportExport::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\Mailer::class)->setPublic(true); + $container->autowire(\MailPoet\API\JSON\v1\Tags::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\Newsletters::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\NewsletterLinks::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\NewsletterTemplates::class)->setPublic(true); diff --git a/mailpoet/tests/integration/API/JSON/v1/TagsTest.php b/mailpoet/tests/integration/API/JSON/v1/TagsTest.php new file mode 100644 index 0000000000..22e7fe6d5f --- /dev/null +++ b/mailpoet/tests/integration/API/JSON/v1/TagsTest.php @@ -0,0 +1,58 @@ +repository = $this->diContainer->get(TagRepository::class); + $this->testee = $this->diContainer->get(Tags::class); + } + + public function testItListsAllTags() { + $count = count($this->repository->findAll()); + $this->assertSame(0, $count); + do { + $this->repository->persist(new TagEntity(sprintf("Tag %d", $count + 1))); + $this->repository->flush(); + $count = count($this->repository->findAll()); + } while ($count < 10); + + $response = $this->testee->listing(); + $this->assertCount(10, $response->data); + } + + public function testItCreatesTags() { + + $entity = $this->repository->findOneBy(['name' => 'test']); + $this->assertNull($entity); + $response = $this->testee->save(['name' => 'test']); + $entity = $this->repository->findOneBy(['name' => 'test']); + $this->assertNotNull($entity); + $this->assertSame('test', $response->data['name']); + } + + public function testItCanNotCreateTagsWithoutNames() { + + $this->expectException(InvalidStateException::class); + $this->testee->save([]); + } + + public function _after() { + parent::_after(); // TODO: Change the autogenerated stub + $this->repository->truncate(); + } +}