diff --git a/src/main/java/TtattaBackend/ttatta/repository/DiaryRepository.java b/src/main/java/TtattaBackend/ttatta/repository/DiaryRepository.java index 39f300c..ed808f2 100644 --- a/src/main/java/TtattaBackend/ttatta/repository/DiaryRepository.java +++ b/src/main/java/TtattaBackend/ttatta/repository/DiaryRepository.java @@ -9,7 +9,6 @@ import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; @@ -178,7 +177,7 @@ List findNearDiariesCandidates( @Param("userId") Long userId ); - List findAllByCreatedAtBetween(LocalDateTime startDateTime, LocalDateTime endDateTime); + List findAllByUsersAndCreatedAtBetween(Users user, LocalDateTime startDateTime, LocalDateTime endDateTime); @Modifying @Query("UPDATE Diaries d SET d.memoryDiaryAlarmCoolTime = d.memoryDiaryAlarmCoolTime - 1 WHERE d.memoryDiaryAlarmCoolTime > 0") diff --git a/src/main/java/TtattaBackend/ttatta/service/AlarmService/AlarmCommandServiceImpl.java b/src/main/java/TtattaBackend/ttatta/service/AlarmService/AlarmCommandServiceImpl.java index 62c0236..0930020 100644 --- a/src/main/java/TtattaBackend/ttatta/service/AlarmService/AlarmCommandServiceImpl.java +++ b/src/main/java/TtattaBackend/ttatta/service/AlarmService/AlarmCommandServiceImpl.java @@ -140,25 +140,29 @@ private void reserveSendPushNotificationByFcm(LocalDateTime alarmTime, Users use private void reserveSendPushNotificationByFcm(LocalDateTime alarmTime, Users user, AlaramType alaramType, Map> scheduledTasks, String memoryDiaryAlarmDaysAgo, Long diaryId) { ScheduledFuture future = taskScheduler.schedule(() -> { try { - ZoneId zoneId = ZoneId.of("Asia/Seoul"); - LocalDate today = LocalDate.now(zoneId); - List diaries = diaryRepository.findAllByCreatedAtBetween( - today.atStartOfDay(), // 오늘 00:00:00 - today.plusDays(1).atStartOfDay() // 내일 00:00:00 - ); - if (scheduledTasks.containsKey(user.getId())) { // 이미 예약된 알림이 있는 경우, 기존 예약 취소 scheduledTasks.get(user.getId()).cancel(false); scheduledTasks.remove(user.getId()); } - if (alaramType == AlaramType.DAILY_SUMMARY && diaries.size() < 2) return; // 일일 요약 알림은 오늘 작성한 일기가 2개 미만이면 보내지 않음 - else if (alaramType == AlaramType.DAILY_SUMMARY && diaries.size() >= 2) { - summaryCommandService.summarize( - DiarySummaryRequestDTO.SummarizeDTO.builder() - .date(today) - .build() + if (alaramType == AlaramType.DAILY_SUMMARY) { + ZoneId zoneId = ZoneId.of("Asia/Seoul"); + LocalDate today = LocalDate.now(zoneId); + List diaries = diaryRepository.findAllByUsersAndCreatedAtBetween( + user, + today.atStartOfDay(), // 오늘 00:00:00 + today.plusDays(1).atStartOfDay() // 내일 00:00:00 ); + if (diaries.size() < 2) { + return; // 오늘 작성한 일기가 2개 미만이면 일일 요약 알림 보내지 않음 + } else { + summaryCommandService.summarizeByDailySummaryAlarm( + user.getId(), + DiarySummaryRequestDTO.SummarizeDTO.builder() + .date(today) + .build() + ); + } } fcmPushSender.sendPushNotification(user.getFcmToken(), alaramType, memoryDiaryAlarmDaysAgo, diaryId); } finally { @@ -348,6 +352,7 @@ public AlarmResponseDTO.DailySummaryAlarmOnResponseDTO sendDailySummaryPushAlarm } if (getDailySummaryAlarm.getAlarmTime().isAfter(LocalTime.now())) { // 현재 시간보다 이전 알림 시간은 예약하지 않음 LocalDateTime ALARM_TIME = getAlarmLocalDateTime(getDailySummaryAlarm.getAlarmTime()); + System.out.println("하루 요약 알림 예약!!!"); reserveSendPushNotificationByFcm(ALARM_TIME, getUser, AlaramType.DAILY_SUMMARY, dailySummaryAlarmScheduledTasks); } diff --git a/src/main/java/TtattaBackend/ttatta/service/AlarmService/FcmPushSender.java b/src/main/java/TtattaBackend/ttatta/service/AlarmService/FcmPushSender.java index f9e4322..d2bd65c 100644 --- a/src/main/java/TtattaBackend/ttatta/service/AlarmService/FcmPushSender.java +++ b/src/main/java/TtattaBackend/ttatta/service/AlarmService/FcmPushSender.java @@ -2,10 +2,7 @@ import TtattaBackend.ttatta.apiPayload.code.status.ErrorStatus; import TtattaBackend.ttatta.apiPayload.exception.handler.ExceptionHandler; -import com.google.firebase.messaging.FirebaseMessaging; -import com.google.firebase.messaging.FirebaseMessagingException; -import com.google.firebase.messaging.Message; -import com.google.firebase.messaging.Notification; +import com.google.firebase.messaging.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryCommandService.java b/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryCommandService.java index 4feecef..c8a7a1f 100644 --- a/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryCommandService.java +++ b/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryCommandService.java @@ -5,7 +5,8 @@ import TtattaBackend.ttatta.web.dto.DiarySummaryResponseDTO; public interface SummaryCommandService { - public SummaryDiary summarize(DiarySummaryRequestDTO.SummarizeDTO request); - public SummaryDiary reSummarize(DiarySummaryRequestDTO.SummarizeDTO request); - public DiarySummaryResponseDTO.DiarySummaryResultDTO getSummary(DiarySummaryRequestDTO.GetDiarySummaryDTO request); + SummaryDiary summarize(DiarySummaryRequestDTO.SummarizeDTO request); + SummaryDiary summarizeByDailySummaryAlarm(Long userId, DiarySummaryRequestDTO.SummarizeDTO request); + SummaryDiary reSummarize(DiarySummaryRequestDTO.SummarizeDTO request); + DiarySummaryResponseDTO.DiarySummaryResultDTO getSummary(DiarySummaryRequestDTO.GetDiarySummaryDTO request); } diff --git a/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryCommandServiceImpl.java b/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryCommandServiceImpl.java index ef37789..3cf42b0 100644 --- a/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryCommandServiceImpl.java +++ b/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryCommandServiceImpl.java @@ -84,6 +84,40 @@ public SummaryDiary summarize(DiarySummaryRequestDTO.SummarizeDTO request) { return summaryDiary; } + @Override + public SummaryDiary summarizeByDailySummaryAlarm(Long userId, DiarySummaryRequestDTO.SummarizeDTO request) { + Users user = userRepository.findById(userId).orElse(null); + LocalDate day = request.getDate(); + + LocalDateTime todayStart = day.atStartOfDay(); + LocalDateTime todayEnd = day.atTime(LocalTime.MAX); + + List diaries = diaryRepository.findAllByUserIdAndDate(user, todayStart, todayEnd); + String prompt = PromptBuilder.buildPrompt(diaries); + + ChatGPTRequestDTO gptRequest = new ChatGPTRequestDTO(model, prompt); + ChatGPTResponseDTO responseDTO = restTemplate.postForObject(apiUrl, gptRequest, ChatGPTResponseDTO.class); + + String content = responseDTO.getChoices().get(0).getMessage().getContent(); + + String rawKey = diaries.stream() + .map(d -> d.getId() + ":" + d.getUpdatedAt().toString()) + .sorted() + .collect(Collectors.joining(",")); + + String diaryKeyHash = generateSHA256(rawKey); + + SummaryDiary summaryDiary = SummaryDiary.builder() + .date(day) + .content(content) + .users(user) + .diaryKeyHash(diaryKeyHash) + .build(); + + summaryDiaryRepository.save(summaryDiary); + return summaryDiary; + } + @Override public SummaryDiary reSummarize(DiarySummaryRequestDTO.SummarizeDTO request) { Long userId = SecurityUtil.getCurrentUserId(); diff --git a/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryDiaryBatchService.java b/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryDiaryBatchService.java index 60a533f..2db1118 100644 --- a/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryDiaryBatchService.java +++ b/src/main/java/TtattaBackend/ttatta/service/OpenAiService/SummaryDiaryBatchService.java @@ -1,60 +1,60 @@ -package TtattaBackend.ttatta.service.OpenAiService; - -import TtattaBackend.ttatta.domain.DailySummaryAlarm; -import TtattaBackend.ttatta.domain.Diaries; -import TtattaBackend.ttatta.repository.DailySummaryAlarmRepository; -import TtattaBackend.ttatta.repository.DiaryRepository; -import TtattaBackend.ttatta.web.dto.DiarySummaryRequestDTO; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.List; - -@Service -@Slf4j -@RequiredArgsConstructor -public class SummaryDiaryBatchService { - private final DailySummaryAlarmRepository dailySummaryAlarmRepository; - private final SummaryCommandService summaryCommandService; - private final DiaryRepository diaryRepository; - - @Scheduled(cron = "0 * * * * *") - public void processDailySummaryDiary() { - LocalTime currentTime = LocalTime.now().withSecond(0).withNano(0); - - List alarms = dailySummaryAlarmRepository.findByAlarmTime(currentTime); - - for (DailySummaryAlarm alarm : alarms) { - try { - LocalDate today = LocalDate.now(); - LocalDateTime todayStart = today.atStartOfDay(); - LocalDateTime todayEnd = today.plusDays(1).atStartOfDay(); - - List todayDiaries = diaryRepository.findAllByUserIdAndDate( - alarm.getUsers(), todayStart, todayEnd); - - if (todayDiaries.size() < 2) { - log.info("요약 건너뜀 - 사용자 ID: {}, 오늘 일기 수: {}", - alarm.getUsers().getId(), todayDiaries.size()); - continue; - } - - DiarySummaryRequestDTO.SummarizeDTO request = DiarySummaryRequestDTO.SummarizeDTO.builder() - .date(today) - .build(); - - summaryCommandService.summarize(request); - log.info("자동 요약 완료 - 사용자 ID: {}, 알람 시간: {}", - alarm.getUsers().getId(), alarm.getAlarmTime()); - } catch (Exception e) { - log.error("자동 요약 실패 - 사용자 ID: {}, 에러: {}", - alarm.getUsers().getId(), e.getMessage()); - } - } - } -} \ No newline at end of file +//package TtattaBackend.ttatta.service.OpenAiService; +// +//import TtattaBackend.ttatta.domain.DailySummaryAlarm; +//import TtattaBackend.ttatta.domain.Diaries; +//import TtattaBackend.ttatta.repository.DailySummaryAlarmRepository; +//import TtattaBackend.ttatta.repository.DiaryRepository; +//import TtattaBackend.ttatta.web.dto.DiarySummaryRequestDTO; +//import lombok.RequiredArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.scheduling.annotation.Scheduled; +//import org.springframework.stereotype.Service; +// +//import java.time.LocalDate; +//import java.time.LocalDateTime; +//import java.time.LocalTime; +//import java.util.List; +// +//@Service +//@Slf4j +//@RequiredArgsConstructor +//public class SummaryDiaryBatchService { +// private final DailySummaryAlarmRepository dailySummaryAlarmRepository; +// private final SummaryCommandService summaryCommandService; +// private final DiaryRepository diaryRepository; +// +// @Scheduled(cron = "0 * * * * *") +// public void processDailySummaryDiary() { +// LocalTime currentTime = LocalTime.now().withSecond(0).withNano(0); +// +// List alarms = dailySummaryAlarmRepository.findByAlarmTime(currentTime); +// +// for (DailySummaryAlarm alarm : alarms) { +// try { +// LocalDate today = LocalDate.now(); +// LocalDateTime todayStart = today.atStartOfDay(); +// LocalDateTime todayEnd = today.plusDays(1).atStartOfDay(); +// +// List todayDiaries = diaryRepository.findAllByUserIdAndDate( +// alarm.getUsers(), todayStart, todayEnd); +// +// if (todayDiaries.size() < 2) { +// log.info("요약 건너뜀 - 사용자 ID: {}, 오늘 일기 수: {}", +// alarm.getUsers().getId(), todayDiaries.size()); +// continue; +// } +// +// DiarySummaryRequestDTO.SummarizeDTO request = DiarySummaryRequestDTO.SummarizeDTO.builder() +// .date(today) +// .build(); +// +// summaryCommandService.summarize(request); +// log.info("자동 요약 완료 - 사용자 ID: {}, 알람 시간: {}", +// alarm.getUsers().getId(), alarm.getAlarmTime()); +// } catch (Exception e) { +// log.error("자동 요약 실패 - 사용자 ID: {}, 에러: {}", +// alarm.getUsers().getId(), e.getMessage()); +// } +// } +// } +//} \ No newline at end of file