From 300cfe7a3c853a6bd6dcfd8b40f74e9373d8daa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Tue, 22 Oct 2024 17:06:16 +0900 Subject: [PATCH 01/15] =?UTF-8?q?refactor:=20prayController=20indent=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20pathvariable=20=EB=88=84?= =?UTF-8?q?=EB=9D=BD=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pray/controller/PrayController.java | 134 +++++++++--------- 1 file changed, 66 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java index 1d3ee3c5..0ec4a465 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java @@ -1,6 +1,5 @@ package com.uspray.uspray.domain.pray.controller; - import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; import com.uspray.uspray.domain.pray.dto.pray.request.PrayRequestDto; import com.uspray.uspray.domain.pray.dto.pray.request.PrayUpdateRequestDto; @@ -28,79 +27,78 @@ @RequiredArgsConstructor public class PrayController implements PrayApi { - private final PrayService prayService; - private final PrayFacade prayFacade; + private final PrayService prayService; + private final PrayFacade prayFacade; - @GetMapping - public ApiResponseDto> getPrayList( - @AuthenticationPrincipal User user, - String prayType - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - prayFacade.getPrayList(user.getUsername(), prayType)); - } + @GetMapping + public ApiResponseDto> getPrayList( + @AuthenticationPrincipal User user, + String prayType + ) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + prayFacade.getPrayList(user.getUsername(), prayType)); + } - @GetMapping("/{prayId}") - public ApiResponseDto getPrayDetail( - @AuthenticationPrincipal User user, - Long prayId - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, - prayService.getPrayDetail(prayId, user.getUsername())); - } + @GetMapping("/{prayId}") + public ApiResponseDto getPrayDetail( + @AuthenticationPrincipal User user, + @PathVariable("prayId") Long prayId) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, + prayService.getPrayDetail(prayId, user.getUsername())); + } - @PostMapping - public ApiResponseDto createPray( - @RequestBody @Valid PrayRequestDto prayRequestDto, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, - prayFacade.createPray(prayRequestDto, user.getUsername(), null)); - } + @PostMapping + public ApiResponseDto createPray( + @RequestBody @Valid PrayRequestDto prayRequestDto, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, + prayFacade.createPray(prayRequestDto, user.getUsername(), null)); + } - @DeleteMapping("/{prayId}") - public ApiResponseDto deletePray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, - prayFacade.deletePray(prayId, user.getUsername())); - } + @DeleteMapping("/{prayId}") + public ApiResponseDto deletePray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, + prayFacade.deletePray(prayId, user.getUsername())); + } - @PutMapping("/{prayId}") - public ApiResponseDto updatePray( - @PathVariable("prayId") Long prayId, - @RequestBody @Valid PrayUpdateRequestDto prayUpdateRequestDto, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, - prayFacade.updatePray(prayId, user.getUsername(), prayUpdateRequestDto)); - } + @PutMapping("/{prayId}") + public ApiResponseDto updatePray( + @PathVariable("prayId") Long prayId, + @RequestBody @Valid PrayUpdateRequestDto prayUpdateRequestDto, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, + prayFacade.updatePray(prayId, user.getUsername(), prayUpdateRequestDto)); + } - @PutMapping("/{prayId}/today") - public ApiResponseDto> todayPray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, - prayFacade.todayPray(prayId, user.getUsername())); - } + @PutMapping("/{prayId}/today") + public ApiResponseDto> todayPray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, + prayFacade.todayPray(prayId, user.getUsername())); + } - @PutMapping("/{prayId}/complete") - public ApiResponseDto> completePray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - prayFacade.completePray(prayId, user.getUsername())); - } + @PutMapping("/{prayId}/complete") + public ApiResponseDto> completePray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + prayFacade.completePray(prayId, user.getUsername())); + } - @PutMapping("/{prayId}/cancel") - public ApiResponseDto> cancelPray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.CANCEL_PRAY_SUCCESS, - prayFacade.cancelPray(prayId, user.getUsername())); - } + @PutMapping("/{prayId}/cancel") + public ApiResponseDto> cancelPray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.CANCEL_PRAY_SUCCESS, + prayFacade.cancelPray(prayId, user.getUsername())); + } } From c8b39f798639e5cc55be771ac112c41dec980fbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Wed, 23 Oct 2024 20:41:19 +0900 Subject: [PATCH 02/15] =?UTF-8?q?refactor:=20update=20pray=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/pray/service/PrayFacade.java | 420 +++++++++--------- .../domain/pray/service/PrayService.java | 70 +-- .../uspray/global/exception/ErrorStatus.java | 1 + 3 files changed, 258 insertions(+), 233 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 121e2e6d..c3f6cf13 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -28,210 +28,230 @@ import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor @Slf4j public class PrayFacade { - private final HistoryService historyService; - private final NotificationLogService notificationLogService; - private final FCMNotificationService fcmNotificationService; - private final ScrapAndHeartService scrapAndHeartService; - private final ShareService shareService; - private final PrayService prayService; - private final MemberService memberService; - private final CategoryService categoryService; - - @Transactional - public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username, - LocalDate startDateOrNull) { - Member member = memberService.findMemberByUserId(username); - Category category = categoryService.getCategoryByIdAndMember(prayRequestDto.getCategoryId(), - member); - return prayService.savePray(prayRequestDto.toEntity(member, category, startDateOrNull)); - } - - @Transactional - public PrayResponseDto updatePray(Long prayId, String username, - PrayUpdateRequestDto prayUpdateRequestDto) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - - // 이 기도 제목을 공유한 적 없거나, 공유 받은 사람이 없으면 전부 수정 가능 - // 이 기도 제목을 공유한 적 있고, 누구라도 공유 받은 사람이 있으면 기도제목 내용 수정 불가능 - Pray sharedPray = prayService.getSharedPray(prayId); - Category category = categoryService.getCategoryByIdAndMember( - prayUpdateRequestDto.getCategoryId(), - pray.getMember()); - // 기도 제목 타입과 카테고리 타입 일치하는 지 확인 - if (!pray.getPrayType().toString().equals(category.getCategoryType().toString())) { - throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); - } - - // 공유 됐을 때 content가 있는 경우 - if ((sharedPray != null || pray.getPrayType() == PrayType.SHARED) && prayUpdateRequestDto.getContent() != null) { - throw new CustomException(ErrorStatus.ALREADY_SHARED_EXCEPTION); - } - - return PrayResponseDto.of(pray.update(prayUpdateRequestDto, category)); - } - - @Transactional - public void convertPrayToHistory() { - List prayList = prayService.getPrayListDeadlineBefore(LocalDate.now()); - for (Pray pray : prayList) { - pray.complete(); - Integer sharedCount = prayService.getSharedCountByOriginPrayId( - pray.getOriginPrayId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) //sharedCount에 내 count도 포함되어 있음 - .build(); - historyService.saveHistory(history); - prayService.deletePray(pray); - } - } - - public void convertPrayToHistory(Pray pray) { - pray.complete(); - History history = History.builder() - .pray(pray) - .build(); - historyService.saveHistory(history); - prayService.deletePray(pray); - } - - @Transactional - public CategoryResponseDto deleteCategory(String username, Long categoryId) { - Member member = memberService.findMemberByUserId(username); - Category category = categoryService.getCategoryByIdAndMember(categoryId, member); - - prayService.getPrayListByCategory(category).forEach(this::convertPrayToHistory); - - return categoryService.deleteCategory(category); - } - - - @Transactional - public List todayPray(Long prayId, String username) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - handlePrayedToday(pray); - return getPrayList(username, pray.getPrayType().stringValue()); - } - - private void sendNotification(Member member) { - try { - fcmNotificationService.sendMessageTo( - member.getFirebaseToken(), - "💘", - "누군가가 당신의 기도제목을 두고 기도했어요"); - } catch (Exception e) { - log.error(e.getMessage()); - - } - log.error( - "send notification to " + member - ); - } - - private void saveNotificationLog(Pray pray, Member member) { - NotificationLog notificationLog = NotificationLog.builder() - .pray(pray) - .member(member) - .title("누군가가 당신의 기도제목을 두고 기도했어요") - .build(); - - notificationLogService.saveNotificationLog(notificationLog); - } - - private void handlePrayedToday(Pray pray) { - if (pray.getLastPrayedAt().equals(LocalDate.now())) { - throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); - } - pray.countUp(); - - if (pray.getPrayType() == PrayType.SHARED) { - Member originMember = memberService.findMemberById(pray.getOriginMemberId()); - if (originMember.getSecondNotiAgree()) { - sendNotification(originMember); - saveNotificationLog(pray, originMember); - } - } - } - - @Transactional - public PrayResponseDto deletePray(Long prayId, String username) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - Member member = memberService.findMemberByUserId(username); - - scrapAndHeartService.deleteScrapAndHeart(member, pray); - shareService.deleteByOriginPray(pray); - prayService.deletePray(pray); - return PrayResponseDto.of(pray); - } - - @Transactional - public List getPrayList(String username, String prayType) { - // 사용자 정보와 카테고리 타입을 가져옴 - Member member = memberService.findMemberByUserId(username); - CategoryType categoryType = CategoryType.valueOf(prayType); - List categoryList = categoryService.getCategoryListByMemberAndCategoryType(member, categoryType); - - // 카테고리 리스트가 비어있을 경우 빈 리스트 반환 - if (categoryList.isEmpty()) { - return Collections.emptyList(); - } - - // PrayListResponseDto 생성 및 반환 - return categoryList.stream() - .map(category -> createPrayListResponseDto(member, category)) - .collect(Collectors.toList()); - } - - private PrayListResponseDto createPrayListResponseDto(Member member, Category category) { - // 기도 리스트 변환 - List prayResponseDtos = prayService.getPrayListByMemberAndCategory(member, category).stream() - .map(this::convertToPrayResponseDto) - .collect(Collectors.toList()); - - // PrayListResponseDto 생성 - return new PrayListResponseDto(category.getId(), category.getName(), category.getColor(), prayResponseDtos); - } - - private PrayResponseDto convertToPrayResponseDto(Pray pray) { - // 기도의 타입에 따라 적절한 PrayResponseDto 생성 - if (pray.getPrayType().equals(PrayType.SHARED)) { - Member originMember = memberService.findMemberById(pray.getOriginMemberId()); - return PrayResponseDto.shared(pray, originMember); - } else { - return PrayResponseDto.of(pray); - } - } - - - @Transactional - public List completePray(Long prayId, String username) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - pray.complete(); - - createHistory(pray); - prayService.deletePray(pray); - - return getPrayList(username, pray.getPrayType().stringValue()); - } - - private void createHistory(Pray pray) { - Integer sharedCount = prayService.getSharedCountByOriginPrayId(pray.getId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) - .build(); - historyService.saveHistory(history); - } - - @Transactional - public List cancelPray(Long prayId, String username) { - return getPrayList(username, - prayService.cancelPray(prayId, username).getPrayType().stringValue()); - } + + private final HistoryService historyService; + private final NotificationLogService notificationLogService; + private final FCMNotificationService fcmNotificationService; + private final ScrapAndHeartService scrapAndHeartService; + private final ShareService shareService; + private final PrayService prayService; + private final MemberService memberService; + private final CategoryService categoryService; + + private static void checkIsAlreadyPrayed(Pray pray) { + if (pray.getLastPrayedAt().equals(LocalDate.now())) { + throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); + } + } + + private boolean isSharedPray(Pray pray) { + return prayService.isSharedPray(pray) || pray.getPrayType() == PrayType.SHARED; + } + + private void checkSharedPrayValidation(PrayUpdateRequestDto prayUpdateRequestDto, + Pray pray) { + if (isSharedPray(pray) + && prayUpdateRequestDto.getContent() != null) { + throw new CustomException(ErrorStatus.SHARED_PRAY_UPDATE_EXCEPTION); + } + } + + @Transactional + public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username, + LocalDate startDateOrNull) { + Member member = memberService.findMemberByUserId(username); + Category category = categoryService.getCategoryByIdAndMember(prayRequestDto.getCategoryId(), + member); + return prayService.savePray(prayRequestDto.toEntity(member, category, startDateOrNull)); + } + + @Transactional + public PrayResponseDto updatePray(Long prayId, String username, + PrayUpdateRequestDto prayUpdateRequestDto) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + + checkSharedPrayValidation(prayUpdateRequestDto, pray); + + Category category = getCategory(prayUpdateRequestDto, pray); + + return PrayResponseDto.of(pray.update(prayUpdateRequestDto, category)); + } + + @NotNull + private Category getCategory(PrayUpdateRequestDto prayUpdateRequestDto, Pray pray) { + Category category = categoryService.getCategoryByIdAndMember( + prayUpdateRequestDto.getCategoryId(), + pray.getMember()); + // 기도 제목 타입과 카테고리 타입 일치하는 지 확인 + if (!pray.getPrayType().toString().equals(category.getCategoryType().toString())) { + throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); + } + return category; + } + + @Transactional + public void convertPrayToHistory() { + List prayList = prayService.getPrayListDeadlineBefore(LocalDate.now()); + for (Pray pray : prayList) { + pray.complete(); + Integer sharedCount = prayService.getSharedCountByOriginPrayId( + pray.getOriginPrayId()); + History history = History.builder() + .pray(pray) + .totalCount(sharedCount) //sharedCount에 내 count도 포함되어 있음 + .build(); + historyService.saveHistory(history); + prayService.deletePray(pray); + } + } + + public void convertPrayToHistory(Pray pray) { + pray.complete(); + History history = History.builder() + .pray(pray) + .build(); + historyService.saveHistory(history); + prayService.deletePray(pray); + } + + @Transactional + public CategoryResponseDto deleteCategory(String username, Long categoryId) { + Member member = memberService.findMemberByUserId(username); + Category category = categoryService.getCategoryByIdAndMember(categoryId, member); + + prayService.getPrayListByCategory(category).forEach(this::convertPrayToHistory); + + return categoryService.deleteCategory(category); + } + + @Transactional + public List todayPray(Long prayId, String username) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + handlePrayedToday(pray); + return getPrayList(username, pray.getPrayType().stringValue()); + } + + private void sendNotification(Member member) { + try { + fcmNotificationService.sendMessageTo( + member.getFirebaseToken(), + "💘", + "누군가가 당신의 기도제목을 두고 기도했어요"); + } catch (Exception e) { + log.error(e.getMessage()); + + } + log.error( + "send notification to " + member + ); + } + + private void saveNotificationLog(Pray pray, Member member) { + NotificationLog notificationLog = NotificationLog.builder() + .pray(pray) + .member(member) + .title("누군가가 당신의 기도제목을 두고 기도했어요") + .build(); + + notificationLogService.saveNotificationLog(notificationLog); + } + + private void handlePrayedToday(Pray pray) { + checkIsAlreadyPrayed(pray); + pray.countUp(); + + if (pray.getPrayType() == PrayType.SHARED) { + Member originMember = memberService.findMemberById(pray.getOriginMemberId()); + if (originMember.getSecondNotiAgree()) { + sendNotification(originMember); + saveNotificationLog(pray, originMember); + } + } + } + + @Transactional + public PrayResponseDto deletePray(Long prayId, String username) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + Member member = memberService.findMemberByUserId(username); + + scrapAndHeartService.deleteScrapAndHeart(member, pray); + shareService.deleteByOriginPray(pray); + prayService.deletePray(pray); + return PrayResponseDto.of(pray); + } + + @Transactional + public List getPrayList(String username, String prayType) { + // 사용자 정보와 카테고리 타입을 가져옴 + Member member = memberService.findMemberByUserId(username); + CategoryType categoryType = CategoryType.valueOf(prayType); + List categoryList = categoryService.getCategoryListByMemberAndCategoryType(member, + categoryType); + + // 카테고리 리스트가 비어있을 경우 빈 리스트 반환 + if (categoryList.isEmpty()) { + return Collections.emptyList(); + } + + // PrayListResponseDto 생성 및 반환 + return categoryList.stream() + .map(category -> createPrayListResponseDto(member, category)) + .collect(Collectors.toList()); + } + + private PrayListResponseDto createPrayListResponseDto(Member member, Category category) { + // 기도 리스트 변환 + List prayResponseDtos = prayService.getPrayListByMemberAndCategory(member, + category).stream() + .map(this::convertToPrayResponseDto) + .collect(Collectors.toList()); + + // PrayListResponseDto 생성 + return new PrayListResponseDto(category.getId(), category.getName(), category.getColor(), + prayResponseDtos); + } + + private PrayResponseDto convertToPrayResponseDto(Pray pray) { + // 기도의 타입에 따라 적절한 PrayResponseDto 생성 + if (pray.getPrayType().equals(PrayType.SHARED)) { + Member originMember = memberService.findMemberById(pray.getOriginMemberId()); + return PrayResponseDto.shared(pray, originMember); + } else { + return PrayResponseDto.of(pray); + } + } + + + @Transactional + public List completePray(Long prayId, String username) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + pray.complete(); + + createHistory(pray); + prayService.deletePray(pray); + + return getPrayList(username, pray.getPrayType().stringValue()); + } + + private void createHistory(Pray pray) { + Integer sharedCount = prayService.getSharedCountByOriginPrayId(pray.getId()); + History history = History.builder() + .pray(pray) + .totalCount(sharedCount) + .build(); + historyService.saveHistory(history); + } + + @Transactional + public List cancelPray(Long prayId, String username) { + return getPrayList(username, + prayService.cancelPray(prayId, username).getPrayType().stringValue()); + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java index f90f5c18..84f5cbb9 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java @@ -15,47 +15,51 @@ @RequiredArgsConstructor public class PrayService { - private final PrayRepository prayRepository; + private final PrayRepository prayRepository; - @Transactional - public PrayResponseDto getPrayDetail(Long prayId, String username) { - Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); - return PrayResponseDto.of(pray); - } + @Transactional + public PrayResponseDto getPrayDetail(Long prayId, String username) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + return PrayResponseDto.of(pray); + } - public PrayResponseDto savePray(Pray pray) { - return PrayResponseDto.of(prayRepository.save(pray)); - } + public PrayResponseDto savePray(Pray pray) { + return PrayResponseDto.of(prayRepository.save(pray)); + } - public List getPrayListByCategory(Category category) { - return prayRepository.findAllByCategory(category); - } + public List getPrayListByCategory(Category category) { + return prayRepository.findAllByCategory(category); + } - public List getPrayListByMemberAndCategory(Member member, Category category) { - return prayRepository.findAllByMemberAndCategoryOrderByCreatedAtAsc(member, category); - } + public List getPrayListByMemberAndCategory(Member member, Category category) { + return prayRepository.findAllByMemberAndCategoryOrderByCreatedAtAsc(member, category); + } - public Pray getPrayByIdAndMemberId(Long prayId, String username) { - return prayRepository.getPrayByIdAndMemberId(prayId, username); - } + public Pray getPrayByIdAndMemberId(Long prayId, String username) { + return prayRepository.getPrayByIdAndMemberId(prayId, username); + } - public Pray getSharedPray(Long prayId) { - return prayRepository.getPrayByOriginPrayId(prayId); - } + private Pray getSharedPray(Long prayId) { + return prayRepository.getPrayByOriginPrayId(prayId); + } - public List getPrayListDeadlineBefore(LocalDate currentDate) { - return prayRepository.findAllByDeadlineBefore(currentDate); - } + public List getPrayListDeadlineBefore(LocalDate currentDate) { + return prayRepository.findAllByDeadlineBefore(currentDate); + } - public Integer getSharedCountByOriginPrayId(Long originPrayId) { - return prayRepository.getSharedCountByOriginPrayId(originPrayId); - } + public Integer getSharedCountByOriginPrayId(Long originPrayId) { + return prayRepository.getSharedCountByOriginPrayId(originPrayId); + } - public void deletePray(Pray pray) { - prayRepository.delete(pray); - } + public void deletePray(Pray pray) { + prayRepository.delete(pray); + } - public Pray cancelPray(Long prayId, String username) { - return prayRepository.cancelPray(prayId, username); - } + public Pray cancelPray(Long prayId, String username) { + return prayRepository.cancelPray(prayId, username); + } + + public Boolean isSharedPray(Pray pray) { + return getSharedPray(pray.getId()) == null; + } } diff --git a/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java b/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java index 87a2777f..bdef782f 100644 --- a/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java +++ b/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java @@ -23,6 +23,7 @@ public enum ErrorStatus { ALREADY_EXIST_GROUP_MEMBER_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 모임 회원입니다."), LEADER_CANNOT_LEAVE_GROUP_EXCEPTION(HttpStatus.BAD_REQUEST, "모임장은 모임을 떠날 수 없습니다."), ALREADY_SHARED_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 공유된 기도제목입니다."), + SHARED_PRAY_UPDATE_EXCEPTION(HttpStatus.BAD_REQUEST, "공유되어진 기도제목이나 공유해온 기도제목의 내용을 수정할 수 없습니다."), ALREADY_EXIST_GROUP_NAME_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 모임 이름입니다."), ALREADY_CANCEL_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 취소된 기도제목입니다."), WRONG_LOGIN_INFO_EXCEPTION(HttpStatus.BAD_REQUEST, "아이디 또는 비밀번호가 틀렸습니다."), From d32061ec485e09e8655a7e51bb758593b0f665ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Wed, 23 Oct 2024 21:15:04 +0900 Subject: [PATCH 03/15] =?UTF-8?q?refactor:=20convertPrayToHistory=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=ED=95=98=EC=97=AC=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/service/CategoryService.java | 235 +++++++++--------- .../history/service/HistoryService.java | 119 ++++----- .../domain/pray/service/PrayFacade.java | 41 +-- .../common/service/SchedulerService.java | 2 +- 4 files changed, 191 insertions(+), 206 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java b/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java index 28b6fa4d..8194cee8 100644 --- a/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java +++ b/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java @@ -2,15 +2,13 @@ import com.uspray.uspray.domain.category.dto.CategoryRequestDto; import com.uspray.uspray.domain.category.dto.CategoryResponseDto; -import com.uspray.uspray.global.enums.CategoryType; import com.uspray.uspray.domain.category.model.Category; +import com.uspray.uspray.domain.category.repository.CategoryRepository; import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.domain.member.repository.MemberRepository; +import com.uspray.uspray.global.enums.CategoryType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.NotFoundException; -import com.uspray.uspray.domain.category.repository.CategoryRepository; -import com.uspray.uspray.domain.member.repository.MemberRepository; -import com.uspray.uspray.domain.pray.repository.PrayRepository; -import com.uspray.uspray.domain.pray.service.PrayFacade; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -21,117 +19,118 @@ @RequiredArgsConstructor public class CategoryService { - private final MemberRepository memberRepository; - private final CategoryRepository categoryRepository; - private final PrayRepository prayRepository; -// private final PrayFacade prayFacade; - - public Category getCategoryByIdAndMember(Long categoryId, Member member) { - return categoryRepository.getCategoryByIdAndMember(categoryId, member); - } - - public List getCategoryListByMemberAndCategoryType(Member member, CategoryType categoryType) { - return categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc(member, categoryType); - } - - private static int getNewOrder(int index, List categories, Category category) { - Category targetPosition = categories.get(index - 1); - - if (targetPosition.equals(category)) { // 원하는 위치가 지금 내 위치와 같으면 - return targetPosition.getOrder(); - } - - if (index == 1) { // 원하는 위치가 첫번째면 - return getFirstPositionOrder(categories); - } - - if (index == categories.size()) { // 원하는 위치가 마지막이면 - return getLastPositionOrder(targetPosition); - } - return getMiddlePositionOrder(targetPosition, category, categories, index); - } - - private static void validateIndex(int index, int size) { - if (index < 1 || index > size) { - throw new NotFoundException(ErrorStatus.INDEX_OUT_OF_BOUND_EXCEPTION); - } - } - - private static int getFirstPositionOrder(List categories) { - return categories.get(0).getOrder() / 2; - } - - private static int getLastPositionOrder(Category prevCategory) { - return prevCategory.getOrder() + 1024; - } - - private static int getMiddlePositionOrder(Category targetCategory, Category currCategory, - List categories, int index) { - // 원하는 위치가 내 위치보다 앞이면 원하는 자리와 그 앞자리 중간으로 - // 원하는 위치가 내 위치보다 뒤면 원하는 자리와 그 뒷자리 중간으로 - int prevIndex = targetCategory.getOrder() < currCategory.getOrder() ? index - 2 : index; - return (targetCategory.getOrder() + categories.get(prevIndex).getOrder()) / 2; - } - - public CategoryResponseDto createCategory(String username, - CategoryRequestDto categoryRequestDto) { - Member member = memberRepository.getMemberByUserId(username); - int maxCategoryOrder = categoryRepository.checkDuplicateAndReturnMaxOrder( - categoryRequestDto.getName(), member, - CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); - Category category = categoryRequestDto.toEntity(member, maxCategoryOrder + 1024); - categoryRepository.save(category); - return CategoryResponseDto.of(category); - } - - public CategoryResponseDto deleteCategory(Category category) { - categoryRepository.delete(category); - return CategoryResponseDto.of(category); - } - - @Transactional - public CategoryResponseDto updateCategory(String username, Long categoryId, - CategoryRequestDto categoryRequestDto) { - Category category = categoryRepository.getCategoryByIdAndMember(categoryId, - memberRepository.getMemberByUserId(username)); - if (categoryRequestDto.getName() != null && !categoryRequestDto.getName().equals(category.getName())) { - categoryRepository.checkDuplicate(categoryRequestDto.getName(), category.getMember(), - CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); - } - category.update(categoryRequestDto); - return CategoryResponseDto.of(category); - } - - public CategoryResponseDto getCategory(String username, Long categoryId) { - Category category = categoryRepository.getCategoryByIdAndMember(categoryId, - memberRepository.getMemberByUserId(username)); - return CategoryResponseDto.of(category); - } - - @Transactional - public CategoryResponseDto updateCategoryOrder(String username, Long categoryId, int index) { - Member member = memberRepository.getMemberByUserId(username); - Category category = categoryRepository.getCategoryByIdAndMember(categoryId, member); - List categories = categoryRepository.getCategoriesByMemberAndCategoryTypeOrderByOrder( - member, category.getCategoryType()); - - validateIndex(index, categories.size()); - int newOrder = getNewOrder(index, categories, category); - - category.updateOrder(newOrder); - - categoryRepository.save(category); - - return CategoryResponseDto.of(category); - } - - public List getCategoryList(String username, String categoryType) { - Member member = memberRepository.getMemberByUserId(username); - CategoryType convertCategoryType = CategoryType.valueOf(categoryType.toUpperCase()); - List categories = categoryRepository.getCategoriesByMemberAndCategoryTypeOrderByOrder( - member, convertCategoryType); - return categories.stream() - .map(CategoryResponseDto::of) - .collect(Collectors.toList()); - } + private final MemberRepository memberRepository; + private final CategoryRepository categoryRepository; + + private static int getNewOrder(int index, List categories, Category category) { + Category targetPosition = categories.get(index - 1); + + if (targetPosition.equals(category)) { // 원하는 위치가 지금 내 위치와 같으면 + return targetPosition.getOrder(); + } + + if (index == 1) { // 원하는 위치가 첫번째면 + return getFirstPositionOrder(categories); + } + + if (index == categories.size()) { // 원하는 위치가 마지막이면 + return getLastPositionOrder(targetPosition); + } + return getMiddlePositionOrder(targetPosition, category, categories, index); + } + + private static void validateIndex(int index, int size) { + if (index < 1 || index > size) { + throw new NotFoundException(ErrorStatus.INDEX_OUT_OF_BOUND_EXCEPTION); + } + } + + private static int getFirstPositionOrder(List categories) { + return categories.get(0).getOrder() / 2; + } + + private static int getLastPositionOrder(Category prevCategory) { + return prevCategory.getOrder() + 1024; + } + + private static int getMiddlePositionOrder(Category targetCategory, Category currCategory, + List categories, int index) { + // 원하는 위치가 내 위치보다 앞이면 원하는 자리와 그 앞자리 중간으로 + // 원하는 위치가 내 위치보다 뒤면 원하는 자리와 그 뒷자리 중간으로 + int prevIndex = targetCategory.getOrder() < currCategory.getOrder() ? index - 2 : index; + return (targetCategory.getOrder() + categories.get(prevIndex).getOrder()) / 2; + } + + public Category getCategoryByIdAndMember(Long categoryId, Member member) { + return categoryRepository.getCategoryByIdAndMember(categoryId, member); + } + + public List getCategoryListByMemberAndCategoryType(Member member, + CategoryType categoryType) { + return categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc(member, + categoryType); + } + + public CategoryResponseDto createCategory(String username, + CategoryRequestDto categoryRequestDto) { + Member member = memberRepository.getMemberByUserId(username); + int maxCategoryOrder = categoryRepository.checkDuplicateAndReturnMaxOrder( + categoryRequestDto.getName(), member, + CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); + Category category = categoryRequestDto.toEntity(member, maxCategoryOrder + 1024); + categoryRepository.save(category); + return CategoryResponseDto.of(category); + } + + public CategoryResponseDto deleteCategory(Category category) { + categoryRepository.delete(category); + return CategoryResponseDto.of(category); + } + + @Transactional + public CategoryResponseDto updateCategory(String username, Long categoryId, + CategoryRequestDto categoryRequestDto) { + Category category = categoryRepository.getCategoryByIdAndMember(categoryId, + memberRepository.getMemberByUserId(username)); + if (categoryRequestDto.getName() != null && !categoryRequestDto.getName() + .equals(category.getName())) { + categoryRepository.checkDuplicate(categoryRequestDto.getName(), category.getMember(), + CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); + } + category.update(categoryRequestDto); + return CategoryResponseDto.of(category); + } + + public CategoryResponseDto getCategory(String username, Long categoryId) { + Category category = categoryRepository.getCategoryByIdAndMember(categoryId, + memberRepository.getMemberByUserId(username)); + return CategoryResponseDto.of(category); + } + + @Transactional + public CategoryResponseDto updateCategoryOrder(String username, Long categoryId, int index) { + Member member = memberRepository.getMemberByUserId(username); + Category category = categoryRepository.getCategoryByIdAndMember(categoryId, member); + List categories = categoryRepository.getCategoriesByMemberAndCategoryTypeOrderByOrder( + member, category.getCategoryType()); + + validateIndex(index, categories.size()); + int newOrder = getNewOrder(index, categories, category); + + category.updateOrder(newOrder); + + categoryRepository.save(category); + + return CategoryResponseDto.of(category); + } + + public List getCategoryList(String username, String categoryType) { + Member member = memberRepository.getMemberByUserId(username); + CategoryType convertCategoryType = CategoryType.valueOf(categoryType.toUpperCase()); + List categories = categoryRepository.getCategoriesByMemberAndCategoryTypeOrderByOrder( + member, convertCategoryType); + return categories.stream() + .map(CategoryResponseDto::of) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java b/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java index 7e86ef50..e6b4ba9b 100644 --- a/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java +++ b/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java @@ -4,16 +4,16 @@ import com.uspray.uspray.domain.history.dto.response.HistoryDetailResponseDto; import com.uspray.uspray.domain.history.dto.response.HistoryListResponseDto; import com.uspray.uspray.domain.history.dto.response.HistoryResponseDto; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.history.model.History; +import com.uspray.uspray.domain.history.repository.HistoryRepository; import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.domain.member.repository.MemberRepository; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.domain.pray.repository.PrayRepository; +import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.exception.model.NotFoundException; -import com.uspray.uspray.domain.history.repository.HistoryRepository; -import com.uspray.uspray.domain.member.repository.MemberRepository; -import com.uspray.uspray.domain.pray.repository.PrayRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -26,64 +26,67 @@ @RequiredArgsConstructor public class HistoryService { - private final HistoryRepository historyRepository; - private final MemberRepository memberRepository; - private final PrayRepository prayRepository; - - @Transactional(readOnly = true) - public HistoryListResponseDto getHistoryList(String username, String type, int page, int size) { - // type은 대소문자 구분하지 않습니다 + private final HistoryRepository historyRepository; + private final MemberRepository memberRepository; + private final PrayRepository prayRepository; - Pageable pageable = PageRequest.of(page, size, Sort.by("deadline").descending()); - Member member = memberRepository.getMemberByUserId(username); - Page historyList; + @Transactional(readOnly = true) + public HistoryListResponseDto getHistoryList(String username, String type, int page, int size) { + // type은 대소문자 구분하지 않습니다 + Pageable pageable = PageRequest.of(page, size, Sort.by("deadline").descending()); + Member member = memberRepository.getMemberByUserId(username); + Page historyList; - if (PrayType.PERSONAL.name().equalsIgnoreCase(type)) { - historyList = historyRepository.findByMemberAndOriginPrayIdIsNull(member, pageable) - .map(HistoryResponseDto::of); - return new HistoryListResponseDto(historyList.getContent(), - historyList.getTotalPages()); - } - if (PrayType.SHARED.name().equalsIgnoreCase(type)) { - historyList = historyRepository.findByMemberAndOriginPrayIdIsNotNull( - member, pageable).map(history -> { - Member originMember = memberRepository.getMemberById(history.getOriginMemberId()); - return HistoryResponseDto.shared(history, originMember); - }); - return new HistoryListResponseDto(historyList.getContent(), - historyList.getTotalPages()); - } - throw new CustomException(ErrorStatus.INVALID_TYPE_EXCEPTION); - } + if (PrayType.PERSONAL.name().equalsIgnoreCase(type)) { + historyList = historyRepository.findByMemberAndOriginPrayIdIsNull(member, pageable) + .map(HistoryResponseDto::of); + return new HistoryListResponseDto(historyList.getContent(), + historyList.getTotalPages()); + } + if (PrayType.SHARED.name().equalsIgnoreCase(type)) { + historyList = historyRepository.findByMemberAndOriginPrayIdIsNotNull( + member, pageable).map(history -> { + Member originMember = memberRepository.getMemberById(history.getOriginMemberId()); + return HistoryResponseDto.shared(history, originMember); + }); + return new HistoryListResponseDto(historyList.getContent(), + historyList.getTotalPages()); + } + throw new CustomException(ErrorStatus.INVALID_TYPE_EXCEPTION); + } - @Transactional(readOnly = true) - public HistoryListResponseDto searchHistoryList(String username, - HistorySearchRequestDto historySearchRequestDto) { + @Transactional(readOnly = true) + public HistoryListResponseDto searchHistoryList(String username, + HistorySearchRequestDto historySearchRequestDto) { - Pageable pageable = PageRequest.of(historySearchRequestDto.getPage(), - historySearchRequestDto.getSize(), Sort.by("deadline").descending()); - Page historyList = historyRepository.findBySearchOption(username, - historySearchRequestDto, pageable) - .map(HistoryResponseDto::of); - return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); - } + Pageable pageable = PageRequest.of(historySearchRequestDto.getPage(), + historySearchRequestDto.getSize(), Sort.by("deadline").descending()); + Page historyList = historyRepository.findBySearchOption(username, + historySearchRequestDto, pageable) + .map(HistoryResponseDto::of); + return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); + } - @Transactional(readOnly = true) - public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId) { - Member member = memberRepository.getMemberByUserId(username); - History history = historyRepository.getHistoryById(historyId); - if (!history.getMember().getId().equals(member.getId())) { - throw new NotFoundException(ErrorStatus.HISTORY_NOT_FOUND_EXCEPTION); - } - if (history.getPrayType().equals(PrayType.SHARED)) { - Pray originPray = prayRepository.getPrayById(history.getOriginPrayId()); - return HistoryDetailResponseDto.shared(history, originPray); - } - return HistoryDetailResponseDto.of(history); - } + @Transactional(readOnly = true) + public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId) { + Member member = memberRepository.getMemberByUserId(username); + History history = historyRepository.getHistoryById(historyId); + if (!history.getMember().getId().equals(member.getId())) { + throw new NotFoundException(ErrorStatus.HISTORY_NOT_FOUND_EXCEPTION); + } + if (history.getPrayType().equals(PrayType.SHARED)) { + Pray originPray = prayRepository.getPrayById(history.getOriginPrayId()); + return HistoryDetailResponseDto.shared(history, originPray); + } + return HistoryDetailResponseDto.of(history); + } - @Transactional - public void saveHistory(History history) { - historyRepository.save(history); - } + @Transactional + public void createHistory(Pray pray, Integer totalCountOrNull) { + History history = History.builder() + .pray(pray) + .totalCount(totalCountOrNull) //sharedCount에 내 count도 포함되어 있음 + .build(); + historyRepository.save(history); + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index c3f6cf13..02019f88 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -4,7 +4,6 @@ import com.uspray.uspray.domain.category.model.Category; import com.uspray.uspray.domain.category.service.CategoryService; import com.uspray.uspray.domain.group.service.ScrapAndHeartService; -import com.uspray.uspray.domain.history.model.History; import com.uspray.uspray.domain.history.service.HistoryService; import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.member.service.MemberService; @@ -51,6 +50,10 @@ private static void checkIsAlreadyPrayed(Pray pray) { } } + private static boolean isSameCategory(Pray pray, Category category) { + return pray.getPrayType().toString().equals(category.getCategoryType().toString()); + } + private boolean isSharedPray(Pray pray) { return prayService.isSharedPray(pray) || pray.getPrayType() == PrayType.SHARED; } @@ -90,34 +93,25 @@ private Category getCategory(PrayUpdateRequestDto prayUpdateRequestDto, Pray pra prayUpdateRequestDto.getCategoryId(), pray.getMember()); // 기도 제목 타입과 카테고리 타입 일치하는 지 확인 - if (!pray.getPrayType().toString().equals(category.getCategoryType().toString())) { + if (!isSameCategory(pray, category)) { throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); } return category; } @Transactional - public void convertPrayToHistory() { + public void moveExpiredPrayersToHistory() { List prayList = prayService.getPrayListDeadlineBefore(LocalDate.now()); for (Pray pray : prayList) { - pray.complete(); - Integer sharedCount = prayService.getSharedCountByOriginPrayId( - pray.getOriginPrayId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) //sharedCount에 내 count도 포함되어 있음 - .build(); - historyService.saveHistory(history); - prayService.deletePray(pray); + convertPrayToHistory(pray); } } - public void convertPrayToHistory(Pray pray) { + private void convertPrayToHistory(Pray pray) { pray.complete(); - History history = History.builder() - .pray(pray) - .build(); - historyService.saveHistory(history); + Integer sharedCount = prayService.getSharedCountByOriginPrayId( + pray.getOriginPrayId()); + historyService.createHistory(pray, sharedCount); prayService.deletePray(pray); } @@ -232,22 +226,11 @@ private PrayResponseDto convertToPrayResponseDto(Pray pray) { @Transactional public List completePray(Long prayId, String username) { Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - pray.complete(); - - createHistory(pray); - prayService.deletePray(pray); + convertPrayToHistory(pray); return getPrayList(username, pray.getPrayType().stringValue()); } - private void createHistory(Pray pray) { - Integer sharedCount = prayService.getSharedCountByOriginPrayId(pray.getId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) - .build(); - historyService.saveHistory(history); - } @Transactional public List cancelPray(Long prayId, String username) { diff --git a/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java b/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java index 99948d1a..233beab8 100644 --- a/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java +++ b/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java @@ -39,6 +39,6 @@ public void cleanSharedPray() { @Scheduled(cron = "0 0 0 * * ?") public void convertPrayToHistory() { - prayFacadeService.convertPrayToHistory(); + prayFacadeService.moveExpiredPrayersToHistory(); } } From f6285265f49e45e81f061498eee98bbbe1fd5797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Wed, 23 Oct 2024 21:31:25 +0900 Subject: [PATCH 04/15] =?UTF-8?q?refactor:=20prayFacade=20=EB=B3=B5?= =?UTF-8?q?=EC=9E=A1=EB=8F=84=20=EB=82=AE=EC=B6=94=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/pray/service/PrayFacade.java | 64 +++++++------------ .../push/service/NotificationLogService.java | 30 ++++++++- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 02019f88..5b9dbc03 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -17,8 +17,6 @@ import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.exception.model.NotFoundException; -import com.uspray.uspray.global.push.model.NotificationLog; -import com.uspray.uspray.global.push.service.FCMNotificationService; import com.uspray.uspray.global.push.service.NotificationLogService; import java.time.LocalDate; import java.util.Collections; @@ -26,31 +24,28 @@ import java.util.stream.Collectors; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor -@Slf4j public class PrayFacade { private final HistoryService historyService; private final NotificationLogService notificationLogService; - private final FCMNotificationService fcmNotificationService; private final ScrapAndHeartService scrapAndHeartService; private final ShareService shareService; private final PrayService prayService; private final MemberService memberService; private final CategoryService categoryService; - private static void checkIsAlreadyPrayed(Pray pray) { + private void checkIsAlreadyPrayed(Pray pray) { if (pray.getLastPrayedAt().equals(LocalDate.now())) { throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); } } - private static boolean isSameCategory(Pray pray, Category category) { + private boolean isSameCategory(Pray pray, Category category) { return pray.getPrayType().toString().equals(category.getCategoryType().toString()); } @@ -60,12 +55,15 @@ private boolean isSharedPray(Pray pray) { private void checkSharedPrayValidation(PrayUpdateRequestDto prayUpdateRequestDto, Pray pray) { - if (isSharedPray(pray) - && prayUpdateRequestDto.getContent() != null) { + if (isPrayUpdatable(pray, prayUpdateRequestDto.getContent())) { throw new CustomException(ErrorStatus.SHARED_PRAY_UPDATE_EXCEPTION); } } + private Boolean isPrayUpdatable(Pray pray, String content) { + return isSharedPray(pray) && content != null; + } + @Transactional public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username, LocalDate startDateOrNull) { @@ -132,30 +130,6 @@ public List todayPray(Long prayId, String username) { return getPrayList(username, pray.getPrayType().stringValue()); } - private void sendNotification(Member member) { - try { - fcmNotificationService.sendMessageTo( - member.getFirebaseToken(), - "💘", - "누군가가 당신의 기도제목을 두고 기도했어요"); - } catch (Exception e) { - log.error(e.getMessage()); - - } - log.error( - "send notification to " + member - ); - } - - private void saveNotificationLog(Pray pray, Member member) { - NotificationLog notificationLog = NotificationLog.builder() - .pray(pray) - .member(member) - .title("누군가가 당신의 기도제목을 두고 기도했어요") - .build(); - - notificationLogService.saveNotificationLog(notificationLog); - } private void handlePrayedToday(Pray pray) { checkIsAlreadyPrayed(pray); @@ -164,8 +138,8 @@ private void handlePrayedToday(Pray pray) { if (pray.getPrayType() == PrayType.SHARED) { Member originMember = memberService.findMemberById(pray.getOriginMemberId()); if (originMember.getSecondNotiAgree()) { - sendNotification(originMember); - saveNotificationLog(pray, originMember); + notificationLogService.sendNotification(originMember); + notificationLogService.saveNotificationLog(pray, originMember); } } } @@ -183,23 +157,31 @@ public PrayResponseDto deletePray(Long prayId, String username) { @Transactional public List getPrayList(String username, String prayType) { - // 사용자 정보와 카테고리 타입을 가져옴 Member member = memberService.findMemberByUserId(username); - CategoryType categoryType = CategoryType.valueOf(prayType); - List categoryList = categoryService.getCategoryListByMemberAndCategoryType(member, - categoryType); + List categoryList = getCategories( + prayType, member); - // 카테고리 리스트가 비어있을 경우 빈 리스트 반환 if (categoryList.isEmpty()) { return Collections.emptyList(); } - // PrayListResponseDto 생성 및 반환 + return convertPrayListResponseDtoListByCategory(categoryList, member); + } + + @NotNull + private List convertPrayListResponseDtoListByCategory( + List categoryList, Member member) { return categoryList.stream() .map(category -> createPrayListResponseDto(member, category)) .collect(Collectors.toList()); } + private List getCategories(String prayType, Member member) { + CategoryType categoryType = CategoryType.valueOf(prayType); + return categoryService.getCategoryListByMemberAndCategoryType(member, + categoryType); + } + private PrayListResponseDto createPrayListResponseDto(Member member, Category category) { // 기도 리스트 변환 List prayResponseDtos = prayService.getPrayListByMemberAndCategory(member, diff --git a/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java b/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java index 47db618e..aaf30761 100644 --- a/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java +++ b/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java @@ -1,17 +1,45 @@ package com.uspray.uspray.global.push.service; +import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.global.push.model.NotificationLog; import com.uspray.uspray.global.push.repository.NotificationLogRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor +@Slf4j public class NotificationLogService { + private final NotificationLogRepository notificationLogRepository; + private final FCMNotificationService fcmNotificationService; + + public void sendNotification(Member member) { + try { + fcmNotificationService.sendMessageTo( + member.getFirebaseToken(), + "💘", + "누군가가 당신의 기도제목을 두고 기도했어요"); + } catch (Exception e) { + log.error(e.getMessage()); + + } + log.error( + "send notification to " + member + ); + } + @Transactional - public void saveNotificationLog(NotificationLog notificationLog) { + public void saveNotificationLog(Pray pray, Member member) { + NotificationLog notificationLog = NotificationLog.builder() + .pray(pray) + .member(member) + .title("누군가가 당신의 기도제목을 두고 기도했어요") + .build(); + notificationLogRepository.save(notificationLog); } From fbc78e72dad4295afaf39e27177041acd6fdf244 Mon Sep 17 00:00:00 2001 From: subin <200516bb@gmail.com> Date: Mon, 28 Oct 2024 19:05:46 +0900 Subject: [PATCH 05/15] =?UTF-8?q?fix:=20origin=20pray=20id=EA=B0=80=20null?= =?UTF-8?q?=EC=9D=BC=20=EB=95=8C=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/uspray/uspray/domain/pray/model/Pray.java | 2 ++ .../uspray/domain/pray/repository/PrayRepository.java | 3 +++ .../uspray/uspray/domain/pray/service/PrayFacade.java | 11 ++++++++--- .../uspray/domain/pray/service/PrayService.java | 4 ++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java b/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java index 87a879f2..3dcfb283 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java +++ b/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java @@ -48,6 +48,8 @@ public class Pray extends AuditingTimeEntity { @JoinColumn(name = "member_id", nullable = false) private Member member; private String content; + + @Column(name = "count") private Integer count; private LocalDate deadline; private Boolean isShared = false; diff --git a/src/main/java/com/uspray/uspray/domain/pray/repository/PrayRepository.java b/src/main/java/com/uspray/uspray/domain/pray/repository/PrayRepository.java index b50483d0..53021852 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/repository/PrayRepository.java +++ b/src/main/java/com/uspray/uspray/domain/pray/repository/PrayRepository.java @@ -59,4 +59,7 @@ default Pray cancelPray(Long prayId, String username) { @Query(value = "SELECT * FROM Pray p where (p.pray_id = :id)", nativeQuery = true) Pray getPrayByIdIgnoreDelete(@Param("id") Long id); + + @Query("SELECT p.count FROM Pray p WHERE p.id = :id") + Integer getCountById(@Param("id") Long id); } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 5b9dbc03..3011e626 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -106,9 +106,14 @@ public void moveExpiredPrayersToHistory() { } private void convertPrayToHistory(Pray pray) { - pray.complete(); - Integer sharedCount = prayService.getSharedCountByOriginPrayId( - pray.getOriginPrayId()); + Integer sharedCount; + if (pray.getOriginPrayId() != null) { + sharedCount = prayService.getSharedCountByOriginPrayId( + pray.getOriginPrayId()); + } else { + sharedCount = prayService.getCountById(pray.getId()); + } + historyService.createHistory(pray, sharedCount); prayService.deletePray(pray); } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java index 84f5cbb9..329e2e69 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java @@ -62,4 +62,8 @@ public Pray cancelPray(Long prayId, String username) { public Boolean isSharedPray(Pray pray) { return getSharedPray(pray.getId()) == null; } + + public Integer getCountById(Long prayId) { + return prayRepository.getCountById(prayId); + } } From 762d9ed93c3c11ebe7b9887ce4f67c848dc4221e Mon Sep 17 00:00:00 2001 From: subin <200516bb@gmail.com> Date: Mon, 28 Oct 2024 19:07:36 +0900 Subject: [PATCH 06/15] =?UTF-8?q?fix:=20return=20=EA=B0=92=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/pray/repository/querydsl/PrayRepositoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java index ccf00ec4..c60daf58 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java +++ b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java @@ -42,7 +42,7 @@ public Integer getSharedCountByOriginPrayId(Long prayId) { .from(pray) .where(pray.id.eq(prayId)) .fetchOne(); - return result != null ? result + result_for_owner : result_for_owner; + return result + result_for_owner; } } From 5249192a85e44fca54b93f656e31444e7f720bdb Mon Sep 17 00:00:00 2001 From: subin <200516bb@gmail.com> Date: Mon, 28 Oct 2024 19:09:09 +0900 Subject: [PATCH 07/15] =?UTF-8?q?fix:=20@EnabledScheduling=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 --- src/main/java/com/uspray/uspray/UsprayApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/uspray/uspray/UsprayApplication.java b/src/main/java/com/uspray/uspray/UsprayApplication.java index 517915de..10098ca2 100644 --- a/src/main/java/com/uspray/uspray/UsprayApplication.java +++ b/src/main/java/com/uspray/uspray/UsprayApplication.java @@ -5,11 +5,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableJpaAuditing @EnableFeignClients @EnableConfigurationProperties +@EnableScheduling public class UsprayApplication { public static void main(String[] args) { From f9fb29530b95c10a332573ffedfb03b2f0e6de46 Mon Sep 17 00:00:00 2001 From: subin <200516bb@gmail.com> Date: Fri, 8 Nov 2024 20:29:38 +0900 Subject: [PATCH 08/15] =?UTF-8?q?fix:=20getCountById=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uspray/uspray/domain/pray/repository/PrayRepository.java | 3 --- .../com/uspray/uspray/domain/pray/service/PrayService.java | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/repository/PrayRepository.java b/src/main/java/com/uspray/uspray/domain/pray/repository/PrayRepository.java index 53021852..b50483d0 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/repository/PrayRepository.java +++ b/src/main/java/com/uspray/uspray/domain/pray/repository/PrayRepository.java @@ -59,7 +59,4 @@ default Pray cancelPray(Long prayId, String username) { @Query(value = "SELECT * FROM Pray p where (p.pray_id = :id)", nativeQuery = true) Pray getPrayByIdIgnoreDelete(@Param("id") Long id); - - @Query("SELECT p.count FROM Pray p WHERE p.id = :id") - Integer getCountById(@Param("id") Long id); } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java index 329e2e69..ec8c0c2b 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java @@ -64,6 +64,6 @@ public Boolean isSharedPray(Pray pray) { } public Integer getCountById(Long prayId) { - return prayRepository.getCountById(prayId); + return prayRepository.getPrayById(prayId).getCount(); } } From 5a82e2345db085c83d39946fdec32d3fe1c89376 Mon Sep 17 00:00:00 2001 From: subin <200516bb@gmail.com> Date: Fri, 8 Nov 2024 21:08:16 +0900 Subject: [PATCH 09/15] =?UTF-8?q?fix:=20getSharedCountByIdAndOriginPrayId?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../querydsl/PrayRepositoryCustom.java | 2 +- .../querydsl/PrayRepositoryImpl.java | 22 +++++++++---------- .../domain/pray/service/PrayFacade.java | 8 +------ .../domain/pray/service/PrayService.java | 8 ++----- 4 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryCustom.java b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryCustom.java index 0d0c3aee..4a7ca3f0 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryCustom.java +++ b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryCustom.java @@ -9,5 +9,5 @@ public interface PrayRepositoryCustom { List findAllWithOrderAndType(String username, String prayType); @Nullable - Integer getSharedCountByOriginPrayId(Long prayId); + Integer getSharedCountByIdAndOriginPrayId(Long prayId, Long originPrayId); } diff --git a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java index c60daf58..012c1285 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java +++ b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java @@ -3,6 +3,7 @@ import static com.uspray.uspray.domain.category.model.QCategory.category; import static com.uspray.uspray.domain.pray.model.QPray.pray; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import com.uspray.uspray.domain.pray.model.Pray; import java.util.List; @@ -29,20 +30,19 @@ public List findAllWithOrderAndType(String username, String prayType) { } @Override - // prayId로 originPrayId를 넘겨줌 - public Integer getSharedCountByOriginPrayId(Long prayId) { - Integer result = queryFactory - .select(pray.count.sum()) - .from(pray) - .where(pray.originPrayId.eq(prayId)) - .groupBy(pray.id) - .fetchOne(); - Integer result_for_owner = queryFactory + public Integer getSharedCountByIdAndOriginPrayId(Long prayId, Long originPrayId) { + return queryFactory .select(pray.count.sum()) .from(pray) - .where(pray.id.eq(prayId)) + .where(eqPrayIdOrOriginPrayId(prayId, originPrayId)) .fetchOne(); - return result + result_for_owner; + } + + private BooleanExpression eqPrayIdOrOriginPrayId(Long prayId, Long originPrayId){ + if(originPrayId == null){ + return pray.id.eq(prayId); + } + return pray.originPrayId.eq(originPrayId).or(pray.id.eq(originPrayId)); } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 3011e626..6dd1d244 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -106,13 +106,7 @@ public void moveExpiredPrayersToHistory() { } private void convertPrayToHistory(Pray pray) { - Integer sharedCount; - if (pray.getOriginPrayId() != null) { - sharedCount = prayService.getSharedCountByOriginPrayId( - pray.getOriginPrayId()); - } else { - sharedCount = prayService.getCountById(pray.getId()); - } + Integer sharedCount = prayService.getSharedCountByIdAndOriginPrayId(pray.getId(), pray.getOriginPrayId()); historyService.createHistory(pray, sharedCount); prayService.deletePray(pray); diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java index ec8c0c2b..2ce5c1d1 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java @@ -47,8 +47,8 @@ public List getPrayListDeadlineBefore(LocalDate currentDate) { return prayRepository.findAllByDeadlineBefore(currentDate); } - public Integer getSharedCountByOriginPrayId(Long originPrayId) { - return prayRepository.getSharedCountByOriginPrayId(originPrayId); + public Integer getSharedCountByIdAndOriginPrayId(Long prayId, Long originPrayId) { + return prayRepository.getSharedCountByIdAndOriginPrayId(prayId, originPrayId); } public void deletePray(Pray pray) { @@ -62,8 +62,4 @@ public Pray cancelPray(Long prayId, String username) { public Boolean isSharedPray(Pray pray) { return getSharedPray(pray.getId()) == null; } - - public Integer getCountById(Long prayId) { - return prayRepository.getPrayById(prayId).getCount(); - } } From 253e4f2106b57d6036775b7cdad52274ac35b57e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Tue, 22 Oct 2024 17:06:16 +0900 Subject: [PATCH 10/15] =?UTF-8?q?refactor:=20prayController=20indent=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20pathvariable=20=EB=88=84?= =?UTF-8?q?=EB=9D=BD=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pray/controller/PrayController.java | 134 +++++++++--------- 1 file changed, 66 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java index 1d3ee3c5..0ec4a465 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java @@ -1,6 +1,5 @@ package com.uspray.uspray.domain.pray.controller; - import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; import com.uspray.uspray.domain.pray.dto.pray.request.PrayRequestDto; import com.uspray.uspray.domain.pray.dto.pray.request.PrayUpdateRequestDto; @@ -28,79 +27,78 @@ @RequiredArgsConstructor public class PrayController implements PrayApi { - private final PrayService prayService; - private final PrayFacade prayFacade; + private final PrayService prayService; + private final PrayFacade prayFacade; - @GetMapping - public ApiResponseDto> getPrayList( - @AuthenticationPrincipal User user, - String prayType - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - prayFacade.getPrayList(user.getUsername(), prayType)); - } + @GetMapping + public ApiResponseDto> getPrayList( + @AuthenticationPrincipal User user, + String prayType + ) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + prayFacade.getPrayList(user.getUsername(), prayType)); + } - @GetMapping("/{prayId}") - public ApiResponseDto getPrayDetail( - @AuthenticationPrincipal User user, - Long prayId - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, - prayService.getPrayDetail(prayId, user.getUsername())); - } + @GetMapping("/{prayId}") + public ApiResponseDto getPrayDetail( + @AuthenticationPrincipal User user, + @PathVariable("prayId") Long prayId) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, + prayService.getPrayDetail(prayId, user.getUsername())); + } - @PostMapping - public ApiResponseDto createPray( - @RequestBody @Valid PrayRequestDto prayRequestDto, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, - prayFacade.createPray(prayRequestDto, user.getUsername(), null)); - } + @PostMapping + public ApiResponseDto createPray( + @RequestBody @Valid PrayRequestDto prayRequestDto, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, + prayFacade.createPray(prayRequestDto, user.getUsername(), null)); + } - @DeleteMapping("/{prayId}") - public ApiResponseDto deletePray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, - prayFacade.deletePray(prayId, user.getUsername())); - } + @DeleteMapping("/{prayId}") + public ApiResponseDto deletePray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, + prayFacade.deletePray(prayId, user.getUsername())); + } - @PutMapping("/{prayId}") - public ApiResponseDto updatePray( - @PathVariable("prayId") Long prayId, - @RequestBody @Valid PrayUpdateRequestDto prayUpdateRequestDto, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, - prayFacade.updatePray(prayId, user.getUsername(), prayUpdateRequestDto)); - } + @PutMapping("/{prayId}") + public ApiResponseDto updatePray( + @PathVariable("prayId") Long prayId, + @RequestBody @Valid PrayUpdateRequestDto prayUpdateRequestDto, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, + prayFacade.updatePray(prayId, user.getUsername(), prayUpdateRequestDto)); + } - @PutMapping("/{prayId}/today") - public ApiResponseDto> todayPray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, - prayFacade.todayPray(prayId, user.getUsername())); - } + @PutMapping("/{prayId}/today") + public ApiResponseDto> todayPray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, + prayFacade.todayPray(prayId, user.getUsername())); + } - @PutMapping("/{prayId}/complete") - public ApiResponseDto> completePray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, - prayFacade.completePray(prayId, user.getUsername())); - } + @PutMapping("/{prayId}/complete") + public ApiResponseDto> completePray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, + prayFacade.completePray(prayId, user.getUsername())); + } - @PutMapping("/{prayId}/cancel") - public ApiResponseDto> cancelPray( - @PathVariable("prayId") Long prayId, - @AuthenticationPrincipal User user - ) { - return ApiResponseDto.success(SuccessStatus.CANCEL_PRAY_SUCCESS, - prayFacade.cancelPray(prayId, user.getUsername())); - } + @PutMapping("/{prayId}/cancel") + public ApiResponseDto> cancelPray( + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user + ) { + return ApiResponseDto.success(SuccessStatus.CANCEL_PRAY_SUCCESS, + prayFacade.cancelPray(prayId, user.getUsername())); + } } From 9e583dc83f6fefb993251259a62611e6832292f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Wed, 23 Oct 2024 20:41:19 +0900 Subject: [PATCH 11/15] =?UTF-8?q?refactor:=20update=20pray=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/pray/service/PrayFacade.java | 317 +++++++++--------- .../domain/pray/service/PrayService.java | 90 ++--- .../uspray/global/exception/ErrorStatus.java | 1 + 3 files changed, 210 insertions(+), 198 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 4065eddd..8cee3cea 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -34,14 +34,21 @@ @RequiredArgsConstructor @Slf4j public class PrayFacade { - private final HistoryService historyService; - private final NotificationLogService notificationLogService; - private final FCMNotificationService fcmNotificationService; - private final ScrapAndHeartService scrapAndHeartService; - private final ShareService shareService; - private final PrayService prayService; - private final MemberService memberService; - private final CategoryService categoryService; + + private final HistoryService historyService; + private final NotificationLogService notificationLogService; + private final FCMNotificationService fcmNotificationService; + private final ScrapAndHeartService scrapAndHeartService; + private final ShareService shareService; + private final PrayService prayService; + private final MemberService memberService; + private final CategoryService categoryService; + + private static void checkIsAlreadyPrayed(Pray pray) { + if (pray.getLastPrayedAt().equals(LocalDate.now())) { + throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); + } + } @Transactional public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username, @@ -52,10 +59,10 @@ public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username return prayService.savePray(prayRequestDto.toEntity(member, category, startDateOrNull)); } - @Transactional - public PrayResponseDto updatePray(Long prayId, String username, - PrayUpdateRequestDto prayUpdateRequestDto) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + @Transactional + public PrayResponseDto updatePray(Long prayId, String username, + PrayUpdateRequestDto prayUpdateRequestDto) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); // 이 기도 제목을 공유한 적 없거나, 공유 받은 사람이 없으면 전부 수정 가능 // 이 기도 제목을 공유한 적 있고, 누구라도 공유 받은 사람이 있으면 기도제목 내용 수정 불가능 @@ -77,21 +84,21 @@ public PrayResponseDto updatePray(Long prayId, String username, return PrayResponseDto.of(pray.update(prayUpdateRequestDto, category)); } - @Transactional - public void convertPrayToHistory() { - List prayList = prayService.getPrayListDeadlineBefore(LocalDate.now()); - for (Pray pray : prayList) { - pray.complete(); - Integer sharedCount = prayService.getSharedCountByOriginPrayId( - pray.getOriginPrayId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) //sharedCount에 내 count도 포함되어 있음 - .build(); - historyService.saveHistory(history); - prayService.deletePray(pray); - } - } + @Transactional + public void convertPrayToHistory() { + List prayList = prayService.getPrayListDeadlineBefore(LocalDate.now()); + for (Pray pray : prayList) { + pray.complete(); + Integer sharedCount = prayService.getSharedCountByOriginPrayId( + pray.getOriginPrayId()); + History history = History.builder() + .pray(pray) + .totalCount(sharedCount) //sharedCount에 내 count도 포함되어 있음 + .build(); + historyService.saveHistory(history); + prayService.deletePray(pray); + } + } @Transactional public void convertPrayToHistory(Pray pray) { @@ -107,132 +114,132 @@ public void convertPrayToHistory(Pray pray) { public CategoryResponseDto deleteCategory(Long categoryId) { Category category = categoryService.getCategoryById(categoryId); - prayService.getPrayListByCategory(category).forEach(this::convertPrayToHistory); - - return categoryService.deleteCategory(category); - } - - - @Transactional - public List todayPray(Long prayId, String username) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - handlePrayedToday(pray); - return getPrayList(username, pray.getPrayType().stringValue()); - } - - private void sendNotification(Member member) { - try { - fcmNotificationService.sendMessageTo( - member.getFirebaseToken(), - "💘", - "누군가가 당신의 기도제목을 두고 기도했어요"); - } catch (Exception e) { - log.error(e.getMessage()); - - } - log.error( - "send notification to " + member - ); - } - - private void saveNotificationLog(Pray pray, Member member) { - NotificationLog notificationLog = NotificationLog.builder() - .pray(pray) - .member(member) - .title("누군가가 당신의 기도제목을 두고 기도했어요") - .build(); - - notificationLogService.saveNotificationLog(notificationLog); - } - - private void handlePrayedToday(Pray pray) { - if (pray.getLastPrayedAt().equals(LocalDate.now())) { - throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); - } - pray.countUp(); - - if (pray.getPrayType() == PrayType.SHARED) { - Member originMember = memberService.findMemberById(pray.getOriginMemberId()); - if (originMember.getSecondNotiAgree()) { - sendNotification(originMember); - saveNotificationLog(pray, originMember); - } - } - } - - @Transactional - public PrayResponseDto deletePray(Long prayId, String username) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - Member member = memberService.findMemberByUserId(username); - - scrapAndHeartService.deleteScrapAndHeart(member, pray); - shareService.deleteByOriginPray(pray); - prayService.deletePray(pray); - return PrayResponseDto.of(pray); - } - - @Transactional - public List getPrayList(String username, String prayType) { - // 사용자 정보와 카테고리 타입을 가져옴 - Member member = memberService.findMemberByUserId(username); - CategoryType categoryType = CategoryType.valueOf(prayType); - List categoryList = categoryService.getCategoryListByMemberAndCategoryType(member, categoryType); - - // 카테고리 리스트가 비어있을 경우 빈 리스트 반환 - if (categoryList.isEmpty()) { - return Collections.emptyList(); - } - - // PrayListResponseDto 생성 및 반환 - return categoryList.stream() - .map(category -> createPrayListResponseDto(member, category)) - .collect(Collectors.toList()); - } - - private PrayListResponseDto createPrayListResponseDto(Member member, Category category) { - // 기도 리스트 변환 - List prayResponseDtos = prayService.getPrayListByMemberAndCategory(member, category).stream() - .map(this::convertToPrayResponseDto) - .collect(Collectors.toList()); - - // PrayListResponseDto 생성 - return new PrayListResponseDto(category.getId(), category.getName(), category.getColor(), prayResponseDtos); - } - - private PrayResponseDto convertToPrayResponseDto(Pray pray) { - // 기도의 타입에 따라 적절한 PrayResponseDto 생성 - if (pray.getPrayType().equals(PrayType.SHARED)) { - Member originMember = memberService.findMemberById(pray.getOriginMemberId()); - return PrayResponseDto.shared(pray, originMember); - } else { - return PrayResponseDto.of(pray); - } - } - - - @Transactional - public List completePray(Long prayId, String username) { - Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - pray.complete(); - - createHistory(pray); - prayService.deletePray(pray); - - return getPrayList(username, pray.getPrayType().stringValue()); - } - - private void createHistory(Pray pray) { - Integer sharedCount = prayService.getSharedCountByOriginPrayId(pray.getId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) - .build(); - historyService.saveHistory(history); - } - - @Transactional - public List cancelPray(Long prayId, String username) { - return getPrayList(username, - prayService.cancelPray(prayId, username).getPrayType().stringValue()); - } + prayService.getPrayListByCategory(category).forEach(this::convertPrayToHistory); + + return categoryService.deleteCategory(category); + } + + @Transactional + public List todayPray(Long prayId, String username) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + handlePrayedToday(pray); + return getPrayList(username, pray.getPrayType().stringValue()); + } + + private void sendNotification(Member member) { + try { + fcmNotificationService.sendMessageTo( + member.getFirebaseToken(), + "💘", + "누군가가 당신의 기도제목을 두고 기도했어요"); + } catch (Exception e) { + log.error(e.getMessage()); + + } + log.error( + "send notification to " + member + ); + } + + private void saveNotificationLog(Pray pray, Member member) { + NotificationLog notificationLog = NotificationLog.builder() + .pray(pray) + .member(member) + .title("누군가가 당신의 기도제목을 두고 기도했어요") + .build(); + + notificationLogService.saveNotificationLog(notificationLog); + } + + private void handlePrayedToday(Pray pray) { + checkIsAlreadyPrayed(pray); + pray.countUp(); + + if (pray.getPrayType() == PrayType.SHARED) { + Member originMember = memberService.findMemberById(pray.getOriginMemberId()); + if (originMember.getSecondNotiAgree()) { + sendNotification(originMember); + saveNotificationLog(pray, originMember); + } + } + } + + @Transactional + public PrayResponseDto deletePray(Long prayId, String username) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + Member member = memberService.findMemberByUserId(username); + + scrapAndHeartService.deleteScrapAndHeart(member, pray); + shareService.deleteByOriginPray(pray); + prayService.deletePray(pray); + return PrayResponseDto.of(pray); + } + + @Transactional + public List getPrayList(String username, String prayType) { + // 사용자 정보와 카테고리 타입을 가져옴 + Member member = memberService.findMemberByUserId(username); + CategoryType categoryType = CategoryType.valueOf(prayType); + List categoryList = categoryService.getCategoryListByMemberAndCategoryType(member, + categoryType); + + // 카테고리 리스트가 비어있을 경우 빈 리스트 반환 + if (categoryList.isEmpty()) { + return Collections.emptyList(); + } + + // PrayListResponseDto 생성 및 반환 + return categoryList.stream() + .map(category -> createPrayListResponseDto(member, category)) + .collect(Collectors.toList()); + } + + private PrayListResponseDto createPrayListResponseDto(Member member, Category category) { + // 기도 리스트 변환 + List prayResponseDtos = prayService.getPrayListByMemberAndCategory(member, + category).stream() + .map(this::convertToPrayResponseDto) + .collect(Collectors.toList()); + + // PrayListResponseDto 생성 + return new PrayListResponseDto(category.getId(), category.getName(), category.getColor(), + prayResponseDtos); + } + + private PrayResponseDto convertToPrayResponseDto(Pray pray) { + // 기도의 타입에 따라 적절한 PrayResponseDto 생성 + if (pray.getPrayType().equals(PrayType.SHARED)) { + Member originMember = memberService.findMemberById(pray.getOriginMemberId()); + return PrayResponseDto.shared(pray, originMember); + } else { + return PrayResponseDto.of(pray); + } + } + + + @Transactional + public List completePray(Long prayId, String username) { + Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); + pray.complete(); + + createHistory(pray); + prayService.deletePray(pray); + + return getPrayList(username, pray.getPrayType().stringValue()); + } + + private void createHistory(Pray pray) { + Integer sharedCount = prayService.getSharedCountByOriginPrayId(pray.getId()); + History history = History.builder() + .pray(pray) + .totalCount(sharedCount) + .build(); + historyService.saveHistory(history); + } + + @Transactional + public List cancelPray(Long prayId, String username) { + return getPrayList(username, + prayService.cancelPray(prayId, username).getPrayType().stringValue()); + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java index 67996b2e..1ee4135f 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java @@ -5,8 +5,8 @@ import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.domain.pray.repository.PrayRepository; -import java.util.List; import java.time.LocalDate; +import java.util.List; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,59 +15,63 @@ @RequiredArgsConstructor public class PrayService { - private final PrayRepository prayRepository; + private final PrayRepository prayRepository; + + @Transactional + public PrayResponseDto getPrayDetail(Long prayId, String username) { + Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); + return PrayResponseDto.of(pray); + } - @Transactional - public PrayResponseDto getPrayDetail(Long prayId, String username) { - Pray pray = prayRepository.getPrayByIdAndMemberId(prayId, username); - return PrayResponseDto.of(pray); - } + public PrayResponseDto savePray(Pray pray) { + return PrayResponseDto.of(prayRepository.save(pray)); + } - public PrayResponseDto savePray(Pray pray) { - return PrayResponseDto.of(prayRepository.save(pray)); - } + public Pray findPrayById(Long prayId) { + return prayRepository.getPrayById(prayId); + } - public Pray findPrayById(Long prayId) { - return prayRepository.getPrayById(prayId); - } + public List findAllByIdIn(List prayIds) { + return prayRepository.findAllByIdIn(prayIds); + } - public List findAllByIdIn(List prayIds) { - return prayRepository.findAllByIdIn(prayIds); - } + public List findAllByOriginPrayIdIn(List prayIds) { + return prayRepository.findAllByOriginPrayIdIn(prayIds); + } - public List findAllByOriginPrayIdIn(List prayIds) { - return prayRepository.findAllByOriginPrayIdIn(prayIds); - } + public List getPrayListByCategory(Category category) { + return prayRepository.findAllByCategory(category); + } - public List getPrayListByCategory(Category category) { - return prayRepository.findAllByCategory(category); - } + public List getPrayListByMemberAndCategory(Member member, Category category) { + return prayRepository.findAllByMemberAndCategoryOrderByCreatedAtAsc(member, category); + } - public List getPrayListByMemberAndCategory(Member member, Category category) { - return prayRepository.findAllByMemberAndCategoryOrderByCreatedAtAsc(member, category); - } + public Pray getPrayByIdAndMemberId(Long prayId, String username) { + return prayRepository.getPrayByIdAndMemberId(prayId, username); + } - public Pray getPrayByIdAndMemberId(Long prayId, String username) { - return prayRepository.getPrayByIdAndMemberId(prayId, username); - } + private Pray getSharedPray(Long prayId) { + return prayRepository.getPrayByOriginPrayId(prayId); + } - public Pray getSharedPray(Long prayId) { - return prayRepository.getPrayByOriginPrayId(prayId); - } + public List getPrayListDeadlineBefore(LocalDate currentDate) { + return prayRepository.findAllByDeadlineBefore(currentDate); + } - public List getPrayListDeadlineBefore(LocalDate currentDate) { - return prayRepository.findAllByDeadlineBefore(currentDate); - } + public Integer getSharedCountByOriginPrayId(Long originPrayId) { + return prayRepository.getSharedCountByOriginPrayId(originPrayId); + } - public Integer getSharedCountByOriginPrayId(Long originPrayId) { - return prayRepository.getSharedCountByOriginPrayId(originPrayId); - } + public void deletePray(Pray pray) { + prayRepository.delete(pray); + } - public void deletePray(Pray pray) { - prayRepository.delete(pray); - } + public Pray cancelPray(Long prayId, String username) { + return prayRepository.cancelPray(prayId, username); + } - public Pray cancelPray(Long prayId, String username) { - return prayRepository.cancelPray(prayId, username); - } + public Boolean isSharedPray(Pray pray) { + return getSharedPray(pray.getId()) == null; + } } diff --git a/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java b/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java index 87a2777f..bdef782f 100644 --- a/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java +++ b/src/main/java/com/uspray/uspray/global/exception/ErrorStatus.java @@ -23,6 +23,7 @@ public enum ErrorStatus { ALREADY_EXIST_GROUP_MEMBER_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 모임 회원입니다."), LEADER_CANNOT_LEAVE_GROUP_EXCEPTION(HttpStatus.BAD_REQUEST, "모임장은 모임을 떠날 수 없습니다."), ALREADY_SHARED_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 공유된 기도제목입니다."), + SHARED_PRAY_UPDATE_EXCEPTION(HttpStatus.BAD_REQUEST, "공유되어진 기도제목이나 공유해온 기도제목의 내용을 수정할 수 없습니다."), ALREADY_EXIST_GROUP_NAME_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 모임 이름입니다."), ALREADY_CANCEL_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 취소된 기도제목입니다."), WRONG_LOGIN_INFO_EXCEPTION(HttpStatus.BAD_REQUEST, "아이디 또는 비밀번호가 틀렸습니다."), From 9cd2986b18170a2d11852d12f6ba0a77709aa1a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Wed, 23 Oct 2024 21:15:04 +0900 Subject: [PATCH 12/15] =?UTF-8?q?refactor:=20convertPrayToHistory=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=ED=95=98=EC=97=AC=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/service/CategoryService.java | 260 +++++++++--------- .../history/service/HistoryService.java | 119 ++++---- .../domain/pray/service/PrayFacade.java | 104 +++---- .../common/service/SchedulerService.java | 2 +- 4 files changed, 234 insertions(+), 251 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java b/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java index e4122c5f..87d3e2f2 100644 --- a/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java +++ b/src/main/java/com/uspray/uspray/domain/category/service/CategoryService.java @@ -7,7 +7,6 @@ import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.member.repository.MemberRepository; import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; -import com.uspray.uspray.domain.pray.repository.PrayRepository; import com.uspray.uspray.global.enums.CategoryType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; @@ -22,133 +21,134 @@ @RequiredArgsConstructor public class CategoryService { - private final MemberRepository memberRepository; - private final CategoryRepository categoryRepository; - private final PrayRepository prayRepository; -// private final PrayFacade prayFacade; - - public List getCategoryListByMemberAndCategoryType(Member member, CategoryType categoryType) { - return categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc(member, categoryType); - } - - private static int getNewOrder(int index, List categories, Category category) { - Category targetPosition = categories.get(index - 1); - - if (targetPosition.equals(category)) { // 원하는 위치가 지금 내 위치와 같으면 - return targetPosition.getOrder(); - } - - if (index == 1) { // 원하는 위치가 첫번째면 - return getFirstPositionOrder(categories); - } - - if (index == categories.size()) { // 원하는 위치가 마지막이면 - return getLastPositionOrder(targetPosition); - } - return getMiddlePositionOrder(targetPosition, category, categories, index); - } - - private static void validateIndex(int index, int size) { - if (index < 1 || index > size) { - throw new NotFoundException(ErrorStatus.INDEX_OUT_OF_BOUND_EXCEPTION); - } - } - - private static int getFirstPositionOrder(List categories) { - return categories.get(0).getOrder() / 2; - } - - private static int getLastPositionOrder(Category prevCategory) { - return prevCategory.getOrder() + 1024; - } - - private static int getMiddlePositionOrder(Category targetCategory, Category currCategory, - List categories, int index) { - // 원하는 위치가 내 위치보다 앞이면 원하는 자리와 그 앞자리 중간으로 - // 원하는 위치가 내 위치보다 뒤면 원하는 자리와 그 뒷자리 중간으로 - int prevIndex = targetCategory.getOrder() < currCategory.getOrder() ? index - 2 : index; - return (targetCategory.getOrder() + categories.get(prevIndex).getOrder()) / 2; - } - - public Category getCategoryById(Long categoryId) { - return categoryRepository.findById(categoryId).orElseThrow(() -> new CustomException(ErrorStatus.CATEGORY_NOT_FOUND_EXCEPTION)); - } - - public Category getCategoryByIdAndMemberAndType(Long categoryId, Member member, - CategoryType categoryType) { - return categoryRepository.findByIdAndMemberAndCategoryType(categoryId, member, categoryType) - .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); - } - - public List findAllWithOrderAndType(String username, String prayType, - List prayIds) { - return categoryRepository.findAllWithOrderAndType(username, prayType, prayIds); - } - - public CategoryResponseDto createCategory(String username, - CategoryRequestDto categoryRequestDto) { - Member member = memberRepository.getMemberByUserId(username); - int maxCategoryOrder = categoryRepository.checkDuplicateAndReturnMaxOrder( - categoryRequestDto.getName(), member, - CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); - Category category = categoryRequestDto.toEntity(member, maxCategoryOrder + 1024); - categoryRepository.save(category); - return CategoryResponseDto.of(category); - } - - public CategoryResponseDto deleteCategory(Category category) { - categoryRepository.delete(category); - return CategoryResponseDto.of(category); - } - - @Transactional - public CategoryResponseDto updateCategory(String username, Long categoryId, - CategoryRequestDto categoryRequestDto) { - Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, - memberRepository.getMemberByUserId(username), CategoryType.PERSONAL) - .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); - if (categoryRequestDto.getName() != null && !categoryRequestDto.getName() - .equals(category.getName())) { - categoryRepository.checkDuplicate(categoryRequestDto.getName(), category.getMember(), - CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); - } - category.update(categoryRequestDto); - return CategoryResponseDto.of(category); - } - - public CategoryResponseDto getCategory(String username, Long categoryId) { - Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, - memberRepository.getMemberByUserId(username), CategoryType.PERSONAL) - .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); - return CategoryResponseDto.of(category); - } - - @Transactional - public CategoryResponseDto updateCategoryOrder(String username, Long categoryId, int index) { - Member member = memberRepository.getMemberByUserId(username); - Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, member, - CategoryType.PERSONAL) - .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); - List categories = categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc( - member, category.getCategoryType()); - - validateIndex(index, categories.size()); - int newOrder = getNewOrder(index, categories, category); - - category.updateOrder(newOrder); - - categoryRepository.save(category); - - return CategoryResponseDto.of(category); - } - - public List getCategoryList(String username, String categoryType) { - Member member = memberRepository.getMemberByUserId(username); - CategoryType convertCategoryType = CategoryType.valueOf(categoryType.toUpperCase()); - List categories = categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc( - member, convertCategoryType); - return categories.stream() - .map(CategoryResponseDto::of) - .collect(Collectors.toList()); - } + private final MemberRepository memberRepository; + private final CategoryRepository categoryRepository; + + private static int getNewOrder(int index, List categories, Category category) { + Category targetPosition = categories.get(index - 1); + + if (targetPosition.equals(category)) { // 원하는 위치가 지금 내 위치와 같으면 + return targetPosition.getOrder(); + } + + if (index == 1) { // 원하는 위치가 첫번째면 + return getFirstPositionOrder(categories); + } + + if (index == categories.size()) { // 원하는 위치가 마지막이면 + return getLastPositionOrder(targetPosition); + } + return getMiddlePositionOrder(targetPosition, category, categories, index); + } + + private static void validateIndex(int index, int size) { + if (index < 1 || index > size) { + throw new NotFoundException(ErrorStatus.INDEX_OUT_OF_BOUND_EXCEPTION); + } + } + + private static int getFirstPositionOrder(List categories) { + return categories.get(0).getOrder() / 2; + } + + private static int getLastPositionOrder(Category prevCategory) { + return prevCategory.getOrder() + 1024; + } + + private static int getMiddlePositionOrder(Category targetCategory, Category currCategory, + List categories, int index) { + // 원하는 위치가 내 위치보다 앞이면 원하는 자리와 그 앞자리 중간으로 + // 원하는 위치가 내 위치보다 뒤면 원하는 자리와 그 뒷자리 중간으로 + int prevIndex = targetCategory.getOrder() < currCategory.getOrder() ? index - 2 : index; + return (targetCategory.getOrder() + categories.get(prevIndex).getOrder()) / 2; + } + + public List getCategoryListByMemberAndCategoryType(Member member, + CategoryType categoryType) { + return categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc(member, + categoryType); + } + + public Category getCategoryById(Long categoryId) { + return categoryRepository.findById(categoryId) + .orElseThrow(() -> new CustomException(ErrorStatus.CATEGORY_NOT_FOUND_EXCEPTION)); + } + + public Category getCategoryByIdAndMemberAndType(Long categoryId, Member member, + CategoryType categoryType) { + return categoryRepository.findByIdAndMemberAndCategoryType(categoryId, member, categoryType) + .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); + } + + public List findAllWithOrderAndType(String username, String prayType, + List prayIds) { + return categoryRepository.findAllWithOrderAndType(username, prayType, prayIds); + } + + public CategoryResponseDto createCategory(String username, + CategoryRequestDto categoryRequestDto) { + Member member = memberRepository.getMemberByUserId(username); + int maxCategoryOrder = categoryRepository.checkDuplicateAndReturnMaxOrder( + categoryRequestDto.getName(), member, + CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); + Category category = categoryRequestDto.toEntity(member, maxCategoryOrder + 1024); + categoryRepository.save(category); + return CategoryResponseDto.of(category); + } + + public CategoryResponseDto deleteCategory(Category category) { + categoryRepository.delete(category); + return CategoryResponseDto.of(category); + } + + @Transactional + public CategoryResponseDto updateCategory(String username, Long categoryId, + CategoryRequestDto categoryRequestDto) { + Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, + memberRepository.getMemberByUserId(username), CategoryType.PERSONAL) + .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); + if (categoryRequestDto.getName() != null && !categoryRequestDto.getName() + .equals(category.getName())) { + categoryRepository.checkDuplicate(categoryRequestDto.getName(), category.getMember(), + CategoryType.valueOf(categoryRequestDto.getType().toUpperCase())); + } + category.update(categoryRequestDto); + return CategoryResponseDto.of(category); + } + + public CategoryResponseDto getCategory(String username, Long categoryId) { + Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, + memberRepository.getMemberByUserId(username), CategoryType.PERSONAL) + .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); + return CategoryResponseDto.of(category); + } + + @Transactional + public CategoryResponseDto updateCategoryOrder(String username, Long categoryId, int index) { + Member member = memberRepository.getMemberByUserId(username); + Category category = categoryRepository.findByIdAndMemberAndCategoryType(categoryId, member, + CategoryType.PERSONAL) + .orElseThrow(() -> new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH)); + List categories = categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc( + member, category.getCategoryType()); + + validateIndex(index, categories.size()); + int newOrder = getNewOrder(index, categories, category); + + category.updateOrder(newOrder); + + categoryRepository.save(category); + + return CategoryResponseDto.of(category); + } + + public List getCategoryList(String username, String categoryType) { + Member member = memberRepository.getMemberByUserId(username); + CategoryType convertCategoryType = CategoryType.valueOf(categoryType.toUpperCase()); + List categories = categoryRepository.findAllByMemberAndCategoryTypeOrderByOrderAsc( + member, convertCategoryType); + return categories.stream() + .map(CategoryResponseDto::of) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java b/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java index 7e86ef50..e6b4ba9b 100644 --- a/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java +++ b/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java @@ -4,16 +4,16 @@ import com.uspray.uspray.domain.history.dto.response.HistoryDetailResponseDto; import com.uspray.uspray.domain.history.dto.response.HistoryListResponseDto; import com.uspray.uspray.domain.history.dto.response.HistoryResponseDto; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.history.model.History; +import com.uspray.uspray.domain.history.repository.HistoryRepository; import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.domain.member.repository.MemberRepository; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.domain.pray.repository.PrayRepository; +import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.exception.model.NotFoundException; -import com.uspray.uspray.domain.history.repository.HistoryRepository; -import com.uspray.uspray.domain.member.repository.MemberRepository; -import com.uspray.uspray.domain.pray.repository.PrayRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -26,64 +26,67 @@ @RequiredArgsConstructor public class HistoryService { - private final HistoryRepository historyRepository; - private final MemberRepository memberRepository; - private final PrayRepository prayRepository; - - @Transactional(readOnly = true) - public HistoryListResponseDto getHistoryList(String username, String type, int page, int size) { - // type은 대소문자 구분하지 않습니다 + private final HistoryRepository historyRepository; + private final MemberRepository memberRepository; + private final PrayRepository prayRepository; - Pageable pageable = PageRequest.of(page, size, Sort.by("deadline").descending()); - Member member = memberRepository.getMemberByUserId(username); - Page historyList; + @Transactional(readOnly = true) + public HistoryListResponseDto getHistoryList(String username, String type, int page, int size) { + // type은 대소문자 구분하지 않습니다 + Pageable pageable = PageRequest.of(page, size, Sort.by("deadline").descending()); + Member member = memberRepository.getMemberByUserId(username); + Page historyList; - if (PrayType.PERSONAL.name().equalsIgnoreCase(type)) { - historyList = historyRepository.findByMemberAndOriginPrayIdIsNull(member, pageable) - .map(HistoryResponseDto::of); - return new HistoryListResponseDto(historyList.getContent(), - historyList.getTotalPages()); - } - if (PrayType.SHARED.name().equalsIgnoreCase(type)) { - historyList = historyRepository.findByMemberAndOriginPrayIdIsNotNull( - member, pageable).map(history -> { - Member originMember = memberRepository.getMemberById(history.getOriginMemberId()); - return HistoryResponseDto.shared(history, originMember); - }); - return new HistoryListResponseDto(historyList.getContent(), - historyList.getTotalPages()); - } - throw new CustomException(ErrorStatus.INVALID_TYPE_EXCEPTION); - } + if (PrayType.PERSONAL.name().equalsIgnoreCase(type)) { + historyList = historyRepository.findByMemberAndOriginPrayIdIsNull(member, pageable) + .map(HistoryResponseDto::of); + return new HistoryListResponseDto(historyList.getContent(), + historyList.getTotalPages()); + } + if (PrayType.SHARED.name().equalsIgnoreCase(type)) { + historyList = historyRepository.findByMemberAndOriginPrayIdIsNotNull( + member, pageable).map(history -> { + Member originMember = memberRepository.getMemberById(history.getOriginMemberId()); + return HistoryResponseDto.shared(history, originMember); + }); + return new HistoryListResponseDto(historyList.getContent(), + historyList.getTotalPages()); + } + throw new CustomException(ErrorStatus.INVALID_TYPE_EXCEPTION); + } - @Transactional(readOnly = true) - public HistoryListResponseDto searchHistoryList(String username, - HistorySearchRequestDto historySearchRequestDto) { + @Transactional(readOnly = true) + public HistoryListResponseDto searchHistoryList(String username, + HistorySearchRequestDto historySearchRequestDto) { - Pageable pageable = PageRequest.of(historySearchRequestDto.getPage(), - historySearchRequestDto.getSize(), Sort.by("deadline").descending()); - Page historyList = historyRepository.findBySearchOption(username, - historySearchRequestDto, pageable) - .map(HistoryResponseDto::of); - return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); - } + Pageable pageable = PageRequest.of(historySearchRequestDto.getPage(), + historySearchRequestDto.getSize(), Sort.by("deadline").descending()); + Page historyList = historyRepository.findBySearchOption(username, + historySearchRequestDto, pageable) + .map(HistoryResponseDto::of); + return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); + } - @Transactional(readOnly = true) - public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId) { - Member member = memberRepository.getMemberByUserId(username); - History history = historyRepository.getHistoryById(historyId); - if (!history.getMember().getId().equals(member.getId())) { - throw new NotFoundException(ErrorStatus.HISTORY_NOT_FOUND_EXCEPTION); - } - if (history.getPrayType().equals(PrayType.SHARED)) { - Pray originPray = prayRepository.getPrayById(history.getOriginPrayId()); - return HistoryDetailResponseDto.shared(history, originPray); - } - return HistoryDetailResponseDto.of(history); - } + @Transactional(readOnly = true) + public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId) { + Member member = memberRepository.getMemberByUserId(username); + History history = historyRepository.getHistoryById(historyId); + if (!history.getMember().getId().equals(member.getId())) { + throw new NotFoundException(ErrorStatus.HISTORY_NOT_FOUND_EXCEPTION); + } + if (history.getPrayType().equals(PrayType.SHARED)) { + Pray originPray = prayRepository.getPrayById(history.getOriginPrayId()); + return HistoryDetailResponseDto.shared(history, originPray); + } + return HistoryDetailResponseDto.of(history); + } - @Transactional - public void saveHistory(History history) { - historyRepository.save(history); - } + @Transactional + public void createHistory(Pray pray, Integer totalCountOrNull) { + History history = History.builder() + .pray(pray) + .totalCount(totalCountOrNull) //sharedCount에 내 count도 포함되어 있음 + .build(); + historyRepository.save(history); + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 8cee3cea..3638181c 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -4,7 +4,6 @@ import com.uspray.uspray.domain.category.model.Category; import com.uspray.uspray.domain.category.service.CategoryService; import com.uspray.uspray.domain.group.service.ScrapAndHeartService; -import com.uspray.uspray.domain.history.model.History; import com.uspray.uspray.domain.history.service.HistoryService; import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.member.service.MemberService; @@ -50,69 +49,61 @@ private static void checkIsAlreadyPrayed(Pray pray) { } } - @Transactional - public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username, - LocalDate startDateOrNull) { - Member member = memberService.findMemberByUserId(username); - Category category = categoryService.getCategoryByIdAndMemberAndType(prayRequestDto.getCategoryId(), - member, CategoryType.PERSONAL); - return prayService.savePray(prayRequestDto.toEntity(member, category, startDateOrNull)); - } + @Transactional + public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username, + LocalDate startDateOrNull) { + Member member = memberService.findMemberByUserId(username); + Category category = categoryService.getCategoryByIdAndMemberAndType( + prayRequestDto.getCategoryId(), + member, CategoryType.PERSONAL); + return prayService.savePray(prayRequestDto.toEntity(member, category, startDateOrNull)); + } @Transactional public PrayResponseDto updatePray(Long prayId, String username, PrayUpdateRequestDto prayUpdateRequestDto) { Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - // 이 기도 제목을 공유한 적 없거나, 공유 받은 사람이 없으면 전부 수정 가능 - // 이 기도 제목을 공유한 적 있고, 누구라도 공유 받은 사람이 있으면 기도제목 내용 수정 불가능 - Pray sharedPray = prayService.getSharedPray(prayId); - Category category = categoryService.getCategoryByIdAndMemberAndType( - prayUpdateRequestDto.getCategoryId(), - pray.getMember(), - CategoryType.PERSONAL); - // 기도 제목 타입과 카테고리 타입 일치하는 지 확인 - if (!pray.getPrayType().toString().equals(category.getCategoryType().toString())) { - throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); - } - - // 공유 됐을 때 content가 있는 경우 - if ((sharedPray != null || pray.getPrayType() == PrayType.SHARED) && prayUpdateRequestDto.getContent() != null) { - throw new CustomException(ErrorStatus.ALREADY_SHARED_EXCEPTION); - } - - return PrayResponseDto.of(pray.update(prayUpdateRequestDto, category)); - } + // 이 기도 제목을 공유한 적 없거나, 공유 받은 사람이 없으면 전부 수정 가능 + // 이 기도 제목을 공유한 적 있고, 누구라도 공유 받은 사람이 있으면 기도제목 내용 수정 불가능 + Pray sharedPray = prayService.getSharedPray(prayId); + Category category = categoryService.getCategoryByIdAndMemberAndType( + prayUpdateRequestDto.getCategoryId(), + pray.getMember(), + CategoryType.PERSONAL); + // 기도 제목 타입과 카테고리 타입 일치하는 지 확인 + if (!pray.getPrayType().toString().equals(category.getCategoryType().toString())) { + throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); + } + + // 공유 됐을 때 content가 있는 경우 + if ((sharedPray != null || pray.getPrayType() == PrayType.SHARED) + && prayUpdateRequestDto.getContent() != null) { + throw new CustomException(ErrorStatus.ALREADY_SHARED_EXCEPTION); + } + + return PrayResponseDto.of(pray.update(prayUpdateRequestDto, category)); + } @Transactional - public void convertPrayToHistory() { + public void moveExpiredPrayersToHistory() { List prayList = prayService.getPrayListDeadlineBefore(LocalDate.now()); for (Pray pray : prayList) { - pray.complete(); - Integer sharedCount = prayService.getSharedCountByOriginPrayId( - pray.getOriginPrayId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) //sharedCount에 내 count도 포함되어 있음 - .build(); - historyService.saveHistory(history); - prayService.deletePray(pray); + convertPrayToHistory(pray); } } - @Transactional - public void convertPrayToHistory(Pray pray) { - pray.complete(); - History history = History.builder() - .pray(pray) - .build(); - historyService.saveHistory(history); - prayService.deletePray(pray); - } + private void convertPrayToHistory(Pray pray) { + pray.complete(); + Integer sharedCount = prayService.getSharedCountByOriginPrayId( + pray.getOriginPrayId()); + historyService.createHistory(pray, sharedCount); + prayService.deletePray(pray); + } - @Transactional - public CategoryResponseDto deleteCategory(Long categoryId) { - Category category = categoryService.getCategoryById(categoryId); + @Transactional + public CategoryResponseDto deleteCategory(Long categoryId) { + Category category = categoryService.getCategoryById(categoryId); prayService.getPrayListByCategory(category).forEach(this::convertPrayToHistory); @@ -220,22 +211,11 @@ private PrayResponseDto convertToPrayResponseDto(Pray pray) { @Transactional public List completePray(Long prayId, String username) { Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - pray.complete(); - - createHistory(pray); - prayService.deletePray(pray); + convertPrayToHistory(pray); return getPrayList(username, pray.getPrayType().stringValue()); } - private void createHistory(Pray pray) { - Integer sharedCount = prayService.getSharedCountByOriginPrayId(pray.getId()); - History history = History.builder() - .pray(pray) - .totalCount(sharedCount) - .build(); - historyService.saveHistory(history); - } @Transactional public List cancelPray(Long prayId, String username) { diff --git a/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java b/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java index 99948d1a..233beab8 100644 --- a/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java +++ b/src/main/java/com/uspray/uspray/global/common/service/SchedulerService.java @@ -39,6 +39,6 @@ public void cleanSharedPray() { @Scheduled(cron = "0 0 0 * * ?") public void convertPrayToHistory() { - prayFacadeService.convertPrayToHistory(); + prayFacadeService.moveExpiredPrayersToHistory(); } } From 53e34e01516ecb768d26c348f53f74e2a9031344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Wed, 23 Oct 2024 21:31:25 +0900 Subject: [PATCH 13/15] =?UTF-8?q?refactor:=20prayFacade=20=EB=B3=B5?= =?UTF-8?q?=EC=9E=A1=EB=8F=84=20=EB=82=AE=EC=B6=94=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/pray/service/PrayFacade.java | 98 +++++++++---------- .../push/service/NotificationLogService.java | 30 +++++- 2 files changed, 77 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 3638181c..97110f8a 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -17,8 +17,6 @@ import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.exception.model.NotFoundException; -import com.uspray.uspray.global.push.model.NotificationLog; -import com.uspray.uspray.global.push.service.FCMNotificationService; import com.uspray.uspray.global.push.service.NotificationLogService; import java.time.LocalDate; import java.util.Collections; @@ -26,29 +24,46 @@ import java.util.stream.Collectors; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor -@Slf4j public class PrayFacade { private final HistoryService historyService; private final NotificationLogService notificationLogService; - private final FCMNotificationService fcmNotificationService; private final ScrapAndHeartService scrapAndHeartService; private final ShareService shareService; private final PrayService prayService; private final MemberService memberService; private final CategoryService categoryService; - private static void checkIsAlreadyPrayed(Pray pray) { + private void checkIsAlreadyPrayed(Pray pray) { if (pray.getLastPrayedAt().equals(LocalDate.now())) { throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); } } + private boolean isSameCategory(Pray pray, Category category) { + return pray.getPrayType().toString().equals(category.getCategoryType().toString()); + } + + private boolean isSharedPray(Pray pray) { + return prayService.isSharedPray(pray) || pray.getPrayType() == PrayType.SHARED; + } + + private void checkSharedPrayValidation(PrayUpdateRequestDto prayUpdateRequestDto, + Pray pray) { + if (isPrayUpdatable(pray, prayUpdateRequestDto.getContent())) { + throw new CustomException(ErrorStatus.SHARED_PRAY_UPDATE_EXCEPTION); + } + } + + private Boolean isPrayUpdatable(Pray pray, String content) { + return isSharedPray(pray) && content != null; + } + @Transactional public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username, LocalDate startDateOrNull) { @@ -64,25 +79,24 @@ public PrayResponseDto updatePray(Long prayId, String username, PrayUpdateRequestDto prayUpdateRequestDto) { Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); - // 이 기도 제목을 공유한 적 없거나, 공유 받은 사람이 없으면 전부 수정 가능 - // 이 기도 제목을 공유한 적 있고, 누구라도 공유 받은 사람이 있으면 기도제목 내용 수정 불가능 - Pray sharedPray = prayService.getSharedPray(prayId); + checkSharedPrayValidation(prayUpdateRequestDto, pray); + + Category category = getCategory(prayUpdateRequestDto, pray); + + return PrayResponseDto.of(pray.update(prayUpdateRequestDto, category)); + } + + @NotNull + private Category getCategory(PrayUpdateRequestDto prayUpdateRequestDto, Pray pray) { Category category = categoryService.getCategoryByIdAndMemberAndType( prayUpdateRequestDto.getCategoryId(), pray.getMember(), CategoryType.PERSONAL); // 기도 제목 타입과 카테고리 타입 일치하는 지 확인 - if (!pray.getPrayType().toString().equals(category.getCategoryType().toString())) { + if (!isSameCategory(pray, category)) { throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); } - - // 공유 됐을 때 content가 있는 경우 - if ((sharedPray != null || pray.getPrayType() == PrayType.SHARED) - && prayUpdateRequestDto.getContent() != null) { - throw new CustomException(ErrorStatus.ALREADY_SHARED_EXCEPTION); - } - - return PrayResponseDto.of(pray.update(prayUpdateRequestDto, category)); + return category; } @Transactional @@ -117,30 +131,6 @@ public List todayPray(Long prayId, String username) { return getPrayList(username, pray.getPrayType().stringValue()); } - private void sendNotification(Member member) { - try { - fcmNotificationService.sendMessageTo( - member.getFirebaseToken(), - "💘", - "누군가가 당신의 기도제목을 두고 기도했어요"); - } catch (Exception e) { - log.error(e.getMessage()); - - } - log.error( - "send notification to " + member - ); - } - - private void saveNotificationLog(Pray pray, Member member) { - NotificationLog notificationLog = NotificationLog.builder() - .pray(pray) - .member(member) - .title("누군가가 당신의 기도제목을 두고 기도했어요") - .build(); - - notificationLogService.saveNotificationLog(notificationLog); - } private void handlePrayedToday(Pray pray) { checkIsAlreadyPrayed(pray); @@ -149,8 +139,8 @@ private void handlePrayedToday(Pray pray) { if (pray.getPrayType() == PrayType.SHARED) { Member originMember = memberService.findMemberById(pray.getOriginMemberId()); if (originMember.getSecondNotiAgree()) { - sendNotification(originMember); - saveNotificationLog(pray, originMember); + notificationLogService.sendNotification(originMember); + notificationLogService.saveNotificationLog(pray, originMember); } } } @@ -168,23 +158,31 @@ public PrayResponseDto deletePray(Long prayId, String username) { @Transactional public List getPrayList(String username, String prayType) { - // 사용자 정보와 카테고리 타입을 가져옴 Member member = memberService.findMemberByUserId(username); - CategoryType categoryType = CategoryType.valueOf(prayType); - List categoryList = categoryService.getCategoryListByMemberAndCategoryType(member, - categoryType); + List categoryList = getCategories( + prayType, member); - // 카테고리 리스트가 비어있을 경우 빈 리스트 반환 if (categoryList.isEmpty()) { return Collections.emptyList(); } - // PrayListResponseDto 생성 및 반환 + return convertPrayListResponseDtoListByCategory(categoryList, member); + } + + @NotNull + private List convertPrayListResponseDtoListByCategory( + List categoryList, Member member) { return categoryList.stream() .map(category -> createPrayListResponseDto(member, category)) .collect(Collectors.toList()); } + private List getCategories(String prayType, Member member) { + CategoryType categoryType = CategoryType.valueOf(prayType); + return categoryService.getCategoryListByMemberAndCategoryType(member, + categoryType); + } + private PrayListResponseDto createPrayListResponseDto(Member member, Category category) { // 기도 리스트 변환 List prayResponseDtos = prayService.getPrayListByMemberAndCategory(member, diff --git a/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java b/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java index 47db618e..aaf30761 100644 --- a/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java +++ b/src/main/java/com/uspray/uspray/global/push/service/NotificationLogService.java @@ -1,17 +1,45 @@ package com.uspray.uspray.global.push.service; +import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.global.push.model.NotificationLog; import com.uspray.uspray.global.push.repository.NotificationLogRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor +@Slf4j public class NotificationLogService { + private final NotificationLogRepository notificationLogRepository; + private final FCMNotificationService fcmNotificationService; + + public void sendNotification(Member member) { + try { + fcmNotificationService.sendMessageTo( + member.getFirebaseToken(), + "💘", + "누군가가 당신의 기도제목을 두고 기도했어요"); + } catch (Exception e) { + log.error(e.getMessage()); + + } + log.error( + "send notification to " + member + ); + } + @Transactional - public void saveNotificationLog(NotificationLog notificationLog) { + public void saveNotificationLog(Pray pray, Member member) { + NotificationLog notificationLog = NotificationLog.builder() + .pray(pray) + .member(member) + .title("누군가가 당신의 기도제목을 두고 기도했어요") + .build(); + notificationLogRepository.save(notificationLog); } From 38102c3dbb29fe2737387dd0adbfbe40796480c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Fri, 15 Nov 2024 11:49:24 +0900 Subject: [PATCH 14/15] =?UTF-8?q?fix:=20praytype=EC=9D=84=20=EC=97=86?= =?UTF-8?q?=EC=95=A0=EA=B3=A0=20=EB=AA=A8=EB=91=90=20categorytype=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/uspray/uspray/InitDb.java | 399 +++++++++--------- .../querydsl/CategoryRepositoryCustom.java | 5 +- .../querydsl/CategoryRepositoryImpl.java | 132 ++---- .../domain/group/service/GroupPrayFacade.java | 359 ++++++++-------- .../response/HistoryDetailResponseDto.java | 48 +-- .../dto/response/HistoryResponseDto.java | 40 +- .../uspray/domain/history/model/History.java | 80 ++-- .../history/service/HistoryService.java | 8 +- .../pray/dto/pray/request/PrayRequestDto.java | 40 +- .../uspray/uspray/domain/pray/model/Pray.java | 128 +++--- .../querydsl/PrayRepositoryImpl.java | 58 +-- .../domain/pray/service/PrayFacade.java | 15 +- .../domain/pray/service/ShareFacade.java | 321 +++++++------- .../uspray/uspray/global/enums/PrayType.java | 18 - 14 files changed, 790 insertions(+), 861 deletions(-) delete mode 100644 src/main/java/com/uspray/uspray/global/enums/PrayType.java diff --git a/src/main/java/com/uspray/uspray/InitDb.java b/src/main/java/com/uspray/uspray/InitDb.java index eb755ac7..f16bb105 100644 --- a/src/main/java/com/uspray/uspray/InitDb.java +++ b/src/main/java/com/uspray/uspray/InitDb.java @@ -8,7 +8,6 @@ import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.global.enums.Authority; import com.uspray.uspray.global.enums.CategoryType; -import com.uspray.uspray.global.enums.PrayType; import java.time.LocalDate; import javax.persistence.EntityManager; import lombok.RequiredArgsConstructor; @@ -20,209 +19,209 @@ @RequiredArgsConstructor public class InitDb { - private final InitService initService; + private final InitService initService; // @PostConstruct // public void init() { // initService.dbInit(); // } - @Component - @Transactional - @RequiredArgsConstructor - static class InitService { - - private final EntityManager em; - private final PasswordEncoder passwordEncoder; - - @Transactional - public void dbInit() { - Member member = Member.builder() - .userId("springtest") - .password(passwordEncoder.encode("test")) - .name("홍길동") - .phone("01012345678") - .birth("2002-02-01") - .gender("female") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member); - - Member member2 = Member.builder() - .userId("springtest2") - .password(passwordEncoder.encode("test2")) - .name("김길동") - .phone("01012345670") - .birth("2002-02-24") - .gender("male") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member2); - - Member member_mook = Member.builder() - .userId("springwjdanr0869") - .password(passwordEncoder.encode("wjdanr0869")) - .name("김정묵") - .phone("01057770869") - .birth("2001-11-07") - .gender("male") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member_mook); - - Member member3 = Member.builder() - .userId("springtest3") - .password(passwordEncoder.encode("test3")) - .name("이수빈") - .phone("01022223333") - .birth("2001-11-07") - .gender("female") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member3); - - Member member4 = Member.builder() - .userId("springtest4") - .password(passwordEncoder.encode("test4")) - .name("권은혜") - .phone("01022223331") - .birth("2001-11-07") - .gender("female") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member4); - - Member member5 = Member.builder() - .userId("springtest5") - .password(passwordEncoder.encode("test5")) - .name("배서현") - .phone("01022223931") - .birth("2001-11-07") - .gender("female") - .authority(Authority.ROLE_USER) - .build(); - em.persist(member5); - - Group group = Group.builder() - .name("테스트 모임") - .leader(member) - .build(); - em.persist(group); - - GroupMember groupMember = GroupMember.builder() - .group(group) - .member(member) - .build(); - em.persist(groupMember); - - Category category = Category.builder() - .name("기타 카테고리") - .color("#75BD62") - .member(member) - .order(1024) - .categoryType(CategoryType.PERSONAL) - .build(); - em.persist(category); - - Category category1_by_member = Category.builder() - .name("가족") - .color("#75BD62") - .member(member) - .order(2048) - .categoryType(CategoryType.PERSONAL) - .build(); - em.persist(category1_by_member); - - Category category2_by_member2 = Category.builder() - .name("친구") - .color("#75BD62") - .member(member2) - .categoryType(CategoryType.PERSONAL) - .order(1024) - .build(); - em.persist(category2_by_member2); - - Category category3_by_member = Category.builder() - .name("공유 카테고리") - .color("#75BD62") - .member(member) - .categoryType(CategoryType.SHARED) - .order(1024) - .build(); - em.persist(category3_by_member); - - Category category4_by_member2 = Category.builder() - .name("공유 카테고리") - .color("#75BD62") - .member(member2) - .categoryType(CategoryType.SHARED) - .order(1024) - .build(); - em.persist(category4_by_member2); - - Pray pray = Pray.builder() - .content("테스트 기도") - .deadline(LocalDate.parse("2025-01-01")) - .member(member) - .category(category) - .prayType(PrayType.PERSONAL) - .startDate(LocalDate.of(2022, 12, 24)) - .build(); - em.persist(pray); - - Pray pray_1 = Pray.builder() - .content("공유 테스트 기도") - .deadline(LocalDate.parse("2025-01-01")) - .member(member2) - .category(category2_by_member2) - .prayType(PrayType.PERSONAL) - .startDate(LocalDate.of(2023, 12, 24)) - .build(); - em.persist(pray_1); - - Pray pray1 = Pray.builder() - .content("공유 테스트 기도") - .deadline(LocalDate.parse("2025-02-24")) - .member(member) - .category(category3_by_member) - .prayType(PrayType.SHARED) - .startDate(LocalDate.of(2023, 12, 24)) - .originPrayId(pray_1.getId()) - .originMemberId(member2.getId()) - .build(); - em.persist(pray1); - - Pray pray2 = Pray.builder() - .content("테스트 기도") - .deadline(LocalDate.parse("2024-02-24")) - .member(member2) - .category(category4_by_member2) - .prayType(PrayType.SHARED) - .startDate(LocalDate.of(2023, 12, 24)) - .originPrayId(pray.getId()) - .build(); - em.persist(pray2); - - Pray pray3 = Pray.builder() - .content("기도할게요") - .deadline(LocalDate.parse("2024-02-02")) - .member(member) - .category(category1_by_member) - .prayType(PrayType.PERSONAL) - .startDate(LocalDate.of(2023, 12, 24)) - .build(); - em.persist(pray3); - - History history = History.builder() - .pray(pray) - .build(); - em.persist(history); - - History history1 = History.builder() - .pray(pray1) - .build(); - em.persist(history1); - } - - } + @Component + @Transactional + @RequiredArgsConstructor + static class InitService { + + private final EntityManager em; + private final PasswordEncoder passwordEncoder; + + @Transactional + public void dbInit() { + Member member = Member.builder() + .userId("springtest") + .password(passwordEncoder.encode("test")) + .name("홍길동") + .phone("01012345678") + .birth("2002-02-01") + .gender("female") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member); + + Member member2 = Member.builder() + .userId("springtest2") + .password(passwordEncoder.encode("test2")) + .name("김길동") + .phone("01012345670") + .birth("2002-02-24") + .gender("male") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member2); + + Member member_mook = Member.builder() + .userId("springwjdanr0869") + .password(passwordEncoder.encode("wjdanr0869")) + .name("김정묵") + .phone("01057770869") + .birth("2001-11-07") + .gender("male") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member_mook); + + Member member3 = Member.builder() + .userId("springtest3") + .password(passwordEncoder.encode("test3")) + .name("이수빈") + .phone("01022223333") + .birth("2001-11-07") + .gender("female") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member3); + + Member member4 = Member.builder() + .userId("springtest4") + .password(passwordEncoder.encode("test4")) + .name("권은혜") + .phone("01022223331") + .birth("2001-11-07") + .gender("female") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member4); + + Member member5 = Member.builder() + .userId("springtest5") + .password(passwordEncoder.encode("test5")) + .name("배서현") + .phone("01022223931") + .birth("2001-11-07") + .gender("female") + .authority(Authority.ROLE_USER) + .build(); + em.persist(member5); + + Group group = Group.builder() + .name("테스트 모임") + .leader(member) + .build(); + em.persist(group); + + GroupMember groupMember = GroupMember.builder() + .group(group) + .member(member) + .build(); + em.persist(groupMember); + + Category category = Category.builder() + .name("기타 카테고리") + .color("#75BD62") + .member(member) + .order(1024) + .categoryType(CategoryType.PERSONAL) + .build(); + em.persist(category); + + Category category1_by_member = Category.builder() + .name("가족") + .color("#75BD62") + .member(member) + .order(2048) + .categoryType(CategoryType.PERSONAL) + .build(); + em.persist(category1_by_member); + + Category category2_by_member2 = Category.builder() + .name("친구") + .color("#75BD62") + .member(member2) + .categoryType(CategoryType.PERSONAL) + .order(1024) + .build(); + em.persist(category2_by_member2); + + Category category3_by_member = Category.builder() + .name("공유 카테고리") + .color("#75BD62") + .member(member) + .categoryType(CategoryType.SHARED) + .order(1024) + .build(); + em.persist(category3_by_member); + + Category category4_by_member2 = Category.builder() + .name("공유 카테고리") + .color("#75BD62") + .member(member2) + .categoryType(CategoryType.SHARED) + .order(1024) + .build(); + em.persist(category4_by_member2); + + Pray pray = Pray.builder() + .content("테스트 기도") + .deadline(LocalDate.parse("2025-01-01")) + .member(member) + .category(category) + .categoryType(CategoryType.PERSONAL) + .startDate(LocalDate.of(2022, 12, 24)) + .build(); + em.persist(pray); + + Pray pray_1 = Pray.builder() + .content("공유 테스트 기도") + .deadline(LocalDate.parse("2025-01-01")) + .member(member2) + .category(category2_by_member2) + .categoryType(CategoryType.PERSONAL) + .startDate(LocalDate.of(2023, 12, 24)) + .build(); + em.persist(pray_1); + + Pray pray1 = Pray.builder() + .content("공유 테스트 기도") + .deadline(LocalDate.parse("2025-02-24")) + .member(member) + .category(category3_by_member) + .categoryType(CategoryType.SHARED) + .startDate(LocalDate.of(2023, 12, 24)) + .originPrayId(pray_1.getId()) + .originMemberId(member2.getId()) + .build(); + em.persist(pray1); + + Pray pray2 = Pray.builder() + .content("테스트 기도") + .deadline(LocalDate.parse("2024-02-24")) + .member(member2) + .category(category4_by_member2) + .categoryType(CategoryType.SHARED) + .startDate(LocalDate.of(2023, 12, 24)) + .originPrayId(pray.getId()) + .build(); + em.persist(pray2); + + Pray pray3 = Pray.builder() + .content("기도할게요") + .deadline(LocalDate.parse("2024-02-02")) + .member(member) + .category(category1_by_member) + .categoryType(CategoryType.PERSONAL) + .startDate(LocalDate.of(2023, 12, 24)) + .build(); + em.persist(pray3); + + History history = History.builder() + .pray(pray) + .build(); + em.persist(history); + + History history1 = History.builder() + .pray(pray1) + .build(); + em.persist(history1); + } + + } } diff --git a/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryCustom.java b/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryCustom.java index 48cb73bd..3566e607 100644 --- a/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryCustom.java +++ b/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryCustom.java @@ -5,7 +5,6 @@ public interface CategoryRepositoryCustom { - List findAllWithOrderAndType(String username, String prayType); - - List findAllWithOrderAndType(String username, String prayType, List prayIds); + List findAllWithOrderAndType(String username, String prayType, + List prayIds); } diff --git a/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryImpl.java b/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryImpl.java index 29e56088..9bbc3ccc 100644 --- a/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryImpl.java +++ b/src/main/java/com/uspray/uspray/domain/category/repository/querydsl/CategoryRepositoryImpl.java @@ -1,20 +1,15 @@ package com.uspray.uspray.domain.category.repository.querydsl; import static com.uspray.uspray.domain.category.model.QCategory.category; -import static com.uspray.uspray.domain.member.model.QMember.member; import static com.uspray.uspray.domain.pray.model.QPray.pray; import com.querydsl.jpa.impl.JPAQueryFactory; import com.uspray.uspray.domain.category.model.Category; -import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; import com.uspray.uspray.domain.pray.dto.pray.response.QPrayResponseDto; -import com.uspray.uspray.domain.pray.model.Pray; -import com.uspray.uspray.global.enums.PrayType; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -22,90 +17,45 @@ @RequiredArgsConstructor public class CategoryRepositoryImpl implements CategoryRepositoryCustom { - private final JPAQueryFactory queryFactory; - - @Override - public List findAllWithOrderAndType(String username, String prayType) { - // 카테고리 목록 가져오기 - List categories = queryFactory - .selectFrom(category) - .where(category.member.userId.eq(username)) - .where(category.categoryType.stringValue().likeIgnoreCase(prayType)) - .orderBy(category.order.asc()) - .fetch(); - - if (categories.isEmpty()) { - return new ArrayList<>(); - } - - // 각 카테고리 별로 PrayResponseDto 목록 가져오기 - List prayListResponseDtos = new ArrayList<>(); - for (Category cat : categories) { - List prays = queryFactory - .selectFrom(pray) - .where(pray.category.id.eq(cat.getId()) - .and(pray.member.userId.eq(username)) - .and(pray.prayType.stringValue().likeIgnoreCase(prayType))) - .orderBy(pray.createdAt.asc()) - .fetch(); - - List prayResponseDtos = prays.stream() - .map(pray_iter -> { - if (pray_iter.getPrayType().equals(PrayType.SHARED)) { - Member originMember = queryFactory - .selectFrom(member) - .where(member.id.eq(pray_iter.getOriginMemberId())) - .fetchOne(); - return PrayResponseDto.shared(pray_iter, originMember); - } else { - return PrayResponseDto.of(pray_iter); - } - }) - .collect(Collectors.toList()); - - prayListResponseDtos.add( - new PrayListResponseDto(cat.getId(), cat.getName(), cat.getColor(), - prayResponseDtos)); - } - return prayListResponseDtos; - } - - @Override - public List findAllWithOrderAndType(String username, String prayType, - List prayIds) { - List categories = queryFactory - .selectFrom(category) - .where(category.member.userId.eq(username)) - .where(category.categoryType.stringValue().likeIgnoreCase(prayType)) - .orderBy(category.order.asc()) - .fetch(); - - // 각 카테고리 별로 PrayResponseDto 목록 가져오기 - List prayListResponseDtos = new ArrayList<>(); - for (Category cat : categories) { - List prayResponseDtos = queryFactory - .select(new QPrayResponseDto( - pray.id, - pray.content, - pray.member.name, - pray.deadline, - pray.category.id, - pray.category.name, - pray.lastPrayedAt, - pray.isShared - )) - .from(pray) - .where(pray.category.id.eq(cat.getId()) - .and(pray.member.userId.eq(username)) - .and(pray.prayType.stringValue().likeIgnoreCase(prayType))) - .fetch(); - prayResponseDtos.removeIf(p -> !prayIds.contains(p.getPrayId())); - prayResponseDtos.forEach(p -> p.setInGroup(true)); - - prayListResponseDtos.add( - new PrayListResponseDto(cat.getId(), cat.getName(), cat.getColor(), - prayResponseDtos)); - } - return prayListResponseDtos; - } + private final JPAQueryFactory queryFactory; + + + @Override + public List findAllWithOrderAndType(String username, String prayType, + List prayIds) { + List categories = queryFactory + .selectFrom(category) + .where(category.member.userId.eq(username)) + .where(category.categoryType.stringValue().likeIgnoreCase(prayType)) + .orderBy(category.order.asc()) + .fetch(); + + // 각 카테고리 별로 PrayResponseDto 목록 가져오기 + List prayListResponseDtos = new ArrayList<>(); + for (Category cat : categories) { + List prayResponseDtos = queryFactory + .select(new QPrayResponseDto( + pray.id, + pray.content, + pray.member.name, + pray.deadline, + pray.category.id, + pray.category.name, + pray.lastPrayedAt, + pray.isShared + )) + .from(pray) + .where(pray.category.id.eq(cat.getId()) + .and(pray.member.userId.eq(username)) + .and(pray.categoryType.stringValue().likeIgnoreCase(prayType))) + .fetch(); + prayResponseDtos.removeIf(p -> !prayIds.contains(p.getPrayId())); + prayResponseDtos.forEach(p -> p.setInGroup(true)); + + prayListResponseDtos.add( + new PrayListResponseDto(cat.getId(), cat.getName(), cat.getColor(), + prayResponseDtos)); + } + return prayListResponseDtos; + } } diff --git a/src/main/java/com/uspray/uspray/domain/group/service/GroupPrayFacade.java b/src/main/java/com/uspray/uspray/domain/group/service/GroupPrayFacade.java index 86caa23e..781abd02 100644 --- a/src/main/java/com/uspray/uspray/domain/group/service/GroupPrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/group/service/GroupPrayFacade.java @@ -17,7 +17,6 @@ import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.domain.pray.service.PrayService; import com.uspray.uspray.global.enums.CategoryType; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.push.model.NotificationLog; @@ -41,183 +40,183 @@ @RequiredArgsConstructor public class GroupPrayFacade { - private final FCMNotificationService fcmNotificationService; - private final MemberService memberService; - private final PrayService prayService; - private final GroupPrayService groupPrayService; - private final GroupMemberService groupMemberService; - private final GroupService groupService; - private final CategoryService categoryService; - private final ScrapAndHeartService scrapAndHeartService; - - @Transactional - public void prayToGroupPray(PrayToGroupPrayDto prayToGroupPrayDto, String userId) { - Member member = memberService.findMemberByUserId(userId); - Group group = groupService.getGroupById(prayToGroupPrayDto.getGroupId()); - - List existIds = group.getGroupPrayList().stream() - .map(gp -> gp.getOriginPray().getId()) - .collect(Collectors.toList()); - if (existIds.stream().anyMatch(id -> id.equals(prayToGroupPrayDto.getPrayId()))) { - throw new CustomException(ErrorStatus.ALREADY_EXIST_GROUP_PRAY_EXCEPTION); - } - - List mainPray = prayService.findAllByIdIn(prayToGroupPrayDto.getPrayId()); - List targetPray = prayService.findAllByOriginPrayIdIn( - prayToGroupPrayDto.getPrayId()); - - for (Pray p : mainPray) { - GroupPray groupPray = GroupPray.builder() - .group(group) - .author(member) - .content(new String(Base64.getDecoder().decode(p.getContent().getBytes()))) - .deadline(p.getDeadline()) - .build(); - p.setGroupPray(groupPray); - groupPrayService.saveGroupPray(groupPray); - p.setIsShared(); - - ScrapAndHeart scrapAndHeart = ScrapAndHeart.builder() - .groupPray(groupPray) - .member(member) - .build(); - scrapAndHeartService.save(scrapAndHeart); - - for (Pray TP : targetPray) { - ScrapAndHeart targetScrapAndHeart = ScrapAndHeart.builder() - .groupPray(groupPray) - .member(TP.getMember()) - .build(); - targetScrapAndHeart.scrapPray(TP); - scrapAndHeartService.save(targetScrapAndHeart); - } - } - } - - public List getPrayList(String username, String prayType, Long groupId) { - List prayIds = groupPrayService.getOriginPrayIdsByGroupId(groupId); - return categoryService.findAllWithOrderAndType(username, prayType, prayIds); - } - - - @Transactional - public void createGroupPray(GroupPrayRequestDto groupPrayRequestDto, String userId) { - Member author = memberService.findMemberByUserId(userId); - Group group = groupService.getGroupById(groupPrayRequestDto.getGroupId()); - GroupPray groupPray = GroupPray.of(group, author, groupPrayRequestDto.getDeadline(), - groupPrayRequestDto.getContent()); - - groupPrayService.saveGroupPray(groupPray); - scrapAndHeartService.save(ScrapAndHeart.createdByGroupPrayOf(groupPray, author)); - - Category category = categoryService.getCategoryByIdAndMemberAndType( - groupPrayRequestDto.getCategoryId(), author, CategoryType.PERSONAL); - - prayService.savePray(Pray.createdByGroupPrayOf(author, groupPrayRequestDto.getContent(), - groupPrayRequestDto.getDeadline(), category, PrayType.PERSONAL, groupPray, true)); - } - - @Transactional(readOnly = true) - public GroupPrayRappingDto getGroupPray(Long groupId, String userId) { - - Member member = memberService.findMemberByUserId(userId); - Group group = groupService.getGroupById(groupId); - - List groupPrays = groupPrayService.findGroupPraysByGroup(group); - Long count = scrapAndHeartService.countHeart(groupPrays); - - List groupPrayList = new ArrayList<>(); - for (GroupPray groupPray : groupPrays) { - ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( - groupPray, member).orElse(null); - groupPrayList.add(GroupPrayResponseDto.builder() - .groupPray(groupPray) - .member(member) - .scrapAndHeart(scrapAndHeart) - .build()); - } - - GroupMember groupMember = groupMemberService.getGroupMemberByGroupAndMember(group, member); - - return new GroupPrayRappingDto(count, groupMember.getNotificationAgree(), - makeSortedTreeMap(groupPrayList)); - } - - private Map> makeSortedTreeMap( - List groupPrayList) { - // 역순으로 정렬하는 트리맵 정의 - Map> sortedMap = new TreeMap<>( - Comparator.reverseOrder()); - - // 트리맵에 날짜별로 그룹화 된 기도제목 리스트 입력 - sortedMap.putAll(groupPrayList.stream() - .collect(Collectors.groupingBy(GroupPrayResponseDto::getCreatedAt))); - - // 날짜별로 그룹화 된 기도제목을 기도제목 id 순으로 정렬 - for (Map.Entry> entry : sortedMap.entrySet()) { - List value = entry.getValue(); - value.sort(Comparator.comparing(GroupPrayResponseDto::getGroupPrayId).reversed()); - } - return sortedMap; - } - - @Transactional - public void heartGroupPray(Long groupPrayId, String userId) throws IOException { - GroupPray groupPray = groupPrayService.getGroupPrayById(groupPrayId); - Member member = memberService.findMemberByUserId(userId); - - ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( - groupPray, member) - .orElse(ScrapAndHeart.builder() - .groupPray(groupPray) - .member(member) - .build()); - - scrapAndHeart.heartPray(); - scrapAndHeartService.save(scrapAndHeart); - sendNotificationAndSaveLog(scrapAndHeart, groupPray, groupPray.getAuthor(), true); - } - - @Transactional - public void scrapGroupPray(ScrapRequestDto scrapRequestDto, String userId) throws IOException { - Member member = memberService.findMemberByUserId(userId); - Category category = categoryService.getCategoryByIdAndMemberAndType( - scrapRequestDto.getCategoryId(), member, CategoryType.SHARED); - GroupPray groupPray = groupPrayService.getGroupPrayById( - scrapRequestDto.getGroupPrayId()); - - Pray pray = makePray(scrapRequestDto, groupPray, member, category); - prayService.savePray(pray); - - ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( - groupPray, member).orElse(ScrapAndHeart.createdByScrapOf(groupPray, member, pray)); - - scrapAndHeart.scrapPray(pray); - scrapAndHeartService.save(scrapAndHeart); - sendNotificationAndSaveLog(scrapAndHeart, groupPray, groupPray.getAuthor(), false); - } - - private Pray makePray(ScrapRequestDto scrapRequestDto, GroupPray groupPray, Member member, - Category category) { - groupPray.getOriginPray().setIsShared(); - - return Pray.createdByScrapOf(member, groupPray.getContent(), scrapRequestDto.getDeadline(), - groupPray.getAuthor().getId(), groupPray.getOriginPray().getId(), category, - PrayType.SHARED); - } - - private void sendNotificationAndSaveLog(ScrapAndHeart scrapAndHeart, GroupPray groupPray, - Member receiver, boolean isHeart) throws IOException { - String groupName = groupPray.getGroup().getName(); - String name = scrapAndHeart.getMember().getName(); - - String title = isHeart ? groupName + " 💘" : groupName + " 💌 "; - String body = isHeart ? name + "님이 당신의 기도제목을 두고 기도했어요" : name + "님이 당신의 기도제목을 저장했어요"; - - fcmNotificationService.sendMessageTo(receiver.getFirebaseToken(), title, body); - fcmNotificationService.saveNotificationLog( - NotificationLog.of(memberService.findMemberByUserId(receiver.getUserId()), - groupPray.getOriginPray(), body)); - - } + private final FCMNotificationService fcmNotificationService; + private final MemberService memberService; + private final PrayService prayService; + private final GroupPrayService groupPrayService; + private final GroupMemberService groupMemberService; + private final GroupService groupService; + private final CategoryService categoryService; + private final ScrapAndHeartService scrapAndHeartService; + + @Transactional + public void prayToGroupPray(PrayToGroupPrayDto prayToGroupPrayDto, String userId) { + Member member = memberService.findMemberByUserId(userId); + Group group = groupService.getGroupById(prayToGroupPrayDto.getGroupId()); + + List existIds = group.getGroupPrayList().stream() + .map(gp -> gp.getOriginPray().getId()) + .collect(Collectors.toList()); + if (existIds.stream().anyMatch(id -> id.equals(prayToGroupPrayDto.getPrayId()))) { + throw new CustomException(ErrorStatus.ALREADY_EXIST_GROUP_PRAY_EXCEPTION); + } + + List mainPray = prayService.findAllByIdIn(prayToGroupPrayDto.getPrayId()); + List targetPray = prayService.findAllByOriginPrayIdIn( + prayToGroupPrayDto.getPrayId()); + + for (Pray p : mainPray) { + GroupPray groupPray = GroupPray.builder() + .group(group) + .author(member) + .content(new String(Base64.getDecoder().decode(p.getContent().getBytes()))) + .deadline(p.getDeadline()) + .build(); + p.setGroupPray(groupPray); + groupPrayService.saveGroupPray(groupPray); + p.setIsShared(); + + ScrapAndHeart scrapAndHeart = ScrapAndHeart.builder() + .groupPray(groupPray) + .member(member) + .build(); + scrapAndHeartService.save(scrapAndHeart); + + for (Pray TP : targetPray) { + ScrapAndHeart targetScrapAndHeart = ScrapAndHeart.builder() + .groupPray(groupPray) + .member(TP.getMember()) + .build(); + targetScrapAndHeart.scrapPray(TP); + scrapAndHeartService.save(targetScrapAndHeart); + } + } + } + + public List getPrayList(String username, String prayType, Long groupId) { + List prayIds = groupPrayService.getOriginPrayIdsByGroupId(groupId); + return categoryService.findAllWithOrderAndType(username, prayType, prayIds); + } + + + @Transactional + public void createGroupPray(GroupPrayRequestDto groupPrayRequestDto, String userId) { + Member author = memberService.findMemberByUserId(userId); + Group group = groupService.getGroupById(groupPrayRequestDto.getGroupId()); + GroupPray groupPray = GroupPray.of(group, author, groupPrayRequestDto.getDeadline(), + groupPrayRequestDto.getContent()); + + groupPrayService.saveGroupPray(groupPray); + scrapAndHeartService.save(ScrapAndHeart.createdByGroupPrayOf(groupPray, author)); + + Category category = categoryService.getCategoryByIdAndMemberAndType( + groupPrayRequestDto.getCategoryId(), author, CategoryType.PERSONAL); + + prayService.savePray(Pray.createdByGroupPrayOf(author, groupPrayRequestDto.getContent(), + groupPrayRequestDto.getDeadline(), category, CategoryType.PERSONAL, groupPray, true)); + } + + @Transactional(readOnly = true) + public GroupPrayRappingDto getGroupPray(Long groupId, String userId) { + + Member member = memberService.findMemberByUserId(userId); + Group group = groupService.getGroupById(groupId); + + List groupPrays = groupPrayService.findGroupPraysByGroup(group); + Long count = scrapAndHeartService.countHeart(groupPrays); + + List groupPrayList = new ArrayList<>(); + for (GroupPray groupPray : groupPrays) { + ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( + groupPray, member).orElse(null); + groupPrayList.add(GroupPrayResponseDto.builder() + .groupPray(groupPray) + .member(member) + .scrapAndHeart(scrapAndHeart) + .build()); + } + + GroupMember groupMember = groupMemberService.getGroupMemberByGroupAndMember(group, member); + + return new GroupPrayRappingDto(count, groupMember.getNotificationAgree(), + makeSortedTreeMap(groupPrayList)); + } + + private Map> makeSortedTreeMap( + List groupPrayList) { + // 역순으로 정렬하는 트리맵 정의 + Map> sortedMap = new TreeMap<>( + Comparator.reverseOrder()); + + // 트리맵에 날짜별로 그룹화 된 기도제목 리스트 입력 + sortedMap.putAll(groupPrayList.stream() + .collect(Collectors.groupingBy(GroupPrayResponseDto::getCreatedAt))); + + // 날짜별로 그룹화 된 기도제목을 기도제목 id 순으로 정렬 + for (Map.Entry> entry : sortedMap.entrySet()) { + List value = entry.getValue(); + value.sort(Comparator.comparing(GroupPrayResponseDto::getGroupPrayId).reversed()); + } + return sortedMap; + } + + @Transactional + public void heartGroupPray(Long groupPrayId, String userId) throws IOException { + GroupPray groupPray = groupPrayService.getGroupPrayById(groupPrayId); + Member member = memberService.findMemberByUserId(userId); + + ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( + groupPray, member) + .orElse(ScrapAndHeart.builder() + .groupPray(groupPray) + .member(member) + .build()); + + scrapAndHeart.heartPray(); + scrapAndHeartService.save(scrapAndHeart); + sendNotificationAndSaveLog(scrapAndHeart, groupPray, groupPray.getAuthor(), true); + } + + @Transactional + public void scrapGroupPray(ScrapRequestDto scrapRequestDto, String userId) throws IOException { + Member member = memberService.findMemberByUserId(userId); + Category category = categoryService.getCategoryByIdAndMemberAndType( + scrapRequestDto.getCategoryId(), member, CategoryType.SHARED); + GroupPray groupPray = groupPrayService.getGroupPrayById( + scrapRequestDto.getGroupPrayId()); + + Pray pray = makePray(scrapRequestDto, groupPray, member, category); + prayService.savePray(pray); + + ScrapAndHeart scrapAndHeart = scrapAndHeartService.findScrapAndHeartByGroupPrayAndMember( + groupPray, member).orElse(ScrapAndHeart.createdByScrapOf(groupPray, member, pray)); + + scrapAndHeart.scrapPray(pray); + scrapAndHeartService.save(scrapAndHeart); + sendNotificationAndSaveLog(scrapAndHeart, groupPray, groupPray.getAuthor(), false); + } + + private Pray makePray(ScrapRequestDto scrapRequestDto, GroupPray groupPray, Member member, + Category category) { + groupPray.getOriginPray().setIsShared(); + + return Pray.createdByScrapOf(member, groupPray.getContent(), scrapRequestDto.getDeadline(), + groupPray.getAuthor().getId(), groupPray.getOriginPray().getId(), category, + CategoryType.SHARED); + } + + private void sendNotificationAndSaveLog(ScrapAndHeart scrapAndHeart, GroupPray groupPray, + Member receiver, boolean isHeart) throws IOException { + String groupName = groupPray.getGroup().getName(); + String name = scrapAndHeart.getMember().getName(); + + String title = isHeart ? groupName + " 💘" : groupName + " 💌 "; + String body = isHeart ? name + "님이 당신의 기도제목을 두고 기도했어요" : name + "님이 당신의 기도제목을 저장했어요"; + + fcmNotificationService.sendMessageTo(receiver.getFirebaseToken(), title, body); + fcmNotificationService.saveNotificationLog( + NotificationLog.of(memberService.findMemberByUserId(receiver.getUserId()), + groupPray.getOriginPray(), body)); + + } } diff --git a/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryDetailResponseDto.java b/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryDetailResponseDto.java index 4ddf0dde..a70d1210 100644 --- a/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryDetailResponseDto.java +++ b/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryDetailResponseDto.java @@ -1,8 +1,8 @@ package com.uspray.uspray.domain.history.dto.response; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.history.model.History; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.global.enums.CategoryType; import java.time.LocalDate; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,37 +13,37 @@ @AllArgsConstructor public class HistoryDetailResponseDto { - private Long historyId; + private Long historyId; - private String name; + private String name; - private String content; + private String content; - private Integer personal_count; + private Integer personal_count; - private Integer total_count; + private Integer total_count; - private LocalDate startDate; + private LocalDate startDate; - private LocalDate deadline; + private LocalDate deadline; - private Long categoryId; + private Long categoryId; - private Boolean canEdit; + private Boolean canEdit; - public static HistoryDetailResponseDto of(History history) { - return new HistoryDetailResponseDto(history.getId(), history.getMember().getName(), - history.getContent(), history.getPersonalCount(), history.getTotalCount(), - history.getStartDate(), history.getDeadline(), - history.getCategoryId(), - history.getPrayType() == PrayType.PERSONAL && !history.getIsShared()); - } + public static HistoryDetailResponseDto of(History history) { + return new HistoryDetailResponseDto(history.getId(), history.getMember().getName(), + history.getContent(), history.getPersonalCount(), history.getTotalCount(), + history.getStartDate(), history.getDeadline(), + history.getCategoryId(), + history.getCategoryType() == CategoryType.PERSONAL && !history.getIsShared()); + } - public static HistoryDetailResponseDto shared(History history, Pray originPray) { - return new HistoryDetailResponseDto(history.getId(), originPray.getMember().getName(), - history.getContent(), history.getPersonalCount(), history.getTotalCount(), - history.getStartDate(), history.getDeadline(), - history.getCategoryId(), - history.getPrayType() == PrayType.PERSONAL && !history.getIsShared()); - } + public static HistoryDetailResponseDto shared(History history, Pray originPray) { + return new HistoryDetailResponseDto(history.getId(), originPray.getMember().getName(), + history.getContent(), history.getPersonalCount(), history.getTotalCount(), + history.getStartDate(), history.getDeadline(), + history.getCategoryId(), + history.getCategoryType() == CategoryType.PERSONAL && !history.getIsShared()); + } } diff --git a/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryResponseDto.java b/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryResponseDto.java index 481651a9..409290b8 100644 --- a/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryResponseDto.java +++ b/src/main/java/com/uspray/uspray/domain/history/dto/response/HistoryResponseDto.java @@ -1,8 +1,8 @@ package com.uspray.uspray.domain.history.dto.response; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.history.model.History; import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.global.enums.CategoryType; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; import lombok.AllArgsConstructor; @@ -15,32 +15,34 @@ @Schema(description = "히스토리 응답 DTO") public class HistoryResponseDto { - private Long historyId; + private Long historyId; - private String userId; + private String userId; - private String name; + private String name; - private String content; + private String content; - private LocalDate createdAt; + private LocalDate createdAt; - private LocalDate deadline; + private LocalDate deadline; - private Long categoryId; + private Long categoryId; - private Boolean canEdit; + private Boolean canEdit; - public static HistoryResponseDto of(History history) { - return new HistoryResponseDto(history.getId(), history.getMember().getUserId(), - history.getMember().getName(), history.getContent(), history.getStartDate(), history.getDeadline(), history.getCategoryId(), - history.getPrayType() == PrayType.PERSONAL && !history.getIsShared()); - } + public static HistoryResponseDto of(History history) { + return new HistoryResponseDto(history.getId(), history.getMember().getUserId(), + history.getMember().getName(), history.getContent(), history.getStartDate(), + history.getDeadline(), history.getCategoryId(), + history.getCategoryType() == CategoryType.PERSONAL && !history.getIsShared()); + } - public static HistoryResponseDto shared(History history, Member originMember) { - return new HistoryResponseDto(history.getId(), originMember.getUserId(), - originMember.getName(), history.getContent(), history.getStartDate(), history.getDeadline(), - history.getCategoryId(), false); // 공유받은 기도제목은 수정 불가능, 항상 false - } + public static HistoryResponseDto shared(History history, Member originMember) { + return new HistoryResponseDto(history.getId(), originMember.getUserId(), + originMember.getName(), history.getContent(), history.getStartDate(), + history.getDeadline(), + history.getCategoryId(), false); // 공유받은 기도제목은 수정 불가능, 항상 false + } } diff --git a/src/main/java/com/uspray/uspray/domain/history/model/History.java b/src/main/java/com/uspray/uspray/domain/history/model/History.java index c2445a14..236e5ddb 100644 --- a/src/main/java/com/uspray/uspray/domain/history/model/History.java +++ b/src/main/java/com/uspray/uspray/domain/history/model/History.java @@ -1,9 +1,9 @@ package com.uspray.uspray.domain.history.model; -import com.uspray.uspray.global.enums.PrayType; -import com.uspray.uspray.global.common.model.AuditingTimeEntity; import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.global.common.model.AuditingTimeEntity; +import com.uspray.uspray.global.enums.CategoryType; import java.time.LocalDate; import java.util.Base64; import javax.persistence.Column; @@ -26,54 +26,54 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class History extends AuditingTimeEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "history_id") - private Long id; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "history_id") + private Long id; - @ManyToOne - @JoinColumn(name = "member_id", nullable = false) - private Member member; + @ManyToOne + @JoinColumn(name = "member_id", nullable = false) + private Member member; - private String content; + private String content; - private Integer personalCount; + private Integer personalCount; - private Integer totalCount; + private Integer totalCount; - private LocalDate startDate; - private LocalDate deadline; + private LocalDate startDate; + private LocalDate deadline; - @Column(name = "origin_pray_id") - private Long originPrayId; + @Column(name = "origin_pray_id") + private Long originPrayId; - @Column(name = "origin_member_id") - private Long originMemberId; + @Column(name = "origin_member_id") + private Long originMemberId; - @NotNull - @Enumerated(EnumType.STRING) - private PrayType prayType; + @NotNull + @Enumerated(EnumType.STRING) + private CategoryType categoryType; - private Long categoryId; + private Long categoryId; - private Boolean isShared; + private Boolean isShared; - @Builder - public History(Pray pray, Integer totalCount) { - this.member = pray.getMember(); - this.content = pray.getContent(); - this.personalCount = pray.getCount(); - this.totalCount = (totalCount == null) ? 0 : totalCount; // totalCount에 기본값 설정 - this.startDate = LocalDate.from(pray.getStartDate()); - this.deadline = pray.getDeadline(); - this.originPrayId = pray.getOriginPrayId(); - this.originMemberId = pray.getOriginMemberId(); - this.prayType = pray.getPrayType(); - this.categoryId = pray.getCategory().getId(); - this.isShared = pray.getIsShared(); - } + @Builder + public History(Pray pray, Integer totalCount) { + this.member = pray.getMember(); + this.content = pray.getContent(); + this.personalCount = pray.getCount(); + this.totalCount = (totalCount == null) ? 0 : totalCount; // totalCount에 기본값 설정 + this.startDate = LocalDate.from(pray.getStartDate()); + this.deadline = pray.getDeadline(); + this.originPrayId = pray.getOriginPrayId(); + this.originMemberId = pray.getOriginMemberId(); + this.categoryType = pray.getCategoryType(); + this.categoryId = pray.getCategory().getId(); + this.isShared = pray.getIsShared(); + } - public String getContent() { - return new String(Base64.getDecoder().decode(content)); - } + public String getContent() { + return new String(Base64.getDecoder().decode(content)); + } } \ No newline at end of file diff --git a/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java b/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java index e6b4ba9b..7eb025b0 100644 --- a/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java +++ b/src/main/java/com/uspray/uspray/domain/history/service/HistoryService.java @@ -10,7 +10,7 @@ import com.uspray.uspray.domain.member.repository.MemberRepository; import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.domain.pray.repository.PrayRepository; -import com.uspray.uspray.global.enums.PrayType; +import com.uspray.uspray.global.enums.CategoryType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.exception.model.NotFoundException; @@ -37,13 +37,13 @@ public HistoryListResponseDto getHistoryList(String username, String type, int p Member member = memberRepository.getMemberByUserId(username); Page historyList; - if (PrayType.PERSONAL.name().equalsIgnoreCase(type)) { + if (CategoryType.PERSONAL.name().equalsIgnoreCase(type)) { historyList = historyRepository.findByMemberAndOriginPrayIdIsNull(member, pageable) .map(HistoryResponseDto::of); return new HistoryListResponseDto(historyList.getContent(), historyList.getTotalPages()); } - if (PrayType.SHARED.name().equalsIgnoreCase(type)) { + if (CategoryType.SHARED.name().equalsIgnoreCase(type)) { historyList = historyRepository.findByMemberAndOriginPrayIdIsNotNull( member, pageable).map(history -> { Member originMember = memberRepository.getMemberById(history.getOriginMemberId()); @@ -74,7 +74,7 @@ public HistoryDetailResponseDto getHistoryDetail(String username, Long historyId if (!history.getMember().getId().equals(member.getId())) { throw new NotFoundException(ErrorStatus.HISTORY_NOT_FOUND_EXCEPTION); } - if (history.getPrayType().equals(PrayType.SHARED)) { + if (history.getCategoryType() == CategoryType.SHARED) { Pray originPray = prayRepository.getPrayById(history.getOriginPrayId()); return HistoryDetailResponseDto.shared(history, originPray); } diff --git a/src/main/java/com/uspray/uspray/domain/pray/dto/pray/request/PrayRequestDto.java b/src/main/java/com/uspray/uspray/domain/pray/dto/pray/request/PrayRequestDto.java index 3c928cbb..3c207002 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/dto/pray/request/PrayRequestDto.java +++ b/src/main/java/com/uspray/uspray/domain/pray/dto/pray/request/PrayRequestDto.java @@ -1,9 +1,9 @@ package com.uspray.uspray.domain.pray.dto.pray.request; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.category.model.Category; import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.global.enums.CategoryType; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; import javax.validation.constraints.NotNull; @@ -19,26 +19,26 @@ @Schema(description = "기도제목 DTO") public class PrayRequestDto { - @NotNull - @Schema(description = "기도제목 내용", example = "@@이가 $$ 할 수 있도록") - private String content; + @NotNull + @Schema(description = "기도제목 내용", example = "@@이가 $$ 할 수 있도록") + private String content; - @NotNull - @Schema(description = "기도제목 마감일", example = "2025-01-01") - private LocalDate deadline; + @NotNull + @Schema(description = "기도제목 마감일", example = "2025-01-01") + private LocalDate deadline; - @NotNull - @Schema(description = "기도제목 카테고리", example = "1") - private Long categoryId; + @NotNull + @Schema(description = "기도제목 카테고리", example = "1") + private Long categoryId; - public Pray toEntity(Member member, Category category, LocalDate startDateOrNull) { - return Pray.builder() - .content(content) - .deadline(deadline) - .member(member) - .category(category) - .prayType(PrayType.PERSONAL) - .startDate(startDateOrNull) - .build(); - } + public Pray toEntity(Member member, Category category, LocalDate startDateOrNull) { + return Pray.builder() + .content(content) + .deadline(deadline) + .member(member) + .category(category) + .categoryType(CategoryType.PERSONAL) + .startDate(startDateOrNull) + .build(); + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java b/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java index 8ae42b3f..71303270 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java +++ b/src/main/java/com/uspray/uspray/domain/pray/model/Pray.java @@ -5,7 +5,7 @@ import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.pray.dto.pray.request.PrayUpdateRequestDto; import com.uspray.uspray.global.common.model.AuditingTimeEntity; -import com.uspray.uspray.global.enums.PrayType; +import com.uspray.uspray.global.enums.CategoryType; import java.time.LocalDate; import java.util.ArrayList; import java.util.Base64; @@ -37,40 +37,40 @@ @Where(clause = "deleted=false") public class Pray extends AuditingTimeEntity { - private final Boolean deleted = false; - @OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true) - private final List groupPray = new ArrayList<>(); - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "pray_id") - private Long id; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id", nullable = false) - private Member member; - private String content; - private Integer count; - private LocalDate deadline; - private Boolean isShared = false; - @Column(name = "origin_pray_id") - private Long originPrayId; - @Column(name = "origin_member_id") - private Long originMemberId; - @NotNull - @Enumerated(EnumType.STRING) - private PrayType prayType; - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "category_id") - private Category category; + private final Boolean deleted = false; + @OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true) + private final List groupPray = new ArrayList<>(); + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "pray_id") + private Long id; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + private String content; + private Integer count; + private LocalDate deadline; + private Boolean isShared = false; + @Column(name = "origin_pray_id") + private Long originPrayId; + @Column(name = "origin_member_id") + private Long originMemberId; + @NotNull + @Enumerated(EnumType.STRING) + private CategoryType categoryType; + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "category_id") + private Category category; - @NotNull - private LocalDate startDate; + @NotNull + private LocalDate startDate; - private LocalDate lastPrayedAt; + private LocalDate lastPrayedAt; @Builder public Pray(Member member, String content, LocalDate deadline, Long originPrayId, - Long originMemberId, Category category, PrayType prayType, GroupPray groupPray, + Long originMemberId, Category category, CategoryType categoryType, GroupPray groupPray, LocalDate startDate, Boolean isShared) { this.member = member; this.content = new String(Base64.getEncoder().encode(content.getBytes())); @@ -79,7 +79,7 @@ public Pray(Member member, String content, LocalDate deadline, Long originPrayId this.originPrayId = originPrayId; this.originMemberId = originMemberId; this.category = category; - this.prayType = prayType; + this.categoryType = categoryType; setGroupPray(groupPray); this.startDate = startDate; this.lastPrayedAt = LocalDate.of(2002, 2, 24); @@ -87,21 +87,21 @@ public Pray(Member member, String content, LocalDate deadline, Long originPrayId } public static Pray createdByGroupPrayOf(Member author, String content, LocalDate deadline, - Category category, PrayType prayType, GroupPray groupPray, Boolean isShared) { + Category category, CategoryType categoryType, GroupPray groupPray, Boolean isShared) { return Pray.builder() .member(author) .content(content) .deadline(deadline) .category(category) .startDate(LocalDate.now()) - .prayType(prayType) + .categoryType(categoryType) .groupPray(groupPray) .isShared(isShared) .build(); } public static Pray createdByScrapOf(Member member, String content, LocalDate deadline, - Long originMemberId, Long originPrayId, Category category, PrayType prayType) { + Long originMemberId, Long originPrayId, Category category, CategoryType categoryType) { return Pray.builder() .member(member) .content(content) @@ -109,42 +109,42 @@ public static Pray createdByScrapOf(Member member, String content, LocalDate dea .originMemberId(originMemberId) .originPrayId(originPrayId) .category(category) - .prayType(prayType) + .categoryType(categoryType) .build(); } - public void setGroupPray(GroupPray groupPray) { - if (groupPray != null) { - this.groupPray.add(groupPray); - groupPray.setOriginPray(this); - } - } + public void setGroupPray(GroupPray groupPray) { + if (groupPray != null) { + this.groupPray.add(groupPray); + groupPray.setOriginPray(this); + } + } - public Pray update(PrayUpdateRequestDto prayUpdateRequestDto, Category category) { - if (prayUpdateRequestDto.getContent() != null) { - this.content = new String( - Base64.getEncoder().encode(prayUpdateRequestDto.getContent().getBytes())); - } - this.deadline = prayUpdateRequestDto.getDeadline(); - this.category = category; - return this; - } + public Pray update(PrayUpdateRequestDto prayUpdateRequestDto, Category category) { + if (prayUpdateRequestDto.getContent() != null) { + this.content = new String( + Base64.getEncoder().encode(prayUpdateRequestDto.getContent().getBytes())); + } + this.deadline = prayUpdateRequestDto.getDeadline(); + this.category = category; + return this; + } - public void countUp() { - this.count++; - this.lastPrayedAt = LocalDate.now(); - } + public void countUp() { + this.count++; + this.lastPrayedAt = LocalDate.now(); + } - public void complete() { - this.deadline = LocalDate.now(); - } + public void complete() { + this.deadline = LocalDate.now(); + } - public void deleteLastPrayedAt() { - this.lastPrayedAt = LocalDate.now().minusDays(1); - this.count--; - } + public void deleteLastPrayedAt() { + this.lastPrayedAt = LocalDate.now().minusDays(1); + this.count--; + } - public void setIsShared() { - this.isShared = true; - } + public void setIsShared() { + this.isShared = true; + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java index ccf00ec4..e1ab9807 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java +++ b/src/main/java/com/uspray/uspray/domain/pray/repository/querydsl/PrayRepositoryImpl.java @@ -13,36 +13,36 @@ @RequiredArgsConstructor public class PrayRepositoryImpl implements PrayRepositoryCustom { - private final JPAQueryFactory queryFactory; + private final JPAQueryFactory queryFactory; - @Override - public List findAllWithOrderAndType(String username, String prayType) { - return queryFactory - .select(pray) - .from(pray) - .join(pray.category, category) - .where(category.member.userId.eq(username)) - .where(pray.prayType.stringValue().likeIgnoreCase(prayType)) - .orderBy(pray.createdAt.asc()) - .orderBy(pray.category.order.asc()) - .fetch(); - } + @Override + public List findAllWithOrderAndType(String username, String prayType) { + return queryFactory + .select(pray) + .from(pray) + .join(pray.category, category) + .where(category.member.userId.eq(username)) + .where(pray.categoryType.stringValue().likeIgnoreCase(prayType)) + .orderBy(pray.createdAt.asc()) + .orderBy(pray.category.order.asc()) + .fetch(); + } - @Override - // prayId로 originPrayId를 넘겨줌 - public Integer getSharedCountByOriginPrayId(Long prayId) { - Integer result = queryFactory - .select(pray.count.sum()) - .from(pray) - .where(pray.originPrayId.eq(prayId)) - .groupBy(pray.id) - .fetchOne(); - Integer result_for_owner = queryFactory - .select(pray.count.sum()) - .from(pray) - .where(pray.id.eq(prayId)) - .fetchOne(); - return result != null ? result + result_for_owner : result_for_owner; - } + @Override + // prayId로 originPrayId를 넘겨줌 + public Integer getSharedCountByOriginPrayId(Long prayId) { + Integer result = queryFactory + .select(pray.count.sum()) + .from(pray) + .where(pray.originPrayId.eq(prayId)) + .groupBy(pray.id) + .fetchOne(); + Integer result_for_owner = queryFactory + .select(pray.count.sum()) + .from(pray) + .where(pray.id.eq(prayId)) + .fetchOne(); + return result != null ? result + result_for_owner : result_for_owner; + } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 97110f8a..e70543b7 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -13,7 +13,6 @@ import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.global.enums.CategoryType; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.exception.model.NotFoundException; @@ -46,11 +45,11 @@ private void checkIsAlreadyPrayed(Pray pray) { } private boolean isSameCategory(Pray pray, Category category) { - return pray.getPrayType().toString().equals(category.getCategoryType().toString()); + return pray.getCategoryType() == category.getCategoryType(); } private boolean isSharedPray(Pray pray) { - return prayService.isSharedPray(pray) || pray.getPrayType() == PrayType.SHARED; + return prayService.isSharedPray(pray) || pray.getCategoryType() == CategoryType.SHARED; } private void checkSharedPrayValidation(PrayUpdateRequestDto prayUpdateRequestDto, @@ -128,7 +127,7 @@ public CategoryResponseDto deleteCategory(Long categoryId) { public List todayPray(Long prayId, String username) { Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); handlePrayedToday(pray); - return getPrayList(username, pray.getPrayType().stringValue()); + return getPrayList(username, pray.getCategoryType().stringValue()); } @@ -136,7 +135,7 @@ private void handlePrayedToday(Pray pray) { checkIsAlreadyPrayed(pray); pray.countUp(); - if (pray.getPrayType() == PrayType.SHARED) { + if (pray.getCategoryType() == CategoryType.SHARED) { Member originMember = memberService.findMemberById(pray.getOriginMemberId()); if (originMember.getSecondNotiAgree()) { notificationLogService.sendNotification(originMember); @@ -197,7 +196,7 @@ private PrayListResponseDto createPrayListResponseDto(Member member, Category ca private PrayResponseDto convertToPrayResponseDto(Pray pray) { // 기도의 타입에 따라 적절한 PrayResponseDto 생성 - if (pray.getPrayType().equals(PrayType.SHARED)) { + if (pray.getCategoryType() == CategoryType.SHARED) { Member originMember = memberService.findMemberById(pray.getOriginMemberId()); return PrayResponseDto.shared(pray, originMember); } else { @@ -211,13 +210,13 @@ public List completePray(Long prayId, String username) { Pray pray = prayService.getPrayByIdAndMemberId(prayId, username); convertPrayToHistory(pray); - return getPrayList(username, pray.getPrayType().stringValue()); + return getPrayList(username, pray.getCategoryType().stringValue()); } @Transactional public List cancelPray(Long prayId, String username) { return getPrayList(username, - prayService.cancelPray(prayId, username).getPrayType().stringValue()); + prayService.cancelPray(prayId, username).getCategoryType().stringValue()); } } diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/ShareFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/ShareFacade.java index f77893ff..4b93f987 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/ShareFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/ShareFacade.java @@ -1,24 +1,23 @@ package com.uspray.uspray.domain.pray.service; +import com.uspray.uspray.domain.category.model.Category; +import com.uspray.uspray.domain.category.repository.CategoryRepository; +import com.uspray.uspray.domain.member.model.Member; +import com.uspray.uspray.domain.member.repository.MemberRepository; import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPrayDeleteRequestDto; import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPrayRequestDto; import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPraySaveRequestDto; import com.uspray.uspray.domain.pray.dto.sharedpray.response.SharedPrayResponseDto; -import com.uspray.uspray.global.enums.CategoryType; -import com.uspray.uspray.global.enums.PrayType; -import com.uspray.uspray.domain.category.model.Category; -import com.uspray.uspray.domain.member.model.Member; -import com.uspray.uspray.global.push.model.NotificationLog; import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.domain.pray.model.SharedPray; +import com.uspray.uspray.domain.pray.repository.PrayRepository; +import com.uspray.uspray.domain.pray.repository.SharedPrayRepository; +import com.uspray.uspray.global.enums.CategoryType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; import com.uspray.uspray.global.exception.model.NotFoundException; -import com.uspray.uspray.domain.category.repository.CategoryRepository; -import com.uspray.uspray.domain.member.repository.MemberRepository; +import com.uspray.uspray.global.push.model.NotificationLog; import com.uspray.uspray.global.push.repository.NotificationLogRepository; -import com.uspray.uspray.domain.pray.repository.PrayRepository; -import com.uspray.uspray.domain.pray.repository.SharedPrayRepository; import com.uspray.uspray.global.push.service.FCMNotificationService; import java.time.LocalDate; import java.util.ArrayList; @@ -34,156 +33,156 @@ @RequiredArgsConstructor public class ShareFacade { - private final SharedPrayRepository sharedPrayRepository; - private final MemberRepository memberRepository; - private final PrayRepository prayRepository; - private final CategoryRepository categoryRepository; - private final NotificationLogRepository notificationLogRepository; - private final FCMNotificationService fcmNotificationService; - - @Transactional(readOnly = true) - public List getSharedPrayList(String username) { - - Member member = memberRepository.getMemberByUserId(username); - List sharedPrayList = sharedPrayRepository.findAllByMemberOrderByCreatedAtDesc( - member); - - List result = new ArrayList<>(); - - for (SharedPray sharedPray : sharedPrayList) { - Pray pray = prayRepository.getPrayByIdIgnoreDelete( - sharedPray.getPray().getId()); - result.add(SharedPrayResponseDto.of(sharedPray, pray)); - } - - return result; - } - - @Transactional - public Long receivedSharedPray(String username, SharedPrayRequestDto sharedPrayRequestDto) { - - Member member = memberRepository.getMemberByUserId(username); - List prayList = prayRepository.findAllByIdIn(sharedPrayRequestDto.getPrayIds()); - long total = 0L; - - if (prayList.size() != sharedPrayRequestDto.getPrayIds().size()) { - throw new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION); - } - for (Pray pray : prayList) { - if (!receiveCheck(member, pray)) { - continue; - } - SharedPray sharedPray = SharedPray.builder() - .member(member) - .pray(pray) - .build(); - sharedPrayRepository.save(sharedPray); - // 기도제목을 보관함에 담으면 원래 기도제목의 isShared를 true로 변경 - pray.setIsShared(); - prayRepository.save(pray); - total++; - } - - if (total == 0L) { - throw new CustomException(ErrorStatus.CANNOT_RECEIVE_SHARED_PRAY_EXCEPTION); - } - return total; - } - - private boolean receiveCheck(Member member, Pray pray) { - if (pray.getMember().equals(member)) { - // 자기 자신의 기도제목은 보관함에 넣을 수 없음 - return false; - } - // 이미 저장된 기도제목의 경우 다시 보관함에 담기지 않도록 처리 - if (prayRepository.existsByMemberAndOriginPrayId(member, pray.getId())) { - return false; - } - // 이미 보관함에 있는 기도제목은 보관함에 넣을 수 없음 - return !sharedPrayRepository.existsByMemberAndPray(member, pray); - } - - @Transactional - public void saveSharedPray(String username, SharedPraySaveRequestDto sharedPraySaveRequestDto) { - - Member member = memberRepository.getMemberByUserId(username); - Category category = categoryRepository.getCategoryById( - sharedPraySaveRequestDto.getCategoryId()); - if (!category.getCategoryType().equals(CategoryType.SHARED)) { - throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); - } - List sharedPrayIds = sharedPraySaveRequestDto.getSharedPrayIds(); - - for (Long id : sharedPrayIds) { - save(member, id, category, sharedPraySaveRequestDto.getDeadline()); - } - } - - private void save(Member member, Long sharedPrayId, Category category, LocalDate deadline) { - - SharedPray sharedPray = sharedPrayRepository.getSharedPrayById(sharedPrayId); - - if (sharedPray.getPray().getDeleted()) { - sharedPrayRepository.deleteById(sharedPrayId); - throw new CustomException(ErrorStatus.PRAY_ALREADY_DELETED_EXCEPTION); - } - Pray pray = Pray.builder() - .member(member) - .content(new String(Base64.getDecoder().decode(sharedPray.getPray().getContent()))) - .deadline(deadline) - .originPrayId(sharedPray.getPray().getId()) - .originMemberId(sharedPray.getPray().getMember().getId()) // 원래 기도제목의 원자자가 되어야 함 - .category(category) - .prayType(PrayType.SHARED) - .startDate(LocalDate.now()) - .build(); - prayRepository.save(pray); - Pray originPray = prayRepository.getPrayById(pray.getOriginPrayId()); - if (originPray.getMember().getThirdNotiAgree()) { - sendNotificationAndSaveLog(originPray, originPray.getMember()); - } - sharedPrayRepository.deleteById(sharedPrayId); - } - - public 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); - } - - @Transactional - public void deleteSharedPray(String username, - SharedPrayDeleteRequestDto sharedPrayDeleteRequestDto) { - - Member member = memberRepository.getMemberByUserId(username); - List sharedPrayIds = sharedPrayDeleteRequestDto.getSharedPrayIds(); - - for (Long id : sharedPrayIds) { - delete(member, id); - } - } - - private void delete(Member member, Long sharedPrayId) { - - SharedPray sharedPray = sharedPrayRepository.getSharedPrayById(sharedPrayId); - - if (!sharedPray.getMember().equals(member)) { - throw new CustomException(ErrorStatus.DELETE_NOT_AUTHORIZED_EXCEPTION); - } - sharedPrayRepository.deleteById(sharedPrayId); - } + private final SharedPrayRepository sharedPrayRepository; + private final MemberRepository memberRepository; + private final PrayRepository prayRepository; + private final CategoryRepository categoryRepository; + private final NotificationLogRepository notificationLogRepository; + private final FCMNotificationService fcmNotificationService; + + @Transactional(readOnly = true) + public List getSharedPrayList(String username) { + + Member member = memberRepository.getMemberByUserId(username); + List sharedPrayList = sharedPrayRepository.findAllByMemberOrderByCreatedAtDesc( + member); + + List result = new ArrayList<>(); + + for (SharedPray sharedPray : sharedPrayList) { + Pray pray = prayRepository.getPrayByIdIgnoreDelete( + sharedPray.getPray().getId()); + result.add(SharedPrayResponseDto.of(sharedPray, pray)); + } + + return result; + } + + @Transactional + public Long receivedSharedPray(String username, SharedPrayRequestDto sharedPrayRequestDto) { + + Member member = memberRepository.getMemberByUserId(username); + List prayList = prayRepository.findAllByIdIn(sharedPrayRequestDto.getPrayIds()); + long total = 0L; + + if (prayList.size() != sharedPrayRequestDto.getPrayIds().size()) { + throw new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION); + } + for (Pray pray : prayList) { + if (!receiveCheck(member, pray)) { + continue; + } + SharedPray sharedPray = SharedPray.builder() + .member(member) + .pray(pray) + .build(); + sharedPrayRepository.save(sharedPray); + // 기도제목을 보관함에 담으면 원래 기도제목의 isShared를 true로 변경 + pray.setIsShared(); + prayRepository.save(pray); + total++; + } + + if (total == 0L) { + throw new CustomException(ErrorStatus.CANNOT_RECEIVE_SHARED_PRAY_EXCEPTION); + } + return total; + } + + private boolean receiveCheck(Member member, Pray pray) { + if (pray.getMember().equals(member)) { + // 자기 자신의 기도제목은 보관함에 넣을 수 없음 + return false; + } + // 이미 저장된 기도제목의 경우 다시 보관함에 담기지 않도록 처리 + if (prayRepository.existsByMemberAndOriginPrayId(member, pray.getId())) { + return false; + } + // 이미 보관함에 있는 기도제목은 보관함에 넣을 수 없음 + return !sharedPrayRepository.existsByMemberAndPray(member, pray); + } + + @Transactional + public void saveSharedPray(String username, SharedPraySaveRequestDto sharedPraySaveRequestDto) { + + Member member = memberRepository.getMemberByUserId(username); + Category category = categoryRepository.getCategoryById( + sharedPraySaveRequestDto.getCategoryId()); + if (!category.getCategoryType().equals(CategoryType.SHARED)) { + throw new CustomException(ErrorStatus.PRAY_CATEGORY_TYPE_MISMATCH); + } + List sharedPrayIds = sharedPraySaveRequestDto.getSharedPrayIds(); + + for (Long id : sharedPrayIds) { + save(member, id, category, sharedPraySaveRequestDto.getDeadline()); + } + } + + private void save(Member member, Long sharedPrayId, Category category, LocalDate deadline) { + + SharedPray sharedPray = sharedPrayRepository.getSharedPrayById(sharedPrayId); + + if (sharedPray.getPray().getDeleted()) { + sharedPrayRepository.deleteById(sharedPrayId); + throw new CustomException(ErrorStatus.PRAY_ALREADY_DELETED_EXCEPTION); + } + Pray pray = Pray.builder() + .member(member) + .content(new String(Base64.getDecoder().decode(sharedPray.getPray().getContent()))) + .deadline(deadline) + .originPrayId(sharedPray.getPray().getId()) + .originMemberId(sharedPray.getPray().getMember().getId()) // 원래 기도제목의 원자자가 되어야 함 + .category(category) + .categoryType(CategoryType.SHARED) + .startDate(LocalDate.now()) + .build(); + prayRepository.save(pray); + Pray originPray = prayRepository.getPrayById(pray.getOriginPrayId()); + if (originPray.getMember().getThirdNotiAgree()) { + sendNotificationAndSaveLog(originPray, originPray.getMember()); + } + sharedPrayRepository.deleteById(sharedPrayId); + } + + public 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); + } + + @Transactional + public void deleteSharedPray(String username, + SharedPrayDeleteRequestDto sharedPrayDeleteRequestDto) { + + Member member = memberRepository.getMemberByUserId(username); + List sharedPrayIds = sharedPrayDeleteRequestDto.getSharedPrayIds(); + + for (Long id : sharedPrayIds) { + delete(member, id); + } + } + + private void delete(Member member, Long sharedPrayId) { + + SharedPray sharedPray = sharedPrayRepository.getSharedPrayById(sharedPrayId); + + if (!sharedPray.getMember().equals(member)) { + throw new CustomException(ErrorStatus.DELETE_NOT_AUTHORIZED_EXCEPTION); + } + sharedPrayRepository.deleteById(sharedPrayId); + } } diff --git a/src/main/java/com/uspray/uspray/global/enums/PrayType.java b/src/main/java/com/uspray/uspray/global/enums/PrayType.java deleted file mode 100644 index 62a578ea..00000000 --- a/src/main/java/com/uspray/uspray/global/enums/PrayType.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.uspray.uspray.global.enums; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor(access = AccessLevel.PRIVATE) -public enum PrayType { - SHARED("공유 기도"), - PERSONAL("개인 기도") - ; - private final String title; - - public String stringValue() { - return this.name(); - } -} From e32c3a7f3f174e380f42a455e9b45dcefb9c24fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=88=98=EC=95=84?= Date: Fri, 22 Nov 2024 14:18:04 +0900 Subject: [PATCH 15/15] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor:=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uspray/domain/pray/service/PrayFacade.java | 13 ++++--------- .../uspray/domain/pray/service/PrayService.java | 8 ++++++++ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java index 71d83c74..7ba3cb33 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayFacade.java @@ -15,7 +15,6 @@ import com.uspray.uspray.global.enums.CategoryType; import com.uspray.uspray.global.exception.ErrorStatus; import com.uspray.uspray.global.exception.model.CustomException; -import com.uspray.uspray.global.exception.model.NotFoundException; import com.uspray.uspray.global.push.service.NotificationLogService; import java.time.LocalDate; import java.util.Collections; @@ -38,11 +37,6 @@ public class PrayFacade { private final MemberService memberService; private final CategoryService categoryService; - private void checkIsAlreadyPrayed(Pray pray) { - if (pray.getLastPrayedAt().equals(LocalDate.now())) { - throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); - } - } private boolean isSameCategory(Pray pray, Category category) { return pray.getCategoryType() == category.getCategoryType(); @@ -70,7 +64,7 @@ public PrayResponseDto createPray(PrayRequestDto prayRequestDto, String username Category category = categoryService.getCategoryByIdAndMemberAndType( prayRequestDto.getCategoryId(), member, CategoryType.PERSONAL); - + return prayService.savePray(prayRequestDto.toEntity(member, category, startDateOrNull)); } @@ -109,7 +103,8 @@ public void moveExpiredPrayersToHistory() { } private void convertPrayToHistory(Pray pray) { - Integer sharedCount = prayService.getSharedCountByIdAndOriginPrayId(pray.getId(), pray.getOriginPrayId()); + Integer sharedCount = prayService.getSharedCountByIdAndOriginPrayId(pray.getId(), + pray.getOriginPrayId()); historyService.createHistory(pray, sharedCount); prayService.deletePray(pray); @@ -135,7 +130,7 @@ public List todayPray(Long prayId, String username) { private void handlePrayedToday(Pray pray) { - checkIsAlreadyPrayed(pray); + prayService.checkIsAlreadyPrayed(pray); pray.countUp(); if (pray.getCategoryType() == CategoryType.SHARED) { diff --git a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java index 86e2436e..fa4b2216 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java +++ b/src/main/java/com/uspray/uspray/domain/pray/service/PrayService.java @@ -5,6 +5,8 @@ import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; import com.uspray.uspray.domain.pray.model.Pray; import com.uspray.uspray.domain.pray.repository.PrayRepository; +import com.uspray.uspray.global.exception.ErrorStatus; +import com.uspray.uspray.global.exception.model.NotFoundException; import java.time.LocalDate; import java.util.List; import javax.transaction.Transactional; @@ -74,4 +76,10 @@ public Pray cancelPray(Long prayId, String username) { public Boolean isSharedPray(Pray pray) { return getSharedPray(pray.getId()) == null; } + + public void checkIsAlreadyPrayed(Pray pray) { + if (pray.getLastPrayedAt().equals(LocalDate.now())) { + throw new NotFoundException(ErrorStatus.ALREADY_PRAYED_TODAY); + } + } }