Skip to content

Commit

Permalink
Send contact tags resolved (#40)
Browse files Browse the repository at this point in the history
  • Loading branch information
lruozzi9 committed Apr 13, 2022
1 parent d810b2c commit af48c34
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 7 deletions.
70 changes: 66 additions & 4 deletions spec/MessageHandler/Contact/ContactTagsAdderHandlerSpec.php
Expand Up @@ -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
{
Expand All @@ -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
Expand Down Expand Up @@ -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));
}
}
50 changes: 47 additions & 3 deletions src/MessageHandler/Contact/ContactTagsAdderHandler.php
Expand Up @@ -5,20 +5,28 @@
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
{
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
) {
}

Expand All @@ -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();
}
}
3 changes: 3 additions & 0 deletions src/Resources/config/services/message_handler.xml
Expand Up @@ -32,6 +32,9 @@
<argument type="service" id="webgriffe.sylius_active_campaign_plugin.client.active_campaign.contact_tag"/>
<argument type="service" id="sylius.repository.customer"/>
<argument type="service" id="webgriffe.sylius_active_campaign_plugin.resolver.contact_tags"/>
<argument type="service" id="webgriffe.sylius_active_campaign_plugin.mapper.tag"/>
<argument type="service" id="webgriffe.sylius_active_campaign_plugin.factory.active_campaign.contact_tag"/>
<argument type="service" id="webgriffe.sylius_active_campaign_plugin.logger"/>
<tag name="messenger.message_handler"/>
</service>

Expand Down

0 comments on commit af48c34

Please sign in to comment.