From 4036bd25a58dffb8252abf3e7f6ea5b3bd396ac6 Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:50:11 +0800 Subject: [PATCH] Remove duplicate register request notifications --- .../openisle/controller/AuthController.java | 13 +++-------- .../repository/NotificationRepository.java | 3 +++ .../openisle/service/NotificationService.java | 12 ++++++++++ .../service/NotificationServiceTest.java | 22 +++++++++++++++++-- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/openisle/controller/AuthController.java b/src/main/java/com/openisle/controller/AuthController.java index 62365f8a2..ae1e62a44 100644 --- a/src/main/java/com/openisle/controller/AuthController.java +++ b/src/main/java/com/openisle/controller/AuthController.java @@ -9,7 +9,6 @@ import com.openisle.service.GoogleAuthService; import com.openisle.service.RegisterModeService; import com.openisle.service.NotificationService; import com.openisle.model.RegisterMode; -import com.openisle.model.NotificationType; import com.openisle.repository.UserRepository; import lombok.Data; import lombok.RequiredArgsConstructor; @@ -50,10 +49,7 @@ public class AuthController { req.getUsername(), req.getEmail(), req.getPassword(), req.getReason(), registerModeService.getRegisterMode()); emailService.sendEmail(user.getEmail(), "Verification Code", "Your verification code is " + user.getVerificationCode()); if (!user.isApproved()) { - for (User admin : userRepository.findByRole(com.openisle.model.Role.ADMIN)) { - notificationService.createNotification(admin, NotificationType.REGISTER_REQUEST, null, null, - null, user, null, user.getRegisterReason()); - } + notificationService.createRegisterRequestNotifications(user, user.getRegisterReason()); } return ResponseEntity.ok(Map.of("message", "Verification code sent")); } @@ -98,11 +94,8 @@ public class AuthController { if (user.isPresent()) { if (!user.get().isApproved()) { if (req.getReason() != null && !req.getReason().isEmpty()) { - // do not send empty notifition (while try login) - for (User admin : userRepository.findByRole(com.openisle.model.Role.ADMIN)) { - notificationService.createNotification(admin, NotificationType.REGISTER_REQUEST, null, null, - null, user.get(), null, req.getReason()); - } + // do not send empty notification (while try login) + notificationService.createRegisterRequestNotifications(user.get(), req.getReason()); } return ResponseEntity.badRequest().body(Map.of( "error", "Account awaiting approval", diff --git a/src/main/java/com/openisle/repository/NotificationRepository.java b/src/main/java/com/openisle/repository/NotificationRepository.java index 31038481b..f0d538c49 100644 --- a/src/main/java/com/openisle/repository/NotificationRepository.java +++ b/src/main/java/com/openisle/repository/NotificationRepository.java @@ -4,6 +4,7 @@ import com.openisle.model.Notification; import com.openisle.model.User; import com.openisle.model.Post; import com.openisle.model.Comment; +import com.openisle.model.NotificationType; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; @@ -15,4 +16,6 @@ public interface NotificationRepository extends JpaRepository findByPost(Post post); List findByComment(Comment comment); + + void deleteByTypeAndFromUser(NotificationType type, User fromUser); } diff --git a/src/main/java/com/openisle/service/NotificationService.java b/src/main/java/com/openisle/service/NotificationService.java index 93f50859a..3add16fa4 100644 --- a/src/main/java/com/openisle/service/NotificationService.java +++ b/src/main/java/com/openisle/service/NotificationService.java @@ -33,6 +33,18 @@ public class NotificationService { return notificationRepository.save(n); } + /** + * Create notifications for all admins when a user submits a register request. + * Old register request notifications from the same applicant are removed first. + */ + public void createRegisterRequestNotifications(User applicant, String reason) { + notificationRepository.deleteByTypeAndFromUser(NotificationType.REGISTER_REQUEST, applicant); + for (User admin : userRepository.findByRole(Role.ADMIN)) { + createNotification(admin, NotificationType.REGISTER_REQUEST, null, null, + null, applicant, null, reason); + } + } + public List listNotifications(String username, Boolean read) { User user = userRepository.findByUsername(username) .orElseThrow(() -> new com.openisle.exception.NotFoundException("User not found")); diff --git a/src/test/java/com/openisle/service/NotificationServiceTest.java b/src/test/java/com/openisle/service/NotificationServiceTest.java index 6efd06498..70d75301a 100644 --- a/src/test/java/com/openisle/service/NotificationServiceTest.java +++ b/src/test/java/com/openisle/service/NotificationServiceTest.java @@ -1,7 +1,6 @@ package com.openisle.service; -import com.openisle.model.Notification; -import com.openisle.model.User; +import com.openisle.model.*; import com.openisle.repository.NotificationRepository; import com.openisle.repository.UserRepository; import org.junit.jupiter.api.Test; @@ -78,4 +77,23 @@ class NotificationServiceTest { assertEquals(5L, count); verify(nRepo).countByUserAndRead(user, false); } + + @Test + void createRegisterRequestNotificationsDeletesOldOnes() { + NotificationRepository nRepo = mock(NotificationRepository.class); + UserRepository uRepo = mock(UserRepository.class); + NotificationService service = new NotificationService(nRepo, uRepo); + + User admin = new User(); + admin.setId(10L); + User applicant = new User(); + applicant.setId(20L); + + when(uRepo.findByRole(Role.ADMIN)).thenReturn(List.of(admin)); + + service.createRegisterRequestNotifications(applicant, "reason"); + + verify(nRepo).deleteByTypeAndFromUser(NotificationType.REGISTER_REQUEST, applicant); + verify(nRepo).save(any(Notification.class)); + } }