Skip to content

Commit

Permalink
Merge pull request #68 from ConnectCo/refactor/#67/채팅-기능-및-구조-개선
Browse files Browse the repository at this point in the history
[REFACTOR] 채팅 기능 및 구조 개선
  • Loading branch information
hig1002 authored Feb 3, 2025
2 parents 5f1d463 + f9cba1f commit 2c9f572
Show file tree
Hide file tree
Showing 15 changed files with 77 additions and 67 deletions.
1 change: 0 additions & 1 deletion src/main/java/com/connectCo/config/FireBaseConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

@Slf4j
@Configuration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.connectCo.domain.chat.dto.request.CreateChatRequest;
import com.connectCo.domain.chat.dto.response.ChatResponse;
import com.connectCo.domain.chat.dto.response.ChatRoomSummaryResponse;
import com.connectCo.domain.chat.dto.response.CreateChatResponse;
import com.connectCo.domain.chat.service.ChatRoomService;
import com.connectCo.domain.chat.service.ChatService;
import com.connectCo.global.common.BaseResponse;
Expand All @@ -29,19 +28,19 @@ public class ChatController {
@Operation(summary = "채팅 메세지 보내기 API")
@MessageMapping("/{roomId}")
@SendTo("/topic/{roomId}")
public BaseResponse<CreateChatResponse> createChat(@DestinationVariable String roomId, CreateChatRequest request){
public BaseResponse<ChatResponse> createChat(@DestinationVariable String roomId, CreateChatRequest request){
return BaseResponse.onSuccess(chatService.createChat(request));
}

@Operation(summary = "내 채팅방 목록 조회 API")
@GetMapping("/rooms")
public BaseResponse<List<ChatRoomSummaryResponse>> getChatRoomsByUser(@RequestParam Long memberId) {
public BaseResponse<List<ChatRoomSummaryResponse>> getChatRoomsByMember(@RequestParam Long memberId) {
return BaseResponse.onSuccess(chatRoomService.getChatRoomsByMember(memberId));
}

@Operation(summary = "채팅방 메시지 조회 API")
@GetMapping("/room/{chatRoomId}/chats")
public BaseResponse<List<ChatResponse>> getChatRoomChats(@PathVariable Long chatRoomId) {
return BaseResponse.onSuccess(chatService.getChatsByChatRoom(chatRoomId));
public BaseResponse<List<ChatResponse>> getChatByChatRoom(@PathVariable Long chatRoomId) {
return BaseResponse.onSuccess(chatRoomService.getChatsByChatRoom(chatRoomId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
@Builder
public class ChatResponse {
private Long chatId;
private Long senderId;
private String message;
private LocalDateTime createdAt;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ public class ChatRoomSummaryResponse {
private Long chatRoomId;
private Long otherMemberId;
private String otherMemberName;
private String lastMessage;
//LocalDateTime lastMessageTime;
private String recentMessage;
private LocalDateTime recentMessageTime;
}

This file was deleted.

2 changes: 2 additions & 0 deletions src/main/java/com/connectCo/domain/chat/entity/Chat.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,7 @@ public class Chat extends BaseEntity {
@JoinColumn
private ChatRoom chatRoom;

private Long senderId;

private String message;
}
17 changes: 17 additions & 0 deletions src/main/java/com/connectCo/domain/chat/entity/ChatRoom.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
Expand All @@ -17,11 +21,24 @@ public class ChatRoom extends BaseEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String recentMessage;

private LocalDateTime recentMessageTime;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "sender_id", nullable = false)
private Member sender;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "receiver_id", nullable = false)
private Member receiver;

@OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Chat> chats = new ArrayList<>();

public void updateRecentMessage(String recentMessage, LocalDateTime recentMessageTime) {
this.recentMessage = recentMessage;
this.recentMessageTime = recentMessageTime;
}

}
10 changes: 5 additions & 5 deletions src/main/java/com/connectCo/domain/chat/mapper/ChatMapper.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.connectCo.domain.chat.mapper;

import com.connectCo.domain.Member.entity.Member;
import com.connectCo.domain.chat.dto.request.CreateChatRequest;
import com.connectCo.domain.chat.dto.response.CreateChatResponse;
import com.connectCo.domain.chat.dto.response.ChatResponse;
import com.connectCo.domain.chat.entity.Chat;
import com.connectCo.domain.chat.entity.ChatRoom;
import org.springframework.stereotype.Component;
Expand All @@ -13,14 +12,15 @@ public class ChatMapper {
public Chat toChat(CreateChatRequest request, ChatRoom chatRoom) {
return Chat.builder()
.chatRoom(chatRoom)
.senderId(request.getSenderId())
.message(request.getMessage())
.build();
}

public CreateChatResponse toCreateChatResponse(Chat chat) {
return CreateChatResponse.builder()
public ChatResponse toChatResponse(Chat chat) {
return ChatResponse.builder()
.chatId(chat.getId())
.chatRoomId(chat.getChatRoom().getId())
.senderId(chat.getSenderId())
.message(chat.getMessage())
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public ChatRoomSummaryResponse toChatRoomSummaryResponse(ChatRoom chatRoom, Long
.otherMemberName(chatRoom.getSender().getId().equals(loginMemberId)
? chatRoom.getReceiver().getName()
: chatRoom.getSender().getName())
.lastMessage("최근 메시지 구현 필요")//Todo 최근 메시지 반환 추가
.recentMessage(chatRoom.getRecentMessage())
.recentMessageTime(chatRoom.getRecentMessageTime())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,7 @@
package com.connectCo.domain.chat.repository;

import com.connectCo.domain.chat.dto.response.ChatResponse;
import com.connectCo.domain.chat.entity.Chat;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface ChatRepository extends JpaRepository<Chat, Long> {

@Query("""
SELECT c
FROM Chat c
WHERE c.chatRoom.id = :chatRoomId
ORDER BY c.createdAt ASC
""")
List<ChatResponse> findChatsByChatRoomId(@Param("chatRoomId") Long chatRoomId);
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.connectCo.domain.chat.service;

import com.connectCo.domain.chat.dto.response.ChatResponse;
import com.connectCo.domain.chat.dto.response.ChatRoomSummaryResponse;
import com.connectCo.domain.chat.entity.ChatRoom;

import java.util.List;

public interface ChatRoomService {
ChatRoom createChatRoom(Long senderId, Long receiverId);
//Todo 토큰 기반으로 변경

List<ChatRoomSummaryResponse> getChatRoomsByMember(Long memberId);

List<ChatResponse> getChatsByChatRoom(Long chatRoomId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@

import com.connectCo.domain.Member.entity.Member;
import com.connectCo.domain.Member.repository.MemberRepository;
import com.connectCo.domain.chat.dto.response.ChatResponse;
import com.connectCo.domain.chat.dto.response.ChatRoomSummaryResponse;
import com.connectCo.domain.chat.entity.Chat;
import com.connectCo.domain.chat.entity.ChatRoom;
import com.connectCo.domain.chat.mapper.ChatMapper;
import com.connectCo.domain.chat.mapper.ChatRoomMapper;
import com.connectCo.domain.chat.repository.ChatRoomRepository;
import com.connectCo.global.exception.CustomApiException;
import com.connectCo.global.exception.ErrorCode;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand All @@ -21,7 +25,8 @@ public class ChatRoomServiceImpl implements ChatRoomService {
private final ChatRoomRepository chatRoomRepository;
private final ChatRoomMapper chatRoomMapper;
private final MemberRepository memberRepository;

private final ChatMapper chatMapper;

/*
* 채팅방 생성
*/
Expand All @@ -44,5 +49,14 @@ public List<ChatRoomSummaryResponse> getChatRoomsByMember(Long memberId){
.toList();
}


@Override
@Transactional
public List<ChatResponse> getChatsByChatRoom(Long chatRoomId) {
ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId)
.orElseThrow(() -> new CustomApiException(ErrorCode.CHATROOM_NOT_FOUND));

return chatRoom.getChats().stream()
.map(chatMapper::toChatResponse)
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@

import com.connectCo.domain.chat.dto.request.CreateChatRequest;
import com.connectCo.domain.chat.dto.response.ChatResponse;
import com.connectCo.domain.chat.dto.response.CreateChatResponse;

import java.util.List;

public interface ChatService {
CreateChatResponse createChat(CreateChatRequest request);
List<ChatResponse> getChatsByChatRoom(Long chatRoomId);
ChatResponse createChat(CreateChatRequest request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,11 @@

import com.connectCo.domain.Member.entity.Member;
import com.connectCo.domain.Member.repository.MemberRepository;
import com.connectCo.domain.Member.service.MemberService;
import com.connectCo.domain.chat.dto.request.CreateChatRequest;
import com.connectCo.domain.chat.dto.response.ChatResponse;
import com.connectCo.domain.chat.dto.response.CreateChatResponse;
import com.connectCo.domain.chat.entity.Chat;
import com.connectCo.domain.chat.entity.ChatRoom;
import com.connectCo.domain.chat.mapper.ChatMapper;
import com.connectCo.domain.chat.mapper.ChatRoomMapper;
import com.connectCo.domain.chat.repository.ChatRepository;
import com.connectCo.domain.chat.repository.ChatRoomRepository;
import com.connectCo.domain.fcm.service.FcmService;
Expand All @@ -19,8 +16,6 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class ChatServiceImpl implements ChatService {
Expand All @@ -30,27 +25,36 @@ public class ChatServiceImpl implements ChatService {
private final ChatMapper chatMapper;
private final ChatRoomRepository chatRoomRepository;
private final MemberRepository memberRepository;
private final MemberService memberService;
private final FcmService fcmService;

@Override
@Transactional
public CreateChatResponse createChat(CreateChatRequest request) {
ChatRoom chatRoom = chatRoomRepository.findById(request.getChatRoomId())
.orElseGet(()->chatRoomService.createChatRoom(request.getSenderId(), request.getReceiverId()));
public ChatResponse createChat(CreateChatRequest request) {
ChatRoom chatRoom = findOrCreateChatRoom(request);
Chat chat = saveChat(request, chatRoom);
updateChatRoomRecentMessage(chatRoom, chat);
sendPushNotificationToReceiver(request);

Chat chat = chatMapper.toChat(request, chatRoom);
chatRepository.save(chat);
return chatMapper.toChatResponse(chat);
}

Member member = memberRepository.findById(request.getReceiverId()).orElseThrow(()->new CustomApiException(ErrorCode.USER_NOT_FOUND));
private ChatRoom findOrCreateChatRoom(CreateChatRequest request) {
return chatRoomRepository.findById(request.getChatRoomId())
.orElseGet(() -> chatRoomService.createChatRoom(request.getSenderId(), request.getReceiverId()));
}

fcmService.sendPushNotification(member.getFcmToken(), "새로운 메시지", request.getMessage());
private Chat saveChat(CreateChatRequest request, ChatRoom chatRoom) {
Chat chat = chatMapper.toChat(request, chatRoom);
return chatRepository.save(chat);
}

return chatMapper.toCreateChatResponse(chat);
private void updateChatRoomRecentMessage(ChatRoom chatRoom, Chat chat) {
chatRoom.updateRecentMessage(chat.getMessage(), chat.getCreatedAt());
chatRoomRepository.save(chatRoom);
}

@Override
public List<ChatResponse> getChatsByChatRoom(Long chatRoomId){
return chatRepository.findChatsByChatRoomId(chatRoomId);
private void sendPushNotificationToReceiver(CreateChatRequest request) {
Member member = memberRepository.findById(request.getReceiverId()).orElseThrow(()->new CustomApiException(ErrorCode.USER_NOT_FOUND));
fcmService.sendPushNotification(member.getFcmToken(), "새로운 메시지", request.getMessage());
}
}
3 changes: 3 additions & 0 deletions src/main/java/com/connectCo/global/exception/ErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ public enum ErrorCode {
//Coupon
COUPON_NOT_FOUND(HttpStatus.NOT_FOUND,"COUPON401","해당 쿠폰을 찾을 수 없습니다."),

//Chat
CHATROOM_NOT_FOUND(HttpStatus.NOT_FOUND,"CHATROOM401","해당 채팅방을 찾을 수 없습니다."),

//firebase
FIREBASE_INIT_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "FIREBASE500", "Firebase 초기화에 실패했습니다."),
FIREBASE_PUSH_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "FIREBASE501", "Firebase 알림 푸쉬에 실패했습니다.");
Expand Down

0 comments on commit 2c9f572

Please sign in to comment.