diff --git a/nect-api/src/main/java/com/nect/api/domain/dm/dto/DmRoomSummaryDto.java b/nect-api/src/main/java/com/nect/api/domain/dm/dto/DmRoomSummaryDto.java index 9a839cb2..5001577a 100644 --- a/nect-api/src/main/java/com/nect/api/domain/dm/dto/DmRoomSummaryDto.java +++ b/nect-api/src/main/java/com/nect/api/domain/dm/dto/DmRoomSummaryDto.java @@ -49,7 +49,7 @@ public static DmRoomSummaryDto fromOtherUser(Long userId, DirectMessage message) .build(); } - public void setImageUrl(String url) { + public void otherUserImageUrl(String url) { this.otherUserImageUrl = url; } diff --git a/nect-api/src/main/java/com/nect/api/domain/dm/service/DmService.java b/nect-api/src/main/java/com/nect/api/domain/dm/service/DmService.java index ff0e48a5..d10bc618 100644 --- a/nect-api/src/main/java/com/nect/api/domain/dm/service/DmService.java +++ b/nect-api/src/main/java/com/nect/api/domain/dm/service/DmService.java @@ -126,7 +126,10 @@ public DmRoomListResponse getRooms(Long userId, Long cursor, int size) { List messages = latest.stream() .map(message -> { DmRoomSummaryDto dto = DmRoomSummaryDto.fromOtherUser(userId, message); - dto.setImageUrl(s3Service.getPresignedGetUrl(message.getSender().getProfileImageName())); + User otherUser = userId.equals(message.getSender().getUserId()) + ? message.getReceiver() + : message.getSender(); + dto.otherUserImageUrl(s3Service.getPresignedGetUrl(otherUser.getProfileImageName())); return dto; }) .toList(); diff --git a/nect-api/src/main/java/com/nect/api/domain/team/chat/converter/ChatConverter.java b/nect-api/src/main/java/com/nect/api/domain/team/chat/converter/ChatConverter.java index 4945af08..1d251b2a 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/chat/converter/ChatConverter.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/chat/converter/ChatConverter.java @@ -5,6 +5,7 @@ import com.nect.api.domain.team.chat.dto.res.ChatNoticeResponseDto; import com.nect.api.domain.team.chat.dto.res.ChatRoomResponseDto; import com.nect.api.domain.team.chat.dto.res.ProjectMemberResponseDto; +import com.nect.api.global.infra.S3Service; import com.nect.core.entity.team.Project; import com.nect.core.entity.team.chat.ChatMessage; import com.nect.core.entity.team.chat.ChatRoom; @@ -12,6 +13,7 @@ import com.nect.core.entity.user.User; import com.nect.core.entity.team.chat.enums.ChatRoomType; import com.nect.core.entity.team.chat.enums.MessageType; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @@ -19,18 +21,19 @@ import java.util.stream.Collectors; @Component +@RequiredArgsConstructor public class ChatConverter { - + private final S3Service s3Service; //ChatMessage -> ChatMessageDto - public static ChatMessageDto toMessageDto(ChatMessage message) { + public ChatMessageDto toMessageDto(ChatMessage message) { return ChatMessageDto.builder() .messageId(message.getId()) .roomId(message.getChatRoom().getId()) .userId(message.getUser().getUserId()) .userName(message.getUser().getName()) - .profileImage(message.getUser().getProfileImageName()) + .profileImage(s3Service.getPresignedGetUrl(message.getUser().getProfileImageName())) .content(message.getContent()) .messageType(message.getMessageType()) .isPinned(message.getIsPinned()) @@ -39,7 +42,7 @@ public static ChatMessageDto toMessageDto(ChatMessage message) { } //DTO -> ChatMessage - public static ChatMessage toMessage(ChatMessageDto dto, User user, ChatRoom chatRoom) { + public ChatMessage toMessage(ChatMessageDto dto, User user, ChatRoom chatRoom) { return ChatMessage.builder() .chatRoom(chatRoom) .user(user) @@ -50,7 +53,7 @@ public static ChatMessage toMessage(ChatMessageDto dto, User user, ChatRoom chat } //텍스트 메시지 생성 - public static ChatMessage toTextMessage(ChatRoom chatRoom, User user, String content) { + public ChatMessage toTextMessage(ChatRoom chatRoom, User user, String content) { return ChatMessage.builder() .chatRoom(chatRoom) .user(user) @@ -62,7 +65,7 @@ public static ChatMessage toTextMessage(ChatRoom chatRoom, User user, String con //ChatRoom 변환 //ChatRoom-> DTO - public static ChatRoomDto toRoomDto(ChatRoom room) { + public ChatRoomDto toRoomDto(ChatRoom room) { ChatRoomDto dto = new ChatRoomDto(); dto.setRoomId(room.getId()); dto.setProjectId(room.getProject() != null ? room.getProject().getId() : null); @@ -72,7 +75,7 @@ public static ChatRoomDto toRoomDto(ChatRoom room) { return dto; } //ChatRoom -> >DTO(멤버포함) - public static ChatRoomDto toRoomDto(ChatRoom room, List members) { + public ChatRoomDto toRoomDto(ChatRoom room, List members) { ChatRoomDto dto = toRoomDto(room); // ChatRoomMember에서 userId 추출 @@ -84,7 +87,7 @@ public static ChatRoomDto toRoomDto(ChatRoom room, List members) { return dto; } - public static ChatRoom toChatRoomEntity(Project project, String roomName, ChatRoomType type) { + public ChatRoom toChatRoomEntity(Project project, String roomName, ChatRoomType type) { ChatRoom chatRoom = new ChatRoom(); chatRoom.setProject(project); chatRoom.setName(roomName); @@ -92,7 +95,7 @@ public static ChatRoom toChatRoomEntity(Project project, String roomName, ChatRo return chatRoom; } - public static ChatRoomUser toChatRoomMemberEntity(ChatRoom chatRoom, User user, LocalDateTime lastReadAt) { + public ChatRoomUser toChatRoomMemberEntity(ChatRoom chatRoom, User user, LocalDateTime lastReadAt) { ChatRoomUser member = new ChatRoomUser(); member.setChatRoom(chatRoom); member.setUser(user); @@ -103,7 +106,7 @@ public static ChatRoomUser toChatRoomMemberEntity(ChatRoom chatRoom, User user, return member; } - public static ChatRoomResponseDto toResponseDTO(ChatRoom chatRoom, List profileImages) { + public ChatRoomResponseDto toResponseDTO(ChatRoom chatRoom, List profileImages) { return ChatRoomResponseDto.builder() .roomId(chatRoom.getId()) .projectId(chatRoom.getProject() != null ? chatRoom.getProject().getId() : null) @@ -114,22 +117,22 @@ public static ChatRoomResponseDto toResponseDTO(ChatRoom chatRoom, List .build(); } - public static ProjectMemberResponseDto toProjectMemberResponseDTO(User user) { + public ProjectMemberResponseDto toProjectMemberResponseDTO(User user) { return ProjectMemberResponseDto.builder() .userId(user.getUserId()) .username(user.getNickname()) .build(); } - public static List toProjectMemberResponseDTOList(List users) { + public List toProjectMemberResponseDTOList(List users) { return users.stream() - .map(ChatConverter::toProjectMemberResponseDTO) + .map(this::toProjectMemberResponseDTO) .collect(Collectors.toList()); } //ChatMessage -> ChatNoticeResponseDTO - public static ChatNoticeResponseDto toNoticeResponseDTO(ChatMessage message) { + public ChatNoticeResponseDto toNoticeResponseDTO(ChatMessage message) { return ChatNoticeResponseDto.builder() .messageId(message.getId()) .roomId(message.getChatRoom().getId()) @@ -143,7 +146,7 @@ public static ChatNoticeResponseDto toNoticeResponseDTO(ChatMessage message) { } - public static List toChatRoomUserList(ChatRoom chatRoom, List users) { + public List toChatRoomUserList(ChatRoom chatRoom, List users) { return users.stream() .map(user -> { ChatRoomUser chatRoomUser = new ChatRoomUser(); diff --git a/nect-api/src/main/java/com/nect/api/domain/team/chat/converter/FileConverter.java b/nect-api/src/main/java/com/nect/api/domain/team/chat/converter/FileConverter.java index caaff24b..67eb392d 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/chat/converter/FileConverter.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/chat/converter/FileConverter.java @@ -11,16 +11,21 @@ import com.nect.core.entity.team.chat.enums.MessageType; import com.nect.core.entity.user.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + import java.util.List; import java.util.stream.Collectors; -import static com.nect.api.domain.team.chat.converter.ChatConverter.toMessageDto; - +@Component +@RequiredArgsConstructor public class FileConverter { + private final ChatConverter chatConverter; + // ChatFile Entity -> ChatFileUploadResponseDTO - public static ChatFileUploadResponseDto toFileUploadResponseDTO(ChatFile chatFile) { + public ChatFileUploadResponseDto toFileUploadResponseDTO(ChatFile chatFile) { return new ChatFileUploadResponseDto( chatFile.getId(), chatFile.getOriginalFileName(), @@ -31,16 +36,16 @@ public static ChatFileUploadResponseDto toFileUploadResponseDTO(ChatFile chatFil } - public static ChatMessageDto toFileMessageDto(ChatMessage message, ChatFile chatFile) { + public ChatMessageDto toFileMessageDto(ChatMessage message, ChatFile chatFile) { // 기본 메시지 정보 변환 - ChatMessageDto dto = toMessageDto(message); + ChatMessageDto dto = chatConverter.toMessageDto(message); // 파일 정보 추가 - dto.setFileInfo(FileConverter.toFileUploadResponseDTO(chatFile)); + dto.setFileInfo(toFileUploadResponseDTO(chatFile)); return dto; } //파일 메시지 엔티티 생성 - public static ChatMessage toFileMessage(ChatRoom chatRoom, User user) { + public ChatMessage toFileMessage(ChatRoom chatRoom, User user) { return ChatMessage.builder() .chatRoom(chatRoom) .user(user) @@ -51,7 +56,7 @@ public static ChatMessage toFileMessage(ChatRoom chatRoom, User user) { } // ChatFile 엔티티 생성 - public static ChatFile toFileEntity( + public ChatFile toFileEntity( String originalFileName, String storedFileName, String fileUrl, @@ -70,7 +75,7 @@ public static ChatFile toFileEntity( } // 사진첩 조회를 위한 단건 DTO 변환 - public static ChatFileResponseDto toFileResponseDto(ChatFile chatFile) { + public ChatFileResponseDto toFileResponseDto(ChatFile chatFile) { return new ChatFileResponseDto( chatFile.getId(), chatFile.getOriginalFileName(), @@ -80,13 +85,13 @@ public static ChatFileResponseDto toFileResponseDto(ChatFile chatFile) { } // 파일 조회를 위한 리스트 DTO 변환 (스트림 로직 이동) - public static List toFileResponseDtoList(List chatFiles) { + public List toFileResponseDtoList(List chatFiles) { return chatFiles.stream() - .map(FileConverter::toFileResponseDto) + .map(this::toFileResponseDto) .collect(Collectors.toList()); } - public static ChatRoomAlbumResponseDto toChatRoomAlbumDto( + public ChatRoomAlbumResponseDto toChatRoomAlbumDto( ChatRoom room, List files, int totalFileCount) { @@ -99,7 +104,7 @@ public static ChatRoomAlbumResponseDto toChatRoomAlbumDto( toFileResponseDtoList(files) ); } - public static ChatRoomAlbumDetailDto toChatRoomAlbumDetailDto( + public ChatRoomAlbumDetailDto toChatRoomAlbumDetailDto( ChatRoom room, List files, int totalCount, diff --git a/nect-api/src/main/java/com/nect/api/domain/team/chat/service/ChatFileService.java b/nect-api/src/main/java/com/nect/api/domain/team/chat/service/ChatFileService.java index 45b12195..dfb44d0d 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/chat/service/ChatFileService.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/chat/service/ChatFileService.java @@ -61,6 +61,7 @@ public class ChatFileService { private final ProjectUserRepository projectUserRepository; private final ProjectRepository projectRepository; private final SharedDocumentRepository sharedDocumentRepository; + private final FileConverter fileConverter; private String uploadDir; @@ -81,10 +82,10 @@ public ChatMessageDto uploadAndSendFile(Long roomId, MultipartFile file, Long us String storedFileName = s3Service.uploadFile(file); String fileUrl = getSafePresignedUrl(storedFileName); - ChatMessage message = FileConverter.toFileMessage(chatRoom, user); + ChatMessage message = fileConverter.toFileMessage(chatRoom, user); chatMessageRepository.save(message); - ChatFile chatFile = FileConverter.toFileEntity( + ChatFile chatFile = fileConverter.toFileEntity( file.getOriginalFilename(), storedFileName, fileUrl, @@ -99,7 +100,7 @@ public ChatMessageDto uploadAndSendFile(Long roomId, MultipartFile file, Long us chatRoomUser.setLastReadAt(LocalDateTime.now()); // 7. DTO 변환 - ChatMessageDto messageDto = FileConverter.toFileMessageDto(message, chatFile); + ChatMessageDto messageDto = fileConverter.toFileMessageDto(message, chatFile); int totalMembers = chatRoomUserRepository.countByChatRoomId(roomId); messageDto.setReadCount(totalMembers - 1); @@ -152,7 +153,7 @@ public List getChatAlbum(Long projectId, int limitPerR List filesWithRefreshedUrls = refreshPresignedUrls(chatFiles); - return FileConverter.toChatRoomAlbumDto( + return fileConverter.toChatRoomAlbumDto( room, filesWithRefreshedUrls, totalFileCount); @@ -187,7 +188,7 @@ public ChatRoomAlbumDetailDto getChatRoomAlbumDetail(Long roomId, int page, int int totalPages = (int) Math.ceil((double) totalCount / size); boolean hasNext = page < totalPages - 1; - return FileConverter.toChatRoomAlbumDetailDto( + return fileConverter.toChatRoomAlbumDetailDto( chatRoom, filesWithRefreshedUrls, totalCount, diff --git a/nect-api/src/main/java/com/nect/api/domain/team/chat/service/ChatService.java b/nect-api/src/main/java/com/nect/api/domain/team/chat/service/ChatService.java index a41b7097..732104ab 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/chat/service/ChatService.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/chat/service/ChatService.java @@ -47,6 +47,8 @@ public class ChatService { private final RedisPublisher redisPublisher; private final UserRepository userRepository; private final ChatFileRepository chatFileRepository; + private final ChatConverter chatConverter; + private final FileConverter fileConverter; @Transactional public ChatMessageDto sendMessage(Long roomId, Long userId, String content) { @@ -58,7 +60,7 @@ public ChatMessageDto sendMessage(Long roomId, Long userId, String content) { .orElseThrow(() -> new ChatException(ChatErrorCode.CHAT_MEMBER_NOT_FOUND)); // 메시지 생성 및 저장 - ChatMessage message = ChatConverter.toTextMessage(chatRoom, user, content); + ChatMessage message = chatConverter.toTextMessage(chatRoom, user, content); chatMessageRepository.save(message); // 발신자의 lastReadMessageId 업데이트 (본인은 이미 읽음) @@ -70,7 +72,7 @@ public ChatMessageDto sendMessage(Long roomId, Long userId, String content) { senderRoomUser.setLastReadAt(LocalDateTime.now()); // DTO 변환 - ChatMessageDto messageDto = ChatConverter.toMessageDto(message); + ChatMessageDto messageDto = chatConverter.toMessageDto(message); //Redis 발행 String channel = "chatroom:" + roomId; @@ -140,12 +142,12 @@ public ChatRoomMessagesResponseDto getChatMessages(Long roomId, Long userId,Long Optional fileOpt = chatFileRepository .findByChatMessageId(message.getId()); if (fileOpt.isPresent()) { - dto = FileConverter.toFileMessageDto(message, fileOpt.get()); + dto = fileConverter.toFileMessageDto(message, fileOpt.get()); } else { - dto = ChatConverter.toMessageDto(message); + dto = chatConverter.toMessageDto(message); } } else { - dto = ChatConverter.toMessageDto(message); + dto = chatConverter.toMessageDto(message); } // readCount = 안 읽은 사람 수 @@ -190,7 +192,7 @@ public ChatNoticeResponseDto createNotice(Long messageId, Boolean isPinned,Long message.setIsPinned(isPinned); - return ChatConverter.toNoticeResponseDTO(message); + return chatConverter.toNoticeResponseDTO(message); } @@ -217,7 +219,7 @@ public ChatMessageSearchResponseDto searchMessages( List messageDtos = messagesPage.getContent().stream() - .map(ChatConverter::toMessageDto) + .map(chatConverter::toMessageDto) .collect(Collectors.toList()); diff --git a/nect-api/src/main/java/com/nect/api/domain/team/chat/service/TeamChatService.java b/nect-api/src/main/java/com/nect/api/domain/team/chat/service/TeamChatService.java index f93bb87c..8b465a86 100644 --- a/nect-api/src/main/java/com/nect/api/domain/team/chat/service/TeamChatService.java +++ b/nect-api/src/main/java/com/nect/api/domain/team/chat/service/TeamChatService.java @@ -43,10 +43,11 @@ public class TeamChatService { private final ProjectRepository projectRepository; private final ChatService chatService; private final S3Service s3Service; + private final ChatConverter chatConverter; public List getProjectMembers(Long projectId) { List members = projectUserRepository.findAllUsersByProjectId(projectId); - return ChatConverter.toProjectMemberResponseDTOList(members); + return chatConverter.toProjectMemberResponseDTOList(members); } // 팀 채팅방 생성 @@ -95,7 +96,7 @@ public ChatRoomResponseDto createGroupChatRoom(Long currentUserId, GroupChatRoom } - ChatRoom chatRoom = ChatConverter.toChatRoomEntity( + ChatRoom chatRoom = chatConverter.toChatRoomEntity( project, request.getRoomName(), ChatRoomType.GROUP @@ -103,10 +104,10 @@ public ChatRoomResponseDto createGroupChatRoom(Long currentUserId, GroupChatRoom chatRoomRepository.save(chatRoom); List members = new ArrayList<>(); - members.add(ChatConverter.toChatRoomMemberEntity(chatRoom, me, LocalDateTime.now())); + members.add(chatConverter.toChatRoomMemberEntity(chatRoom, me, LocalDateTime.now())); for (User user : targetUsers) { - members.add(ChatConverter.toChatRoomMemberEntity(chatRoom, user, null)); + members.add(chatConverter.toChatRoomMemberEntity(chatRoom, user, null)); } chatRoomUserRepository.saveAll(members); @@ -119,7 +120,7 @@ public ChatRoomResponseDto createGroupChatRoom(Long currentUserId, GroupChatRoom .limit(4) .collect(Collectors.toList()); - return ChatConverter.toResponseDTO(chatRoom, profileImages); + return chatConverter.toResponseDTO(chatRoom, profileImages); } @@ -171,7 +172,7 @@ public ChatRoomInviteResponseDto inviteMembers( List newMembers = userRepository.findAllByUserIdIn(newMemberIds); List chatRoomUsers = newMembers.stream() - .map(user -> ChatConverter.toChatRoomMemberEntity(chatRoom, user, null)) + .map(user -> chatConverter.toChatRoomMemberEntity(chatRoom, user, null)) .collect(Collectors.toList()); chatRoomUserRepository.saveAll(chatRoomUsers); @@ -262,4 +263,4 @@ public List getProjectMembers(Long projectId, Long currentUser } -} \ No newline at end of file +}