From 8a93a1620a11e85de160b05408b328c28e287170 Mon Sep 17 00:00:00 2001 From: Hwangseoeun Date: Tue, 2 Dec 2025 02:12:16 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduling/PetInfoNotification.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/main/java/com/petlog/{pet/scheduling/PetInfoScheduling.java => notification/scheduling/PetInfoNotification.java} (98%) diff --git a/src/main/java/com/petlog/pet/scheduling/PetInfoScheduling.java b/src/main/java/com/petlog/notification/scheduling/PetInfoNotification.java similarity index 98% rename from src/main/java/com/petlog/pet/scheduling/PetInfoScheduling.java rename to src/main/java/com/petlog/notification/scheduling/PetInfoNotification.java index 6b4cd21..c9b5235 100644 --- a/src/main/java/com/petlog/pet/scheduling/PetInfoScheduling.java +++ b/src/main/java/com/petlog/notification/scheduling/PetInfoNotification.java @@ -1,4 +1,4 @@ -package com.petlog.pet.scheduling; +package com.petlog.notification.scheduling; import com.petlog.notification.service.NotificationService; import com.petlog.pet.entity.FeedingDailyRecord; @@ -21,7 +21,7 @@ @RequiredArgsConstructor @Component -public class PetInfoScheduling { +public class PetInfoNotification { private final NotificationService notificationService; private final PetProfileRepository petProfileRepository; From 642cbdaefb421e222e8896241f61dd42b3af6287 Mon Sep 17 00:00:00 2001 From: Hwangseoeun Date: Tue, 2 Dec 2025 10:25:16 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=EC=9D=BC=EC=A0=95=EC=9D=98=20?= =?UTF-8?q?=EB=A6=AC=EB=A7=88=EC=9D=B8=EB=93=9C=20=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=EC=97=90=20fcm=20=EC=95=8C=EB=A6=BC=20=EB=B3=B4=EB=82=B4?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduling/ScheduleNotification.java | 92 +++++++++++++++++++ .../repository/ScheduleRepository.java | 2 + 2 files changed, 94 insertions(+) create mode 100644 src/main/java/com/petlog/notification/scheduling/ScheduleNotification.java diff --git a/src/main/java/com/petlog/notification/scheduling/ScheduleNotification.java b/src/main/java/com/petlog/notification/scheduling/ScheduleNotification.java new file mode 100644 index 0000000..3c2e04c --- /dev/null +++ b/src/main/java/com/petlog/notification/scheduling/ScheduleNotification.java @@ -0,0 +1,92 @@ +package com.petlog.notification.scheduling; + +import com.petlog.notification.service.NotificationService; +import com.petlog.petgroup.entity.PetGroup; +import com.petlog.petgroup.entity.PetGroupMember; +import com.petlog.petgroup.repository.PetGroupMemberRepository; +import com.petlog.petgroup.repository.PetGroupRepository; +import com.petlog.schedule.entity.Schedule; +import com.petlog.schedule.repository.ScheduleRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +@RequiredArgsConstructor +@Component +public class ScheduleNotification { + + private final NotificationService notificationService; + private final PetGroupRepository petGroupRepository; + private final PetGroupMemberRepository petGroupMemberRepository; + private final ScheduleRepository scheduleRepository; + + @Scheduled(cron = "0 */1 * * * *") + public void checkScheduleAndSendNotification() { + final List petGroups = petGroupRepository.findAll(); + + for(final PetGroup petGroup : petGroups) { + final List groupMembers = getPetGroupMembers(petGroup); + + if(groupMembers.isEmpty()) { + continue; + } + + final LocalDateTime now = LocalDateTime.now(); + final LocalDateTime start = now.withSecond(0).withNano(0); + final LocalDateTime end = start.plusMinutes(1); + final List schedules = scheduleRepository.findAllByPetGroupAndRemindAtBetween(petGroup, start, end); + + if(schedules.isEmpty()) { + continue; + } + + checkIsAllDayScheduleAndSendNotification(groupMembers, schedules); + } + } + + private void checkIsAllDayScheduleAndSendNotification(final List groupMembers, final List schedules) { + for(final Schedule schedule : schedules) { + if(schedule.isAllDay()) { + sendIsAllDayScheduleNotificationToAllGroupMembers(groupMembers, schedule); + } + + if(!schedule.isAllDay()) { + sendScheduleNotificationToAllGroupMembers(groupMembers, schedule); + } + } + } + + private List getPetGroupMembers(final PetGroup petGroup) { + return petGroupMemberRepository.findAllByPetGroup(petGroup) + .orElse(List.of()); + } + + private void sendIsAllDayScheduleNotificationToAllGroupMembers(final List groupMembers, final Schedule schedule) { + for (final PetGroupMember groupMember : groupMembers) { + final Long groupMemberId = groupMember.getMember().getId(); + + notificationService.sendNotification( + groupMemberId, + schedule.getTitle(), + "하루종일", + "SCHEDULE" + ); + } + } + + private void sendScheduleNotificationToAllGroupMembers(final List groupMembers, final Schedule schedule) { + for (final PetGroupMember groupMember : groupMembers) { + final Long groupMemberId = groupMember.getMember().getId(); + + notificationService.sendNotification( + groupMemberId, + schedule.getTitle(), + schedule.getStartAt().toLocalTime() + " ~ " + schedule.getEndAt().toLocalTime(), + "SCHEDULE" + ); + } + } +} diff --git a/src/main/java/com/petlog/schedule/repository/ScheduleRepository.java b/src/main/java/com/petlog/schedule/repository/ScheduleRepository.java index 5651ce7..c949529 100644 --- a/src/main/java/com/petlog/schedule/repository/ScheduleRepository.java +++ b/src/main/java/com/petlog/schedule/repository/ScheduleRepository.java @@ -10,4 +10,6 @@ public interface ScheduleRepository extends JpaRepository { List findAllByPetGroupAndStartAtBetween(final PetGroup petGroup, final LocalDateTime start, final LocalDateTime end); + + List findAllByPetGroupAndRemindAtBetween(final PetGroup petGroup, final LocalDateTime start, final LocalDateTime end); }