From af48c34db27ecc126ceab155ddc0af07d9a7a775 Mon Sep 17 00:00:00 2001 From: Lorenzo Ruozzi Date: Wed, 13 Apr 2022 16:25:21 +0200 Subject: [PATCH] Send contact tags resolved (#40) --- .../Contact/ContactTagsAdderHandlerSpec.php | 70 +++++++++++++++++-- .../Contact/ContactTagsAdderHandler.php | 50 ++++++++++++- .../config/services/message_handler.xml | 3 + 3 files changed, 116 insertions(+), 7 deletions(-) diff --git a/spec/MessageHandler/Contact/ContactTagsAdderHandlerSpec.php b/spec/MessageHandler/Contact/ContactTagsAdderHandlerSpec.php index 00c79b5..66409e6 100644 --- a/spec/MessageHandler/Contact/ContactTagsAdderHandlerSpec.php +++ b/spec/MessageHandler/Contact/ContactTagsAdderHandlerSpec.php @@ -6,14 +6,24 @@ use App\Entity\Customer\CustomerInterface; use InvalidArgumentException; +use Psr\Log\LoggerInterface; use Sylius\Component\Core\Model\CustomerInterface as SyliusCustomerInterface; use Sylius\Component\Core\Repository\CustomerRepositoryInterface; +use Symfony\Component\HttpKernel\Exception\HttpException; use Webgriffe\SyliusActiveCampaignPlugin\Client\ActiveCampaignResourceClientInterface; +use Webgriffe\SyliusActiveCampaignPlugin\Factory\ActiveCampaign\ContactTagFactoryInterface; +use Webgriffe\SyliusActiveCampaignPlugin\Mapper\TagMapperInterface; use Webgriffe\SyliusActiveCampaignPlugin\Message\Contact\ContactTagsAdder; use Webgriffe\SyliusActiveCampaignPlugin\MessageHandler\Contact\ContactTagsAdderHandler; use PhpSpec\ObjectBehavior; +use Webgriffe\SyliusActiveCampaignPlugin\Model\ActiveCampaign\ContactTagInterface; +use Webgriffe\SyliusActiveCampaignPlugin\Model\ActiveCampaign\TagInterface; use Webgriffe\SyliusActiveCampaignPlugin\Model\ActiveCampaignAwareInterface; use Webgriffe\SyliusActiveCampaignPlugin\Resolver\ContactTagsResolverInterface; +use Webgriffe\SyliusActiveCampaignPlugin\ValueObject\Response\CreateResourceResponseInterface; +use Webgriffe\SyliusActiveCampaignPlugin\ValueObject\Response\ListResourcesResponseInterface; +use Webgriffe\SyliusActiveCampaignPlugin\ValueObject\Response\ResourceResponseInterface; +use Webgriffe\SyliusActiveCampaignPlugin\ValueObject\Response\Tag\TagResponse; class ContactTagsAdderHandlerSpec extends ObjectBehavior { @@ -22,12 +32,45 @@ public function let( ActiveCampaignResourceClientInterface $activeCampaignContactTagClient, CustomerRepositoryInterface $customerRepository, ContactTagsResolverInterface $contactTagsResolver, - CustomerInterface $customer - ): void - { + TagMapperInterface $tagMapper, + ContactTagFactoryInterface $contactTagFactory, + LoggerInterface $logger, + CustomerInterface $customer, + ListResourcesResponseInterface $maleResourcesResponse, + ResourceResponseInterface $maleTagResponse, + ListResourcesResponseInterface $newResourcesResponse, + TagInterface $newTag, + CreateResourceResponseInterface $createResourceResponse, + ResourceResponseInterface $newTagResponse, + ContactTagInterface $maleContactTag, + ContactTagInterface $newContactTag, + CreateResourceResponseInterface $createMaleContactTagResourceResponse + ): void { $customerRepository->find(12)->willReturn($customer); + $customer->getActiveCampaignId()->willReturn(143); + + $contactTagsResolver->resolve($customer)->willReturn(['male', 'new']); + + $maleTagResponse->getId()->willReturn(4); + $maleResourcesResponse->getResourceResponseLists()->willReturn([$maleTagResponse]); + $activeCampaignTagClient->list(['search' => 'male'])->willReturn($maleResourcesResponse); + + $newResourcesResponse->getResourceResponseLists()->willReturn([]); + $activeCampaignTagClient->list(['search' => 'new'])->willReturn($newResourcesResponse); - $this->beConstructedWith($activeCampaignTagClient, $activeCampaignContactTagClient, $customerRepository, $contactTagsResolver); + $tagMapper->mapFromTagAndTagType('new')->willReturn($newTag); + + $newTagResponse->getId()->willReturn(7); + $createResourceResponse->getResourceResponse()->willReturn($newTagResponse); + $activeCampaignTagClient->create($newTag)->willReturn($createResourceResponse); + + $contactTagFactory->createNew(143, 4)->willReturn($maleContactTag); + $contactTagFactory->createNew(143, 7)->willReturn($newContactTag); + + $activeCampaignContactTagClient->create($maleContactTag)->willReturn($createMaleContactTagResourceResponse); + $activeCampaignContactTagClient->create($newContactTag)->willThrow(new HttpException(200)); + + $this->beConstructedWith($activeCampaignTagClient, $activeCampaignContactTagClient, $customerRepository, $contactTagsResolver, $tagMapper, $contactTagFactory, $logger); } public function it_is_initializable(): void @@ -68,4 +111,23 @@ public function it_throws_if_customer_has_not_been_exported_to_active_campaign_y [new ContactTagsAdder(12)] ); } + + public function it_throws_if_adding_customer_tag_throws_not_200_or_201_response( + ContactTagFactoryInterface $contactTagFactory + ): void { + $contactTagFactory->createNew(143, 7)->willThrow(new HttpException(205)); + + $this->shouldThrow(new HttpException(205))->during( + '__invoke', + [new ContactTagsAdder(12)] + ); + } + + public function it_adds_contact_tags( + LoggerInterface $logger + ): void { + $logger->info('The tag with id "7" already exists for the contact with id "143".')->shouldBeCalledOnce(); + + $this->__invoke(new ContactTagsAdder(12)); + } } diff --git a/src/MessageHandler/Contact/ContactTagsAdderHandler.php b/src/MessageHandler/Contact/ContactTagsAdderHandler.php index a9e709a..355b3b0 100644 --- a/src/MessageHandler/Contact/ContactTagsAdderHandler.php +++ b/src/MessageHandler/Contact/ContactTagsAdderHandler.php @@ -5,12 +5,17 @@ namespace Webgriffe\SyliusActiveCampaignPlugin\MessageHandler\Contact; use InvalidArgumentException; +use Psr\Log\LoggerInterface; use Sylius\Component\Core\Model\CustomerInterface; use Sylius\Component\Core\Repository\CustomerRepositoryInterface; +use Symfony\Component\HttpKernel\Exception\HttpException; use Webgriffe\SyliusActiveCampaignPlugin\Client\ActiveCampaignResourceClientInterface; +use Webgriffe\SyliusActiveCampaignPlugin\Factory\ActiveCampaign\ContactTagFactoryInterface; +use Webgriffe\SyliusActiveCampaignPlugin\Mapper\TagMapperInterface; use Webgriffe\SyliusActiveCampaignPlugin\Message\Contact\ContactTagsAdder; use Webgriffe\SyliusActiveCampaignPlugin\Model\ActiveCampaignAwareInterface; use Webgriffe\SyliusActiveCampaignPlugin\Resolver\ContactTagsResolverInterface; +use Webgriffe\SyliusActiveCampaignPlugin\ValueObject\Response\Tag\TagResponse; final class ContactTagsAdderHandler { @@ -18,7 +23,10 @@ public function __construct( private ActiveCampaignResourceClientInterface $activeCampaignTagClient, private ActiveCampaignResourceClientInterface $activeCampaignContactTagClient, private CustomerRepositoryInterface $customerRepository, - private ContactTagsResolverInterface $contactTagsResolver + private ContactTagsResolverInterface $contactTagsResolver, + private TagMapperInterface $tagMapper, + private ContactTagFactoryInterface $contactTagFactory, + private LoggerInterface $logger ) { } @@ -33,9 +41,45 @@ public function __invoke(ContactTagsAdder $message): void if (!$customer instanceof ActiveCampaignAwareInterface) { throw new InvalidArgumentException(sprintf('The Customer entity should implement the "%s" class.', ActiveCampaignAwareInterface::class)); } - $activeCampaignId = $customer->getActiveCampaignId(); - if ($activeCampaignId === null) { + $activeCampaignContactId = $customer->getActiveCampaignId(); + if ($activeCampaignContactId === null) { throw new InvalidArgumentException(sprintf('The Customer with id "%s" does not have an ActiveCampaign id.', $customerId)); } + $tags = $this->contactTagsResolver->resolve($customer); + /** @var int[] $activeCampaignTagIds */ + $activeCampaignTagIds = []; + foreach ($tags as $tag) { + $activeCampaignTagIds[] = $this->retrieveActiveCampaignTagId($tag); + } + + foreach ($activeCampaignTagIds as $activeCampaignTagId) { + try { + $this->activeCampaignContactTagClient->create($this->contactTagFactory->createNew($activeCampaignContactId, $activeCampaignTagId)); + } catch (HttpException $httpException) { + if ($httpException->getStatusCode() !== 200) { + throw $httpException; + } + $this->logger->info(sprintf('The tag with id "%s" already exists for the contact with id "%s".', $activeCampaignTagId, $activeCampaignContactId)); + + continue; + } + } + } + + private function retrieveActiveCampaignTagId(string $tag): int + { + $listActiveCampaignTags = $this->activeCampaignTagClient->list(['search' => $tag])->getResourceResponseLists(); + if (count($listActiveCampaignTags) > 0) { + /** @var TagResponse $activeCampaignTag */ + $activeCampaignTag = reset($listActiveCampaignTags); + + return $activeCampaignTag->getId(); + } + $mappedTag = $this->tagMapper->mapFromTagAndTagType($tag); + $createActiveCampaignTagResponse = $this->activeCampaignTagClient->create($mappedTag); + /** @var TagResponse $activeCampaignTag */ + $activeCampaignTag = $createActiveCampaignTagResponse->getResourceResponse(); + + return $activeCampaignTag->getId(); } } diff --git a/src/Resources/config/services/message_handler.xml b/src/Resources/config/services/message_handler.xml index 5ecb6e5..41bd4ed 100644 --- a/src/Resources/config/services/message_handler.xml +++ b/src/Resources/config/services/message_handler.xml @@ -32,6 +32,9 @@ + + +