diff --git a/ontime-back/build.gradle b/ontime-back/build.gradle index e03bc4c..52a235b 100644 --- a/ontime-back/build.gradle +++ b/ontime-back/build.gradle @@ -36,6 +36,7 @@ dependencies { implementation 'com.fasterxml.jackson.core:jackson-databind' runtimeOnly 'com.h2database:h2' runtimeOnly 'com.mysql:mysql-connector-j' + implementation 'mysql:mysql-connector-java:8.0.33' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' diff --git a/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java b/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java index 2b62d74..de2c947 100644 --- a/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java +++ b/ontime-back/src/main/java/devkor/ontime_back/service/NotificationService.java @@ -43,7 +43,7 @@ public void scheduleReminder(NotificationSchedule notificationSchedule) { } ScheduledFuture future = taskScheduler.schedule( - () -> sendReminder(notificationSchedule, "약속 5분 전입니다"), + () -> sendReminder(notificationSchedule, "준비 시작해야 합니다.(현재 시각: 약속시각 - (여유시간 + 이동시간 + 총준비시간) )"), Date.from(reminderTime.atZone(ZoneId.systemDefault()).toInstant()) ); @@ -68,7 +68,8 @@ public void sendReminder(NotificationSchedule notificationSchedule, String messa if (userId != null) { UserSetting userSetting = userSettingRepository.findByUserId(userId) - .orElseThrow(() -> new IllegalArgumentException("No UserSetting found in schedule's user"));// Repository 메서드 가정 + .orElseThrow(() -> new IllegalArgumentException("No UserSetting found in schedule's user")); + log.debug("사용자 알림 전송 설정 여부: " + userSetting.getIsNotificationsEnabled()); if (Boolean.TRUE.equals(userSetting.getIsNotificationsEnabled())) { sendNotificationToUser(notificationSchedule.getSchedule(), message); diff --git a/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java b/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java index e80c4cf..bfdeae1 100644 --- a/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java +++ b/ontime-back/src/main/java/devkor/ontime_back/service/PreparationScheduleService.java @@ -1,9 +1,12 @@ package devkor.ontime_back.service; import devkor.ontime_back.dto.PreparationDto; +import devkor.ontime_back.entity.NotificationSchedule; import devkor.ontime_back.entity.PreparationSchedule; import devkor.ontime_back.entity.Schedule; +import devkor.ontime_back.entity.User; import devkor.ontime_back.global.jwt.JwtTokenProvider; +import devkor.ontime_back.repository.NotificationScheduleRepository; import devkor.ontime_back.repository.PreparationScheduleRepository; import devkor.ontime_back.repository.ScheduleRepository; import devkor.ontime_back.repository.UserRepository; @@ -13,24 +16,26 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; -import static devkor.ontime_back.response.ErrorCode.SCHEDULE_NOT_FOUND; -import static devkor.ontime_back.response.ErrorCode.UNAUTHORIZED_ACCESS; +import static devkor.ontime_back.response.ErrorCode.*; @Service @Transactional(readOnly = true) @RequiredArgsConstructor @Slf4j public class PreparationScheduleService { + private final ScheduleService scheduleService; private final PreparationScheduleRepository preparationScheduleRepository; private final UserRepository userRepository; private final ScheduleRepository scheduleRepository; private final JwtTokenProvider jwtTokenProvider; + private final NotificationScheduleRepository notificationScheduleRepository; @Transactional @@ -87,5 +92,13 @@ protected void handlePreparationSchedules(Long userId, UUID scheduleId, List
 new GeneralException(NOTIFICATION_NOT_FOUND));
+
+        LocalDateTime notificationTime = scheduleService.getNotificationTime(schedule, schedule.getUser());
+        log.info("Notification Time(변경된): " + notificationTime);
+
+        scheduleService.updateAndRescheduleNotification(notificationTime, notification);
     }
 }
diff --git a/ontime-back/src/main/java/devkor/ontime_back/service/ScheduleService.java b/ontime-back/src/main/java/devkor/ontime_back/service/ScheduleService.java
index 688ee85..0e54687 100644
--- a/ontime-back/src/main/java/devkor/ontime_back/service/ScheduleService.java
+++ b/ontime-back/src/main/java/devkor/ontime_back/service/ScheduleService.java
@@ -107,7 +107,7 @@ public void modifySchedule(Long userId, UUID scheduleId, ScheduleModDto schedule
         updateAndRescheduleNotification(newNotificationTime, notification);
     }
 
