From aea4f59af7a2fee583d205c293d3bb49ef0d21fb Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:16:42 +0800 Subject: [PATCH] Disable post viewed and user activity notifications by default --- .../NotificationPreferenceInitializer.java | 39 ++++++++++++++++++ .../main/java/com/openisle/model/User.java | 7 +++- ...NotificationPreferenceInitializerTest.java | 41 +++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/com/openisle/config/NotificationPreferenceInitializer.java create mode 100644 backend/src/test/java/com/openisle/config/NotificationPreferenceInitializerTest.java diff --git a/backend/src/main/java/com/openisle/config/NotificationPreferenceInitializer.java b/backend/src/main/java/com/openisle/config/NotificationPreferenceInitializer.java new file mode 100644 index 000000000..55a60ca68 --- /dev/null +++ b/backend/src/main/java/com/openisle/config/NotificationPreferenceInitializer.java @@ -0,0 +1,39 @@ +package com.openisle.config; + +import com.openisle.model.NotificationType; +import com.openisle.model.User; +import com.openisle.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; + +/** + * Ensure default notification preferences are applied to existing users. + */ +@Component +@RequiredArgsConstructor +public class NotificationPreferenceInitializer implements CommandLineRunner { + + private final UserRepository userRepository; + + @Override + public void run(String... args) { + List users = userRepository.findAll(); + for (User user : users) { + Set disabled = user.getDisabledNotificationTypes(); + boolean changed = false; + if (disabled.add(NotificationType.POST_VIEWED)) { + changed = true; + } + if (disabled.add(NotificationType.USER_ACTIVITY)) { + changed = true; + } + if (changed) { + userRepository.save(user); + } + } + } +} diff --git a/backend/src/main/java/com/openisle/model/User.java b/backend/src/main/java/com/openisle/model/User.java index fef975633..3f9dc0bca 100644 --- a/backend/src/main/java/com/openisle/model/User.java +++ b/backend/src/main/java/com/openisle/model/User.java @@ -7,7 +7,7 @@ import lombok.Setter; import org.hibernate.annotations.CreationTimestamp; import java.time.LocalDateTime; -import java.util.HashSet; +import java.util.EnumSet; import java.util.Set; /** @@ -68,7 +68,10 @@ public class User { @CollectionTable(name = "user_disabled_notification_types", joinColumns = @JoinColumn(name = "user_id")) @Column(name = "notification_type") @Enumerated(EnumType.STRING) - private Set disabledNotificationTypes = new HashSet<>(); + private Set disabledNotificationTypes = EnumSet.of( + NotificationType.POST_VIEWED, + NotificationType.USER_ACTIVITY + ); @CreationTimestamp @Column(nullable = false, updatable = false, diff --git a/backend/src/test/java/com/openisle/config/NotificationPreferenceInitializerTest.java b/backend/src/test/java/com/openisle/config/NotificationPreferenceInitializerTest.java new file mode 100644 index 000000000..a4fe1c41c --- /dev/null +++ b/backend/src/test/java/com/openisle/config/NotificationPreferenceInitializerTest.java @@ -0,0 +1,41 @@ +package com.openisle.config; + +import com.openisle.model.NotificationType; +import com.openisle.model.User; +import com.openisle.repository.UserRepository; +import org.junit.jupiter.api.Test; + +import java.util.EnumSet; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.*; + +class NotificationPreferenceInitializerTest { + + @Test + void addsDefaultsToUsers() throws Exception { + User u1 = new User(); + u1.setId(1L); + u1.getDisabledNotificationTypes().clear(); + + User u2 = new User(); + u2.setId(2L); + u2.getDisabledNotificationTypes().clear(); + u2.getDisabledNotificationTypes().add(NotificationType.POST_VIEWED); + + UserRepository repo = mock(UserRepository.class); + when(repo.findAll()).thenReturn(List.of(u1, u2)); + + NotificationPreferenceInitializer init = new NotificationPreferenceInitializer(repo); + init.run(); + + assertTrue(u1.getDisabledNotificationTypes().containsAll( + EnumSet.of(NotificationType.POST_VIEWED, NotificationType.USER_ACTIVITY))); + assertTrue(u2.getDisabledNotificationTypes().containsAll( + EnumSet.of(NotificationType.POST_VIEWED, NotificationType.USER_ACTIVITY))); + + verify(repo).save(u1); + verify(repo).save(u2); + } +}