From f284e8e0936077dd1825023687592f6126c60cc9 Mon Sep 17 00:00:00 2001
From: blavenie <benoit.lavenier@e-is.pro>
Date: Wed, 5 Jul 2017 12:57:42 +0200
Subject: [PATCH] - Add a debug mode for email subscription - Fix events sent
 many times - fix #16

---
 .../subscription/PluginSettings.java          |  9 ++++
 .../service/SubscriptionService.java          | 54 ++++++++++++++-----
 .../resources/templates/text_event_item.st    |  1 +
 .../user/service/SynchroService.java          |  2 +-
 4 files changed, 52 insertions(+), 14 deletions(-)

diff --git a/duniter4j-es-subscription/src/main/java/org/duniter/elasticsearch/subscription/PluginSettings.java b/duniter4j-es-subscription/src/main/java/org/duniter/elasticsearch/subscription/PluginSettings.java
index 4d1473f8..cff17bae 100644
--- a/duniter4j-es-subscription/src/main/java/org/duniter/elasticsearch/subscription/PluginSettings.java
+++ b/duniter4j-es-subscription/src/main/java/org/duniter/elasticsearch/subscription/PluginSettings.java
@@ -91,6 +91,15 @@ public class PluginSettings extends AbstractLifecycleComponent<PluginSettings> {
         return settings.getAsBoolean("duniter.subscription.email.atStartup", false);
     }
 
+    /**
+     * Should email subscription execute as DEBUG mode ?
+     * @return
+     */
+    public boolean isEmailSubscriptionsDebug() {
+        return settings.getAsBoolean("duniter.subscription.email.debug", false);
+    }
+
+
     /**
      * Day of the week to trigger weekly email subscription (default: 2 = monday)
      * @return
diff --git a/duniter4j-es-subscription/src/main/java/org/duniter/elasticsearch/subscription/service/SubscriptionService.java b/duniter4j-es-subscription/src/main/java/org/duniter/elasticsearch/subscription/service/SubscriptionService.java
index 8a955cbc..86d61371 100644
--- a/duniter4j-es-subscription/src/main/java/org/duniter/elasticsearch/subscription/service/SubscriptionService.java
+++ b/duniter4j-es-subscription/src/main/java/org/duniter/elasticsearch/subscription/service/SubscriptionService.java
@@ -152,8 +152,8 @@ public class SubscriptionService extends AbstractService {
                 logger.warn(I18n.t("duniter4j.es.subscription.email.start", pluginSettings.getEmailSubscriptionsExecuteHour(), dayOfWeek));
             }
 
-            // Execution at startup
-            if (pluginSettings.isEmailSubscriptionsExecuteAtStartup()) {
+            // Execution at startup (or DEBUG mode)
+            if (pluginSettings.isEmailSubscriptionsExecuteAtStartup() || pluginSettings.isEmailSubscriptionsDebug()) {
                 threadPool.schedule(
                         () -> executeEmailSubscriptions(EmailSubscription.Frequency.daily),
                         new TimeValue(20, TimeUnit.SECONDS) /* after 20s */
@@ -213,7 +213,7 @@ public class SubscriptionService extends AbstractService {
             from += size;
         }
 
