Skip to content

Commit

Permalink
Feat: 선별 조건 리스트도 함께 응답하도록 댓글 이벤트 당첨자 조회 API 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
yxhwxn committed Aug 18, 2024
1 parent 62e7ecc commit 6f8eebe
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,10 @@ public static class CommentListRequestDTO {
@Builder
public static class WinnerRequestDTO {
private Long eventId;
private int winnerCount;
private int minLength;
private Integer winnerCount;
private Integer minLength;
private String startDate;
private String endDate;

private List<String> keywords;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,19 @@ public static class WinnerResponseDTO {
private List<CommentDetailDTO> winners;
}

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class CommentEventWinnersWithCriteria {
private Integer winnerCount;
private Integer minLength;
private String startDate;
private String endDate;
private List<String> keywords;
private List<CommentEventWinners> winners;
}

@Getter
@NoArgsConstructor
@AllArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,35 @@ public CommentResponseDTO.WinnerResponseDTO drawWinners(CommentRequestDTO.Winner
Event event = eventRepository.findByIdAndMemberId(request.getEventId(), member.getId())
.orElseThrow(() -> new IllegalArgumentException("Event not found"));

// 당첨자 선별 조건 Event 엔티티에 저장
event.setSelectionCriteria(request);
eventRepository.save(event);

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime startDateTime = LocalDateTime.parse(request.getStartDate(), dateTimeFormatter);
LocalDateTime endDateTime = LocalDateTime.parse(request.getEndDate(), dateTimeFormatter);

List<Comment> comments = commentRepository.findByEventIdAndCommentDateBetween(event.getId(), startDateTime, endDateTime);
LocalDateTime startDateTime = null;
LocalDateTime endDateTime = null;

// 날짜 필터링을 위한 조건 설정
if (request.getStartDate() != null && !request.getStartDate().isEmpty()) {
startDateTime = LocalDateTime.parse(request.getStartDate(), dateTimeFormatter);
}
if (request.getEndDate() != null && !request.getEndDate().isEmpty()) {
endDateTime = LocalDateTime.parse(request.getEndDate(), dateTimeFormatter);
}

List<Comment> comments;

// 날짜 조건이 있을 경우에만 필터링, 없으면 전체 댓글을 조회
if (startDateTime != null && endDateTime != null) {
comments = commentRepository.findByEventIdAndCommentDateBetween(event.getId(), startDateTime, endDateTime);
} else {
comments = commentRepository.findByEventId(event.getId());
}

// 키워드 필터링(OR 로직) 및 minLength 필터링 추가
List<Comment> filteredComments = comments.stream()
.filter(comment -> request.getKeywords().stream().anyMatch(keyword -> comment.getCommentText().contains(keyword)))
.filter(comment -> request.getKeywords().isEmpty() || request.getKeywords().stream().anyMatch(keyword -> comment.getCommentText().contains(keyword)))
.filter(comment -> comment.getCommentText().length() >= request.getMinLength())
.collect(Collectors.toList());

Expand Down Expand Up @@ -109,17 +129,30 @@ public List<CommentResponseDTO.CommentDetailDTO> filterWinnersByKeyword(List<Com
.collect(Collectors.toList());
}

public List<CommentResponseDTO.CommentEventWinners> getCommentEventWinners(Long eventId, String userId) {
public CommentResponseDTO.CommentEventWinnersWithCriteria getCommentEventWinnersWithCriteria(Long eventId, String userId) {
Member member = memberRepository.findByUserIdAndStatusNot(userId, UserStatus.DELETED)
.orElseThrow(() -> new IllegalArgumentException("Member not found"));

Event event = eventRepository.findByIdAndMemberId(eventId, member.getId())
.orElseThrow(() -> new IllegalArgumentException("Event not found or does not belong to the user"));

List<Comment> winners = commentRepository.findByEventIdAndIsWinnerTrue(eventId);

return winners.stream()
List<CommentResponseDTO.CommentEventWinners> winnerList = winners.stream()
.map(CommentConverter::toCommentEventWinners)
.collect(Collectors.toList());

return CommentResponseDTO.CommentEventWinnersWithCriteria.builder()
.winners(winnerList)
.winnerCount(event.getWinnerCount())
.minLength(event.getMinLength())
.startDate(event.getSelectionStartDate() != null ? event.getSelectionStartDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) : null)
.endDate(event.getSelectionEndDate() != null ? event.getSelectionEndDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) : null)
.keywords(event.getKeywords())
.build();
}


public void deleteWinners(Long eventId) {
List<Comment> comments = commentRepository.findByEventIdAndIsWinnerTrue(eventId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,16 @@ public ResponseEntity<ApiResponse<Void>> deleteEvent(@PathVariable("eventId") Lo
}

@GetMapping("/comment-winners")
@Operation(summary = "댓글 이벤트 당첨자 조회 API", description = "댓글 이벤트의 당첨자 리스트를 조회합니다.")
public ResponseEntity<ApiResponse<List<CommentResponseDTO.CommentEventWinners>>> getCommentEventWinners(
@Operation(summary = "댓글 이벤트 당첨자 조회 API", description = "댓글 이벤트의 당첨자 리스트와 선별 조건을 조회합니다.")
public ResponseEntity<ApiResponse<CommentResponseDTO.CommentEventWinnersWithCriteria>> getCommentEventWinners(
@RequestParam("eventId") Long eventId,
@CurrentAccount Account account) {

List<CommentResponseDTO.CommentEventWinners> winners = commentService.getCommentEventWinners(eventId, account.userId());
return ResponseEntity.ok(ApiResponse.of(winners));
CommentResponseDTO.CommentEventWinnersWithCriteria winnersWithCriteria = commentService.getCommentEventWinnersWithCriteria(eventId, account.userId());
return ResponseEntity.ok(ApiResponse.of(winnersWithCriteria));
}


@GetMapping("/survey-winners")
@Operation(summary = "설문 이벤트 당첨자 조회 API", description = "설문 이벤트의 당첨자 리스트 및 선별 조건을 조회합니다.")
public ResponseEntity<ApiResponse<SurveyResponseDTO.SurveyEventWinnersResponse>> getSurveyEventWinners(
Expand Down

0 comments on commit 6f8eebe

Please sign in to comment.