Skip to content

Commit

Permalink
Merge pull request #136 from DuruDuru-UMC-7th/119-feat-채팅방-목록-조회api
Browse files Browse the repository at this point in the history
채팅방 목록 조회 API 작성 완료
  • Loading branch information
sokft authored Feb 7, 2025
2 parents b29b658 + a366962 commit 6ca4e12
Show file tree
Hide file tree
Showing 7 changed files with 174 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.backend.DuruDuru.global.converter;

import com.backend.DuruDuru.global.domain.entity.Chatting;
import com.backend.DuruDuru.global.domain.entity.ChattingRoom;
import com.backend.DuruDuru.global.domain.entity.Message;
import com.backend.DuruDuru.global.web.dto.Chatting.ChattingResponseDTO;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

public class ChattingConverter {

public static ChattingResponseDTO.ChattingRoomDetailDTO toChattingRoomDetailDTO(ChattingRoom chattingRoom, Long currentMemberId) {
// 거래유형 가져오기
String tradeType = chattingRoom.getTrade().getTradeType().toString();

// 위치정보 가져오기
String location = "";
if (chattingRoom.getTrade().getMember().getTown() != null) {
location = chattingRoom.getTrade().getMember().getTown().getEupmyeondong();
}

// 최신 메시지 찾기
Message lastMessage = null;
for (Chatting chatting : chattingRoom.getChattings()) {
for (Message message : chatting.getMessages()) {
if (lastMessage == null || message.getSentTime().isAfter(lastMessage.getSentTime())) {
lastMessage = message;
}
}
}
String lastMessageContent = lastMessage != null ? lastMessage.getContent() : "";
LocalDateTime lastMessageDate = lastMessage != null ? lastMessage.getSentTime() : null;
LocalDateTime sentTime = lastMessageDate; // 마지막 메시지의 전송시간을 보낸 시간으로 사용

// 읽은 메시지 계산
int unreadCount = 0;
for (Chatting chatting : chattingRoom.getChattings()) {
for (Message message : chatting.getMessages()) {
if (!message.isRead() && !message.getMember().getMemberId().equals(currentMemberId)) {
unreadCount++;
}
}
}

// 마지막 메시지가 존재하면 발신자 닉네임 가져오기
String username = (lastMessage != null)
? lastMessage.getMember().getNickName()
: chattingRoom.getTrade().getMember().getNickName();

return ChattingResponseDTO.ChattingRoomDetailDTO.builder()
.chatRoomId(chattingRoom.getChattingRoomId())
.username(username)
.tradeType(tradeType)
.location(location)
.lastMessage(lastMessageContent)
.lastMessageDate(lastMessageDate)
.unreadCount(unreadCount)
.sentTime(sentTime)
.build();
}

//ChattingRoom엔티티를 ChattingRoomListDTO로 변환
public static ChattingResponseDTO.ChattingRoomListDTO toChattingRoomListDTO(List<ChattingRoom> chattingRooms, Long currentMemberId) {
List<ChattingResponseDTO.ChattingRoomDetailDTO> detailDTOList = chattingRooms.stream()
.map(chattingRoom -> toChattingRoomDetailDTO(chattingRoom, currentMemberId))
.collect(Collectors.toList());

return ChattingResponseDTO.ChattingRoomListDTO.builder()
.chatRooms(detailDTOList)
.count(detailDTOList.size())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.backend.DuruDuru.global.repository;

import com.backend.DuruDuru.global.domain.entity.ChattingRoom;
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 ChattingRepository extends JpaRepository<ChattingRoom, Long> {
@Query("select distinct cr from ChattingRoom cr join cr.chattings c where c.member.memberId = :memberId")
List<ChattingRoom> findChattingRoomsByMemberId(@Param("memberId") Long memberId);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.backend.DuruDuru.global.service.ChattingService;

import com.backend.DuruDuru.global.web.dto.Chatting.ChattingResponseDTO;

public interface ChattingQueryService {
ChattingResponseDTO.ChattingRoomListDTO getChattingRoomList(Long memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.backend.DuruDuru.global.service.ChattingService;

import com.backend.DuruDuru.global.converter.ChattingConverter;
import com.backend.DuruDuru.global.domain.entity.ChattingRoom;
import com.backend.DuruDuru.global.repository.ChattingRepository;
import com.backend.DuruDuru.global.web.dto.Chatting.ChattingResponseDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ChattingQueryServiceImpl implements ChattingQueryService {

private final ChattingRepository chattingRoomRepository;

//회원이 참여한 채팅방 조회
@Override
public ChattingResponseDTO.ChattingRoomListDTO getChattingRoomList(Long memberId) {
List<ChattingRoom> chattingRooms = chattingRoomRepository.findChattingRoomsByMemberId(memberId);
return ChattingConverter.toChattingRoomListDTO(chattingRooms, memberId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

import com.backend.DuruDuru.global.apiPayload.ApiResponse;
import com.backend.DuruDuru.global.apiPayload.code.status.SuccessStatus;
import com.backend.DuruDuru.global.service.ChattingService.ChattingQueryService;
import com.backend.DuruDuru.global.service.ChattingService.ChattingQueryServiceImpl;
import com.backend.DuruDuru.global.web.dto.Chatting.ChattingResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
Expand All @@ -18,11 +21,14 @@
@Tag(name = "채팅 API", description = "채팅 관련 API입니다.")
public class ChatController {

private final ChattingQueryServiceImpl chattingQueryServiceImpl;

// 채팅방 목록 조회
@GetMapping("/rooms")
@Operation(summary = "채팅방 목록 조회 API", description = "사용자의 채팅방 목록 조회API")
public ApiResponse<?> getChatRooms() {
return ApiResponse.onSuccess(SuccessStatus.CHAT_OK, null);
public ApiResponse<ChattingResponseDTO.ChattingRoomListDTO> getChattingRoomList(@RequestParam Long memberId) {
ChattingResponseDTO.ChattingRoomListDTO resultDTO = chattingQueryServiceImpl.getChattingRoomList(memberId);
return ApiResponse.onSuccess(SuccessStatus.CHAT_OK, resultDTO);
}

// 채팅 내역 조회
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.backend.DuruDuru.global.web.dto.Chatting;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

public class ChattingRequestDTO {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.backend.DuruDuru.global.web.dto.Chatting;

import lombok.*;

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

public class ChattingResponseDTO {

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class ChattingRoomDetailDTO {
private Long chatRoomId;
private String username;
private String tradeType;
private String location;
private String lastMessage;
private LocalDateTime lastMessageDate;
private int unreadCount;
private LocalDateTime sentTime;
}

//ChttingRoom상세 정보 담아서 개수와 함께 반환 하는 DTO
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class ChattingRoomListDTO {
private int count; // 채팅방 개수
private List<ChattingRoomDetailDTO> chatRooms; // 채팅방 상세 정보 리스트
}
}

0 comments on commit 6ca4e12

Please sign in to comment.