Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fix/104] 채팅 전송 시각을 KST String으로 리턴하도록 변경 #107

Merged
merged 2 commits into from
Aug 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ jobs:
sudo docker pull rimi3226/gamegoo:${{ github.sha }}
sudo docker stop gamegoo_api
sudo docker rm gamegoo_api
sudo docker run -it -d -p 8080:8080 --name gamegoo_api rimi3226/gamegoo:${{ github.sha }}
sudo docker run -it -d -p 8080:8080 --name gamegoo_api \
-e JAVA_OPTS="-Duser.timezone=Asia/Seoul" \
rimi3226/gamegoo:${{ github.sha }}

# REMOVE Github IP FROM security group (12)
- name: Remove IP FROM security group
Expand Down
10 changes: 3 additions & 7 deletions src/main/java/com/gamegoo/converter/ChatConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.gamegoo.domain.chat.Chat;
import com.gamegoo.domain.chat.Chatroom;
import com.gamegoo.dto.chat.ChatResponse;
import java.time.format.DateTimeFormatter;
import com.gamegoo.util.DatetimeUtil;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.data.domain.Slice;
Expand All @@ -21,15 +21,13 @@ public static ChatResponse.ChatroomCreateResultDTO toChatroomCreateResultDTO(Cha
}

public static ChatResponse.ChatCreateResultDTO toChatCreateResultDTO(Chat chat) {
// ISO 8601 형식의 문자열로 변환
String createdAtIoString = chat.getCreatedAt().format(DateTimeFormatter.ISO_DATE_TIME);

return ChatResponse.ChatCreateResultDTO.builder()
.senderId(chat.getFromMember().getId())
.senderProfileImg(chat.getFromMember().getProfileImage())
.senderName(chat.getFromMember().getGameName())
.message(chat.getContents())
.createdAt(createdAtIoString)
.createdAt(DatetimeUtil.toKSTString(chat.getCreatedAt()))
.timestamp(chat.getTimestamp())
.build();
}
Expand All @@ -48,15 +46,13 @@ public static ChatResponse.ChatMessageListDTO toChatMessageListDTO(Slice<Chat> c
}

