diff --git a/hertzbeat-common/pom.xml b/hertzbeat-common/pom.xml
index bfa3faa7c28..ba256508783 100644
--- a/hertzbeat-common/pom.xml
+++ b/hertzbeat-common/pom.xml
@@ -135,12 +135,20 @@
${poi.version}
compile
+
org.apache.poi
poi-ooxml
${poi.version}
compile
+
+
+
+ cn.hutool
+ hutool-all
+ ${hutool-all.version}
+
diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/cache/CacheFactory.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/cache/CacheFactory.java
index 37aaf0703c6..178f9902024 100644
--- a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/cache/CacheFactory.java
+++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/cache/CacheFactory.java
@@ -33,6 +33,9 @@ private CacheFactory() {}
private static final CommonCacheService ALERT_CONVERGE_CACHE =
new CaffeineCacheServiceImpl<>(10, 1000, Duration.ofDays(1), false);
+
+ private static final CommonCacheService DESENSITIZATION_MAP_CACHE =
+ new CaffeineCacheServiceImpl<>(10, 1000, Duration.ofDays(1), false);
/**
* get notice cache
@@ -57,4 +60,10 @@ public static CommonCacheService getAlertSilenceCache() {
public static CommonCacheService getAlertConvergeCache() {
return ALERT_CONVERGE_CACHE;
}
+
+ /**
+ * get desensitizationMap cache
+ * @return desensitizationMap cache
+ */
+ public static CommonCacheService getDesensitizationMapCache(){return DESENSITIZATION_MAP_CACHE;};
}
diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/dto/vo/NoticeReceiverVO.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/dto/vo/NoticeReceiverVO.java
new file mode 100644
index 00000000000..6da5be0ffd9
--- /dev/null
+++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/dto/vo/NoticeReceiverVO.java
@@ -0,0 +1,242 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hertzbeat.common.entity.dto.vo;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.persistence.Column;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.hertzbeat.common.serialize.EmailDesensitizationSerializer;
+import org.apache.hertzbeat.common.serialize.PhoneDesensitizationSerializer;
+import org.springframework.data.annotation.CreatedBy;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedBy;
+import org.springframework.data.annotation.LastModifiedDate;
+
+import java.time.LocalDateTime;
+
+import static io.swagger.v3.oas.annotations.media.Schema.AccessMode.READ_ONLY;
+import static io.swagger.v3.oas.annotations.media.Schema.AccessMode.READ_WRITE;
+
+/**
+ * 2024-12-06
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class NoticeReceiverVO {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Schema(title = "Recipient entity primary key index ID", description = "Recipient entity primary key index ID",
+ example = "87584674384", accessMode = READ_ONLY)
+ private Long id;
+
+ @Schema(title = "Recipient name", description = "Recipient name",
+ example = "tom", accessMode = READ_WRITE)
+ @Size(max = 100)
+ @NotBlank(message = "name can not null")
+ private String name;
+
+ @Schema(title = "Notification information method: 0-SMS 1-Email 2-webhook 3-WeChat Official Account 4-Enterprise WeChat Robot "
+ + "5-DingTalk Robot 6-FeiShu Robot 7-Telegram Bot 8-SlackWebHook 9-Discord Bot 10-Enterprise WeChat app message",
+ description = "Notification information method: "
+ + "0-SMS 1-Email 2-webhook 3-WeChat Official Account "
+ + "4-Enterprise WeChat Robot 5-DingTalk Robot 6-FeiShu Robot "
+ + "7-Telegram Bot 8-SlackWebHook 9-Discord Bot 10-Enterprise "
+ + "WeChat app message",
+ accessMode = READ_WRITE)
+ @Min(0)
+ @NotNull(message = "type can not null")
+ private Byte type;
+
+ @Schema(title = "Mobile number: Valid when the notification method is SMS",
+ description = "Mobile number: Valid when the notification method is SMS",
+ example = "18923435643", accessMode = READ_WRITE)
+ @Size(max = 100)
+ @JsonSerialize(using = PhoneDesensitizationSerializer.class)
+ private String phone;
+
+ @Schema(title = "Email account: Valid when the notification method is email",
+ description = "Email account: Valid when the notification method is email",
+ example = "tom@qq.com", accessMode = READ_WRITE)
+ @Size(max = 100)
+ @JsonSerialize(using = EmailDesensitizationSerializer.class)
+ private String email;
+
+ @Schema(title = "URL address: The notification method is valid for webhook",
+ description = "URL address: The notification method is valid for webhook",
+ example = "https://www.tancloud.cn", accessMode = READ_WRITE)
+ @Size(max = 300)
+ @Column(length = 300)
+ private String hookUrl;
+
+ @Schema(title = "openId : The notification method is valid for WeChat official account, enterprise WeChat robot or FlyBook robot",
+ description = "openId : The notification method is valid for WeChat official account, enterprise WeChat robot or FlyBook robot",
+ example = "343432", accessMode = READ_WRITE)
+ @Size(max = 300)
+ @Column(length = 300)
+ private String wechatId;
+
+ @Schema(title = "Access token : The notification method is valid for DingTalk robot",
+ description = "Access token : The notification method is valid for DingTalk robot",
+ example = "34823984635647", accessMode = READ_WRITE)
+ @Size(max = 300)
+ @Column(length = 300)
+ private String accessToken;
+
+ @Schema(title = "Telegram bot token : The notification method is valid for Telegram Bot",
+ description = "Telegram bot token : The notification method is valid for Telegram Bot",
+ example = "1499012345:AAEOB_wEYS-DZyPM3h5NzI8voJMXXXXXX", accessMode = READ_WRITE)
+ private String tgBotToken;
+
+ @Schema(title = "Telegram user id: The notification method is valid for Telegram Bot",
+ description = "Telegram user id: The notification method is valid for Telegram Bot",
+ example = "779294123", accessMode = READ_WRITE)
+ private String tgUserId;
+
+ @Schema(title = "DingTalk,FeiShu,WeWork user id: The notification method is valid for DingTalk,FeiShu,WeWork Bot",
+ description = "DingTalk,FeiShu,WeWork user id: The notification method is valid for DingTalk,FeiShu,WeWork Bot",
+ example = "779294123", accessMode = READ_WRITE)
+ private String userId;
+
+ @Schema(title = "URL address: The notification method is valid for Slack",
+ description = "URL address: The notification method is valid for Slack",
+ example = "https://hooks.slack.com/services/XXXX/XXXX/XXXX", accessMode = READ_WRITE)
+ @Size(max = 300)
+ @Column(length = 300)
+ private String slackWebHookUrl;
+
+ @Schema(title = "Enterprise weChat message: The notification method is valid for Enterprise WeChat app message",
+ description = "Enterprise weChat message: The notification method is valid for Enterprise WeChat app message",
+ example = "ww1a603432123d0dc1", accessMode = READ_WRITE)
+ private String corpId;
+
+ @Schema(title = "Enterprise weChat appId: The notification method is valid for Enterprise WeChat app message",
+ description = "Enterprise weChat appId: The notification method is valid for Enterprise WeChat app message",
+ example = "1000001", accessMode = READ_WRITE)
+ private Integer agentId;
+
+ @Schema(title = "Enterprise weChat secret: The notification method is valid for Enterprise WeChat app message",
+ description = "Enterprise weChat secret: The notification method is valid for Enterprise WeChat app message",
+ example = "oUydwn92ey0lnuY02MixNa57eNK-20dJn5NEOG-u2uE", accessMode = READ_WRITE)
+ private String appSecret;
+
+ @Schema(title = "Enterprise weChat party id: The notification method is valid for Enterprise WeChat app message",
+ description = "Enterprise weChat party id: The notification method is valid for Enterprise WeChat app message",
+ example = "779294123", accessMode = READ_WRITE)
+ private String partyId;
+
+ @Schema(title = "Enterprise weChat tag id: The notification method is valid for Enterprise WeChat app message",
+ description = "Enterprise weChat tag id: The notification method is valid for Enterprise WeChat app message",
+ example = "779294123", accessMode = READ_WRITE)
+ private String tagId;
+
+ @Schema(title = "Discord channel id: The notification method is valid for Discord",
+ description = "Discord channel id: The notification method is valid for Discord",
+ example = "1065303416030642266", accessMode = READ_WRITE)
+ @Size(max = 300)
+ @Column(length = 300)
+ private String discordChannelId;
+
+ @Schema(title = "Discord bot token: The notification method is valid for Discord",
+ description = "Discord bot token: The notification method is valid for Discord",
+ example = "MTA2NTMwMzU0ODY4Mzg4MjUzNw.xxxxx.xxxxxxx", accessMode = READ_WRITE)
+ @Size(max = 300)
+ @Column(length = 300)
+ private String discordBotToken;
+
+ @Schema(title = "huawei cloud SMN ak: If the notification method is valid for huawei cloud SMN",
+ description = "huawei cloud SMN ak: If the notification method is valid for huawei cloud SMN",
+ example = "NCVBODJOEYHSW3VNXXXX", accessMode = READ_WRITE)
+ @Size(max = 22)
+ @Column(length = 22)
+ private String smnAk;
+
+ @Schema(title = "huawei cloud SMN sk: If the notification method is valid for huawei cloud SMN",
+ description = "huawei cloud SMN sk: If the notification method is valid for huawei cloud SMN",
+ example = "nmSNhUJN9MlpPl8lfCsgdA0KvHCL9JXXXX", accessMode = READ_WRITE)
+ @Size(max = 42)
+ @Column(length = 42)
+ private String smnSk;
+
+ @Schema(title = "huawei cloud SMN projectId: If the notification method is valid for huawei cloud SMN",
+ description = "huawei cloud SMN projectId: If the notification method is valid for huawei cloud SMN",
+ example = "320c2fb11edb47a481c299c1XXXXXX", accessMode = READ_WRITE)
+ @Size(max = 32)
+ @Column(length = 32)
+ private String smnProjectId;
+
+ @Schema(title = "huawei cloud SMN region: If the notification method is valid for huawei cloud SMN",
+ description = "huawei cloud SMN region: If the notification method is valid for huawei cloud SMN",
+ example = "cn-east-3", accessMode = READ_WRITE)
+ @Size(max = 32)
+ @Column(length = 32)
+ private String smnRegion;
+
+ @Schema(title = "huawei cloud SMN TopicUrn: If the notification method is valid for huawei cloud SMN",
+ description = "huawei cloud SMN TopicUrn: If the notification method is valid for huawei cloud SMN",
+ example = "urn:smn:cn-east-3:xxx:hertzbeat_test", accessMode = READ_WRITE)
+ @Size(max = 300)
+ @Column(length = 300)
+ private String smnTopicUrn;
+
+ @Schema(title = "serverChanToken : The notification method is valid for ServerChan",
+ description = "serverChanToken : The notification method is valid for ServerChan",
+ example = "SCT193569TSNm6xIabdjqeZPtOGOWcvU1e", accessMode = READ_WRITE)
+ @Size(max = 300)
+ @Column(length = 300)
+ private String serverChanToken;
+
+ @Schema(title = "Gotify token : The notification method is valid for Gotify",
+ description = "Gotify token : The notification method is valid for Gotify",
+ example = "A845h__ZMqDxZlO", accessMode = READ_WRITE)
+ @Size(max = 300)
+ @Column(length = 300)
+ private String gotifyToken;
+
+ @Schema(title = "The creator of this record", example = "tom",
+ accessMode = READ_ONLY)
+ @CreatedBy
+ private String creator;
+
+ @Schema(title = "This record was last modified by", example = "tom", accessMode = READ_ONLY)
+ @LastModifiedBy
+ private String modifier;
+
+ @Schema(title = "Record creation time (millisecond timestamp)",
+ example = "1612198922000", accessMode = READ_ONLY)
+ @CreatedDate
+ private LocalDateTime gmtCreate;
+
+ @Schema(title = "Record the latest modification time (timestamp in milliseconds)",
+ example = "1612198444000", accessMode = READ_ONLY)
+ @LastModifiedDate
+ private LocalDateTime gmtUpdate;
+}
diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializer.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializer.java
new file mode 100644
index 00000000000..0f895f403a7
--- /dev/null
+++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializer.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hertzbeat.common.serialize;
+
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import org.apache.hertzbeat.common.cache.CacheFactory;
+import org.apache.hertzbeat.common.cache.CommonCacheService;
+import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO;
+
+import java.io.IOException;
+
+/**
+ * 2024-12-06
+ * Email Desensitizing serializer
+ */
+public class EmailDesensitizationSerializer extends JsonSerializer {
+
+ @Override
+ public void serialize(String email, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+ String emailDesensitization = "";
+ CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache();
+ if (StrUtil.isNotBlank(email)) {
+ int index = StrUtil.indexOf(email, '@');
+ emailDesensitization = index <= 1 ? email :
+ StrUtil.replace(email, 1, index, '*');
+ NoticeReceiverVO currentValue = (NoticeReceiverVO) jsonGenerator.getOutputContext().getCurrentValue();
+ desensitizationMapCache.put(currentValue.getId() + "_" + emailDesensitization, email);
+ }
+ jsonGenerator.writeString(emailDesensitization);
+ }
+}
\ No newline at end of file
diff --git a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializer.java b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializer.java
new file mode 100644
index 00000000000..a71ec44b1b9
--- /dev/null
+++ b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializer.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hertzbeat.common.serialize;
+
+import cn.hutool.core.util.DesensitizedUtil;
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import org.apache.hertzbeat.common.cache.CacheFactory;
+import org.apache.hertzbeat.common.cache.CommonCacheService;
+import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO;
+
+import java.io.IOException;
+
+/**
+ * 2024-12-06
+ * Phone Desensitizing serializer
+ */
+public class PhoneDesensitizationSerializer extends JsonSerializer {
+
+ @Override
+ public void serialize(String phone, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+ String phoneDesensitization = "";
+ CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache();
+ if (StrUtil.isNotBlank(phone)){
+ phoneDesensitization = DesensitizedUtil.mobilePhone(phone);
+ NoticeReceiverVO currentValue = (NoticeReceiverVO)jsonGenerator.getOutputContext().getCurrentValue();
+ desensitizationMapCache.put(currentValue.getId()+"_"+phoneDesensitization, phone);
+ }
+
+ jsonGenerator.writeString(phoneDesensitization);
+ }
+}
\ No newline at end of file
diff --git a/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializerTest.java b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializerTest.java
new file mode 100644
index 00000000000..2992af12c55
--- /dev/null
+++ b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/EmailDesensitizationSerializerTest.java
@@ -0,0 +1,42 @@
+package org.apache.hertzbeat.common.serialize;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import org.apache.hertzbeat.common.cache.CacheFactory;
+import org.apache.hertzbeat.common.cache.CommonCacheService;
+import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class EmailDesensitizationSerializerTest {
+
+ private EmailDesensitizationSerializer emailDesensitizationSerializer;
+
+ @BeforeEach
+ void setUp() {
+ emailDesensitizationSerializer = new EmailDesensitizationSerializer();
+ }
+
+ @Test
+ public void test() throws JsonProcessingException {
+ NoticeReceiverVO noticeReceiver = new NoticeReceiverVO();
+ noticeReceiver.setId(1L);
+ noticeReceiver.setEmail("12345@163.com");
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ SimpleModule simpleModule = new SimpleModule();
+ simpleModule.addSerializer(String.class,emailDesensitizationSerializer);
+
+ objectMapper.registerModule(simpleModule);
+
+ String jsonString = objectMapper.writeValueAsString(noticeReceiver);
+ NoticeReceiverVO noticeReceiverVO = objectMapper.readValue(jsonString, NoticeReceiverVO.class);
+
+ CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache();
+
+ assertEquals(noticeReceiver.getEmail(),desensitizationMapCache.get(noticeReceiverVO.getId()+"_"+noticeReceiverVO.getEmail()));
+ }
+}
\ No newline at end of file
diff --git a/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializerTest.java b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializerTest.java
new file mode 100644
index 00000000000..cdf0899d263
--- /dev/null
+++ b/hertzbeat-common/src/test/java/org/apache/hertzbeat/common/serialize/PhoneDesensitizationSerializerTest.java
@@ -0,0 +1,42 @@
+package org.apache.hertzbeat.common.serialize;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import org.apache.hertzbeat.common.cache.CacheFactory;
+import org.apache.hertzbeat.common.cache.CommonCacheService;
+import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class PhoneDesensitizationSerializerTest {
+
+ private PhoneDesensitizationSerializer phoneDesensitizationSerializer;
+
+ @BeforeEach
+ void setUp() {
+ phoneDesensitizationSerializer = new PhoneDesensitizationSerializer();
+ }
+
+ @Test
+ public void test() throws JsonProcessingException {
+ NoticeReceiverVO noticeReceiver = new NoticeReceiverVO();
+ noticeReceiver.setId(1L);
+ noticeReceiver.setPhone("12345678910");
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ SimpleModule simpleModule = new SimpleModule();
+ simpleModule.addSerializer(String.class,phoneDesensitizationSerializer);
+
+ objectMapper.registerModule(simpleModule);
+
+ String jsonString = objectMapper.writeValueAsString(noticeReceiver);
+ NoticeReceiverVO noticeReceiverVO = objectMapper.readValue(jsonString, NoticeReceiverVO.class);
+
+ CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache();
+
+ assertEquals(noticeReceiver.getPhone(),desensitizationMapCache.get(noticeReceiverVO.getId()+"_"+noticeReceiverVO.getPhone()));
+ }
+}
\ No newline at end of file
diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/NoticeConfigController.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/NoticeConfigController.java
index 241bddaa070..cb8b1fe0c0f 100644
--- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/NoticeConfigController.java
+++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/controller/NoticeConfigController.java
@@ -19,6 +19,8 @@
import static org.apache.hertzbeat.common.constants.CommonConstants.FAIL_CODE;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
+
+import cn.hutool.core.bean.BeanUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -26,6 +28,7 @@
import java.util.Optional;
import javax.validation.Valid;
import org.apache.hertzbeat.common.entity.dto.Message;
+import org.apache.hertzbeat.common.entity.dto.vo.NoticeReceiverVO;
import org.apache.hertzbeat.common.entity.manager.NoticeReceiver;
import org.apache.hertzbeat.common.entity.manager.NoticeRule;
import org.apache.hertzbeat.common.entity.manager.NoticeTemplate;
@@ -82,9 +85,9 @@ public ResponseEntity> deleteNoticeReceiver(
@GetMapping(path = "/receivers")
@Operation(summary = "Get a list of message notification recipients based on query filter items",
description = "Get a list of message notification recipients based on query filter items")
- public ResponseEntity>> getReceivers(
+ public ResponseEntity>> getReceivers(
@Parameter(description = "en: Recipient name,support fuzzy query", example = "tom") @RequestParam(required = false) final String name) {
- return ResponseEntity.ok(Message.success(noticeConfigService.getNoticeReceivers(name)));
+ return ResponseEntity.ok(Message.success(BeanUtil.copyToList(noticeConfigService.getNoticeReceivers(name), NoticeReceiverVO.class)));
}
@PostMapping(path = "/rule")
diff --git a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/NoticeConfigServiceImpl.java b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/NoticeConfigServiceImpl.java
index b4dd9b5c01d..a33c1fa44c0 100644
--- a/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/NoticeConfigServiceImpl.java
+++ b/hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/NoticeConfigServiceImpl.java
@@ -17,6 +17,7 @@
package org.apache.hertzbeat.manager.service.impl;
+import cn.hutool.core.util.ObjectUtil;
import jakarta.persistence.criteria.Predicate;
import java.io.IOException;
import java.io.InputStream;
@@ -132,6 +133,14 @@ public void addReceiver(NoticeReceiver noticeReceiver) {
@Override
public void editReceiver(NoticeReceiver noticeReceiver) {
+ CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache();
+ if (ObjectUtil.isNotEmpty(noticeReceiver.getEmail()) && ObjectUtil.isNotEmpty(desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getEmail()))){
+ noticeReceiver.setEmail((String) desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getEmail()));
+ }
+ if (ObjectUtil.isNotEmpty(noticeReceiver.getPhone()) && ObjectUtil.isNotEmpty(desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getPhone()))){
+ noticeReceiver.setPhone((String) desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getPhone()));
+ }
+
noticeReceiverDao.save(noticeReceiver);
}
@@ -267,6 +276,16 @@ public NoticeTemplate getDefaultNoticeTemplateByType(Byte type) {
@Override
public boolean sendTestMsg(NoticeReceiver noticeReceiver) {
+ if (null != noticeReceiver.getId()){
+ CommonCacheService desensitizationMapCache = CacheFactory.getDesensitizationMapCache();
+ if (ObjectUtil.isNotEmpty(noticeReceiver.getEmail()) && ObjectUtil.isNotEmpty(desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getEmail()))){
+ noticeReceiver.setEmail((String) desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getEmail()));
+ }
+ if (ObjectUtil.isNotEmpty(noticeReceiver.getPhone()) && ObjectUtil.isNotEmpty(desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getPhone()))){
+ noticeReceiver.setPhone((String) desensitizationMapCache.get(noticeReceiver.getId()+"_"+noticeReceiver.getPhone()));
+ }
+ }
+
Map tags = new HashMap<>(8);
tags.put(CommonConstants.TAG_MONITOR_ID, "100");
tags.put(CommonConstants.TAG_MONITOR_NAME, "100Name");
diff --git a/pom.xml b/pom.xml
index 05974f113fa..cb6242bb543 100644
--- a/pom.xml
+++ b/pom.xml
@@ -163,6 +163,7 @@
3.1.37
3.23.5
3.8.0
+ 5.8.20
0.13.3
2.23
@@ -474,6 +475,13 @@
spring-boot-starter-test
test
+
+
+
+ cn.hutool
+ hutool-all
+ ${hutool-all.version}
+