Skip to content

Commit

Permalink
Refactor SendInBlue contacts api
Browse files Browse the repository at this point in the history
  • Loading branch information
Remg committed Apr 11, 2022
1 parent 5b19382 commit f6afbe0
Show file tree
Hide file tree
Showing 22 changed files with 280 additions and 141 deletions.
14 changes: 14 additions & 0 deletions config/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ services:
tags: [ 'app.auth_app.url_generator' ]
App\Recaptcha\RecaptchaApiClientInterface:
tags: ['app.recaptcha_api_client']
App\SendInBlue\Manager\ManagerInterface:
tags: ['app.sendinblue.manager']

# Imports
App\:
Expand Down Expand Up @@ -366,3 +368,15 @@ services:
arguments:
- '@request_stack'
- '%kernel.debug%'

App\SendInBlue\ContactManager:
arguments:
$managers: !tagged_iterator 'app.sendinblue.manager'

App\SendInBlue\Manager\AdherentManager:
arguments:
$listId: '%env(int:SENDINBLUE_ADHERENT_LIST_ID)%'

App\SendInBlue\Manager\ContactManager:
arguments:
$listId: '%env(int:SENDINBLUE_CONTACT_LIST_ID)%'
4 changes: 2 additions & 2 deletions config/services_dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ services:
App\OpenGraph\OpenGraphFetcher:
class: 'Tests\App\Test\OpenGraph\DummyOpenGraphFetcher'

Tests\App\Test\SendInBlue\DummyClient:
decorates: 'App\SendInBlue\Client'
Tests\App\Test\SendInBlue\Client\DummyClient:
decorates: 'App\SendInBlue\Client\Client'

data_collector.messenger:
class: Symfony\Component\Messenger\DataCollector\MessengerDataCollector
Expand Down
2 changes: 1 addition & 1 deletion config/services_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,4 @@ services:
$accessTokenTtlInterval: '%env(ACCESS_TOKEN_TTL_INTERVAL)%'
$refreshTokenTtlInterval: '%env(REFRESH_TOKEN_TTL_INTERVAL)%'

App\SendInBlue\Client: '@Tests\App\Test\SendInBlue\DummyClient'
App\SendInBlue\Client\Client: '@Tests\App\Test\SendInBlue\Client\DummyClient'
2 changes: 1 addition & 1 deletion src/Contact/ContactHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use App\Entity\Contact;
use App\Membership\Contact\ContactRegistrationCommand;
use App\Membership\Contact\ContactSynchronisationCommand;
use App\SendInBlue\Command\ContactSynchronisationCommand;
use Symfony\Component\Messenger\MessageBusInterface;

