From d42854eeeb4914892604dd05e8144da8b8a46416 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Thu, 23 May 2024 11:48:52 +0800 Subject: [PATCH 1/5] [Core] [User] Fix user login registration loading status --- core/datacap-ui/src/views/auth/signin/AuthSignin.vue | 6 +++++- core/datacap-ui/src/views/auth/signup/AuthSignup.vue | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/datacap-ui/src/views/auth/signin/AuthSignin.vue b/core/datacap-ui/src/views/auth/signin/AuthSignin.vue index f1d4dc8d2..326f79287 100644 --- a/core/datacap-ui/src/views/auth/signin/AuthSignin.vue +++ b/core/datacap-ui/src/views/auth/signin/AuthSignin.vue @@ -143,7 +143,10 @@ export default defineComponent({ captchaImage.value = response.data.image } }) - .finally(() => captchaLoading.value = false) + .finally(() => { + captchaLoading.value = false + loading.value = false + }) } const onSubmit = handleSubmit(() => { @@ -198,6 +201,7 @@ export default defineComponent({ methods: { handlerInitialize() { + this.loading = true this.refererCaptcha() } } diff --git a/core/datacap-ui/src/views/auth/signup/AuthSignup.vue b/core/datacap-ui/src/views/auth/signup/AuthSignup.vue index 8440a0744..6df20b264 100644 --- a/core/datacap-ui/src/views/auth/signup/AuthSignup.vue +++ b/core/datacap-ui/src/views/auth/signup/AuthSignup.vue @@ -157,7 +157,10 @@ export default defineComponent({ captchaImage.value = response.data.image } }) - .finally(() => captchaLoading.value = false) + .finally(() => { + captchaLoading.value = false + loading.value = false + }) } const onSubmit = handleSubmit(() => { @@ -193,6 +196,7 @@ export default defineComponent({ methods: { handlerInitialize() { + this.loading = true this.refererCaptcha() } } From 12e9b4eea2dda50237196885449dd07aa59b1645 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Thu, 23 May 2024 15:44:34 +0800 Subject: [PATCH 2/5] [Core] [Notify] Add spi --- notify/datacap-notify-spi/pom.xml | 39 +++++++++++++++++++ .../kotlin/io/edurt/datacap/notify/Notify.kt | 21 ++++++++++ .../io/edurt/datacap/notify/NotifyManager.kt | 22 +++++++++++ .../io/edurt/datacap/notify/NotifyModule.kt | 11 ++++++ .../datacap/notify/model/NotifyRequest.kt | 8 ++++ .../datacap/notify/model/NotifyResponse.kt | 12 ++++++ .../edurt/datacap/notify/NotifyModuleTest.kt | 36 +++++++++++++++++ .../io/edurt/datacap/notify/TestNotify.kt | 13 +++++++ .../edurt/datacap/notify/TestNotifyModule.kt | 13 +++++++ .../io.edurt.datacap.notify.NotifyModule | 1 + pom.xml | 1 + 11 files changed, 177 insertions(+) create mode 100644 notify/datacap-notify-spi/pom.xml create mode 100644 notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/Notify.kt create mode 100644 notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyManager.kt create mode 100644 notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyModule.kt create mode 100644 notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyRequest.kt create mode 100644 notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyResponse.kt create mode 100644 notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/NotifyModuleTest.kt create mode 100644 notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/TestNotify.kt create mode 100644 notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/TestNotifyModule.kt create mode 100644 notify/datacap-notify-spi/src/test/resources/META-INF/services/io.edurt.datacap.notify.NotifyModule diff --git a/notify/datacap-notify-spi/pom.xml b/notify/datacap-notify-spi/pom.xml new file mode 100644 index 000000000..29071092b --- /dev/null +++ b/notify/datacap-notify-spi/pom.xml @@ -0,0 +1,39 @@ + + + + io.edurt.datacap + datacap + 2024.03.5-SNAPSHOT + ../../pom.xml + + 4.0.0 + + datacap-notify-spi + DataCap - Notify spi + + + + org.jetbrains.kotlin + kotlin-reflect + + + com.google.inject + guice + + + ch.qos.logback + logback-classic + + + + + + + org.jetbrains.dokka + dokka-maven-plugin + + + + diff --git a/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/Notify.kt b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/Notify.kt new file mode 100644 index 000000000..c84bbeec5 --- /dev/null +++ b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/Notify.kt @@ -0,0 +1,21 @@ +package io.edurt.datacap.notify + +import io.edurt.datacap.notify.model.NotifyRequest +import io.edurt.datacap.notify.model.NotifyResponse + +interface Notify +{ + fun name(): String + { + return this.javaClass + .simpleName + .removeSuffix("Notify") + } + + fun description(): String + { + return "Integrate ${name()} notify" + } + + fun send(request: NotifyRequest): NotifyResponse +} diff --git a/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyManager.kt b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyManager.kt new file mode 100644 index 000000000..42a653a7d --- /dev/null +++ b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyManager.kt @@ -0,0 +1,22 @@ +package io.edurt.datacap.notify + +import com.google.inject.AbstractModule +import org.slf4j.Logger +import org.slf4j.LoggerFactory.getLogger +import java.util.* + +class NotifyManager : AbstractModule() +{ + private val log: Logger = getLogger(NotifyManager::class.java) + private var externalModules: Iterable = ServiceLoader.load(NotifyModule::class.java) + + override fun configure() + { + log.info("========== Loading notify start ==========") + externalModules.forEach { module -> + log.info("Installing notify [ {} ] join time [ {} ]", module.name(), System.currentTimeMillis()) + install(module) + } + log.info("========== Loading notify end ==========") + } +} diff --git a/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyModule.kt b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyModule.kt new file mode 100644 index 000000000..1ff0ff0f2 --- /dev/null +++ b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyModule.kt @@ -0,0 +1,11 @@ +package io.edurt.datacap.notify + +import com.google.inject.AbstractModule + +abstract class NotifyModule : AbstractModule() +{ + fun name(): String = this.javaClass + .simpleName + .removeSuffix("Notify") + .removeSuffix("Module") +} diff --git a/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyRequest.kt b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyRequest.kt new file mode 100644 index 000000000..60af79ffc --- /dev/null +++ b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyRequest.kt @@ -0,0 +1,8 @@ +package io.edurt.datacap.notify.model + +class NotifyRequest +{ + var title: String? = null + var content: String? = null + var sendTo: String? = null +} diff --git a/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyResponse.kt b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyResponse.kt new file mode 100644 index 000000000..0e3ceef28 --- /dev/null +++ b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyResponse.kt @@ -0,0 +1,12 @@ +package io.edurt.datacap.notify.model + +class NotifyResponse +{ + var successful: Boolean = false + var message: String? = null + + override fun toString(): String + { + return "NotifyResponse(successful=$successful, message=$message)" + } +} diff --git a/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/NotifyModuleTest.kt b/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/NotifyModuleTest.kt new file mode 100644 index 000000000..b4e895b24 --- /dev/null +++ b/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/NotifyModuleTest.kt @@ -0,0 +1,36 @@ +package io.edurt.datacap.notify + +import com.google.inject.Guice +import com.google.inject.Injector +import com.google.inject.Key +import com.google.inject.TypeLiteral +import io.edurt.datacap.notify.model.NotifyRequest +import org.junit.Assert +import org.junit.Test +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.util.* + +class NotifyModuleTest +{ + private val log: Logger = LoggerFactory.getLogger(TestNotify::class.java) + private val injector: Injector = Guice.createInjector(NotifyManager()) + + @Test + fun test() + { + val optional: Optional = injector.getInstance(Key.get(object : TypeLiteral>() + {})) + .stream() + .findFirst() + + optional.ifPresent { + val request = NotifyRequest() + request.title = "This is title" + request.content = "This is content" + request.sendTo = "community@devlive.org" + log.info("Notify response: {}", it.send(request)) + Assert.assertEquals("Test", it.name()) + } + } +} diff --git a/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/TestNotify.kt b/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/TestNotify.kt new file mode 100644 index 000000000..20a63f35c --- /dev/null +++ b/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/TestNotify.kt @@ -0,0 +1,13 @@ +package io.edurt.datacap.notify + +import io.edurt.datacap.notify.model.NotifyRequest +import io.edurt.datacap.notify.model.NotifyResponse + +class TestNotify : Notify +{ + override fun send(request: NotifyRequest): NotifyResponse + { + val response = NotifyResponse() + return response + } +} diff --git a/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/TestNotifyModule.kt b/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/TestNotifyModule.kt new file mode 100644 index 000000000..ee2950add --- /dev/null +++ b/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/TestNotifyModule.kt @@ -0,0 +1,13 @@ +package io.edurt.datacap.notify + +import com.google.inject.multibindings.Multibinder + +class TestNotifyModule : NotifyModule() +{ + override fun configure() + { + Multibinder.newSetBinder(this.binder(), Notify::class.java) + .addBinding() + .to(TestNotify::class.java) + } +} diff --git a/notify/datacap-notify-spi/src/test/resources/META-INF/services/io.edurt.datacap.notify.NotifyModule b/notify/datacap-notify-spi/src/test/resources/META-INF/services/io.edurt.datacap.notify.NotifyModule new file mode 100644 index 000000000..52d86800f --- /dev/null +++ b/notify/datacap-notify-spi/src/test/resources/META-INF/services/io.edurt.datacap.notify.NotifyModule @@ -0,0 +1 @@ +io.edurt.datacap.notify.TestNotifyModule diff --git a/pom.xml b/pom.xml index 29fb62fb9..3fa748c1d 100644 --- a/pom.xml +++ b/pom.xml @@ -87,6 +87,7 @@ parser/datacap-parser-mysql scheduler/datacap-scheduler-spi scheduler/datacap-scheduler-local + notify/datacap-notify-spi datacap From 34c4241ba5184dfda7f89647da9294f853dd881f Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Thu, 23 May 2024 19:53:25 +0800 Subject: [PATCH 3/5] [Core] [Notify] Add dingtalk --- .../datacap/common/response/SignResponse.java | 14 ++++ .../edurt/datacap/common/utils/SignUtils.java | 39 ++++++++++ .../datacap/common/utils/SignUtilsTest.java | 15 ++++ .../io/edurt/datacap/lib/http/HttpClient.java | 25 ++++-- notify/datacap-notify-dingtalk/pom.xml | 36 +++++++++ .../datacap/notify/dingtalk/DingTalkModule.kt | 15 ++++ .../datacap/notify/dingtalk/DingTalkNotify.kt | 13 ++++ .../datacap/notify/dingtalk/DingTalkUtils.kt | 76 +++++++++++++++++++ .../notify/dingtalk/model/ReturnModel.kt | 12 +++ .../notify/dingtalk/model/TextModel.kt | 6 ++ .../io.edurt.datacap.notify.NotifyModule | 1 + .../notify/dingtalk/DingTalkModuleTest.kt | 32 ++++++++ .../notify/dingtalk/DingTalkNotifyTest.kt | 38 ++++++++++ .../notify/dingtalk/DingTalkUtilsTest.kt | 28 +++++++ .../io/edurt/datacap/notify/NotifyType.kt | 6 ++ .../datacap/notify/model/NotifyRequest.kt | 5 ++ pom.xml | 11 +++ 17 files changed, 364 insertions(+), 8 deletions(-) create mode 100644 core/datacap-common/src/main/java/io/edurt/datacap/common/response/SignResponse.java create mode 100644 core/datacap-common/src/main/java/io/edurt/datacap/common/utils/SignUtils.java create mode 100644 core/datacap-common/src/test/java/io/edurt/datacap/common/utils/SignUtilsTest.java create mode 100644 notify/datacap-notify-dingtalk/pom.xml create mode 100644 notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkModule.kt create mode 100644 notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkNotify.kt create mode 100644 notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkUtils.kt create mode 100644 notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/model/ReturnModel.kt create mode 100644 notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/model/TextModel.kt create mode 100644 notify/datacap-notify-dingtalk/src/main/resources/META-INF/services/io.edurt.datacap.notify.NotifyModule create mode 100644 notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkModuleTest.kt create mode 100644 notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkNotifyTest.kt create mode 100644 notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkUtilsTest.kt create mode 100644 notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyType.kt diff --git a/core/datacap-common/src/main/java/io/edurt/datacap/common/response/SignResponse.java b/core/datacap-common/src/main/java/io/edurt/datacap/common/response/SignResponse.java new file mode 100644 index 000000000..64f612049 --- /dev/null +++ b/core/datacap-common/src/main/java/io/edurt/datacap/common/response/SignResponse.java @@ -0,0 +1,14 @@ +package io.edurt.datacap.common.response; + +import lombok.Builder; +import lombok.Data; +import lombok.ToString; + +@Data +@Builder +@ToString +public class SignResponse +{ + private Long timestamp; + private String sign; +} diff --git a/core/datacap-common/src/main/java/io/edurt/datacap/common/utils/SignUtils.java b/core/datacap-common/src/main/java/io/edurt/datacap/common/utils/SignUtils.java new file mode 100644 index 000000000..4582e16ef --- /dev/null +++ b/core/datacap-common/src/main/java/io/edurt/datacap/common/utils/SignUtils.java @@ -0,0 +1,39 @@ +package io.edurt.datacap.common.utils; + +import io.edurt.datacap.common.response.SignResponse; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class SignUtils +{ + private SignUtils() + {} + + /** + * Generates a signature using the provided secret. + * + * @param secret the secret key used for signing + * @return the SignResponse object containing the generated signature and timestamp + * @throws Exception if an error occurs during the signing process + */ + public static SignResponse sign(String secret) + throws Exception + { + Long timestamp = System.currentTimeMillis(); + String stringToSign = timestamp + "\n" + secret; + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); + byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); + Base64.Encoder encoder = Base64.getEncoder(); + String sign = URLEncoder.encode(encoder.encodeToString(signData), "UTF-8"); + return SignResponse.builder() + .timestamp(timestamp) + .sign(sign) + .build(); + } +} diff --git a/core/datacap-common/src/test/java/io/edurt/datacap/common/utils/SignUtilsTest.java b/core/datacap-common/src/test/java/io/edurt/datacap/common/utils/SignUtilsTest.java new file mode 100644 index 000000000..4e3a4dbe6 --- /dev/null +++ b/core/datacap-common/src/test/java/io/edurt/datacap/common/utils/SignUtilsTest.java @@ -0,0 +1,15 @@ +package io.edurt.datacap.common.utils; + +import org.junit.Assert; +import org.junit.Test; + +public class SignUtilsTest +{ + @Test + public void testSign() + throws Exception + { + Assert.assertNotNull(SignUtils.sign("SSSS") + .getSign()); + } +} diff --git a/lib/datacap-http/src/main/java/io/edurt/datacap/lib/http/HttpClient.java b/lib/datacap-http/src/main/java/io/edurt/datacap/lib/http/HttpClient.java index e6114a1d2..0e86f6511 100644 --- a/lib/datacap-http/src/main/java/io/edurt/datacap/lib/http/HttpClient.java +++ b/lib/datacap-http/src/main/java/io/edurt/datacap/lib/http/HttpClient.java @@ -1,6 +1,7 @@ package io.edurt.datacap.lib.http; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import lombok.extern.slf4j.Slf4j; import okhttp3.ConnectionPool; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; @@ -13,6 +14,7 @@ import java.io.IOException; import java.util.concurrent.TimeUnit; +@Slf4j @SuppressFBWarnings(value = {"NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"}, justification = "I prefer to suppress these FindBugs warnings") public class HttpClient @@ -66,25 +68,31 @@ private String get() builder.addQueryParameter(key, configure.getParams().get(key)); } } + log.info("Request url {}", builder.build()); Request request = new Request.Builder() .addHeader("Accept-Encoding", "identity") - .url(builder.build().toString()).build(); + .url(builder.build().toString()) + .build(); return execute(request); } private String post() { RequestBody requestBody = RequestBody.create(configure.getMediaType(), configure.getBody()); - HttpUrl.Builder builder = HttpUrl.parse(this.formatJdbcUrl()).newBuilder(); + HttpUrl.Builder builder = HttpUrl.parse(this.formatJdbcUrl()) + .newBuilder(); // Adding Path Parameters if (ObjectUtils.isNotEmpty(configure.getParams())) { for (String key : configure.getParams().keySet()) { - builder.addQueryParameter(key, configure.getParams().get(key)); + builder.addEncodedQueryParameter(key, configure.getParams() + .get(key)); } } - Request request = new Request.Builder().post(requestBody) + log.info("Request url {}", builder.build()); + Request request = new Request.Builder() + .post(requestBody) .addHeader("Accept-Encoding", "identity") .url(builder.build().toString()).build(); return execute(request); @@ -93,12 +101,13 @@ private String post() private String execute(Request request) { String responseBody = null; - try { - Response response = okHttpClient.newCall(request).execute(); - responseBody = response.body().string(); + try (Response response = okHttpClient.newCall(request) + .execute()) { + responseBody = response.body() + .string(); } catch (IOException | NullPointerException e) { - e.printStackTrace(); + log.warn("Request error", e); } return responseBody; } diff --git a/notify/datacap-notify-dingtalk/pom.xml b/notify/datacap-notify-dingtalk/pom.xml new file mode 100644 index 000000000..844280624 --- /dev/null +++ b/notify/datacap-notify-dingtalk/pom.xml @@ -0,0 +1,36 @@ + + + + io.edurt.datacap + datacap + 2024.03.5-SNAPSHOT + ../../pom.xml + + 4.0.0 + + datacap-notify-dingtalk + DataCap - Parser for dingtalk + + + + io.edurt.datacap + datacap-notify-spi + + + io.edurt.datacap + datacap-http + + + + + + + org.jetbrains.dokka + dokka-maven-plugin + + + + + diff --git a/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkModule.kt b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkModule.kt new file mode 100644 index 000000000..f1fc79cc5 --- /dev/null +++ b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkModule.kt @@ -0,0 +1,15 @@ +package io.edurt.datacap.notify.dingtalk + +import com.google.inject.multibindings.Multibinder +import io.edurt.datacap.notify.Notify +import io.edurt.datacap.notify.NotifyModule + +class DingTalkModule : NotifyModule() +{ + override fun configure() + { + Multibinder.newSetBinder(this.binder(), Notify::class.java) + .addBinding() + .to(DingTalkNotify::class.java) + } +} diff --git a/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkNotify.kt b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkNotify.kt new file mode 100644 index 000000000..5520c1b80 --- /dev/null +++ b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkNotify.kt @@ -0,0 +1,13 @@ +package io.edurt.datacap.notify.dingtalk + +import io.edurt.datacap.notify.Notify +import io.edurt.datacap.notify.model.NotifyRequest +import io.edurt.datacap.notify.model.NotifyResponse + +class DingTalkNotify : Notify +{ + override fun send(request: NotifyRequest): NotifyResponse + { + return DingTalkUtils.send(request) + } +} diff --git a/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkUtils.kt b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkUtils.kt new file mode 100644 index 000000000..73a4fe73a --- /dev/null +++ b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/DingTalkUtils.kt @@ -0,0 +1,76 @@ +package io.edurt.datacap.notify.dingtalk + +import io.edurt.datacap.common.utils.JsonUtils +import io.edurt.datacap.common.utils.SignUtils +import io.edurt.datacap.lib.http.HttpClient +import io.edurt.datacap.lib.http.HttpConfigure +import io.edurt.datacap.lib.http.HttpMethod +import io.edurt.datacap.notify.NotifyType +import io.edurt.datacap.notify.dingtalk.model.ReturnModel +import io.edurt.datacap.notify.dingtalk.model.TextModel +import io.edurt.datacap.notify.model.NotifyRequest +import io.edurt.datacap.notify.model.NotifyResponse +import org.apache.commons.lang3.StringUtils.isNotEmpty +import org.slf4j.Logger +import org.slf4j.LoggerFactory.getLogger + +object DingTalkUtils +{ + private val log: Logger = getLogger(DingTalkUtils::class.java) + + @JvmStatic + fun send(request: NotifyRequest): NotifyResponse + { + val configure = HttpConfigure() + configure.autoConnected = false + configure.retry = 0 + configure.protocol = "https" + configure.host = "oapi.dingtalk.com" + configure.port = 443 + configure.path = "robot/send" + configure.method = HttpMethod.POST + + val params = mutableMapOf("access_token" to request.access) + if (isNotEmpty(request.secret)) + { + val signResponse = SignUtils.sign(request.secret) + log.info("Sign response: ${JsonUtils.toJSON(signResponse)}") + params["sign"] = signResponse.sign + params["timestamp"] = signResponse.timestamp.toString() + } + configure.params = params + log.info("Notify request params: ${JsonUtils.toJSON(params)}") + + val text = TextModel() + text.content = request.content + configure.body = JsonUtils.toJSON(mapOf("text" to text, "msgtype" to formatMessageType(request))) + log.info("Notify request body: ${configure.body}") + + val client = HttpClient(configure) + val returnModel = JsonUtils.toObject(client.execute(), ReturnModel::class.java) + val response = NotifyResponse() + if (returnModel.code == 0) + { + response.successful = true + response.message = null + } + else + { + response.successful = false + response.message = returnModel.message + } + return response + } + + private fun formatMessageType(request: NotifyRequest): String + { + if (request.type == NotifyType.TEXT) + { + return "text" + } + else + { + return "markdown" + } + } +} diff --git a/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/model/ReturnModel.kt b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/model/ReturnModel.kt new file mode 100644 index 000000000..8e5e18cda --- /dev/null +++ b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/model/ReturnModel.kt @@ -0,0 +1,12 @@ +package io.edurt.datacap.notify.dingtalk.model + +import com.fasterxml.jackson.annotation.JsonProperty + +class ReturnModel +{ + @JsonProperty(value = "errcode") + var code: Number? = null + + @JsonProperty(value = "errmsg") + var message: String? = null +} \ No newline at end of file diff --git a/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/model/TextModel.kt b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/model/TextModel.kt new file mode 100644 index 000000000..1008858d7 --- /dev/null +++ b/notify/datacap-notify-dingtalk/src/main/kotlin/io/edurt/datacap/notify/dingtalk/model/TextModel.kt @@ -0,0 +1,6 @@ +package io.edurt.datacap.notify.dingtalk.model + +class TextModel +{ + var content: String? = null +} diff --git a/notify/datacap-notify-dingtalk/src/main/resources/META-INF/services/io.edurt.datacap.notify.NotifyModule b/notify/datacap-notify-dingtalk/src/main/resources/META-INF/services/io.edurt.datacap.notify.NotifyModule new file mode 100644 index 000000000..0593294eb --- /dev/null +++ b/notify/datacap-notify-dingtalk/src/main/resources/META-INF/services/io.edurt.datacap.notify.NotifyModule @@ -0,0 +1 @@ +io.edurt.datacap.notify.dingtalk.DingTalkModule diff --git a/notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkModuleTest.kt b/notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkModuleTest.kt new file mode 100644 index 000000000..95afb26e7 --- /dev/null +++ b/notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkModuleTest.kt @@ -0,0 +1,32 @@ +package io.edurt.datacap.notify.dingtalk + +import com.google.inject.Guice +import com.google.inject.Injector +import com.google.inject.Key +import com.google.inject.TypeLiteral +import io.edurt.datacap.notify.Notify +import io.edurt.datacap.notify.NotifyManager +import org.junit.Assert.assertNotNull +import org.junit.Before +import org.junit.Test + +class DingTalkModuleTest +{ + private val name = "DingTalk" + private var injector: Injector? = null + + @Before + fun before() + { + injector = Guice.createInjector(NotifyManager()) + } + + @Test + fun test() + { + val notify: Notify? = injector?.getInstance(Key.get(object : TypeLiteral>() + {})) + ?.first { it.name() == name } + assertNotNull(notify) + } +} diff --git a/notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkNotifyTest.kt b/notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkNotifyTest.kt new file mode 100644 index 000000000..8e9b28afb --- /dev/null +++ b/notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkNotifyTest.kt @@ -0,0 +1,38 @@ +package io.edurt.datacap.notify.dingtalk + +import com.google.inject.Guice +import com.google.inject.Injector +import com.google.inject.Key +import com.google.inject.TypeLiteral +import io.edurt.datacap.notify.Notify +import io.edurt.datacap.notify.NotifyManager +import io.edurt.datacap.notify.model.NotifyRequest +import org.junit.Assert.assertNotNull +import org.junit.Before +import org.junit.Test + +class DingTalkNotifyTest +{ + private val name = "DingTalk" + private var injector: Injector? = null + private val request: NotifyRequest = NotifyRequest() + + @Before + fun before() + { + injector = Guice.createInjector(NotifyManager()) + + request.access = "ACCESS" + request.content = "Test Message" + request.secret = "SECRET" + } + + @Test + fun test() + { + val notify: Notify? = injector?.getInstance(Key.get(object : TypeLiteral>() + {})) + ?.first { it.name() == name } + assertNotNull(notify?.send(request)) + } +} diff --git a/notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkUtilsTest.kt b/notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkUtilsTest.kt new file mode 100644 index 000000000..d800bcd0d --- /dev/null +++ b/notify/datacap-notify-dingtalk/src/test/java/io/edurt/datacap/notify/dingtalk/DingTalkUtilsTest.kt @@ -0,0 +1,28 @@ +package io.edurt.datacap.notify.dingtalk + +import io.edurt.datacap.notify.model.NotifyRequest +import org.junit.Assert +import org.junit.Before +import org.junit.Test + +class DingTalkUtilsTest +{ + private val request: NotifyRequest = NotifyRequest() + + @Before + fun before() + { + request.access = "ACCESS" + request.content = "Test Message" + request.secret = "SECRET" + } + + @Test + fun testSend() + { + Assert.assertFalse( + DingTalkUtils.send(request) + .successful + ) + } +} diff --git a/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyType.kt b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyType.kt new file mode 100644 index 000000000..0efef751c --- /dev/null +++ b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyType.kt @@ -0,0 +1,6 @@ +package io.edurt.datacap.notify + +enum class NotifyType +{ + TEXT +} diff --git a/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyRequest.kt b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyRequest.kt index 60af79ffc..a460a84f2 100644 --- a/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyRequest.kt +++ b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/model/NotifyRequest.kt @@ -1,8 +1,13 @@ package io.edurt.datacap.notify.model +import io.edurt.datacap.notify.NotifyType + class NotifyRequest { var title: String? = null var content: String? = null var sendTo: String? = null + var access: String? = null + var secret: String? = null + var type: NotifyType = NotifyType.TEXT } diff --git a/pom.xml b/pom.xml index 3fa748c1d..022886a93 100644 --- a/pom.xml +++ b/pom.xml @@ -88,6 +88,7 @@ scheduler/datacap-scheduler-spi scheduler/datacap-scheduler-local notify/datacap-notify-spi + notify/datacap-notify-dingtalk datacap @@ -216,6 +217,11 @@ datacap-common ${project.version} + + io.edurt.datacap + datacap-http + ${project.version} + org.springframework.boot spring-boot-starter-web @@ -306,6 +312,11 @@ datacap-parser-spi ${project.version} + + io.edurt.datacap + datacap-notify-spi + ${project.version} + mysql mysql-connector-java From 71bf8d8429aedb588f6582c4c9944ebd3659c660 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Thu, 23 May 2024 20:07:49 +0800 Subject: [PATCH 4/5] [Core] [Notify] Add filter --- core/datacap-server/pom.xml | 6 +++++ .../server/configure/PluginConfigure.java | 4 ++- .../io/edurt/datacap/notify/NotifyFilter.kt | 26 +++++++++++++++++++ .../edurt/datacap/notify/NotifyFilterTest.kt | 16 ++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyFilter.kt create mode 100644 notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/NotifyFilterTest.kt diff --git a/core/datacap-server/pom.xml b/core/datacap-server/pom.xml index 862a97c8f..bccf56a02 100644 --- a/core/datacap-server/pom.xml +++ b/core/datacap-server/pom.xml @@ -404,6 +404,12 @@ datacap-fs-alioss ${project.version} + + + io.edurt.datacap + datacap-notify-dingtalk + ${project.version} + diff --git a/core/datacap-server/src/main/java/io/edurt/datacap/server/configure/PluginConfigure.java b/core/datacap-server/src/main/java/io/edurt/datacap/server/configure/PluginConfigure.java index 325f1a5e4..e31120608 100644 --- a/core/datacap-server/src/main/java/io/edurt/datacap/server/configure/PluginConfigure.java +++ b/core/datacap-server/src/main/java/io/edurt/datacap/server/configure/PluginConfigure.java @@ -4,6 +4,7 @@ import com.google.inject.Injector; import io.edurt.datacap.executor.ExecutorManager; import io.edurt.datacap.fs.FsManager; +import io.edurt.datacap.notify.NotifyManager; import io.edurt.datacap.parser.ParserManager; import io.edurt.datacap.scheduler.ScheduleManager; import io.edurt.datacap.spi.PluginLoader; @@ -20,6 +21,7 @@ public Injector injector() new FsManager(), new ParserManager(), new ScheduleManager(), - new ExecutorManager()); + new ExecutorManager(), + new NotifyManager()); } } diff --git a/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyFilter.kt b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyFilter.kt new file mode 100644 index 000000000..5d1e1e13f --- /dev/null +++ b/notify/datacap-notify-spi/src/main/kotlin/io/edurt/datacap/notify/NotifyFilter.kt @@ -0,0 +1,26 @@ +package io.edurt.datacap.notify + +import com.google.inject.Injector +import com.google.inject.Key +import com.google.inject.TypeLiteral +import java.util.* + +object NotifyFilter +{ + /** + * Finds a Notify object by name using the given injector. + * + * @param injector the Guice injector used for dependency injection + * @param name the name of the Notify object to find + * @return an Optional containing the found Notify object, or an empty Optional if not found + */ + @JvmStatic + fun findNotify(injector: Injector, name: String): Optional + { + return injector.getInstance(Key.get(object : TypeLiteral>() + {})) + .stream() + .filter { it.name() == name } + .findFirst() + } +} diff --git a/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/NotifyFilterTest.kt b/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/NotifyFilterTest.kt new file mode 100644 index 000000000..0ad70e240 --- /dev/null +++ b/notify/datacap-notify-spi/src/test/kotlin/io/edurt/datacap/notify/NotifyFilterTest.kt @@ -0,0 +1,16 @@ +package io.edurt.datacap.notify + +import com.google.inject.Guice +import org.junit.Assert +import org.junit.Test + +class NotifyFilterTest +{ + private val injector = Guice.createInjector(NotifyManager()) + + @Test + fun testFindNotify() + { + Assert.assertNotNull(NotifyFilter.findNotify(injector, "Test")) + } +} From d90cbd26e7e0572d561a98468d3ce0ed27031b6d Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Thu, 23 May 2024 22:05:07 +0800 Subject: [PATCH 5/5] [Core] [Notify] Fixed code --- .../src/main/java/io/edurt/datacap/lib/http/HttpClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/datacap-http/src/main/java/io/edurt/datacap/lib/http/HttpClient.java b/lib/datacap-http/src/main/java/io/edurt/datacap/lib/http/HttpClient.java index 0e86f6511..b62c66589 100644 --- a/lib/datacap-http/src/main/java/io/edurt/datacap/lib/http/HttpClient.java +++ b/lib/datacap-http/src/main/java/io/edurt/datacap/lib/http/HttpClient.java @@ -15,7 +15,7 @@ import java.util.concurrent.TimeUnit; @Slf4j -@SuppressFBWarnings(value = {"NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"}, +@SuppressFBWarnings(value = {"NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", "RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE"}, justification = "I prefer to suppress these FindBugs warnings") public class HttpClient {