-        logger.info(String.format("Executing %s email subscription... [OK] (%s executions in %s ms)",
+        logger.info(String.format("Executing %s email subscription... [OK] emails sent [%s] (in %s ms)",
                 frequency.name(), executionCount, System.currentTimeMillis()-now));
 
     }
@@ -259,7 +259,24 @@ public class SubscriptionService extends AbstractService {
                                                          final Map<String, String> profileTitles) {
         Preconditions.checkNotNull(subscription);
 
-        logger.info(String.format("Processing email subscription [%s]", subscription.getId()));
+        boolean debug = pluginSettings.isEmailSubscriptionsDebug();
+        if (subscription.getContent() != null && subscription.getContent().getEmail() != null) {
+            if (debug) {
+                logger.info(String.format("Processing email subscription to [%s - %s] on account [%s]",
+                        senderName,
+                        subscription.getContent().getEmail(),
+                        ModelUtils.minifyPubkey(subscription.getIssuer())));
+            }
+            else {
+                logger.info(String.format("Processing email subscription [%s] on account [%s]",
+                        subscription.getId(),
+                        ModelUtils.minifyPubkey(subscription.getIssuer())));
+            }
+        }
+        else {
+            logger.warn(String.format("Processing email subscription [%s] - no email found in subscription content: skipping", subscription.getId()));
+            return null;
+        }
 
         SubscriptionExecution lastExecution = subscriptionExecutionDao.getLastExecution(subscription);
         Long lastExecutionTime;
@@ -319,12 +336,21 @@ public class SubscriptionService extends AbstractService {
                 pluginSettings.getCesiumUrl())
                 .render(issuerLocale);
 
-        // Schedule email sending
-        threadPool.schedule(() -> mailService.sendHtmlEmailWithText(
-                emailSubjectPrefix + I18n.t("duniter4j.es.subscription.email.subject", userEvents.size()),
-                text,
-                "<body>" + html + "</body>",
-                subscription.getContent().getEmail()));
+        final String object = emailSubjectPrefix + I18n.t("duniter4j.es.subscription.email.subject", userEvents.size());
+        if (pluginSettings.isEmailSubscriptionsDebug()) {
+            logger.info(String.format("---- Email to send (debug mode) ------\nTo:%s\nObject: %s\nText content:\n%s",
+                    subscription.getContent().getEmail(),
+                    object,
+                    text));
+        }
+        else {
+            // Schedule email sending
+            threadPool.schedule(() -> mailService.sendHtmlEmailWithText(
+                    object,
+                    text,
+                    "<body>" + html + "</body>",
+                    subscription.getContent().getEmail()));
+        }
 
         // Compute last time (should be the first one, as events are sorted in DESC order)
         Long lastEventTime = userEvents.get(0).getTime();
@@ -352,6 +378,9 @@ public class SubscriptionService extends AbstractService {
                 issuerProfilNames.get(subscription.getIssuer()) :
                 ModelUtils.minifyPubkey(subscription.getIssuer());
 
+        // Remove comma (to avoid to be used as many args in the i18n_args template)
+        issuerName = issuerName.replaceAll("[, ]+", " ");
+        senderName = StringUtils.isNotBlank(senderName) ? senderName.replaceAll("[, ]+", " ") : senderName;
 
         try {
             // Compute body
@@ -393,11 +422,10 @@ public class SubscriptionService extends AbstractService {
         execution.setSignature(cryptoService.sign(json, pluginSettings.getNodeKeypair().getSecKey()));
 
         if (execution.getId() == null) {
-
-            //subscriptionExecutionDao.create(json, false/*not wait*/);
+            subscriptionExecutionDao.create(toJson(execution), false/*not wait*/);
         }
         else {
-            //subscriptionExecutionDao.update(execution.getId(), json, false/*not wait*/);
+            subscriptionExecutionDao.update(execution.getId(), toJson(execution), false/*not wait*/);
         }
         return execution;
     }
diff --git a/duniter4j-es-subscription/src/main/resources/templates/text_event_item.st b/duniter4j-es-subscription/src/main/resources/templates/text_event_item.st
index 701a00ec..df9c16e4 100644
--- a/duniter4j-es-subscription/src/main/resources/templates/text_event_item.st
+++ b/duniter4j-es-subscription/src/main/resources/templates/text_event_item.st
@@ -1,3 +1,4 @@
 text_event_item(e) ::= <<
    - [$e.time; format="short"$] $e.description$
+
 >>
\ No newline at end of file
diff --git a/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/service/SynchroService.java b/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/service/SynchroService.java
index 0fc95407..38cdb593 100644
--- a/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/service/SynchroService.java
+++ b/duniter4j-es-user/src/main/java/org/duniter/elasticsearch/user/service/SynchroService.java
@@ -73,7 +73,7 @@ public class SynchroService extends AbstractSynchroService {
         importInvitationChanges(result, peer, sinceTime);
 
         long duration = System.currentTimeMillis() - time;
-        logger.info(String.format("[%s] Synchronizing user data since %s [OK] %s (ins %s ms)", peer.toString(), sinceTime, result.toString(), duration));
+        logger.info(String.format("[%s] Synchronizing user data since %s [OK] %s (in %s ms)", peer.toString(), sinceTime, result.toString(), duration));
     }
 
     protected void importHistoryChanges(SynchroResult result, Peer peer, long sinceTime) {
-- 
GitLab