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 @@ +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 @@ +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 @@ +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.'); + } } }