diff --git a/src/main/java/cc/backend/amateurShow/controller/AmateurController.java b/src/main/java/cc/backend/amateurShow/controller/AmateurController.java index f30b630..1d48ae0 100644 --- a/src/main/java/cc/backend/amateurShow/controller/AmateurController.java +++ b/src/main/java/cc/backend/amateurShow/controller/AmateurController.java @@ -92,6 +92,6 @@ public ApiResponse> getShowClosing( @GetMapping("/incoming") @Operation(summary = "공연 임박인 공연 조회 API") public ApiResponse> getShowIncoming(@AuthenticationPrincipal(expression = "member") Member member) { - return ApiResponse.onSuccess(amateurService.getIncomingShow(member.getId())); + return ApiResponse.onSuccess(amateurService.getRecentlyHotShow(member.getId())); } } \ No newline at end of file diff --git a/src/main/java/cc/backend/amateurShow/converter/AmateurConverter.java b/src/main/java/cc/backend/amateurShow/converter/AmateurConverter.java index 465873c..91e81e3 100644 --- a/src/main/java/cc/backend/amateurShow/converter/AmateurConverter.java +++ b/src/main/java/cc/backend/amateurShow/converter/AmateurConverter.java @@ -55,39 +55,60 @@ public static List toAmateurCastingEntity(List AmateurCasting.builder() - .amateurShow(amateurShow) - .actorName(casting.getActorName()) - .castingName(casting.getCastingName()) - .castingImageUrl(casting.getCastingImageRequestDTO().getImageUrl() != null ? - casting.getCastingImageRequestDTO().getImageUrl() : null) - .castingImageKeyName(casting.getCastingImageRequestDTO().getKeyName() != null ? - casting.getCastingImageRequestDTO().getKeyName() : null) - .build()) - .collect(Collectors.toList()); + return castings.stream() + .map(casting -> { + String imageUrl = null; + String keyName = null; + + if (casting.getCastingImageRequestDTO() != null) { + imageUrl = casting.getCastingImageRequestDTO().getImageUrl(); + keyName = casting.getCastingImageRequestDTO().getKeyName(); + } + + return AmateurCasting.builder() + .amateurShow(amateurShow) + .actorName(casting.getActorName()) + .castingName(casting.getCastingName()) + .castingImageUrl(imageUrl) + .castingImageKeyName(keyName) + .build(); + }) + .toList(); } public static AmateurNotice toAmateurNoticeEntity(AmateurEnrollRequestDTO.Notice notice, AmateurShow amateurShow) { - if (notice.getContent() == null) return null; + if (notice == null || notice.getContent() == null) { + return null; + } + + String imageUrl = null; + if (notice.getNoticeImageRequestDTO() != null) { + imageUrl = notice.getNoticeImageRequestDTO().getImageUrl(); + } return AmateurNotice.builder() .amateurShow(amateurShow) .content(notice.getContent()) - .noticeImageUrl(notice.getNoticeImageRequestDTO().getImageUrl() != null ? - notice.getNoticeImageRequestDTO().getImageUrl() : null) + .noticeImageUrl(imageUrl) .timeInfo(notice.getTimeInfo()) .build(); } // 이건 수정용!! public static AmateurNotice toAmateurNoticeEntity(AmateurUpdateRequestDTO.UpdateNotice notice, AmateurShow amateurShow) { - if (notice.getContent() == null) return null; + if (notice == null || notice.getContent() == null) { + return null; + } + + String imageUrl = null; + if (notice.getNoticeImageRequestDTO() != null) { + imageUrl = notice.getNoticeImageRequestDTO().getImageUrl(); + } return AmateurNotice.builder() .amateurShow(amateurShow) .content(notice.getContent()) - .noticeImageUrl(notice.getNoticeImageRequestDTO().getImageUrl() != null ? - notice.getNoticeImageRequestDTO().getImageUrl() : null) + .noticeImageUrl(imageUrl) .timeInfo(notice.getTimeInfo()) .build(); } @@ -135,12 +156,20 @@ public static List toAmateurRoundEntity(List findByMember_IdAndStatusInOrderByIdDesc( List findByEndGreaterThanEqual(LocalDate today); + @Query(""" + SELECT a + FROM AmateurShow a + WHERE a.end >= :today + ORDER BY a.totalSoldTicket DESC, a.start ASC +""") + List findHotShows( + @Param("today") LocalDate today, + Pageable pageable + ); @Query("select a from AmateurShow a") @EntityGraph(attributePaths = {"amateurRounds", "amateurNotice"}, type = EntityGraph.EntityGraphType.FETCH) diff --git a/src/main/java/cc/backend/amateurShow/service/amateurShowService/AmateurService.java b/src/main/java/cc/backend/amateurShow/service/amateurShowService/AmateurService.java index e551d7d..59a551c 100644 --- a/src/main/java/cc/backend/amateurShow/service/amateurShowService/AmateurService.java +++ b/src/main/java/cc/backend/amateurShow/service/amateurShowService/AmateurService.java @@ -22,7 +22,7 @@ AmateurEnrollResponseDTO.AmateurEnrollResult enrollShow(Long memberId, List getShowToday(Long memberId); Slice getShowOngoing(Long memberId, Pageable pageable); List getShowRanking(Long memberId); - List getIncomingShow(Long memberId); + List getRecentlyHotShow(Long memberId); List getShowClosing(Long memberId); diff --git a/src/main/java/cc/backend/amateurShow/service/amateurShowService/AmateurServiceImpl.java b/src/main/java/cc/backend/amateurShow/service/amateurShowService/AmateurServiceImpl.java index 670049e..38b6ae0 100644 --- a/src/main/java/cc/backend/amateurShow/service/amateurShowService/AmateurServiceImpl.java +++ b/src/main/java/cc/backend/amateurShow/service/amateurShowService/AmateurServiceImpl.java @@ -24,6 +24,7 @@ import cc.backend.memberLike.repository.MemberLikeRepository; import cc.backend.ticket.dto.response.ReserveListResponseDTO; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Slice; @@ -422,12 +423,19 @@ public void deleteShow(Long memberId, Long amateurShowId) { } //캐스팅 삭제 - List amateurCastings = amateurShow.getAmateurCastingList(); - List castingImages = amateurCastings.stream() - .map(casting -> imageRepository.findByFilePathAndContentId(FilePath.casting, casting.getId())) - .filter(Objects::nonNull) + List castingIds = amateurShow.getAmateurCastingList() + .stream() + .map(AmateurCasting::getId) .toList(); - castingImages.forEach(image -> imageService.deleteImage(image.getId(), memberId)); + + if (!castingIds.isEmpty()) { + List castingImages = + imageRepository.findByFilePathAndContentIdIn( + FilePath.casting, castingIds); + + castingImages.forEach(img -> + imageService.deleteImage(img.getId(), memberId)); + } //amateurShow 삭제 amateurShowRepository.delete(amateurShow); @@ -621,32 +629,29 @@ public Slice getMyAmateurShow(Long } @Override - public List getIncomingShow (Long memberId){ + public List getRecentlyHotShow (Long memberId){ memberRepository.findById(memberId).orElseThrow(()-> new GeneralException(ErrorStatus.MEMBER_NOT_AUTHORIZED)); - Collator collator = Collator.getInstance(Locale.KOREAN); //한글 사전식 정렬 - // 종료일이 오늘 이후인 공연만 DB에서 조회 + // 종료되지 않은 공연 중, 판매량 기준 상위 3개 LocalDate today = LocalDate.now(); - List shows = amateurShowRepository.findByEndGreaterThanEqual(today); + List shows = amateurShowRepository.findHotShows(today, PageRequest.of(0, 3)); return shows.stream() - // 시작일 기준 오름차순 → 이름 기준 오름차순(한글 사전식) - .sorted(Comparator - .comparing(AmateurShow::getStart) - .thenComparing(AmateurShow::getName, Comparator.nullsLast(collator))) - .limit(10) - .map(show -> { - String schedule = AmateurConverter.mergeSchedule(show.getStart(), show.getEnd()); - return AmateurShowResponseDTO.AmateurShowList.builder() - .amateurShowId(show.getId()) - .name(show.getName()) - .detailAddress(show.getDetailAddress()) - .schedule(schedule) - .posterImageUrl(show.getPosterImageUrl()) - .build(); - }) - .collect(Collectors.toList()); + .map(show -> AmateurShowResponseDTO.AmateurShowList.builder() + .amateurShowId(show.getId()) + .name(show.getName()) + .detailAddress(show.getDetailAddress()) + .schedule( + AmateurConverter.mergeSchedule( + show.getStart(), + show.getEnd() + ) + ) + .posterImageUrl(show.getPosterImageUrl()) + .build() + ) + .toList(); } diff --git a/src/main/java/cc/backend/image/repository/ImageRepository.java b/src/main/java/cc/backend/image/repository/ImageRepository.java index c79b422..d704269 100644 --- a/src/main/java/cc/backend/image/repository/ImageRepository.java +++ b/src/main/java/cc/backend/image/repository/ImageRepository.java @@ -24,4 +24,9 @@ List findFirstByContentIds( Image findByKeyName(String keyName); Image findByFilePathAndKeyName(FilePath filePath, String keyName); + + List findByFilePathAndContentIdIn( + FilePath filePath, + List contentIds + ); } diff --git a/src/main/java/cc/backend/notice/service/NoticeServiceImpl.java b/src/main/java/cc/backend/notice/service/NoticeServiceImpl.java index a0f8204..4bdbd31 100644 --- a/src/main/java/cc/backend/notice/service/NoticeServiceImpl.java +++ b/src/main/java/cc/backend/notice/service/NoticeServiceImpl.java @@ -101,7 +101,7 @@ public NoticeResponseDTO.NoticeDTO notifyNewComment(CommentEvent event) { memberNoticeRepository.save(MemberNotice.builder() .notice(newNotice) - .member(commentWriter).build()); + .member(boardWriter).build()); return NoticeResponseDTO.NoticeDTO.builder() .id(newNotice.getId())