diff --git a/src/main/java/com/uspray/uspray/controller/PrayController.java b/src/main/java/com/uspray/uspray/controller/PrayController.java index 5e274010..8ef22bd1 100644 --- a/src/main/java/com/uspray/uspray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/controller/PrayController.java @@ -40,7 +40,7 @@ public class PrayController { private final PrayService prayService; - private final PrayFacade prayFacadeService; + private final PrayFacade prayFacade; @Operation(summary = "기도제목 목록 조회") @ApiResponse( @@ -82,7 +82,7 @@ public ApiResponseDto createPray( @Parameter(hidden = true) @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, - prayFacadeService.createPray(prayRequestDto, user.getUsername())); + prayFacade.createPray(prayRequestDto, user.getUsername())); } @DeleteMapping("/{prayId}") @@ -108,7 +108,7 @@ public ApiResponseDto updatePray( @Parameter(hidden = true) @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, - prayFacadeService.updatePray(prayId, user.getUsername(), prayUpdateRequestDto)); + prayFacade.updatePray(prayId, user.getUsername(), prayUpdateRequestDto)); } @Operation(summary = "오늘 기도하기") @@ -122,7 +122,7 @@ public ApiResponseDto> todayPray( @Parameter(hidden = true) @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, - prayService.todayPray(prayId, user.getUsername())); + prayFacade.todayPray(prayId, user.getUsername())); } @Operation(summary = "기도 완료하기") @@ -135,7 +135,7 @@ public ApiResponseDto> completePray( @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, @Parameter(hidden = true) @AuthenticationPrincipal User user ) { - prayFacadeService.createHistory(user.getUsername(), prayId); + prayFacade.createHistory(user.getUsername(), prayId); return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, prayService.completePray(prayId, user.getUsername())); } diff --git a/src/main/java/com/uspray/uspray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/service/PrayFacade.java index ec6bb9c7..91631481 100644 --- a/src/main/java/com/uspray/uspray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/service/PrayFacade.java @@ -1,5 +1,6 @@ package com.uspray.uspray.service; +import com.uspray.uspray.DTO.pray.PrayListResponseDto; import com.uspray.uspray.DTO.pray.request.PrayRequestDto; import com.uspray.uspray.DTO.pray.request.PrayUpdateRequestDto; import com.uspray.uspray.DTO.pray.response.PrayResponseDto; @@ -7,27 +8,36 @@ import com.uspray.uspray.domain.Category; import com.uspray.uspray.domain.History; import com.uspray.uspray.domain.Member; +import com.uspray.uspray.domain.NotificationLog; import com.uspray.uspray.domain.Pray; import com.uspray.uspray.exception.ErrorStatus; import com.uspray.uspray.exception.model.CustomException; +import com.uspray.uspray.exception.model.NotFoundException; import com.uspray.uspray.infrastructure.CategoryRepository; import com.uspray.uspray.infrastructure.HistoryRepository; import com.uspray.uspray.infrastructure.MemberRepository; +import com.uspray.uspray.infrastructure.NotificationLogRepository; import com.uspray.uspray.infrastructure.PrayRepository; import java.time.LocalDate; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor +@Slf4j public class PrayFacade { private final MemberRepository memberRepository; private final PrayRepository prayRepository; private final CategoryRepository categoryRepository; private final HistoryRepository historyRepository; + private final NotificationLogRepository notificationLogRepository; + private final FCMNotificationService fcmNotificationService; @Transactional public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username) { @@ -91,4 +101,65 @@ public void createHistory(String username, Long prayId) { .build(); historyRepository.save(history); } + + @Transactional + public List getPrayList(String username, String prayType) { + + List prays = prayRepository.findAllWithOrderAndType(username, prayType); + + // Pray 엔티티를 categoryId를 기준으로 그룹화한 맵 생성 + Map> prayMap = prays.stream() + .collect(Collectors.groupingBy(pray -> pray.getCategory().getId())); + + // 그룹화된 맵을 PrayListResponseDto 변환하여 반환 + return prayMap.entrySet().stream() + .map(entry -> new PrayListResponseDto(entry.getKey(), + entry.getValue().get(0).getCategory().getName(), + entry.getValue().stream() + .map(PrayResponseDto::of) + .collect(Collectors.toList()))) + .collect(Collectors.toList()); + } + + @Transactional + public List todayPray(Long prayId, String username) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + LocalDate today = LocalDate.now(); + handlePrayedToday(pray, today); + return getPrayList(username, PrayType.PERSONAL.stringValue()); + } + + private void sendNotificationAndSaveLog(Pray pray, Member member) { + try { + fcmNotificationService.sendMessageTo( + member.getFirebaseToken(), + "누군가가 당신이 공유한 기도제목을 기도했어요.", + "💘"); + } catch (Exception e) { + log.error(e.getMessage()); + + } + log.error( + "send notification to " + memberRepository.getMemberByUserId(member.getUserId()) + ); + NotificationLog notificationLog = NotificationLog.builder() + .pray(pray) + .member(memberRepository.getMemberByUserId(member.getUserId())) + .title("누군가가 당신이 공유한 기도제목을 기도했어요.") + .build(); + notificationLogRepository.save(notificationLog); + } + + private void handlePrayedToday(Pray pray, LocalDate today) { + if (pray.getLastPrayedAt().equals(today)) { + throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY, + ErrorStatus.ALREADY_PRAYED_TODAY.getMessage()); + } + pray.countUp(); + + if (pray.getPrayType() == PrayType.SHARED) { + Pray originPray = prayRepository.getPrayById(pray.getOriginPrayId()); + sendNotificationAndSaveLog(pray, originPray.getMember()); + } + } } diff --git a/src/main/java/com/uspray/uspray/service/PrayService.java b/src/main/java/com/uspray/uspray/service/PrayService.java index 59ac6b3a..269237b4 100644 --- a/src/main/java/com/uspray/uspray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/service/PrayService.java @@ -3,14 +3,8 @@ import com.uspray.uspray.DTO.pray.PrayListResponseDto; import com.uspray.uspray.DTO.pray.response.PrayResponseDto; import com.uspray.uspray.Enums.PrayType; -import com.uspray.uspray.domain.NotificationLog; import com.uspray.uspray.domain.Pray; -import com.uspray.uspray.exception.ErrorStatus; -import com.uspray.uspray.exception.model.NotFoundException; -import com.uspray.uspray.infrastructure.MemberRepository; -import com.uspray.uspray.infrastructure.NotificationLogRepository; import com.uspray.uspray.infrastructure.PrayRepository; -import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -23,8 +17,6 @@ public class PrayService { private final PrayRepository prayRepository; - private final NotificationLogRepository notificationLogRepository; - private final MemberRepository memberRepository; @Transactional public PrayResponseDto getPrayDetail(Long prayId, String username) { @@ -58,37 +50,6 @@ public List getPrayList(String username, String prayType) { .collect(Collectors.toList()); } - @Transactional - public List todayPray(Long prayId, String username) { - Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); - LocalDate today = LocalDate.now(); - handlePrayedToday(pray, today); - return getPrayList(username, PrayType.PERSONAL.stringValue()); - } - - private void sendNotificationAndSaveLog(Pray pray, String username) { - // TODO: notification 보내는 로직 추가 - System.out.println("send notification to " + memberRepository.getMemberByUserId(username)); - NotificationLog notificationLog = NotificationLog.builder() - .pray(pray) - .member(memberRepository.getMemberByUserId(username)) - .title("누군가가 당신이 공유한 기도제목을 기도했어요.") - .build(); - notificationLogRepository.save(notificationLog); - } - - private void handlePrayedToday(Pray pray, LocalDate today) { - if (pray.getLastPrayedAt().equals(today)) { - throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY, - ErrorStatus.ALREADY_PRAYED_TODAY.getMessage()); - } - pray.countUp(); - - if (pray.getPrayType() == PrayType.SHARED) { - Pray originPray = prayRepository.getPrayById(pray.getOriginPrayId()); - sendNotificationAndSaveLog(pray, originPray.getMember().getUserId()); - } - } @Transactional public List completePray(Long prayId, String username) {