public static ChatResponse.ChatMessageDTO toChatMessageDto(Chat chat) {
// ISO 8601 형식의 문자열로 변환
String createdAtIoString = chat.getCreatedAt().format(DateTimeFormatter.ISO_DATE_TIME);

return ChatResponse.ChatMessageDTO.builder()
.senderId(chat.getFromMember().getId())
.senderName(chat.getFromMember().getGameName())
.senderProfileImg(chat.getFromMember().getProfileImage())
.message(chat.getContents())
.createdAt(createdAtIoString)
.createdAt(DatetimeUtil.toKSTString(chat.getCreatedAt()))
.timestamp(chat.getTimestamp())
.build();

Expand Down
62 changes: 5 additions & 57 deletions src/main/java/com/gamegoo/service/chat/ChatCommandService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.gamegoo.apiPayload.code.status.ErrorStatus;
import com.gamegoo.apiPayload.exception.handler.ChatHandler;
import com.gamegoo.converter.ChatConverter;
import com.gamegoo.domain.Member;
import com.gamegoo.domain.chat.Chat;
import com.gamegoo.domain.chat.Chatroom;
Expand All @@ -15,11 +16,8 @@
import com.gamegoo.repository.member.MemberRepository;
import com.gamegoo.service.member.ProfileService;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -69,31 +67,9 @@ public ChatResponse.ChatroomEnterDTO startChatroom(ChatRequest.ChatroomStartRequ
// 해당 채팅방의 lastViewDate 업데이트
memberChatroom.updateLastViewDate(LocalDateTime.now());

// chatMessageDtoList 생성
List<ChatResponse.ChatMessageDTO> chatMessageDtoList = recentChats.stream()
.map(chat -> {
// ISO 8601 형식의 문자열로 변환
String createdAtIoString = chat.getCreatedAt()
.format(DateTimeFormatter.ISO_DATE_TIME);

return ChatResponse.ChatMessageDTO.builder()
.senderId(chat.getFromMember().getId())
.senderName(chat.getFromMember().getGameName())
.senderProfileImg(chat.getFromMember().getProfileImage())
.message(chat.getContents())
.createdAt(createdAtIoString)
.timestamp(chat.getTimestamp())
.build();
}).collect(Collectors.toList());

// ChatMessageListDTO 생성
ChatResponse.ChatMessageListDTO chatMessageListDTO = ChatResponse.ChatMessageListDTO.builder()
.chatMessageDtoList(chatMessageDtoList)
.list_size(chatMessageDtoList.size())
.has_next(recentChats.hasNext())
.next_cursor(recentChats.hasNext() ? recentChats.getContent().get(0).getTimestamp()
: null) // next cursor를 현재 chat list의 가장 오래된 chat의 timestamp로 주기
.build();
ChatResponse.ChatMessageListDTO chatMessageListDTO = ChatConverter.toChatMessageListDTO(
recentChats);

return ChatroomEnterDTO.builder()
.uuid(chatroom.get().getUuid())
Expand Down Expand Up @@ -264,31 +240,9 @@ public ChatResponse.ChatroomEnterDTO enterChatroom(String chatroomUuid, Long mem
// 해당 채팅방의 lastViewDate 업데이트
memberChatroom.updateLastViewDate(LocalDateTime.now());

// chatMessageDtoList 생성
List<ChatResponse.ChatMessageDTO> chatMessageDtoList = recentChats.stream()
.map(chat -> {
// ISO 8601 형식의 문자열로 변환
String createdAtIoString = chat.getCreatedAt()
.format(DateTimeFormatter.ISO_DATE_TIME);

return ChatResponse.ChatMessageDTO.builder()
.senderId(chat.getFromMember().getId())
.senderName(chat.getFromMember().getGameName())
.senderProfileImg(chat.getFromMember().getProfileImage())
.message(chat.getContents())
.createdAt(createdAtIoString)
.timestamp(chat.getTimestamp())
.build();
}).collect(Collectors.toList());

// ChatMessageListDTO 생성
ChatResponse.ChatMessageListDTO chatMessageListDTO = ChatResponse.ChatMessageListDTO.builder()
.chatMessageDtoList(chatMessageDtoList)
.list_size(chatMessageDtoList.size())
.has_next(recentChats.hasNext())
.next_cursor(recentChats.hasNext() ? recentChats.getContent().get(0).getTimestamp()
: null) // next cursor를 현재 chat list의 가장 오래된 chat의 timestamp로 주기
.build();
ChatResponse.ChatMessageListDTO chatMessageListDTO = ChatConverter.toChatMessageListDTO(
recentChats);

return ChatroomEnterDTO.builder()
.uuid(chatroomUuid)
Expand Down Expand Up @@ -319,11 +273,6 @@ public Chat addChat(ChatRequest.ChatCreateRequest request, String chatroomUuid,
memberId, chatroom.getId())
.orElseThrow(() -> new ChatHandler(ErrorStatus.CHATROOM_ACCESS_DENIED));

// // 해당 회원이 이미 나간 채팅방인지 검증
// if (memberChatroom.getLastJoinDate() == null) {
// throw new ChatHandler(ErrorStatus.CHATROOM_ACCESS_DENIED);
// }

// chat 엔티티 생성
Chat chat = Chat.builder()
.contents(request.getMessage())
Expand All @@ -334,7 +283,6 @@ public Chat addChat(ChatRequest.ChatCreateRequest request, String chatroomUuid,
// MemberChatroom의 lastViewDate 업데이트
Chat savedChat = chatRepository.save(chat);
updateLastViewDateByAddChat(memberChatroom, savedChat.getCreatedAt());
//memberChatroom.updateLastViewDate(savedChat.getCreatedAt());

return savedChat;
}
Expand Down
16 changes: 4 additions & 12 deletions src/main/java/com/gamegoo/service/chat/ChatQueryService.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import com.gamegoo.repository.chat.ChatroomRepository;
import com.gamegoo.repository.chat.MemberChatroomRepository;
import com.gamegoo.service.member.ProfileService;
import java.time.format.DateTimeFormatter;
import com.gamegoo.util.DatetimeUtil;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -72,23 +72,15 @@ public List<ChatResponse.ChatroomViewDTO> getChatroomList(Long memberId) {
Integer unReadCnt = chatRepository.countUnreadChats(
chatroom.getId(), memberChatroom.getId());

String lastAtIoString = null;
// ISO 8601 형식의 문자열로 변환
if (lastChat.isPresent()) {
lastAtIoString = lastChat.get().getCreatedAt()
.format(DateTimeFormatter.ISO_DATE_TIME);
} else {
lastAtIoString = memberChatroom.getLastJoinDate()
.format(DateTimeFormatter.ISO_DATE_TIME);
}

return ChatResponse.ChatroomViewDTO.builder()
.chatroomId(chatroom.getId())
.uuid(chatroom.getUuid())
.targetMemberImg(targetMember.getProfileImage())
.targetMemberName(targetMember.getGameName())
.lastMsg(lastChat.isPresent() ? lastChat.get().getContents() : null)
.lastMsgAt(lastAtIoString)
.lastMsgAt(lastChat.isPresent() ? DatetimeUtil.toKSTString(
lastChat.get().getCreatedAt())
: DatetimeUtil.toKSTString(memberChatroom.getLastJoinDate()))
.notReadMsgCnt(unReadCnt)
.build();

Expand Down
21 changes: 21 additions & 0 deletions src/main/java/com/gamegoo/util/DatetimeUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.gamegoo.util;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class DatetimeUtil {

/**
* KST 시간대 ISO 8601 형식의 문자열로 변환
*
* @param localDateTime
* @return
*/
public static String toKSTString(LocalDateTime localDateTime) {
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Seoul"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
return zonedDateTime.format(formatter);
}
}
Loading