class ContactHandler
Expand Down
3 changes: 2 additions & 1 deletion src/Entity/Adherent.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
use App\OAuth\Model\User as InMemoryOAuthUser;
use App\Scope\FeatureEnum;
use App\Scope\ScopeEnum;
use App\SendInBlue\ContactInterface;
use App\Subscription\SubscriptionTypeEnum;
use App\Utils\AreaUtils;
use App\Validator\TerritorialCouncil\UniqueTerritorialCouncilMember;
Expand Down Expand Up @@ -98,7 +99,7 @@
*
* @UniqueTerritorialCouncilMember(qualities={"referent", "lre_manager", "referent_jam"})
*/
class Adherent implements UserInterface, UserEntityInterface, GeoPointInterface, EncoderAwareInterface, MembershipInterface, ReferentTaggableEntity, ZoneableEntity, \Serializable, EntityMediaInterface, EquatableInterface, UuidEntityInterface, MailchimpCleanableContactInterface
class Adherent implements UserInterface, UserEntityInterface, GeoPointInterface, EncoderAwareInterface, MembershipInterface, ReferentTaggableEntity, ZoneableEntity, \Serializable, EntityMediaInterface, EquatableInterface, UuidEntityInterface, MailchimpCleanableContactInterface, ContactInterface
{
use EntityCrudTrait;
use EntityIdentityTrait;
Expand Down
3 changes: 2 additions & 1 deletion src/Entity/Contact.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use ApiPlatform\Core\Annotation\ApiResource;
use App\Recaptcha\RecaptchaChallengeInterface;
use App\Recaptcha\RecaptchaChallengeTrait;
use App\SendInBlue\ContactInterface;
use App\Validator\Recaptcha as AssertRecaptcha;
use Doctrine\ORM\Mapping as ORM;
use libphonenumber\PhoneNumber;
Expand Down Expand Up @@ -47,7 +48,7 @@
*
* @AssertRecaptcha(api="friendly_captcha", groups={"contact_create"})
*/
class Contact implements RecaptchaChallengeInterface
class Contact implements RecaptchaChallengeInterface, ContactInterface
{
use EntityIdentityTrait;
use EntityPostAddressTrait;
Expand Down
72 changes: 0 additions & 72 deletions src/SendInBlue/AdherentManager.php

This file was deleted.

34 changes: 34 additions & 0 deletions src/SendInBlue/AttributesEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace App\SendInBlue;

class AttributesEnum
{
public const FIELD_EMAIL = 'EMAIL';

public const FIELD_FIRST_NAME = 'PRENOM';
public const FIELD_LAST_NAME = 'NOM';

public const FIELD_BIRTHDATE = 'DATE_NAISSANCE';
public const FIELD_PHONE = 'PHONE';

public const FIELD_CITY = 'VILLE';
public const FIELD_POSTAL_CODE = 'CODE_POSTAL';
public const FIELD_COUNTRY = 'PAYS';

public const FIELD_SOURCE = 'SOURCE';
public const FIELD_STATUS = 'STATUS';
public const FIELD_CREATED_AT = 'CREATED_AT';
public const FIELD_UPDATED_AT = 'UPDATED_AT';
public const FIELD_ACTIVATED_AT = 'ACTIVATED_AT';

public const FIELD_SUBSCRIPTION_TYPES = 'SUBSCRIPTION_TYPES';

public const FIELD_ACTION_TERRAIN = 'ACTION_TERRAIN';
public const FIELD_CAMPAGNE_NUMERIQUE = 'CAMPAGNE_NUMERIQUE';
public const FIELD_PROCHES = 'CONVAINCRE_PROCHE';
public const FIELD_INTERESTS_UPDATED_AT = 'INTERESTS_UPDATED_AT';

public const FIELD_MAIL_CONTACT = 'MAIL_CONTACT';
public const FIELD_PHONE_CONTACT = 'PHONE_CONTACT';
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace App\SendInBlue;
namespace App\SendInBlue\Client;

use SendinBlue\Client\Api\ContactsApi;
use SendinBlue\Client\Configuration;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace App\SendInBlue;
namespace App\SendInBlue\Client;

interface ClientInterface
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace App\Membership\Contact;
namespace App\SendInBlue\Command;

use App\Messenger\Message\AbstractUuidAsynchronousMessage;
use App\SendInBlue\SynchronizeMessageInterface;
Expand Down
7 changes: 7 additions & 0 deletions src/SendInBlue/ContactInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace App\SendInBlue;

interface ContactInterface
{
}
74 changes: 28 additions & 46 deletions src/SendInBlue/ContactManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,66 +2,48 @@

namespace App\SendInBlue;

use App\Entity\Contact;
use App\Membership\Contact\InterestEnum;
use App\Utils\PhoneNumberUtils;
use App\SendInBlue\Client\ClientInterface;
use App\SendInBlue\Manager\ManagerInterface;

class ContactManager
{
private const FIELD_CREATED_AT = 'CREATED_AT';
private const FIELD_UPDATED_AT = 'UPDATED_AT';
private const FIELD_SOURCE = 'SOURCE';
private const FIELD_FIRST_NAME = 'PRENOM';
private const FIELD_LAST_NAME = 'NOM';
private const FIELD_ACTION_TERRAIN = 'ACTION_TERRAIN';
private const FIELD_CAMPAGNE_NUMERIQUE = 'CAMPAGNE_NUMERIQUE';
private const FIELD_PROCHES = 'CONVAINCRE_PROCHE';
private const FIELD_INTERESTS_UPDATED_AT = 'INTERESTS_UPDATED_AT';
private const FIELD_BIRTHDATE = 'DATE_NAISSANCE';
private const FIELD_PHONE = 'PHONE';
private const FIELD_MAIL_CONTACT = 'MAIL_CONTACT';
private const FIELD_PHONE_CONTACT = 'PHONE_CONTACT';
private const FIELD_CITY = 'VILLE';
private const FIELD_POSTAL_CODE = 'CODE_POSTAL';
private const FIELD_COUNTRY = 'PAYS';
protected ClientInterface $client;

private ClientInterface $client;
private int $contactListId;
/** @var iterable|ManagerInterface[] */
private iterable $managers;

public function __construct(ClientInterface $client, int $sendInBlueContactListId)
public function __construct(ClientInterface $client, iterable $managers)
{
$this->client = $client;
$this->contactListId = $sendInBlueContactListId;
$this->managers = $managers;
}

public function synchronize(Contact $contact): void
public function synchronize(ContactInterface $contact, string $identifier): void
{
$manager = $this->getManager($contact);

$this->client->synchronize(
$contact->getEmailAddress(),
$this->contactListId,
$this->createAttributes($contact)
$identifier,
$manager->getListId(),
$manager->getAttributes($contact)
);
}

private function createAttributes(Contact $contact): array
public function delete(ContactInterface $contact): void
{
$manager = $this->getManager($contact);

$this->client->delete($manager->getIdentifier($contact));
}

private function getManager(ContactInterface $contact): ManagerInterface
{
return [
self::FIELD_SOURCE => $contact->getSource(),
self::FIELD_FIRST_NAME => $contact->getFirstName(),
self::FIELD_LAST_NAME => $contact->getLastName(),
self::FIELD_ACTION_TERRAIN => \in_array(InterestEnum::ACTION_TERRAIN, $contact->getInterests(), true),
self::FIELD_CAMPAGNE_NUMERIQUE => \in_array(InterestEnum::CAMPAGNE_NUMERIQUE, $contact->getInterests(), true),
self::FIELD_PROCHES => \in_array(InterestEnum::PROCHES, $contact->getInterests(), true),
self::FIELD_INTERESTS_UPDATED_AT => $contact->getInterestsUpdatedAt(),
self::FIELD_BIRTHDATE => $contact->getBirthdate() ? $contact->getBirthdate()->format('Y-m-d') : null,
self::FIELD_PHONE => PhoneNumberUtils::format($contact->getPhone()),
self::FIELD_MAIL_CONTACT => $contact->isMailContact(),
self::FIELD_PHONE_CONTACT => $contact->isPhoneContact(),
self::FIELD_CITY => $contact->getCityName(),
self::FIELD_POSTAL_CODE => $contact->getPostalCode(),
self::FIELD_COUNTRY => $contact->getCountry(),
self::FIELD_CREATED_AT => $contact->getCreatedAt() ? $contact->getCreatedAt()->format('Y-m-d') : null,
self::FIELD_UPDATED_AT => $contact->getUpdatedAt() ? $contact->getUpdatedAt()->format('Y-m-d') : null,
];
foreach ($this->managers as $manager) {
if ($manager->supports($contact)) {
return $manager;
}
}

throw new \InvalidArgumentException('Unhandled');
}
}
11 changes: 11 additions & 0 deletions src/SendInBlue/Exception/UnexpectedTypeException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace App\SendInBlue\Exception;

class UnexpectedTypeException extends \RuntimeException
{
public function __construct($value, string $expectedType)
{
parent::__construct(sprintf('Expected argument of type "%s", "%s" given', $expectedType, \is_object($value) ? \get_class($value) : \gettype($value)));
}
}
10 changes: 5 additions & 5 deletions src/SendInBlue/Handler/AdherentDeleteCommandHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

use App\Entity\Adherent;
use App\Repository\AdherentRepository;
use App\SendInBlue\AdherentManager;
use App\SendInBlue\Command\AdherentDeleteCommand;
use App\SendInBlue\ContactManager;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
Expand All @@ -18,17 +18,17 @@ class AdherentDeleteCommandHandler implements MessageHandlerInterface, LoggerAwa

private EntityManagerInterface $em;
private AdherentRepository $adherentRepository;
private AdherentManager $adherentManager;
private ContactManager $contactManager;

public function __construct(
EntityManagerInterface $em,
AdherentRepository $adherentRepository,
AdherentManager $adherentManager,
ContactManager $contactManager,
LoggerInterface $logger
) {
$this->em = $em;
$this->adherentRepository = $adherentRepository;
$this->adherentManager = $adherentManager;
$this->contactManager = $contactManager;
$this->logger = $logger;
}

Expand All @@ -44,7 +44,7 @@ public function __invoke(AdherentDeleteCommand $command): void
$this->em->refresh($adherent);

try {
$this->adherentManager->delete($adherent);
$this->contactManager->delete($adherent);
} catch (\Exception $e) {
$this->logger->error(sprintf('Failed to delete adherent UUID: "%s". Error: %s', $adherent->getUuid(), $e->getMessage()));
}
Expand Down
Loading

0 comments on commit f6afbe0

Please sign in to comment.