aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/juick/www/api/webhooks
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2023-06-20 07:10:16 +0300
committerGravatar Vitaly Takmazov2023-06-21 01:02:41 +0300
commit10dcb7324fac83c0190ff4a842360a035449f278 (patch)
tree95b90305ff7e7cdb3fd298878353ed702a0754a1 /src/main/java/com/juick/www/api/webhooks
parent314db08815ae98bff02a7489cddf861cd01f2629 (diff)
VK: read premium status using Callback API
Diffstat (limited to 'src/main/java/com/juick/www/api/webhooks')
-rw-r--r--src/main/java/com/juick/www/api/webhooks/VkWebhook.java76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/main/java/com/juick/www/api/webhooks/VkWebhook.java b/src/main/java/com/juick/www/api/webhooks/VkWebhook.java
new file mode 100644
index 00000000..9e4477b1
--- /dev/null
+++ b/src/main/java/com/juick/www/api/webhooks/VkWebhook.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2008-2023, Juick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.juick.www.api.webhooks;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.juick.service.UserService;
+import com.juick.service.VKService;
+import com.juick.util.HttpBadRequestException;
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+@RestController
+public class VkWebhook {
+ private static final Logger logger = LoggerFactory.getLogger("VK");
+ @Value("${vk_webhook_secret:}")
+ private String secretKey;
+ @Value("${vk_webhook_confirmation:}")
+ private String confirmationCode;
+ @Inject
+ private ObjectMapper jsonMapper;
+ @Inject
+ private UserService userService;
+ @Inject
+ private VKService vkService;
+
+ @PostMapping(value = "/api/_vk")
+ public String processUpdate(InputStream body) throws IOException {
+ String data = IOUtils.toString(body, StandardCharsets.UTF_8);
+ logger.debug("Data: {}", data);
+ JsonNode json = jsonMapper.readTree(data);
+ var type = json.get("type").asText();
+ var secret = json.get("secret").asText("");
+ logger.info("Event received: {}, secret: {}", type, secret);
+ if (type.equals("confirmation")) {
+ return confirmationCode;
+ } else {
+ if (secretKey.equals(secret)) {
+ if (type.startsWith("donut_")) {
+ var vkId = json.get("object").get("user_id").asLong(0);
+ var userId = userService.getUIDbyVKID(vkId);
+ if (userId > 0) {
+ vkService.updatePremiumStatus(userId);
+ }
+ }
+ return "ok";
+ } else {
+ throw new HttpBadRequestException();
+ }
+ }
+ }
+}