Browse Source

simplenews_mailjet_subscriptions deprecated fix

bach 1 year ago
parent
commit
22feda7263
2 changed files with 795 additions and 1 deletions
  1. 1 1
      composer.json
  2. 794 0
      patches/simplenews_mailjet_subscriptions__usingmailjetmodule#3.patch

+ 1 - 1
composer.json

@@ -302,7 +302,7 @@
               "With no blocks, clicking on the Custom Blocks tab crashes site https://www.drupal.org/project/structure_sync/issues/3070414":"https://www.drupal.org/files/issues/2022-03-23/PluginNotFoundException-3070414-3.patch"
             },
             "drupal/simplenews_mailjet_subscriptions": {
-              "using mailjet module":"./patches/simplenews_mailjet_subscriptions__usingmailjetmodule#2.patch"
+              "using mailjet module":"./patches/simplenews_mailjet_subscriptions__usingmailjetmodule#3.patch"
             },
             "drupal/graphql": {
               "invalid translation language https://github.com/drupal-graphql/graphql/pull/1176": "./patches/graphql-fix-invalid-translation-language-dev.patch"

+ 794 - 0
patches/simplenews_mailjet_subscriptions__usingmailjetmodule#3.patch

@@ -0,0 +1,794 @@
+diff --git a/README.txt b/README.txt
+index cee6e1a..b488e91 100644
+--- a/README.txt
++++ b/README.txt
+@@ -15,6 +15,7 @@ REQUIREMENTS
+ This module requires the following modules:
+ 
+  * Simplenews (https://www.drupal.org/project/simplenews)
++ * Mailet (https://www.drupal.org/project/Mailjet)
+ 
+  INSTALLATION
+ ------------
+diff --git a/simplenews_mailjet_subscriptions.module b/simplenews_mailjet_subscriptions.module
+index 09abe13..74214f6 100644
+--- a/simplenews_mailjet_subscriptions.module
++++ b/simplenews_mailjet_subscriptions.module
+@@ -7,7 +7,7 @@
+ 
+ use Drupal\Core\Routing\RouteMatchInterface;
+ use Drupal\simplenews\Entity\Subscriber;
+-use Drupal\simplenews_mailjet_subscriptions\SimplenewsMailjetSubscriptionsUtilities;
++// use Drupal\simplenews_mailjet_subscriptions\SimplenewsMailjetSubscriptionsUtilities;
+ use Drupal\simplenews_mailjet_subscriptions\Entity\SimplenewsMailjetSubscriptionEntity;
+ use Drupal\Component\Utility\Html;
+ 
+@@ -24,18 +24,18 @@ use Drupal\Component\Utility\Html;
+ function simplenews_mailjet_subscriptions_simplenews_subscribe(Subscriber $subscriber, string $subscription) {
+   $entities = SimplenewsMailjetSubscriptionEntity::loadMultiple();
+   foreach ((array) $entities as $entity) {
+-    $api_key = $entity->getApiKey();
+-    $secret_key = $entity->getSecretkey();
+     $listID = $entity->getID();
+     $table = $entity->get('mapping_table');
+     if (is_array($table)) {
+       foreach ($table as $category) {
+         if ($category['simplenews_news'] == $subscription) {
+-          SimplenewsMailjetSubscriptionsUtilities::subscribeUser($subscriber, $subscription, $category, $api_key, $secret_key, $listID);
++          // SimplenewsMailjetSubscriptionsUtilities::subscribeUser($subscriber, $category);
++          \Drupal::service('simplenews_mailjet_subscriptions.utilities')->subscribeUser($listID, $subscriber, $category);
+         }
+       }
+     }
+   }
++  // \Drupal::service('simplenews_mailjet_subscriptions.utilities')->subscribeUser($subscriber, $subscription);
+ }
+ 
+ /**
+@@ -51,19 +51,74 @@ function simplenews_mailjet_subscriptions_simplenews_subscribe(Subscriber $subsc
+ function simplenews_mailjet_subscriptions_simplenews_unsubscribe(Subscriber $subscriber, string $subscription) {
+   $entities = SimplenewsMailjetSubscriptionEntity::loadMultiple();
+   foreach ((array) $entities as $entity) {
+-    $api_key = $entity->getApiKey();
+-    $secret_key = $entity->getSecretkey();
+     $listID = $entity->getID();
+     $table = $entity->get('mapping_table');
+     if (is_array($table)) {
+       foreach ($table as $category) {
+         if ($category['simplenews_news'] == $subscription) {
+           // Unsubscribe.
+-          SimplenewsMailjetSubscriptionsUtilities::unsubscribeUser($subscriber, $subscription, $category, $api_key, $secret_key, $listID);
++          // SimplenewsMailjetSubscriptionsUtilities::unsubscribeUser($subscriber, $category);
++          \Drupal::service('simplenews_mailjet_subscriptions.utilities')->unsubscribeUser($listID, $subscriber, $category);
+         }
+       }
+     }
+   }
++  // \Drupal::service('simplenews_mailjet_subscriptions.utilities')->unsubscribeUser($subscriber, $subscription);
++}
++
++
++/**
++ * Act after a subscriber is updated.
++ *
++ * @param \Drupal\simplenews\Entity\Subscriber $subscriber
++ *   The subscriber object including all subscriptions of this user.
++ *
++ * @ingroup subscriber
++ */
++function simplenews_mailjet_subscriptions_simplenews_subscriber_update(Subscriber $subscriber) {
++  $new_mail=$subscriber->getMail();
++  $original_mail = $subscriber->original->getMail();
++  if ($new_mail !== $original_mail) {
++    $new_subscriptions = $subscriber->getSubscribedNewsletterIds();
++    $original_subscriptions = $subscriber->original->getSubscribedNewsletterIds();
++    $entities = SimplenewsMailjetSubscriptionEntity::loadMultiple();
++    foreach ((array) $entities as $entity) {
++      $listID = $entity->getID();
++      $table = $entity->get('mapping_table');
++      if (is_array($table)) {
++        foreach ($table as $category) {
++          if ( in_array($category['simplenews_news'], $original_subscriptions) ) {
++            \Drupal::service('simplenews_mailjet_subscriptions.utilities')->unsubscribeUser($listID, $subscriber->original, $category);
++          }
++          if ( in_array($category['simplenews_news'], $new_subscriptions) ) {
++            \Drupal::service('simplenews_mailjet_subscriptions.utilities')->subscribeUser($listID, $subscriber, $category);
++          }
++        }
++      }
++    }
++  }
++}
++
++
++/**
++ * Act after a subscriber has been deleted.
++ *
++ * @param \Drupal\simplenews\Entity\Subscriber $subscriber
++ *   The subscriber object including all subscriptions of this user.
++ *
++ * @ingroup subscriber
++ */
++function simplenews_mailjet_subscriptions_simplenews_subscriber_delete(Subscriber $subscriber) {
++  $entities = SimplenewsMailjetSubscriptionEntity::loadMultiple();
++  foreach ((array) $entities as $entity) {
++    $listID = $entity->getID();
++    $table = $entity->get('mapping_table');
++    if (is_array($table)) {
++      foreach ($table as $category) {
++        \Drupal::service('simplenews_mailjet_subscriptions.utilities')->unsubscribeUser($listID, $subscriber, $category);
++      }
++    }
++  }
+ }
+ 
+ /**
+diff --git a/simplenews_mailjet_subscriptions.services.yml b/simplenews_mailjet_subscriptions.services.yml
+new file mode 100644
+index 0000000..cee6a81
+--- /dev/null
++++ b/simplenews_mailjet_subscriptions.services.yml
+@@ -0,0 +1,7 @@
++services:
++  simplenews_mailjet_subscriptions.handler:
++    class: Drupal\simplenews_mailjet_subscriptions\SimplenewsMailjetSubscriptionsMailjetHandler
++    arguments: ['@mailjet.client_factory']
++  simplenews_mailjet_subscriptions.utilities:
++    class: Drupal\simplenews_mailjet_subscriptions\SimplenewsMailjetSubscriptionsUtilities
++    arguments: [ '@simplenews_mailjet_subscriptions.handler' ]
+diff --git a/src/Entity/SimplenewsMailjetSubscriptionEntity.php b/src/Entity/SimplenewsMailjetSubscriptionEntity.php
+index 27b7737..34c8df5 100644
+--- a/src/Entity/SimplenewsMailjetSubscriptionEntity.php
++++ b/src/Entity/SimplenewsMailjetSubscriptionEntity.php
+@@ -30,8 +30,6 @@ use Drupal\Core\Config\Entity\ConfigEntityBase;
+  *   config_export = {
+  *     "id",
+  *     "title",
+- *     "api_key",
+- *     "secret_key",
+  *     "mapping_table"
+  *   }
+  * )
+@@ -94,53 +92,53 @@ class SimplenewsMailjetSubscriptionEntity extends ConfigEntityBase implements Si
+     return $this->get('id');
+   }
+ 
+-  /**
+-   * Returns the entity api key.
+-   *
+-   * @return string
+-   *   The entity api key.
+-   */
+-  public function getApiKey() {
+-    return $this->get('api_key');
+-  }
+-
+-  /**
+-   * Sets the entity api key.
+-   *
+-   * @param string $api_key
+-   *   Api key.
+-   *
+-   * @return $this
+-   *   The Simplenews Mailjet Subscription entity.
+-   */
+-  public function setApiKey($api_key) {
+-    $this->set('api_key', $api_key);
+-    return $this;
+-  }
+-
+-  /**
+-   * Returns the entity secret key.
+-   *
+-   * @return string
+-   *   The entity secret key.
+-   */
+-  public function getSecretkey() {
+-    return $this->get('secret_key');
+-  }
+-
+-  /**
+-   * Sets the entity secret key.
+-   *
+-   * @param string $secret_key
+-   *   Secret key.
+-   *
+-   * @return $this
+-   *   The Simplenews Mailjet Subscription entity.
+-   */
+-  public function setSecretkey($secret_key) {
+-    $this->set('secret_key', $secret_key);
+-    return $this;
+-  }
++  // /**
++  //  * Returns the entity api key.
++  //  *
++  //  * @return string
++  //  *   The entity api key.
++  //  */
++  // public function getApiKey() {
++  //   return $this->get('api_key');
++  // }
++
++  // /**
++  //  * Sets the entity api key.
++  //  *
++  //  * @param string $api_key
++  //  *   Api key.
++  //  *
++  //  * @return $this
++  //  *   The Simplenews Mailjet Subscription entity.
++  //  */
++  // public function setApiKey($api_key) {
++  //   $this->set('api_key', $api_key);
++  //   return $this;
++  // }
++
++  // /**
++  //  * Returns the entity secret key.
++  //  *
++  //  * @return string
++  //  *   The entity secret key.
++  //  */
++  // public function getSecretkey() {
++  //   return $this->get('secret_key');
++  // }
++
++  // /**
++  //  * Sets the entity secret key.
++  //  *
++  //  * @param string $secret_key
++  //  *   Secret key.
++  //  *
++  //  * @return $this
++  //  *   The Simplenews Mailjet Subscription entity.
++  //  */
++  // public function setSecretkey($secret_key) {
++  //   $this->set('secret_key', $secret_key);
++  //   return $this;
++  // }
+ 
+   /**
+    * Sets the entity mapping table.
+diff --git a/src/Form/SimplenewsMailjetSubscriptionAddForm.php b/src/Form/SimplenewsMailjetSubscriptionAddForm.php
+index 836bee3..bc70090 100644
+--- a/src/Form/SimplenewsMailjetSubscriptionAddForm.php
++++ b/src/Form/SimplenewsMailjetSubscriptionAddForm.php
+@@ -64,20 +64,20 @@ class SimplenewsMailjetSubscriptionAddForm extends EntityForm {
+         'exists' => [$this, 'exist'],
+       ],
+     ];
+-    $form['api_key'] = [
+-      '#type' => 'textfield',
+-      '#title' => $this->t('API Key'),
+-      '#maxlength' => 32,
+-      '#description' => $this->t('Mailjet Account API Key'),
+-      '#required' => TRUE,
+-    ];
+-    $form['secret_key'] = [
+-      '#type' => 'password',
+-      '#title' => $this->t('Secret Key'),
+-      '#maxlength' => 32,
+-      '#description' => $this->t('Mailjet Account Secret Key'),
+-      '#required' => TRUE,
+-    ];
++    // $form['api_key'] = [
++    //   '#type' => 'textfield',
++    //   '#title' => $this->t('API Key'),
++    //   '#maxlength' => 32,
++    //   '#description' => $this->t('Mailjet Account API Key'),
++    //   '#required' => TRUE,
++    // ];
++    // $form['secret_key'] = [
++    //   '#type' => 'password',
++    //   '#title' => $this->t('Secret Key'),
++    //   '#maxlength' => 32,
++    //   '#description' => $this->t('Mailjet Account Secret Key'),
++    //   '#required' => TRUE,
++    // ];
+ 
+     return $form;
+   }
+diff --git a/src/Form/SimplenewsMailjetSubscriptionEditForm.php b/src/Form/SimplenewsMailjetSubscriptionEditForm.php
+index 98342b5..f67ba96 100644
+--- a/src/Form/SimplenewsMailjetSubscriptionEditForm.php
++++ b/src/Form/SimplenewsMailjetSubscriptionEditForm.php
+@@ -76,20 +76,20 @@ class SimplenewsMailjetSubscriptionEditForm extends EntityForm {
+       '#help' => $this->t('Configuration title'),
+       '#required' => TRUE,
+     ];
+-    $form['api_key'] = [
+-      '#type' => 'textfield',
+-      '#title' => $this->t('API Key'),
+-      '#maxlength' => 32,
+-      '#default_value' => $this->entity->getApiKey(),
+-      '#help' => $this->t('Mailjet Account API Key'),
+-      '#required' => TRUE,
+-      '#disabled' => !$this->entity->isNew(),
+-    ];
+-
+-    if ($this->entity->getApiKey() && $this->entity->getSecretkey()) {
++    // $form['api_key'] = [
++    //   '#type' => 'textfield',
++    //   '#title' => $this->t('API Key'),
++    //   '#maxlength' => 32,
++    //   '#default_value' => $this->entity->getApiKey(),
++    //   '#help' => $this->t('Mailjet Account API Key'),
++    //   '#required' => TRUE,
++    //   '#disabled' => !$this->entity->isNew(),
++    // ];
++
++    // if ($this->entity->getApiKey() && $this->entity->getSecretkey()) {
+       $this->constructTable($form, $form_state);
+ 
+-    }
++    // }
+ 
+     $form['add_subscription'] = [
+       '#type' => 'submit',
+diff --git a/src/Plugin/RulesAction/UnsubscribeFromList.php b/src/Plugin/RulesAction/UnsubscribeFromList.php
+new file mode 100644
+index 0000000..3f546ef
+--- /dev/null
++++ b/src/Plugin/RulesAction/UnsubscribeFromList.php
+@@ -0,0 +1,51 @@
++<?php
++
++namespace Drupal\simplenews_mailjet_subscriptions\Plugin\RulesAction;
++
++use Drupal\rules\Core\RulesActionBase;
++use Drupal\simplenews\SubscriberInterface;
++
++/**
++ * Provides a 'Unsubscribe' action.
++ *
++ * @RulesAction(
++ *   id = "rules_simplenews_mailjet_subscriptions_unsubscribe_from_list",
++ *   label = @Translation("Unsubscribe from newsletter, giving mailjet listID and email"),
++ *   category = @Translation("Simplenews Mailjet Subscriptions"),
++ *   context_definitions = {
++ *     "listID" = @ContextDefinition("integer",
++ *       label = @Translation("Mailjet list ID"),
++ *       description = @Translation("Specifies the mailjet list ID from which simplenews list will be found and email will be unsubscribed from.")
++ *     ),
++ *     "email" = @ContextDefinition("string",
++ *       label = @Translation("Subscriber email"),
++ *       description = @Translation("Specifies the email to unsubscribe.")
++ *     )
++ *   }
++ * )
++ */
++class UnsubscribeFromList extends RulesActionBase {
++
++  /**
++   * Deletes the Entity.
++   *
++   * @param integer listID
++   *    The mailjet list to unsubcsribe from.
++   *
++   * @param string email
++   *    The email to unsubcribe.
++   */
++  protected function doExecute(integer $listID, string $email) {
++    $l = $listID;
++    $e = $email;
++    \Drupal::logger('simplenews_mailjet_subscriptions')->notice(print_r($listID, true));
++    // \Drupal::logger('simplenews_mailjet_subscriptions')->notice("Unsubscribe webhook triggered for listID: " . $listID . ", and email: " . $email . ".");
++
++    // find corresponding simplenews list from mailjet listID
++
++    // get subscriber entity
++
++    // unsubscribe subscriber from simplenews list
++  }
++
++}
+\ No newline at end of file
+diff --git a/src/SimplenewsMailjetSubscriptionsInterface.php b/src/SimplenewsMailjetSubscriptionsInterface.php
+index c727d26..37c082d 100644
+--- a/src/SimplenewsMailjetSubscriptionsInterface.php
++++ b/src/SimplenewsMailjetSubscriptionsInterface.php
+@@ -36,43 +36,43 @@ interface SimplenewsMailjetSubscriptionsInterface extends ConfigEntityInterface
+    */
+   public function getId();
+ 
+-  /**
+-   * Returns the entity api key.
+-   *
+-   * @return string
+-   *   The entity api key.
+-   */
+-  public function getApiKey();
++  // /**
++  //  * Returns the entity api key.
++  //  *
++  //  * @return string
++  //  *   The entity api key.
++  //  */
++  // public function getApiKey();
+ 
+-  /**
+-   * Sets the entity api key.
+-   *
+-   * @param string $api_key
+-   *   Api key.
+-   *
+-   * @return $this
+-   *   The Simplenews Mailjet Subscription entity.
+-   */
+-  public function setApiKey($api_key);
++  // /**
++  //  * Sets the entity api key.
++  //  *
++  //  * @param string $api_key
++  //  *   Api key.
++  //  *
++  //  * @return $this
++  //  *   The Simplenews Mailjet Subscription entity.
++  //  */
++  // public function setApiKey($api_key);
+ 
+-  /**
+-   * Returns the entity secret key.
+-   *
+-   * @return string
+-   *   The entity secret key.
+-   */
+-  public function getSecretkey();
++  // /**
++  //  * Returns the entity secret key.
++  //  *
++  //  * @return string
++  //  *   The entity secret key.
++  //  */
++  // public function getSecretkey();
+ 
+-  /**
+-   * Sets the entity secret key.
+-   *
+-   * @param string $secret_key
+-   *   Secret key.
+-   *
+-   * @return $this
+-   *   The Simplenews Mailjet Subscription entity.
+-   */
+-  public function setSecretkey($secret_key);
++  // /**
++  //  * Sets the entity secret key.
++  //  *
++  //  * @param string $secret_key
++  //  *   Secret key.
++  //  *
++  //  * @return $this
++  //  *   The Simplenews Mailjet Subscription entity.
++  //  */
++  // public function setSecretkey($secret_key);
+ 
+   /**
+    * Sets the entity mapping table.
+diff --git a/src/SimplenewsMailjetSubscriptionsMailjetHandler.php b/src/SimplenewsMailjetSubscriptionsMailjetHandler.php
+new file mode 100644
+index 0000000..a68cbf1
+--- /dev/null
++++ b/src/SimplenewsMailjetSubscriptionsMailjetHandler.php
+@@ -0,0 +1,47 @@
++<?php
++
++namespace Drupal\simplenews_mailjet_subscriptions;
++
++use Mailjet\Resources;
++use Drupal\mailjet\MailjetHandler;
++
++/**
++ * Implement SimplenewsMailjetSubscriptionsMailjetHandler interface.
++ */
++class SimplenewsMailjetSubscriptionsMailjetHandler extends MailjetHandler implements SimplenewsMailjetSubscriptionsMailjetHandlerInterface{
++
++  /**
++   * {@inheritdoc}
++   *
++   * @return array|null
++   *   Return array with result or null.
++   */
++  public function createMailjetContact($email): ?array {
++    
++    $response = $this->mailjetClient->post(Resources::$Contact, ["body" => ['Email' => $email]]);
++
++    if ($response->success()) {
++      return $response->getData();
++    }
++
++    return NULL;
++  }
++
++  /**
++   * {@inheritdoc}
++   *
++   * @return array|null
++   *   Return array with result or null.
++   */
++  public function getMailjetContactByEmail($email): ?array {
++    
++    $response = $this->mailjetClient->get(Resources::$Contact, ['id' => $email]);
++
++    if ($response->success()) {
++      return $response->getData();
++    }
++
++    return NULL;
++  }
++
++}
+\ No newline at end of file
+diff --git a/src/SimplenewsMailjetSubscriptionsMailjetHandlerInterface.php b/src/SimplenewsMailjetSubscriptionsMailjetHandlerInterface.php
+new file mode 100644
+index 0000000..b6484d7
+--- /dev/null
++++ b/src/SimplenewsMailjetSubscriptionsMailjetHandlerInterface.php
+@@ -0,0 +1,34 @@
++<?php
++
++namespace Drupal\simplenews_mailjet_subscriptions;
++
++use Drupal\mailjet\MailjetHandlerInterface;
++
++/**
++ * Interface for mailjet handler.
++ */
++interface SimplenewsMailjetSubscriptionsMailjetHandlerInterface extends MailjetHandlerInterface {
++
++  /**
++   * create contact.
++   *
++   * @param string $email
++   *   email of the contact
++   *
++   * @return array|null
++   *   Return array with the result or null.
++   */
++  public function createMailjetContact($email): ?array;
++
++  /**
++   * Get contact by email.
++   *
++   * @param string $email
++   *   email of the contact
++   *
++   * @return array|null
++   *   Return array with the result or null.
++   */
++  public function getMailjetContactByEmail($email): ?array;
++
++}
+\ No newline at end of file
+diff --git a/src/SimplenewsMailjetSubscriptionsUtilities.php b/src/SimplenewsMailjetSubscriptionsUtilities.php
+index 950ff8a..5cb351d 100644
+--- a/src/SimplenewsMailjetSubscriptionsUtilities.php
++++ b/src/SimplenewsMailjetSubscriptionsUtilities.php
+@@ -2,141 +2,122 @@
+ 
+ namespace Drupal\simplenews_mailjet_subscriptions;
+ 
++// use Drupal\mailjet\MailjetHandlerInterface;
++use Drupal\simplenews_mailjet_subscriptions\SimplenewsMailjetSubscriptionsMailjetHandlerInterface;
++
+ /**
+- * Provides a list of Simplenews Mailjet Subscription entities.
++ * Utilisties
+  */
+ class SimplenewsMailjetSubscriptionsUtilities {
+ 
+   /**
+-   * Check Subscriber.
++   * MailjetHandler service.
++   *
++   * @var \Drupal\Simplenews_mailjet_subscriptions\SimplenewsMailjetSubscriptionsMailjetHandlerInterface
++   */
++  protected $mailjetHandler;
++
++/**
++   * SubscribeEmailForm constructor.
++   *
++   * @param \Drupal\Simplenews_mailjet_subscriptions\SimplenewsMailjetSubscriptionsMailjetHandlerInterface $mailjetHandler
++   *   The mailjet handler service.
+    */
+-  private static function checkSubscriber($api_key, $secret_key, $encoded_mail) {
+-
+-    // Check if contact exist
+-    // verifica se o contacto ja tem opções.
+-    $endpoint = 'https://api.mailjet.com/v3/REST/contactdata/' . $encoded_mail;
+-    $ch = curl_init();
+-    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
+-    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
+-    curl_setopt($ch, CURLOPT_USERPWD, $api_key . ':' . $secret_key);
+-    curl_setopt($ch, CURLOPT_URL, $endpoint);
+-    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+-    $response = curl_exec($ch);
+-    curl_close($ch);
+-    $json = json_decode($response, TRUE);
+-
+-    return $json;
++  public function __construct(SimplenewsMailjetSubscriptionsMailjetHandlerInterface $mailjetHandler) {
++    $this->mailjetHandler = $mailjetHandler;
+   }
+ 
+   /**
+-   * Update Subscriber.
++   * {@inheritDoc}
+    */
+-  private static function updateSubscriber($api_key, $secret_key, $listID, $subscriber_email, $contact_property, $newsletter_property_name, $action) {
+-
+-    // Add contact to mailjet.
+-    $endpoint = 'https://api.mailjet.com/v3/REST/contactslist/' . $listID . '/managecontact';
+-    $message = [
+-      "Properties" => [
+-        $contact_property => $newsletter_property_name,
+-      ],
+-      "Action" => $action,
+-      "Email" => $subscriber_email,
+-    ];
+-    $payload = json_encode($message);
+-
+-    $ch = curl_init();
+-    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
+-    curl_setopt($ch, CURLOPT_POST, 1);
+-    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
+-    curl_setopt($ch, CURLOPT_USERPWD, $api_key . ':' . $secret_key);
+-    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
+-    curl_setopt($ch, CURLOPT_URL, $endpoint);
+-    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+-    $response = curl_exec($ch);
+-    curl_close($ch);
+-    $json = json_decode($response, TRUE);
+-
+-    return $json;
++  public static function create(ContainerInterface $container) {
++    return new static(
++      $container->get('simplenews_mailjet_subscriptions.handler')
++    );
++  }
++
++  public function checkSubscriber($encoded_mail) {
++    $response = $this->mailjetHandler->getMailjetContactByEmail($encoded_mail);
++    if ($response) {
++      // contact alredy exists
++      $contact_id = $response[0]['ID'];
++      return $contact_id;
++    }
++
++    return null;
++  }
++
++  public function createSubscriber($email) {
++    $response = $this->mailjetHandler->createMailjetContact($email);
++    if ($response) {
++      // contact alredy exists
++      $contact_id = $response[0]['ID'];
++      return $contact_id;
++    }
++
++    return null;
+   }
+ 
+   /**
+    * Subscribe User.
+    */
+-  public static function subscribeUser($subscriber, $subscription, $category, $api_key, $secret_key, $listID) {
++  public function subscribeUser($listID, $subscriber, $category) {
+ 
+-    $contact_property = $category['contact_property'];
+-    $newsletter_property_name = $category['newsletter_property_name'];
+     $subscriber_email = $subscriber->getMail();
+-    $encoded_mail = urlencode($subscriber_email);
+-    $response = '';
+ 
+-    $contact_info = self::checkSubscriber($api_key, $secret_key, $encoded_mail);
++    // hook is sometimes called with empty subscriber
++    if (!$subscriber_email) return;
+ 
+-    $options = $contact_info['Data'];
++    $encoded_mail = urlencode($subscriber_email);
+ 
+-    // Se existe - acrescenta a opções.
+-    if ($options[0]['Data']) {
+-      foreach ($options[0]['Data'] as $property) {
+-        if ($property["Name"] == $contact_property) {
++    $contactid = $this->checkSubscriber($encoded_mail);
++    if (!$contactid) {
++      // subscriber does not exists yet, create it
++      $contactid = $this->createSubscriber($subscriber_email);
++    }
+ 
+-          if (is_int(strpos($property['Value'], $newsletter_property_name))) {
+-            $newsletter_property_name = $property['Value'];
+-          }
+-          else {
+-            $newsletter_property_name = $property['Value'] . ';' . $newsletter_property_name;
+-          }
+-        }
++    if ($contactid) {
++      $contact = [
++        'Email' => $subscriber_email,
++        // 'Properties' => [
++        //   $contact_property => $newsletter_property_name
++        // ]
++      ];
++
++      $response = $this->mailjetHandler->syncMailjetContact($listID, $contact, 'addnoforce');
++      if ($response) {
++        // $contact_id = $response['Data'][0]['ContactID'];
++        \Drupal::logger('simplenews_mailjet_subscriptions')->notice('The mailjet user ' . $subscriber_email . ' subscribed to the ' . $listID . ' list.');
++      }else{
++        \Drupal::logger('simplenews_mailjet_subscriptions')->warning('error while subscrining ' . $subscriber_email . ' to the ' . $listID . ' list.');
+       }
++
++    } else {
++      \Drupal::logger('simplenews_mailjet_subscriptions')->warning($subscriber_email . ' does not exists and can not be created on mailjet.');
+     }
+ 
+-    $response = self::updateSubscriber($api_key, $secret_key, $listID, $subscriber_email, $contact_property, $newsletter_property_name, 'addnoforce');
+-    $contact_id = $response['Data'][0]['ContactID'];
+-    \Drupal::logger('simplenews_mailjet_subscriptions')->notice('The mailjet user ' . $contact_id . ' subscribed to the ' . $contact_property . ' properties with the ' . $newsletter_property_name . ' values in the list ' . $listID . '.');
+-    return $response;
++
+   }
+ 
+   /**
+    * Unsubscribe User.
+    */
+-  public static function unsubscribeUser($subscriber, $subscription, $category, $api_key, $secret_key, $listID) {
+-    $contact_property = $category['contact_property'];
+-    $newsletter_property_name = $category['newsletter_property_name'];
++  public function unsubscribeUser($listID, $subscriber, $category) {
+     $subscriber_email = $subscriber->getMail();
+-    $encoded_mail = urlencode($subscriber_email);
+-    $response = '';
+-
+-    $contact_info = self::checkSubscriber($api_key, $secret_key, $encoded_mail);
+-    $contact_id = $contact_info['ContactID'];
+-    $options = $contact_info['Data'];
+-
+-    if ($options[0]['Data']) {
+-      foreach ($options[0]['Data'] as $property) {
+-        if ($property["Name"] == $contact_property) {
+-          if (substr_count($property['Value'], ';') == 0) {
+-            $newsletter_property_name = '';
+-            $response = self::updateSubscriber($api_key, $secret_key, $listID, $subscriber_email, $contact_property, $newsletter_property_name, 'remove');
+-            $contact_id = $response['Data'][0]['ContactID'];
+-            \Drupal::logger('simplenews_mailjet_subscriptions')->notice('The mailjet user ' . $contact_id . ' unsubscribed to the list ' . $listID . '.');
+-          }
+-          else {
+-            $pos = strpos($property['Value'], $newsletter_property_name);
+-            \Drupal::logger('simplenews_mailjet_subscriptions')->notice('The mailjet user ' . $contact_id . ' unsubscribed to the ' . $contact_property . ' properties with the ' . $newsletter_property_name . ' values in the list ' . $listID . '.');
+-            if ($pos === 0) {
+-              $newsletter_property_name = str_replace($newsletter_property_name . ';', '', $property['Value']);
+-            }
+-            else {
+-              $newsletter_property_name = str_replace(';' . $newsletter_property_name, '', $property['Value']);
+-            }
+-            $response = self::updateSubscriber($api_key, $secret_key, $listID, $subscriber_email, $contact_property, $newsletter_property_name, 'addnoforce');
+-            $contact_id = $response['Data'][0]['ContactID'];
+-            \Drupal::logger('simplenews_mailjet_subscriptions')->notice('The mailjet user ' . $contact_id . 'remains subscribed to the ' . $contact_property . ' properties with the ' . $newsletter_property_name . ' values in the list ' . $listID . '.');
+-
+-          }
+-        }
+-      }
+-    }
++    $contact = [
++      'Email' => $subscriber_email,
++      // 'Properties' => [
++      //   $contact_property => $newsletter_property_name
++      // ]
++    ];
+ 
+-    return $response;
++    $response = $this->mailjetHandler->syncMailjetContact($listID, $contact, 'remove');
++    if ($response) {
++      // $contact_id = $response['Data'][0]['ContactID'];
++      \Drupal::logger('simplenews_mailjet_subscriptions')->notice('The mailjet user ' . $subscriber_email . ' removed from the ' . $listID . ' list.');
++    }else{
++      \Drupal::logger('simplenews_mailjet_subscriptions')->warning('error while removing ' . $subscriber_email . ' from the ' . $listID . ' list.');
++    }
+   }
+ 
+ }