messageRoom 테이블에는 없으나, emoticon
필드값을 프론트 쪽에서 받길 원한다.
@Getter
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MessageResponseDto {
private Long id;
private String roomName;
private String sender;
private String roomId;
private String receiver;
private Long postId;
private LocalDateTime createdAt;
private String emoticon; // messageRoom 에 저장된 컬럼은 아니지만, 프론트 쪽으로 반환하고 싶은 필드값
// 쪽지방 생성
public MessageResponseDto(MessageRoom messageRoom) {
this.id = messageRoom.getId();
this.roomName = messageRoom.getRoomName();
this.sender = messageRoom.getSender();
this.roomId = messageRoom.getRoomId();
this.receiver = messageRoom.getReceiver();
this.postId = messageRoom.getPost().getId();
}
// 사용자 관련 쪽지방 전체 조회
public MessageResponseDto(Long id, String roomName, String roomId, String sender, String receiver, LocalDateTime createdAt) {
this.id = id;
this.roomName = roomName;
this.roomId = roomId;
this.sender = sender;
this.receiver = receiver;
ZoneId utcZone = ZoneId.of("UTC");
ZoneId koreaZone = ZoneId.of("Asia/Seoul");
ZonedDateTime utcTime = createdAt.atZone(utcZone);
ZonedDateTime koreaTime = utcTime.withZoneSameInstant(koreaZone);
this.createdAt = koreaTime.toLocalDateTime();
}
public MessageResponseDto(String roomId) {
this.roomId = roomId;
}
public void setLatestMessageContent(String message) {
this.message = message;
}
public void setLatestMessageCreatedAt(LocalDateTime createdAt) {
ZoneId utcZone = ZoneId.of("UTC");
ZoneId koreaZone = ZoneId.of("Asia/Seoul");
ZonedDateTime utcTime = createdAt.atZone(utcZone);
ZonedDateTime koreaTime = utcTime.withZoneSameInstant(koreaZone);
this.createdAt = koreaTime.toLocalDateTime();
}
// messageRoom 에 저장된 컬럼은 아니지만, 프론트 쪽으로 반환하고 싶은 필드값
public void setEmoticon(String emoticon) {
this.emoticon = emoticon;
}
}
emoticon 을 어떻게 설정(set)해줄지 정할 수 있다.
@Slf4j
@Service
@RequiredArgsConstructor
public class MessageRoomService {
...
// 사용자 관련 쪽지방 전체 조회
public List<MessageResponseDto> findAllRoomByUser(User user) {
List<MessageRoom> messageRooms = messageRoomRepository.findByUserIdOrReceiverUserId(user.getId(), user.getId());
List<MessageResponseDto> messageRoomDtos = new ArrayList<>();
for (MessageRoom messageRoom : messageRooms) {
// user 가 sender 인 경우
if (user.getNickname().equals(messageRoom.getSender())) {
MessageResponseDto messageRoomDto = new MessageResponseDto(
messageRoom.getId(),
messageRoom.getReceiver(), // roomName
messageRoom.getRoomId(),
messageRoom.getSender(),
messageRoom.getReceiver(),
messageRoom.getCreatedAt());
// messageRoom 에 저장된 컬럼은 아니지만, 프론트 쪽으로 반환하고 싶은 필드값
User receiverUser = userRepository.findByNickname(messageRoom.getReceiver());
messageRoomDto.setEmoticon(receiverUser.getEmoticon());
// 가장 최신 메시지 & 생성 시간 조회
Message latestMessage = messageRepository.findTopByRoomIdOrderByCreatedAtDesc(messageRoom.getRoomId());
if (latestMessage != null) {
messageRoomDto.setLatestMessageCreatedAt(latestMessage.getCreatedAt());
messageRoomDto.setLatestMessageContent(latestMessage.getMessage());
}
messageRoomDtos.add(messageRoomDto);
// user 가 receiver 인 경우
} else {
MessageResponseDto messageRoomDto = new MessageResponseDto(
messageRoom.getId(),
messageRoom.getSender(), // roomName
messageRoom.getRoomId(),
messageRoom.getSender(),
messageRoom.getReceiver(),
messageRoom.getCreatedAt());
// messageRoom 에 저장된 컬럼은 아니지만, 프론트 쪽으로 반환하고 싶은 필드값
User senderUser = userRepository.findByNickname(messageRoom.getSender());
messageRoomDto.setEmoticon(senderUser.getEmoticon());
// 가장 최신 메시지 & 생성 시간 조회
Message latestMessage = messageRepository.findTopByRoomIdOrderByCreatedAtDesc(messageRoom.getRoomId());
if (latestMessage != null) {
messageRoomDto.setLatestMessageCreatedAt(latestMessage.getCreatedAt());
messageRoomDto.setLatestMessageContent(latestMessage.getMessage());
}
messageRoomDtos.add(messageRoomDto);
}
}
return messageRoomDtos;
}
...
}