Browse Source

[Bug-9235][Alert]Fix wechat markdown message and change wechat form structure (#9367)

* fix wechat issues:
1. change table msg type to markdown.
2. change userId to not required and enrich hints
3. change 'app id' to 'app id and chat id'

* fix wechat issues:
1. revert table showtype and add markdown showtype.
2. enrich hints.
3. delete 'chatid', rename agentid to weChatAgentIdChatId.
4. modify code to send markdown message.

* fix wechat issues: Change the language pack of agentId to agentId/chatId.

* fix format

* fix param name

Co-authored-by: Amy <amywang0104@163.com>
Tq 3 years ago
parent
commit
c294979e2f

+ 3 - 1
dolphinscheduler-alert/dolphinscheduler-alert-api/src/main/java/org/apache/dolphinscheduler/alert/api/ShowType.java

@@ -25,11 +25,13 @@ public enum ShowType {
      * 1 TEXT;
      * 2 attachment;
      * 3 TABLE+attachment;
+     * 4 MARKDOWN;
      */
     TABLE(0, "table"),
     TEXT(1, "text"),
     ATTACHMENT(2, "attachment"),
-    TABLE_ATTACHMENT(3, "table attachment");
+    TABLE_ATTACHMENT(3, "table attachment"),
+    MARKDOWN(4, "markdown"),;
 
     private final int code;
     private final String descp;

+ 5 - 5
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatAlertChannelFactory.java

@@ -56,14 +56,14 @@ public final class WeChatAlertChannelFactory implements AlertChannelFactory {
                                            .build();
 
         InputParam usersParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USERS, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_USERS)
-                                          .setPlaceholder("please input users ")
+                                          .setPlaceholder("use `|` to separate userIds and `@all` to everyone ")
                                           .addValidate(Validate.newBuilder()
-                                                               .setRequired(true)
+                                                               .setRequired(false)
                                                                .build())
                                           .build();
 
         InputParam agentIdParam = InputParam.newBuilder(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_AGENT_ID, WeChatAlertParamsConstants.ENTERPRISE_WE_CHAT_AGENT_ID)
-                                            .setPlaceholder("please input agent id ")
+                                            .setPlaceholder("please input agent id or chat id ")
                                             .addValidate(Validate.newBuilder()
                                                                  .setRequired(true)
                                                                  .build())
@@ -77,9 +77,9 @@ public final class WeChatAlertChannelFactory implements AlertChannelFactory {
                 .build();
 
         RadioParam showType = RadioParam.newBuilder(AlertConstants.NAME_SHOW_TYPE, AlertConstants.SHOW_TYPE)
-                                        .addParamsOptions(new ParamsOptions(ShowType.TABLE.getDescp(), ShowType.TABLE.getDescp(), false))
+                                        .addParamsOptions(new ParamsOptions(ShowType.MARKDOWN.getDescp(), ShowType.MARKDOWN.getDescp(), false))
                                         .addParamsOptions(new ParamsOptions(ShowType.TEXT.getDescp(), ShowType.TEXT.getDescp(), false))
-                                        .setValue(ShowType.TABLE.getDescp())
+                                        .setValue(ShowType.MARKDOWN.getDescp())
                                         .addValidate(Validate.newBuilder().setRequired(true).build())
                                         .build();
 

+ 2 - 3
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatAlertParamsConstants.java

@@ -24,9 +24,8 @@ public final class WeChatAlertParamsConstants {
     static final String NAME_ENTERPRISE_WE_CHAT_SECRET = "secret";
     static final String ENTERPRISE_WE_CHAT_TEAM_SEND_MSG = "$t('teamSendMsg')";
     static final String NAME_ENTERPRISE_WE_CHAT_TEAM_SEND_MSG = "teamSendMsg";
-    static final String ENTERPRISE_WE_CHAT_AGENT_ID = "$t('agentId')";
-    static final String NAME_ENTERPRISE_WE_CHAT_AGENT_ID = "agentId";
-    static final String NAME_ENTERPRISE_WE_CHAT_CHAT_ID = "chatId";
+    static final String ENTERPRISE_WE_CHAT_AGENT_ID = "$t('agentId/chatId')";
+    static final String NAME_ENTERPRISE_WE_CHAT_AGENT_ID = "agentId/chatId";
     static final String ENTERPRISE_WE_CHAT_USERS = "$t('users')";
     static final String NAME_ENTERPRISE_WE_CHAT_USERS = "users";
 

+ 18 - 62
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WeChatSender.java

@@ -17,15 +17,10 @@
 
 package org.apache.dolphinscheduler.plugin.alert.wechat;
 
-import static java.util.Objects.requireNonNull;
-import static org.apache.dolphinscheduler.plugin.alert.wechat.WeChatAlertConstants.*;
-
 import org.apache.dolphinscheduler.alert.api.AlertConstants;
 import org.apache.dolphinscheduler.alert.api.AlertResult;
-import org.apache.dolphinscheduler.alert.api.ShowType;
 import org.apache.dolphinscheduler.spi.utils.JSONUtils;
 import org.apache.dolphinscheduler.spi.utils.StringUtils;
-
 import org.apache.http.HttpEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
@@ -34,18 +29,20 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import static java.util.Objects.requireNonNull;
+import static org.apache.dolphinscheduler.plugin.alert.wechat.WeChatAlertConstants.*;
 
 public final class WeChatSender {
     private static final Logger logger = LoggerFactory.getLogger(WeChatSender.class);
@@ -57,8 +54,7 @@ public final class WeChatSender {
     private static final String CORP_ID_REGEX = "{corpId}";
     private static final String SECRET_REGEX = "{secret}";
     private static final String TOKEN_REGEX = "{token}";
-    private final String weChatAgentId;
-    private final String weChatChatId;
+    private final String weChatAgentIdChatId;
     private final String weChatUsers;
     private final String weChatTokenUrlReplace;
     private final String weChatToken;
@@ -66,8 +62,7 @@ public final class WeChatSender {
     private final String showType;
 
     WeChatSender(Map<String, String> config) {
-        weChatAgentId = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_AGENT_ID);
-        weChatChatId = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_CHAT_ID);
+        weChatAgentIdChatId = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_AGENT_ID);
         weChatUsers = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_USERS);
         String weChatCorpId = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_CORP_ID);
         String weChatSecret = config.get(WeChatAlertParamsConstants.NAME_ENTERPRISE_WE_CHAT_SECRET);
@@ -76,8 +71,8 @@ public final class WeChatSender {
         showType = config.get(AlertConstants.NAME_SHOW_TYPE);
         requireNonNull(showType, AlertConstants.NAME_SHOW_TYPE + MUST_NOT_NULL);
         weChatTokenUrlReplace = weChatTokenUrl
-            .replace(CORP_ID_REGEX, weChatCorpId)
-            .replace(SECRET_REGEX, weChatSecret);
+                .replace(CORP_ID_REGEX, weChatCorpId)
+                .replace(SECRET_REGEX, weChatSecret);
         weChatToken = getToken();
     }
 
@@ -100,42 +95,10 @@ public final class WeChatSender {
         }
     }
 
-    /**
-     * convert table to markdown style
-     *
-     * @param title the title
-     * @param content the content
-     * @return markdown table content
-     */
-    private static String markdownTable(String title, String content) {
-        List<LinkedHashMap> mapItemsList = JSONUtils.toList(content, LinkedHashMap.class);
-        if (null == mapItemsList || mapItemsList.isEmpty()) {
-            logger.error("itemsList is null");
-            throw new RuntimeException("itemsList is null");
-        }
-        StringBuilder contents = new StringBuilder(200);
-        for (LinkedHashMap mapItems : mapItemsList) {
-            Set<Entry<String, Object>> entries = mapItems.entrySet();
-            Iterator<Entry<String, Object>> iterator = entries.iterator();
-            StringBuilder t = new StringBuilder(String.format("`%s`%s", title, WeChatAlertConstants.MARKDOWN_ENTER));
-
-            while (iterator.hasNext()) {
-
-                Map.Entry<String, Object> entry = iterator.next();
-                t.append(WeChatAlertConstants.MARKDOWN_QUOTE);
-                t.append(entry.getKey()).append(":").append(entry.getValue());
-                t.append(WeChatAlertConstants.MARKDOWN_ENTER);
-            }
-            contents.append(t);
-        }
-
-        return contents.toString();
-    }
-
     /**
      * convert text to markdown style
      *
-     * @param title the title
+     * @param title   the title
      * @param content the content
      * @return markdown text
      */
@@ -242,17 +205,17 @@ public final class WeChatSender {
             return alertResult;
         }
         String enterpriseWeChatPushUrlReplace = "";
-        Map<String,String> contentMap=new HashMap<>();
-        contentMap.put(WeChatAlertConstants.WE_CHAT_CONTENT_KEY,data);
-        String msgJson="";
+        Map<String, String> contentMap = new HashMap<>();
+        contentMap.put(WeChatAlertConstants.WE_CHAT_CONTENT_KEY, data);
+        String msgJson = "";
         if (sendType.equals(WeChatType.APP.getDescp())) {
             enterpriseWeChatPushUrlReplace = WeChatAlertConstants.WE_CHAT_PUSH_URL.replace(TOKEN_REGEX, weChatToken);
-            WechatAppMessage wechatAppMessage=new WechatAppMessage(weChatUsers, WE_CHAT_MESSAGE_TYPE_TEXT, Integer.valueOf(weChatAgentId),contentMap, WE_CHAT_MESSAGE_SAFE_PUBLICITY, WE_CHAT_ENABLE_ID_TRANS, WE_CHAT_DUPLICATE_CHECK_INTERVAL_ZERO);
-            msgJson=JSONUtils.toJsonString(wechatAppMessage);
+            WechatAppMessage wechatAppMessage = new WechatAppMessage(weChatUsers, showType, Integer.valueOf(weChatAgentIdChatId), contentMap, WE_CHAT_MESSAGE_SAFE_PUBLICITY, WE_CHAT_ENABLE_ID_TRANS, WE_CHAT_DUPLICATE_CHECK_INTERVAL_ZERO);
+            msgJson = JSONUtils.toJsonString(wechatAppMessage);
         } else if (sendType.equals(WeChatType.APPCHAT.getDescp())) {
             enterpriseWeChatPushUrlReplace = WeChatAlertConstants.WE_CHAT_APP_CHAT_PUSH_URL.replace(TOKEN_REGEX, weChatToken);
-            WechatAppChatMessage wechatAppChatMessage=new WechatAppChatMessage(weChatChatId, WE_CHAT_MESSAGE_TYPE_TEXT, contentMap, WE_CHAT_MESSAGE_SAFE_PUBLICITY);
-            msgJson=JSONUtils.toJsonString(wechatAppChatMessage);
+            WechatAppChatMessage wechatAppChatMessage = new WechatAppChatMessage(weChatAgentIdChatId, showType, contentMap, WE_CHAT_MESSAGE_SAFE_PUBLICITY);
+            msgJson = JSONUtils.toJsonString(wechatAppChatMessage);
         }
 
         try {
@@ -272,14 +235,7 @@ public final class WeChatSender {
      * @return the markdown alert table/text
      */
     private String markdownByAlert(String title, String content) {
-        String result = "";
-        if (showType.equals(ShowType.TABLE.getDescp())) {
-            result = markdownTable(title, content);
-        } else if (showType.equals(ShowType.TEXT.getDescp())) {
-            result = markdownText(title, content);
-        }
-        return result;
-
+        return markdownText(title, content);
     }
 
     private String getToken() {

+ 17 - 2
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WechatAppChatMessage.java

@@ -17,6 +17,8 @@
 
 package org.apache.dolphinscheduler.plugin.alert.wechat;
 
+import org.apache.dolphinscheduler.alert.api.ShowType;
+
 import java.util.Map;
 
 public class WechatAppChatMessage {
@@ -24,6 +26,7 @@ public class WechatAppChatMessage {
     private String chatid;
     private String msgtype;
     private Map<String,String> text;
+    private Map<String,String> markdown;
     private Integer safe;
 
     public String getChatid() {
@@ -58,13 +61,25 @@ public class WechatAppChatMessage {
         this.safe = safe;
     }
 
+    public Map<String, String> getMarkdown() {
+        return markdown;
+    }
+
+    public void setMarkdown(Map<String, String> markdown) {
+        this.markdown = markdown;
+    }
+
     public WechatAppChatMessage() {
     }
 
-    public WechatAppChatMessage(String chatid, String msgtype, Map<String, String> text, Integer safe) {
+    public WechatAppChatMessage(String chatid, String msgtype, Map<String, String> contentMap, Integer safe) {
         this.chatid = chatid;
         this.msgtype = msgtype;
-        this.text = text;
+        if (msgtype.equals(ShowType.MARKDOWN.getDescp())) {
+            this.markdown = contentMap;
+        } else {
+            this.text = contentMap;
+        }
         this.safe = safe;
     }
 }

+ 20 - 5
dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-wechat/src/main/java/org/apache/dolphinscheduler/plugin/alert/wechat/WechatAppMessage.java

@@ -17,6 +17,8 @@
 
 package org.apache.dolphinscheduler.plugin.alert.wechat;
 
+import org.apache.dolphinscheduler.alert.api.ShowType;
+
 import java.util.Map;
 
 public class WechatAppMessage {
@@ -24,7 +26,8 @@ public class WechatAppMessage {
     private String touser;
     private String msgtype;
     private Integer agentid;
-    private Map<String,String> text;
+    private Map<String, String> text;
+    private Map<String, String> markdown;
     private Integer safe;
     private Integer enable_id_trans;
     private Integer enable_duplicate_check;
@@ -85,16 +88,28 @@ public class WechatAppMessage {
         this.enable_duplicate_check = enable_duplicate_check;
     }
 
+    public Map<String, String> getMarkdown() {
+        return markdown;
+    }
+
+    public void setMarkdown(Map<String, String> markdown) {
+        this.markdown = markdown;
+    }
+
     public WechatAppMessage() {
     }
 
-    public WechatAppMessage(String touser, String msgtype, Integer agentid, Map<String, String> text, Integer safe, Integer enable_id_trans, Integer enable_duplicate_check) {
+    public WechatAppMessage(String touser, String msgtype, Integer agentid, Map<String, String> contentMap, Integer safe, Integer enableIdTrans, Integer enableDuplicateCheck) {
         this.touser = touser;
         this.msgtype = msgtype;
         this.agentid = agentid;
-        this.text = text;
+        if (msgtype.equals(ShowType.MARKDOWN.getDescp())) {
+            this.markdown = contentMap;
+        } else {
+            this.text = contentMap;
+        }
         this.safe = safe;
-        this.enable_id_trans = enable_id_trans;
-        this.enable_duplicate_check = enable_duplicate_check;
+        this.enable_id_trans = enableIdTrans;
+        this.enable_duplicate_check = enableDuplicateCheck;
     }
 }

+ 1 - 1
dolphinscheduler-ui-next/src/locales/modules/en_US.ts

@@ -1112,7 +1112,7 @@ const security = {
     Secret: 'Secret',
     users: 'Users',
     userSendMsg: 'UserSendMsg',
-    agentId: 'AgentId',
+    'agentId/chatId': 'AgentId or ChatId',
     showType: 'Show Type',
     receivers: 'Receivers',
     receiverCcs: 'ReceiverCcs',

+ 1 - 1
dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts

@@ -1097,7 +1097,7 @@ const security = {
     Secret: '密钥',
     users: '群员',
     userSendMsg: '群员信息',
-    agentId: '应用ID',
+    'agentId/chatId': '应用ID或群聊ID',
     showType: '内容展示类型',
     receivers: '收件人',
     receiverCcs: '抄送人',