From 9e3ef56b872998dda2f66bb3f54204acb9071b15 Mon Sep 17 00:00:00 2001 From: tkdwns414 Date: Fri, 7 Jun 2024 16:54:06 +0900 Subject: [PATCH] =?UTF-8?q?[feat]=20#88=20Worry=20Cron=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/telepigeon/server/domain/Worry.java | 9 ++++++ .../server/repository/WorryRepository.java | 4 +++ .../server/service/ScheduleService.java | 32 ++++++++++++++++++- .../server/service/answer/AnswerService.java | 2 +- .../service/{fcm => external}/FcmService.java | 2 +- .../server/service/hurry/HurryService.java | 2 +- .../service/profile/ProfileRetriever.java | 5 +++ .../service/question/QuestionService.java | 2 +- .../server/service/room/RoomService.java | 2 +- .../server/service/worry/WorryRetriever.java | 5 +++ .../questionTest/QuestionServiceTest.java | 2 +- 11 files changed, 60 insertions(+), 7 deletions(-) rename src/main/java/com/telepigeon/server/service/{fcm => external}/FcmService.java (97%) diff --git a/src/main/java/com/telepigeon/server/domain/Worry.java b/src/main/java/com/telepigeon/server/domain/Worry.java index ae99714..833c72e 100644 --- a/src/main/java/com/telepigeon/server/domain/Worry.java +++ b/src/main/java/com/telepigeon/server/domain/Worry.java @@ -1,5 +1,6 @@ package com.telepigeon.server.domain; +import com.telepigeon.server.dto.fcm.FcmMessageDto; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Getter; @@ -52,4 +53,12 @@ public static Worry create( ) { return new Worry(name, content, times, profile); } + + public FcmMessageDto toFcmMessageDto() { + return FcmMessageDto.builder() + .title(this.name) + .body(this.content) + .type("worry") + .build(); + } } diff --git a/src/main/java/com/telepigeon/server/repository/WorryRepository.java b/src/main/java/com/telepigeon/server/repository/WorryRepository.java index 7826ed1..9af3647 100644 --- a/src/main/java/com/telepigeon/server/repository/WorryRepository.java +++ b/src/main/java/com/telepigeon/server/repository/WorryRepository.java @@ -3,9 +3,13 @@ import com.telepigeon.server.domain.Profile; import com.telepigeon.server.domain.Worry; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.List; public interface WorryRepository extends JpaRepository { List findAllByProfile(Profile profile); + + @Query("SELECT w FROM Worry w WHERE w.times LIKE %:time%") + List findAllByTime(String time); } diff --git a/src/main/java/com/telepigeon/server/service/ScheduleService.java b/src/main/java/com/telepigeon/server/service/ScheduleService.java index 41bc0b1..187a107 100644 --- a/src/main/java/com/telepigeon/server/service/ScheduleService.java +++ b/src/main/java/com/telepigeon/server/service/ScheduleService.java @@ -1,22 +1,31 @@ package com.telepigeon.server.service; import com.telepigeon.server.domain.Profile; +import com.telepigeon.server.domain.Worry; +import com.telepigeon.server.service.external.FcmService; import com.telepigeon.server.service.question.QuestionService; +import com.telepigeon.server.service.worry.WorryRetriever; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.telepigeon.server.service.profile.ProfileRetriever; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + @Slf4j @Component @RequiredArgsConstructor public class ScheduleService { private final QuestionService questionService; private final ProfileRetriever profileRetriever; + private final WorryRetriever worryRetriever; + private final FcmService fcmService; @Scheduled(cron="0 0 12 * * *") - public void createSchedule(){ + public void createSchedule() { for (Profile profile : profileRetriever.findAll()) { try { questionService.create(profile); @@ -25,4 +34,25 @@ public void createSchedule(){ } } } + + @Scheduled(cron="0 0 * * * *") + public void sendWorries() { + String currentHour = LocalTime.now().format(DateTimeFormatter.ofPattern("HH시")); + List worries = worryRetriever.findAllByTime(currentHour); + for (Worry worry : worries) { + try { + sendWorry(worry); + } catch (Exception e) { + log.error("Failed to send worry for worry {}", worry.getId()); + } + } + } + + private void sendWorry(Worry worry) { + Profile profile = profileRetriever.findByOpponentProfile(worry.getProfile()); + fcmService.send( + profile.getUser().getFcmToken(), + worry.toFcmMessageDto() + ); + } } diff --git a/src/main/java/com/telepigeon/server/service/answer/AnswerService.java b/src/main/java/com/telepigeon/server/service/answer/AnswerService.java index 62df5ef..4550472 100644 --- a/src/main/java/com/telepigeon/server/service/answer/AnswerService.java +++ b/src/main/java/com/telepigeon/server/service/answer/AnswerService.java @@ -12,7 +12,7 @@ import com.telepigeon.server.dto.room.response.RoomStateDto; import com.telepigeon.server.dto.type.FcmContent; import com.telepigeon.server.service.external.S3Service; -import com.telepigeon.server.service.fcm.FcmService; +import com.telepigeon.server.service.external.FcmService; import com.telepigeon.server.service.external.NaverCloudService; import com.telepigeon.server.service.user.UserRetriever; import com.telepigeon.server.service.hurry.HurryRetriever; diff --git a/src/main/java/com/telepigeon/server/service/fcm/FcmService.java b/src/main/java/com/telepigeon/server/service/external/FcmService.java similarity index 97% rename from src/main/java/com/telepigeon/server/service/fcm/FcmService.java rename to src/main/java/com/telepigeon/server/service/external/FcmService.java index 66e48d8..c64e44e 100644 --- a/src/main/java/com/telepigeon/server/service/fcm/FcmService.java +++ b/src/main/java/com/telepigeon/server/service/external/FcmService.java @@ -1,4 +1,4 @@ -package com.telepigeon.server.service.fcm; +package com.telepigeon.server.service.external; import com.google.firebase.messaging.*; import com.telepigeon.server.dto.fcm.FcmMessageDto; diff --git a/src/main/java/com/telepigeon/server/service/hurry/HurryService.java b/src/main/java/com/telepigeon/server/service/hurry/HurryService.java index 7cb5d8d..b60e339 100644 --- a/src/main/java/com/telepigeon/server/service/hurry/HurryService.java +++ b/src/main/java/com/telepigeon/server/service/hurry/HurryService.java @@ -8,7 +8,7 @@ import com.telepigeon.server.dto.type.FcmContent; import com.telepigeon.server.exception.BusinessException; import com.telepigeon.server.exception.code.BusinessErrorCode; -import com.telepigeon.server.service.fcm.FcmService; +import com.telepigeon.server.service.external.FcmService; import com.telepigeon.server.service.profile.ProfileRetriever; import com.telepigeon.server.service.room.RoomRetriever; import com.telepigeon.server.service.user.UserRetriever; diff --git a/src/main/java/com/telepigeon/server/service/profile/ProfileRetriever.java b/src/main/java/com/telepigeon/server/service/profile/ProfileRetriever.java index 3c1fc89..3652e35 100644 --- a/src/main/java/com/telepigeon/server/service/profile/ProfileRetriever.java +++ b/src/main/java/com/telepigeon/server/service/profile/ProfileRetriever.java @@ -27,6 +27,11 @@ public Profile findByUserNotAndRoom(final User user, final Room room) { .orElseThrow(() -> new NotFoundException(NotFoundErrorCode.PROFILE_NOT_FOUND)); } + public Profile findByOpponentProfile(final Profile profile) { + return profileRepository.findByUserNotAndRoom(profile.getUser(), profile.getRoom()) + .orElseThrow(() -> new NotFoundException(NotFoundErrorCode.PROFILE_NOT_FOUND)); + } + public boolean existsByUserNotAndRoom(final User user, final Room room) { return profileRepository.existsByUserNotAndRoom(user, room); } diff --git a/src/main/java/com/telepigeon/server/service/question/QuestionService.java b/src/main/java/com/telepigeon/server/service/question/QuestionService.java index 5145e16..6afd1f0 100644 --- a/src/main/java/com/telepigeon/server/service/question/QuestionService.java +++ b/src/main/java/com/telepigeon/server/service/question/QuestionService.java @@ -9,7 +9,7 @@ import com.telepigeon.server.exception.code.BusinessErrorCode; import com.telepigeon.server.exception.code.NotFoundErrorCode; import com.telepigeon.server.service.answer.AnswerRetriever; -import com.telepigeon.server.service.fcm.FcmService; +import com.telepigeon.server.service.external.FcmService; import com.telepigeon.server.service.hurry.HurryRemover; import com.telepigeon.server.service.hurry.HurryRetriever; import com.telepigeon.server.service.openAi.OpenAiService; diff --git a/src/main/java/com/telepigeon/server/service/room/RoomService.java b/src/main/java/com/telepigeon/server/service/room/RoomService.java index 49f1877..c247051 100644 --- a/src/main/java/com/telepigeon/server/service/room/RoomService.java +++ b/src/main/java/com/telepigeon/server/service/room/RoomService.java @@ -12,7 +12,7 @@ import com.telepigeon.server.repository.RoomRepository; import com.telepigeon.server.service.answer.AnswerRemover; import com.telepigeon.server.service.answer.AnswerRetriever; -import com.telepigeon.server.service.fcm.FcmService; +import com.telepigeon.server.service.external.FcmService; import com.telepigeon.server.service.profile.ProfileRemover; import com.telepigeon.server.service.profile.ProfileRetriever; import com.telepigeon.server.service.profile.ProfileSaver; diff --git a/src/main/java/com/telepigeon/server/service/worry/WorryRetriever.java b/src/main/java/com/telepigeon/server/service/worry/WorryRetriever.java index 049bcf6..77b6296 100644 --- a/src/main/java/com/telepigeon/server/service/worry/WorryRetriever.java +++ b/src/main/java/com/telepigeon/server/service/worry/WorryRetriever.java @@ -25,4 +25,9 @@ public Worry findById(Long worryId) { ()-> new NotFoundException(NotFoundErrorCode.WORRY_NOT_FOUND) ); } + + public List findAllByTime(String time) { + return worryRepository.findAllByTime(time); + } + } diff --git a/src/test/java/com/telepigeon/server/questionTest/QuestionServiceTest.java b/src/test/java/com/telepigeon/server/questionTest/QuestionServiceTest.java index 29e56e6..950e6f3 100644 --- a/src/test/java/com/telepigeon/server/questionTest/QuestionServiceTest.java +++ b/src/test/java/com/telepigeon/server/questionTest/QuestionServiceTest.java @@ -11,7 +11,7 @@ //import com.telepigeon.server.exception.BusinessException; //import com.telepigeon.server.exception.NotFoundException; //import com.telepigeon.server.service.answer.AnswerRetriever; -//import com.telepigeon.server.service.fcm.FcmService; +//import com.telepigeon.server.service.external.FcmService; //import com.telepigeon.server.service.hurry.HurryRetriever; //import com.telepigeon.server.service.openAi.OpenAiService; //import com.telepigeon.server.service.profile.ProfileRetriever;