diff --git a/src/main/java/com/whylog/server/domain/decision/service/ApplicationQueryService.java b/src/main/java/com/whylog/server/domain/decision/service/ApplicationQueryService.java index 413497d..b7c05a5 100644 --- a/src/main/java/com/whylog/server/domain/decision/service/ApplicationQueryService.java +++ b/src/main/java/com/whylog/server/domain/decision/service/ApplicationQueryService.java @@ -196,7 +196,7 @@ private List toDecisionContextItems( .time(applicationTimeline.getDecisionTimeline().getTimestamp()) .memberId(memberId) .memberName(member != null ? member.getName() : null) - .profileImage(member != null ? member.getProfileImage() : null) + .profileImage(memberUseCase.getProfileImageUrl(member) ) .dialogueContent(applicationTimeline.getDecisionTimeline().getUtterance()) .build(); }) diff --git a/src/main/java/com/whylog/server/domain/meeting/dto/MeetingResponse.java b/src/main/java/com/whylog/server/domain/meeting/dto/MeetingResponse.java index 97e9951..8a78924 100644 --- a/src/main/java/com/whylog/server/domain/meeting/dto/MeetingResponse.java +++ b/src/main/java/com/whylog/server/domain/meeting/dto/MeetingResponse.java @@ -1,17 +1,13 @@ package com.whylog.server.domain.meeting.dto; -import com.whylog.server.domain.meeting.entity.Dialogue; -import com.whylog.server.domain.meeting.entity.Meeting; import com.whylog.server.domain.meeting.entity.MeetingAnalysis; import com.whylog.server.domain.meeting.enums.MeetingStatus; import com.whylog.server.domain.meeting.socket.MeetingParticipant; -import com.whylog.server.domain.user.entity.Member; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.time.Duration; import java.time.LocalDateTime; import java.util.List; @@ -196,15 +192,6 @@ public static class ParticipantDTO { @Schema(description = "참여자 프로필 사진 URL", example = "https://example.com/profile/user-1.jpg") private String profileImage; - public static List create(List members) { - return members.stream().map(member -> ParticipantDTO.builder() - .memberId(member.getId()) - .name(member.getName()) - .profileImage(member.getProfileImage()) - .build() - ).toList(); - } - } @Getter @@ -223,44 +210,6 @@ public static class DialogueDTO { @Schema(description = "말한 시간", example = "00:22") private String timestamp; - public static List create(Meeting meeting, List dialogues) { - LocalDateTime startDateTime = meeting.getStartDateTime(); - - return dialogues.stream().map(dialogue -> DialogueDTO.builder() - .memberId(dialogue.getMember().getId()) - .content(dialogue.getContent()) - .timestamp(formatElapsed(startDateTime, dialogue.getSpeechDateTime())) - .build() - ).toList(); - } - - private static String formatElapsed(LocalDateTime startDateTime, LocalDateTime speechDateTime) { - if (startDateTime == null || speechDateTime == null) { - return null; - } - - Duration elapsed = Duration.between(startDateTime, speechDateTime); - if (elapsed.isNegative()) { - return "00:00"; - } - - long totalSeconds = elapsed.getSeconds(); - long minutes = totalSeconds / 60; - long seconds = totalSeconds % 60; - return String.format("%02d:%02d", minutes, seconds); - } - - } - - public static HistoryListDTO create(Meeting meeting, List dialogues, List participants ) { - - List participantDtoList = ParticipantDTO.create(participants); - List dialogueDtoList = DialogueDTO.create(meeting, dialogues); - return HistoryListDTO.builder() - .participants(participantDtoList) - .dialogues(dialogueDtoList) - .build(); - } } diff --git a/src/main/java/com/whylog/server/domain/meeting/service/MeetingQueryService.java b/src/main/java/com/whylog/server/domain/meeting/service/MeetingQueryService.java index 528460f..12bbd8e 100644 --- a/src/main/java/com/whylog/server/domain/meeting/service/MeetingQueryService.java +++ b/src/main/java/com/whylog/server/domain/meeting/service/MeetingQueryService.java @@ -7,11 +7,14 @@ import com.whylog.server.domain.meeting.entity.MeetingMember; import com.whylog.server.domain.meeting.enums.MeetingStatus; import com.whylog.server.domain.user.entity.Member; +import com.whylog.server.domain.user.service.MemberUseCase; import com.whylog.server.global.apiPayload.exception.ParameterRequiredException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.List; @Service @@ -20,6 +23,7 @@ public class MeetingQueryService { private final MeetingUseCase meetingUseCase; private final MeetingAudioReplayService meetingAudioReplayService; + private final MemberUseCase memberUseCase; // 미팅 목록 조회 @Transactional(readOnly = true) @@ -69,7 +73,7 @@ private List memberToParticipantsInfo(Li .map(member -> MeetingResponse.MeetingParticipantInfo.builder() .memberId(member.getId()) .name(member.getName()) - .profileImage(member.getProfileImage()) + .profileImage(memberUseCase.getProfileImageUrl(member)) .build() ).toList(); } @@ -109,7 +113,50 @@ public MeetingResponse.HistoryListDTO getDialogueHistory(Long meetingId) { .toList(); // dto 생성 및 반환 - return MeetingResponse.HistoryListDTO.create(meeting, dialogues, members); + return createHistoryListDto(meeting, dialogues, members); + } + + private MeetingResponse.HistoryListDTO createHistoryListDto(Meeting meeting, List dialogues, List members) { + return MeetingResponse.HistoryListDTO.builder() + .participants(createParticipantDtos(members)) + .dialogues(createDialogueDtos(meeting, dialogues)) + .build(); + } + + private List createParticipantDtos(List members) { + return members.stream().map(member -> MeetingResponse.HistoryListDTO.ParticipantDTO.builder() + .memberId(member.getId()) + .name(member.getName()) + .profileImage(memberUseCase.getProfileImageUrl(member)) + .build() + ).toList(); + } + + private List createDialogueDtos(Meeting meeting, List dialogues) { + LocalDateTime startDateTime = meeting.getStartDateTime(); + + return dialogues.stream().map(dialogue -> MeetingResponse.HistoryListDTO.DialogueDTO.builder() + .memberId(dialogue.getMember().getId()) + .content(dialogue.getContent()) + .timestamp(formatElapsed(startDateTime, dialogue.getSpeechDateTime())) + .build() + ).toList(); + } + + private String formatElapsed(LocalDateTime startDateTime, LocalDateTime speechDateTime) { + if (startDateTime == null || speechDateTime == null) { + return null; + } + + Duration elapsed = Duration.between(startDateTime, speechDateTime); + if (elapsed.isNegative()) { + return "00:00"; + } + + long totalSeconds = elapsed.getSeconds(); + long minutes = totalSeconds / 60; + long seconds = totalSeconds % 60; + return String.format("%02d:%02d", minutes, seconds); } } diff --git a/src/main/java/com/whylog/server/domain/user/service/MemberUseCase.java b/src/main/java/com/whylog/server/domain/user/service/MemberUseCase.java index 09cbed9..d920e67 100644 --- a/src/main/java/com/whylog/server/domain/user/service/MemberUseCase.java +++ b/src/main/java/com/whylog/server/domain/user/service/MemberUseCase.java @@ -4,6 +4,8 @@ import com.whylog.server.domain.user.exception.MemberNotFoundException; import com.whylog.server.domain.user.repository.MemberRepository; import java.util.List; + +import com.whylog.server.global.external.s3.S3Client; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,6 +14,7 @@ public class MemberUseCase { private final MemberRepository memberRepository; + private final S3Client s3Client; // id로 member 조회 public Member findMemberById(Long id){ @@ -28,4 +31,13 @@ public List findMembersByIds(List memberIds) { return memberRepository.findAllById(memberIds); } + public String getProfileImageUrl(Member member) { + + if(member == null) + return null; + + // s3Client.getFileUrl에서 null 검사 해줘서 바로 리턴해줘도 됨 + return s3Client.getFileUrl(member.getProfileImage()); + } + }