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; 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); }