-    private void updateAndRescheduleNotification(LocalDateTime newNotificationTime, NotificationSchedule notification) {
+    public void updateAndRescheduleNotification(LocalDateTime newNotificationTime, NotificationSchedule notification) {
         if(newNotificationTime == notification.getNotificationTime()) return;
 
         notificationService.cancelScheduledNotification(notification.getId());
@@ -141,7 +141,7 @@ public void addSchedule(ScheduleAddDto scheduleAddDto, Long userId) {
         notificationService.scheduleReminder(notification);
     }
 
-    private LocalDateTime getNotificationTime(Schedule schedule, User user) {
+    public LocalDateTime getNotificationTime(Schedule schedule, User user) {
         Integer preparationTime = calculatePreparationTime(schedule, user);
         Integer moveTime = schedule.getMoveTime();
         Integer spareTime = schedule.getScheduleSpareTime() == null ? user.getSpareTime() : schedule.getScheduleSpareTime();
diff --git a/ontime-back/src/test/java/devkor/ontime_back/service/PreparationScheduleServiceTest.java b/ontime-back/src/test/java/devkor/ontime_back/service/PreparationScheduleServiceTest.java
index 76d4344..4e4fd9c 100644
--- a/ontime-back/src/test/java/devkor/ontime_back/service/PreparationScheduleServiceTest.java
+++ b/ontime-back/src/test/java/devkor/ontime_back/service/PreparationScheduleServiceTest.java
@@ -37,6 +37,9 @@ public class PreparationScheduleServiceTest {
     @Autowired
     private UserRepository userRepository;
 
+    @Autowired
+    private NotificationScheduleRepository notificationScheduleRepository;
+
     @Autowired
     private PreparationScheduleService preparationScheduleService;
 
@@ -63,6 +66,7 @@ void makePreparationSchedules_withoutDeletingExisting() {
                 .punctualityScore(-1f)
                 .scheduleCountAfterReset(0)
                 .latenessCountAfterReset(0)
+                .spareTime(5)
                 .build();
         userRepository.save(newUser);
 
@@ -83,6 +87,12 @@ void makePreparationSchedules_withoutDeletingExisting() {
                 .build();
         scheduleRepository.save(addedSchedule1);
 
+        NotificationSchedule notificationSchedule = NotificationSchedule.builder()
+                .schedule(addedSchedule1)
+                .notificationTime(LocalDateTime.of(2025, 1, 1, 0, 0))
+                .build();
+        notificationScheduleRepository.save(notificationSchedule);
+
         UUID preparationSchedule1Id = UUID.randomUUID();
         UUID preparationSchedule2Id = UUID.randomUUID();
 
@@ -112,6 +122,7 @@ void updatePreparationSchedules_withDeletingExisting() {
                 .punctualityScore(-1f)
                 .scheduleCountAfterReset(0)
                 .latenessCountAfterReset(0)
+                .spareTime(5)
                 .build();
         userRepository.save(newUser);
 
@@ -132,6 +143,12 @@ void updatePreparationSchedules_withDeletingExisting() {
                 .build();
         scheduleRepository.save(addedSchedule1);
 
+        NotificationSchedule notificationSchedule = NotificationSchedule.builder()
+                .schedule(addedSchedule1)
+                .notificationTime(LocalDateTime.of(2025, 1, 1, 0, 0))
+                .build();
+        notificationScheduleRepository.save(notificationSchedule);
+
         PreparationSchedule preparationSchedule3 = preparationScheduleRepository.save(new PreparationSchedule(
                 UUID.randomUUID(), addedSchedule1, "화장", 10, null));
         PreparationSchedule preparationSchedule2= preparationScheduleRepository.save(new PreparationSchedule(
@@ -168,6 +185,7 @@ void handlePreparationSchedules_withoutDeletingExisting() {
                 .punctualityScore(-1f)
                 .scheduleCountAfterReset(0)
                 .latenessCountAfterReset(0)
+                .spareTime(5)
                 .build();
         userRepository.save(newUser);
 
@@ -188,6 +206,12 @@ void handlePreparationSchedules_withoutDeletingExisting() {
                 .build();
         scheduleRepository.save(addedSchedule1);
 
+        NotificationSchedule notificationSchedule = NotificationSchedule.builder()
+                .schedule(addedSchedule1)
+                .notificationTime(LocalDateTime.of(2025, 1, 1, 0, 0))
+                .build();
+        notificationScheduleRepository.save(notificationSchedule);
+
         UUID preparationSchedule1Id = UUID.randomUUID();
         UUID preparationSchedule2Id = UUID.randomUUID();
 
@@ -217,6 +241,7 @@ void handlePreparationSchedules_withDeletingExisting() {
                 .punctualityScore(-1f)
                 .scheduleCountAfterReset(0)
                 .latenessCountAfterReset(0)
+                .spareTime(5)
                 .build();
         userRepository.save(newUser);
 
@@ -237,6 +262,12 @@ void handlePreparationSchedules_withDeletingExisting() {
                 .build();
         scheduleRepository.save(addedSchedule1);
 
+        NotificationSchedule notificationSchedule = NotificationSchedule.builder()
+                .schedule(addedSchedule1)
+                .notificationTime(LocalDateTime.of(2025, 1, 1, 0, 0))
+                .build();
+        notificationScheduleRepository.save(notificationSchedule);
+
         PreparationSchedule preparationSchedule3 = preparationScheduleRepository.save(new PreparationSchedule(
                 UUID.randomUUID(), addedSchedule1, "화장", 10, null));
         PreparationSchedule preparationSchedule2= preparationScheduleRepository.save(new PreparationSchedule(