Skip to content

Commit 5506ec9

Browse files
KascheKasche
authored andcommitted
Added Webhook Functions
1 parent 1891266 commit 5506ec9

17 files changed

+791
-17
lines changed

src/main/java/de/jadenk/springcloud/DatabaseInitializer.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ private void checkAndCreateTables() throws SQLException {
6565
if (!tableExists(statement, "calendar_entry")) {
6666
createCalendarTable(statement);
6767
}
68+
69+
if (!tableExists(statement, "webhooks")) {
70+
createWebhookTable(statement);
71+
}
6872
}
6973
}
7074

@@ -105,6 +109,23 @@ private void createCalendarTable(Statement statement) throws SQLException {
105109
"FOREIGN KEY (user_id) REFERENCES users(id));");
106110
}
107111

112+
private void createWebhookTable(Statement statement) throws SQLException {
113+
statement.executeUpdate("CREATE TABLE webhooks (" +
114+
"webhook_id BIGINT AUTO_INCREMENT PRIMARY KEY," +
115+
"is_enabled BOOLEAN NOT NULL," +
116+
"webhook_url VARCHAR(255) NOT NULL," +
117+
"on_user_creation BOOLEAN NOT NULL DEFAULT FALSE," +
118+
"on_user_ban BOOLEAN NOT NULL DEFAULT FALSE," +
119+
"on_register BOOLEAN NOT NULL DEFAULT FALSE," +
120+
"on_error_thrown BOOLEAN NOT NULL DEFAULT FALSE," +
121+
"on_file_deletion BOOLEAN NOT NULL DEFAULT FALSE," +
122+
"on_file_upload BOOLEAN NOT NULL DEFAULT FALSE," +
123+
"on_calendar_notification BOOLEAN NOT NULL DEFAULT FALSE," +
124+
"on_user_update BOOLEAN NOT NULL DEFAULT FALSE" +
125+
");");
126+
}
127+
128+
108129
private void createUsersTable(Statement statement) throws SQLException {
109130
statement.executeUpdate("CREATE TABLE users (" +
110131
"id BIGINT AUTO_INCREMENT PRIMARY KEY, " +

src/main/java/de/jadenk/springcloud/SpringcloudApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.scheduling.annotation.EnableScheduling;
56

7+
@EnableScheduling
68
@SpringBootApplication
79
public class SpringcloudApplication {
810

src/main/java/de/jadenk/springcloud/controller/AdminController.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package de.jadenk.springcloud.controller;
22

33
import de.jadenk.springcloud.config.SecurityConfig;
4-
import de.jadenk.springcloud.model.Log;
5-
import de.jadenk.springcloud.model.Role;
6-
import de.jadenk.springcloud.model.UploadedFile;
7-
import de.jadenk.springcloud.model.User;
4+
import de.jadenk.springcloud.model.*;
85
import de.jadenk.springcloud.repository.LogRepository;
96
import de.jadenk.springcloud.repository.RoleRepository;
107
import de.jadenk.springcloud.repository.UserRepository;
118
import de.jadenk.springcloud.service.LogService;
129
import de.jadenk.springcloud.service.UserService;
10+
import de.jadenk.springcloud.service.WebhookService;
1311
import de.jadenk.springcloud.util.MessageService;
12+
import de.jadenk.springcloud.util.WebhookEvent;
1413
import org.springframework.beans.factory.annotation.Autowired;
1514
import org.springframework.security.core.Authentication;
1615
import org.springframework.security.core.GrantedAuthority;
@@ -21,17 +20,17 @@
2120
import org.springframework.web.bind.annotation.*;
2221
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
2322

24-
import java.util.Collection;
25-
import java.util.List;
26-
import java.util.Optional;
27-
import java.util.Set;
23+
import java.util.*;
2824

2925
@Controller
3026
public class AdminController {
3127

3228
@Autowired
3329
private LogService logService;
3430

31+
@Autowired
32+
private WebhookService webhookService;
33+
3534
@Autowired
3635
private UserRepository userRepository;
3736

@@ -76,6 +75,10 @@ public String adminDashboard(@RequestParam(value = "page", defaultValue = "1") i
7675
int offset = (page - 1) * pageSize;
7776
List<Log> logs = logRepository.findLogsPaged(offset, pageSize);
7877

78+
79+
Webhook webhook = webhookService.getFirst().orElse(new Webhook());
80+
model.addAttribute("webhook", webhook);
81+
model.addAttribute("webhooks", webhookService.getAll());
7982
model.addAttribute("users", users);
8083
model.addAttribute("logs", logs);
8184
model.addAttribute("roles", roles);
@@ -100,15 +103,17 @@ public String updateUser(@RequestParam("id") Long id,
100103
User user = userRepository.findById(id)
101104
.orElseThrow(() -> new IllegalArgumentException("User not found: " + id));
102105

106+
Log log = null;
107+
103108
if (!user.getUsername().equals(username)) {
104109
String message = messageService.getLog("admin.user.username.changed", user.getUsername(), username);
105-
logService.log(currentUser.getUsername(), message);
110+
log = logService.log(currentUser.getUsername(), message);
106111
user.setUsername(username);
107112
}
108113

109114
if (!user.getEmail().equals(email)) {
110115
String message = messageService.getLog("admin.user.email.changed", user.getUsername(), email);
111-
logService.log(currentUser.getUsername(), message);
116+
log = logService.log(currentUser.getUsername(), message);
112117
user.setEmail(email);
113118
}
114119

@@ -120,17 +125,19 @@ public String updateUser(@RequestParam("id") Long id,
120125
Role currentRole = user.getRole();
121126
if (!currentRole.equals(foundRole)) {
122127
String message = messageService.getLog("admin.user.role.changed", user.getUsername(), currentRole.getName(), foundRole.getName());
123-
logService.log(currentUser.getUsername(), message);
128+
log = logService.log(currentUser.getUsername(), message);
124129
user.setRole(foundRole);
125130
}
126131

127132
if (password != null && !password.trim().isEmpty()) {
128133
String encodedPassword = securityConfig.passwordEncoder().encode(password);
129134
user.setPassword(encodedPassword);
130135
String message = messageService.getLog("admin.user.password.changed", user.getUsername());
131-
logService.log(currentUser.getUsername(), message);
136+
log = logService.log(currentUser.getUsername(), message);
132137
}
133138

139+
webhookService.triggerWebhookEvent(WebhookEvent.USER_UPDATED, "User " + user.getUsername() + " was updated", log.getId());
140+
134141
userRepository.save(user);
135142

136143
return "redirect:/admin";
@@ -157,7 +164,8 @@ public String banUser(@PathVariable Long id, RedirectAttributes redirectAttribut
157164
User user = userService.getUserById(id);
158165
String status = user.isBanned() ? "banned" : "unbanned";
159166
String message = messageService.getLog("admin.user.ban.status", user.getUsername(), status);
160-
logService.log(currentUser.getUsername(), message);
167+
Log log = logService.log(currentUser.getUsername(), message);
168+
webhookService.triggerWebhookEvent(WebhookEvent.USER_BANNED, "User " + user.getUsername() + " was " + status, log.getId());
161169
} catch (Exception e) {
162170
System.out.println("Error while banning user.");
163171
}

src/main/java/de/jadenk/springcloud/controller/DashboardController.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package de.jadenk.springcloud.controller;
22

33
import de.jadenk.springcloud.exception.ResourceNotFoundException;
4+
import de.jadenk.springcloud.model.Log;
45
import de.jadenk.springcloud.model.UploadedFile;
56
import de.jadenk.springcloud.repository.UploadedFileRepository;
67
import de.jadenk.springcloud.repository.UserRepository;
78
import de.jadenk.springcloud.service.FileUploadService;
89
import de.jadenk.springcloud.service.LogService;
910
import de.jadenk.springcloud.service.UserService;
11+
import de.jadenk.springcloud.service.WebhookService;
1012
import de.jadenk.springcloud.util.MessageService;
13+
import de.jadenk.springcloud.util.WebhookEvent;
1114
import org.springframework.beans.factory.annotation.Autowired;
1215
import org.springframework.core.io.ByteArrayResource;
1316
import org.springframework.core.io.Resource;
@@ -80,6 +83,9 @@ public String handleUpload(@RequestParam("file") MultipartFile file) {
8083
}
8184
}
8285

86+
@Autowired
87+
private WebhookService webhookService;
88+
8389
@GetMapping("/delete/{id}")
8490
public String deleteFile(@PathVariable Long id) {
8591
UserDetails currentUser = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
@@ -89,7 +95,9 @@ public String deleteFile(@PathVariable Long id) {
8995

9096
uploadedFileRepository.deleteById(id);
9197
String message = messageService.getError("dashboard.file.deleted", filename);
92-
logService.log(currentUser.getUsername(), message);
98+
Log log = logService.log(currentUser.getUsername(), message);
99+
100+
webhookService.triggerWebhookEvent(WebhookEvent.USER_UPDATED, "User " + currentUser.getUsername() + " deleted an File.", log.getId());
93101
return "redirect:/dashboard";
94102
}
95103

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package de.jadenk.springcloud.controller;
2+
3+
import de.jadenk.springcloud.model.Webhook;
4+
import de.jadenk.springcloud.repository.WebhookRepository;
5+
import de.jadenk.springcloud.service.WebhookService;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.stereotype.Controller;
8+
import org.springframework.ui.Model;
9+
import org.springframework.web.bind.annotation.*;
10+
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
11+
12+
import java.util.ArrayList;
13+
14+
@Controller
15+
@RequestMapping("/webhooks")
16+
public class WebhookController {
17+
18+
@Autowired
19+
private WebhookRepository webhookRepository;
20+
21+
@Autowired
22+
private WebhookService webhookService;
23+
24+
@PostMapping("/add")
25+
public String addWebhook(
26+
@RequestParam String url,
27+
@RequestParam(required = false) boolean onUserCreation,
28+
@RequestParam(required = false) boolean onUserBan,
29+
@RequestParam(required = false) boolean onUserUpdate,
30+
@RequestParam(required = false) boolean onRegister,
31+
@RequestParam(required = false) boolean onErrorThrown,
32+
@RequestParam(required = false) boolean onFileDeletion,
33+
@RequestParam(required = false) boolean onFileUpload,
34+
@RequestParam(required = false) boolean onCalendarNotification
35+
) {
36+
Webhook webhook = new Webhook();
37+
webhook.setUrl(url);
38+
webhook.setEnabled(true);
39+
webhook.setOnUserCreation(onUserCreation);
40+
webhook.setOnUserBan(onUserBan);
41+
webhook.setOnUserUpdate(onUserUpdate);
42+
webhook.setOnRegister(onRegister);
43+
webhook.setOnErrorThrown(onErrorThrown);
44+
webhook.setOnFileDeletion(onFileDeletion);
45+
webhook.setOnFileUpload(onFileUpload);
46+
webhook.setOnCalendarNotification(onCalendarNotification);
47+
48+
webhookRepository.save(webhook);
49+
50+
return "redirect:/admin";
51+
}
52+
53+
54+
@PostMapping("/delete/{id}")
55+
public String deleteWebhook(@PathVariable Long id) {
56+
webhookService.deleteWebhook(id);
57+
return "redirect:/admin";
58+
}
59+
60+
@PostMapping("/test/{id}")
61+
public String testWebhook(@PathVariable Long id, RedirectAttributes redirectAttributes) {
62+
webhookRepository.findById(id).ifPresent(webhook -> {
63+
if (webhook.isEnabled()) {
64+
webhookService.sendTestPayload(webhook);
65+
}
66+
});
67+
redirectAttributes.addFlashAttribute("message", "Webhook-Test ausgeführt");
68+
return "redirect:/admin";
69+
}
70+
71+
72+
@PostMapping("/toggle/{id}")
73+
public String toggleWebhook(@PathVariable Long id, @RequestParam(required = false) Boolean enabled, RedirectAttributes redirectAttributes) {
74+
webhookRepository.findById(id).ifPresent(webhook -> {
75+
webhook.setEnabled(enabled != null && enabled);
76+
webhookRepository.save(webhook);
77+
});
78+
redirectAttributes.addFlashAttribute("message", "Webhook aktiviert/deaktiviert");
79+
return "redirect:/admin";
80+
}
81+
}

0 commit comments

Comments
 (0)