From d60c5a1cbbc1e24fe621e84511284e6fcd8030f4 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 18 Jan 2025 15:33:19 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20api=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/ApplyRepositoryCustom.java | 3 - .../repository/impl/ApplyRepositoryImpl.java | 51 ------- .../api/apply/service/ApplyService.java | 7 - .../chat/dto/res/ChatRoomListResponseDto.java | 37 ++++- .../api/chat/repository/ChatRepository.java | 2 + .../chat/repository/ChatRoomRepository.java | 5 + .../api/chat/rest/ChatRoomController.java | 40 +----- .../api/chat/service/ChatRoomService.java | 135 ++++++++++++++++++ .../walkmong_back/api/dog/domain/Dog.java | 8 ++ .../common/exception/ErrorType.java | 4 +- 10 files changed, 188 insertions(+), 104 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepositoryCustom.java b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepositoryCustom.java index d24f97e..05dacb5 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepositoryCustom.java +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepositoryCustom.java @@ -12,9 +12,6 @@ public interface ApplyRepositoryCustom { Optional getApplyInfoResponse(Long boardId, Long memberId, String delYn); - //지원한 산책의 채팅방 조회 - List getApplyChatList(Long memberId, MatchingStatus status); - //내가 지원한 산책 리스트 조회 List getApplyInfoResponses(Long memberId, WalkMatchingStatus status, String delYn); List getApplicantList(Long boardId, String delYn); diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/repository/impl/ApplyRepositoryImpl.java b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/impl/ApplyRepositoryImpl.java index 8170cb9..57721b2 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/apply/repository/impl/ApplyRepositoryImpl.java +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/impl/ApplyRepositoryImpl.java @@ -163,57 +163,6 @@ else if (status.equals(WalkMatchingStatus.REJECT)) { .fetch(); } - //지원한 산책의 채팅리스트 조회 - @Override - public List getApplyChatList(Long memberId, MatchingStatus status) { - QDog dog = QDog.dog; - QMember member = QMember.member; - QBoard board = QBoard.board; - QApply apply = QApply.apply; - QAddress address = QAddress.address; - - QChatRoom chatRoom=QChatRoom.chatRoom; - QChat chat= QChat.chat; - - //대화 상대의 마지막 메세지 가져오기: chat 테이블에서 Id의 최댓값을 가져온다 - SubQueryExpression lastMessageSubQuery = JPAExpressions.select(chat.chatId.max()) - .from(chat) - .leftJoin(chatRoom).on(chat.roomId.eq(chatRoom.roomId)) - .where(chat.roomId.eq(chatRoom.roomId) - .and(chat.senderId.ne(memberId))); - - - - List chatRoomListResponseDtos= - queryFactory.selectDistinct( - Projections.constructor(ChatRoomListResponseDto.class, - dog.name.as("dogName"), - dog.profile.as("dogProfile"), - board.startTime.as("startTime"), - board.endTime.as("endTime"), - chatRoom.chatOwnerId.as("chatTarget"), //채팅 대상 - chat.message.as("lastChat"), //상대의 마지막 채팅 - chat.createdAt.as("lastChatTime"), // 상대의 마지막 채팅 내용 - Expressions.asString("").as("targetName"),// 상대방 이름을 공백으로 지정 - Expressions.asNumber(10).as("notRead"), - chat.roomId.as("roomId"), - board.boardId.as("boardId") - - )) - .from(board) - .leftJoin(dog).on(dog.dogId.eq(board.dogId)) - .leftJoin(apply).on(apply.boardId.eq(board.boardId)) - //boardId와 chatParticipantId는 1:1 관계 - .leftJoin(chatRoom).on(chatRoom.boardId.eq(board.boardId)) - .leftJoin(chat).on(chat.roomId.eq(chatRoom.roomId)) - .where(apply.memberId.eq(memberId) - .and(apply.matchingStatus.eq(status)) - .and(chat.chatId.eq(lastMessageSubQuery))) - .fetch(); - - return chatRoomListResponseDtos; - } - /** * 반려인이 산책 지원자들의 정보를 조회한다 */ diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/service/ApplyService.java b/src/main/java/org/jullaene/walkmong_back/api/apply/service/ApplyService.java index 8321ce0..ba12a53 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/apply/service/ApplyService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/service/ApplyService.java @@ -96,13 +96,6 @@ public List getAllAppliedInfoWithStatus(TabStatus tabStatus } - //지원한 산책의 채팅방 조회 - public List getAllChatListWithStatus(MatchingStatus status) { - Long memberId = memberService.getMemberFromUserDetail().getMemberId(); - log.info("사용자 id {}", memberId); - List chatList = applyRepository.getApplyChatList(memberId, status); - return chatList; - } public List getApplicantList(Long boardId) { return applyRepository.getApplicantList(boardId,"N"); diff --git a/src/main/java/org/jullaene/walkmong_back/api/chat/dto/res/ChatRoomListResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/chat/dto/res/ChatRoomListResponseDto.java index 7d85891..a0bc04b 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/chat/dto/res/ChatRoomListResponseDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/chat/dto/res/ChatRoomListResponseDto.java @@ -1,17 +1,20 @@ package org.jullaene.walkmong_back.api.chat.dto.res; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; +import lombok.*; +import org.jullaene.walkmong_back.api.board.domain.Board; +import org.jullaene.walkmong_back.api.chat.domain.Chat; +import org.jullaene.walkmong_back.api.chat.domain.ChatRoom; +import org.jullaene.walkmong_back.api.dog.domain.Dog; +import org.jullaene.walkmong_back.api.member.domain.Member; +import org.jullaene.walkmong_back.common.enums.TabStatus; import java.time.LocalDateTime; @Getter @RequiredArgsConstructor -@AllArgsConstructor @Setter public class ChatRoomListResponseDto { + private TabStatus tabStatus; private String dogName; private String dogProfile; private LocalDateTime startTime; @@ -24,4 +27,28 @@ public class ChatRoomListResponseDto { private Long roomId; private Long boardId; + @Builder + public ChatRoomListResponseDto(Dog dog, + Board board, + Member target, + Chat chat, + ChatRoom chatRoom, + TabStatus tabStatus + ) { + this.tabStatus = tabStatus; + this.dogName = dog.getName(); + this.dogProfile = dog.getProfile(); + this.startTime = board.getStartTime(); + this.endTime = board.getEndTime(); + this.chatTarget = target.getMemberId(); + this.targetName = target.getNickname(); + this.notRead = 0; + this.roomId = chatRoom.getRoomId(); + this.boardId = board.getBoardId(); + + if (chat != null) { + this.lastChat = chat.getMessage(); + this.lastChatTime = chat.getCreatedAt(); + } + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/chat/repository/ChatRepository.java b/src/main/java/org/jullaene/walkmong_back/api/chat/repository/ChatRepository.java index 3447b22..d96210c 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/chat/repository/ChatRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/chat/repository/ChatRepository.java @@ -5,8 +5,10 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface ChatRepository extends JpaRepository { List findAllByRoomId(Long roomId); + Optional findFirstByRoomIdAndDelYnOrderByCreatedAtDesc(Long roomId, String delYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/chat/repository/ChatRoomRepository.java b/src/main/java/org/jullaene/walkmong_back/api/chat/repository/ChatRoomRepository.java index a08b307..8368329 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/chat/repository/ChatRoomRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/chat/repository/ChatRoomRepository.java @@ -4,9 +4,14 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository public interface ChatRoomRepository extends JpaRepository { Optional findByRoomIdAndDelYn(Long chatRoomId, String delYn); + + List findByChatParticipantIdAndDelYn(Long memberId, String delYn); + + List findByChatOwnerIdAndDelYn(Long memberId, String delYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/chat/rest/ChatRoomController.java b/src/main/java/org/jullaene/walkmong_back/api/chat/rest/ChatRoomController.java index a7c3217..caa0082 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/chat/rest/ChatRoomController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/chat/rest/ChatRoomController.java @@ -1,7 +1,9 @@ package org.jullaene.walkmong_back.api.chat.rest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jullaene.walkmong_back.WalkmongBackApplication; import org.jullaene.walkmong_back.api.apply.domain.enums.MatchingStatus; +import org.jullaene.walkmong_back.api.apply.dto.enums.WalkMatchingStatus; import org.jullaene.walkmong_back.api.apply.service.ApplyService; import org.jullaene.walkmong_back.api.board.service.BoardService; import org.jullaene.walkmong_back.api.chat.dto.req.ChatMessageRequestDto; @@ -53,42 +55,8 @@ public ResponseEntity>> getChatHistor //지원|의뢰 && 매칭상태에 따른 채팅방 리스트 조회 @GetMapping("/list") public ResponseEntity>> getChatRoomList(@RequestParam("record") String record, - @RequestParam("status")MatchingStatus status){ - /* - record - applied: 지원한 산책 - requested: 의뢰한 산책 - all: 전체 - */ - - /* - - PENDING: 매칭중 - CONFIRMED: 매칭확정 - REJECTED: 매칭취소 - */ - List chatRoomListResponseDto=null; - if (record.equals("applied")){ - chatRoomListResponseDto=applyService.getAllChatListWithStatus(status); - - }else if (record.equals("requested")) { - chatRoomListResponseDto = boardService.getAllChatListWithStatus(status); - }else if (record.equals("all")){ - List appliedList = applyService.getAllChatListWithStatus(status); - List requestedList = boardService.getAllChatListWithStatus(status); - - chatRoomListResponseDto = new ArrayList<>(); - chatRoomListResponseDto.addAll(appliedList); - chatRoomListResponseDto.addAll(requestedList); - - } - - //공백으로 설정한 상대방 이름을 실명으로 전환 - for (ChatRoomListResponseDto dto:chatRoomListResponseDto){ - Long memberId=dto.getChatTarget(); - log.info("상대방 아이디 {}",memberId); - dto.setTargetName(memberRepository.findNickNameByMemberId(memberId)); - } + @RequestParam("status") WalkMatchingStatus status){ + List chatRoomListResponseDto = chatRoomService.getChatRoomList(record, status); return ResponseEntity.ok(BasicResponse.ofSuccess(chatRoomListResponseDto)); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/chat/service/ChatRoomService.java b/src/main/java/org/jullaene/walkmong_back/api/chat/service/ChatRoomService.java index 51bf4d7..5f73f48 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/chat/service/ChatRoomService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/chat/service/ChatRoomService.java @@ -1,8 +1,12 @@ package org.jullaene.walkmong_back.api.chat.service; +import com.google.api.Http; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.hibernate.IdentifierLoadAccess; +import org.jullaene.walkmong_back.api.apply.dto.enums.WalkMatchingStatus; +import org.jullaene.walkmong_back.api.board.domain.Board; +import org.jullaene.walkmong_back.api.board.domain.enums.WalkingStatus; import org.jullaene.walkmong_back.api.board.repository.BoardRepository; import org.jullaene.walkmong_back.api.chat.domain.Chat; import org.jullaene.walkmong_back.api.chat.domain.ChatRoom; @@ -10,11 +14,15 @@ import org.jullaene.walkmong_back.api.chat.dto.req.ChatMessageRequestDto; import org.jullaene.walkmong_back.api.chat.dto.res.ChatHistoryResponseDto; import org.jullaene.walkmong_back.api.chat.dto.res.ChatMessageResponseDto; +import org.jullaene.walkmong_back.api.chat.dto.res.ChatRoomListResponseDto; import org.jullaene.walkmong_back.api.chat.repository.ChatRepository; import org.jullaene.walkmong_back.api.chat.repository.ChatRoomRepository; +import org.jullaene.walkmong_back.api.dog.domain.Dog; +import org.jullaene.walkmong_back.api.dog.repository.DogRepository; import org.jullaene.walkmong_back.api.member.domain.Member; import org.jullaene.walkmong_back.api.member.service.MemberService; +import org.jullaene.walkmong_back.common.enums.TabStatus; import org.jullaene.walkmong_back.common.exception.CustomException; import org.jullaene.walkmong_back.common.exception.ErrorType; import org.springframework.http.HttpStatus; @@ -22,7 +30,9 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; @Service @@ -33,6 +43,7 @@ public class ChatRoomService { private final ChatRepository chatRepository; private final MemberService memberService; private final BoardRepository boardRepository; + private final DogRepository dogRepository; //채팅방 생성 public Long createRoom(Long boardId) { @@ -111,4 +122,128 @@ public ChatMessageResponseDto saveMessage(ChatMessageRequestDto message) { .createdAt(savedChat.getCreatedAt()) .build(); } + + public List getChatRoomList(String record, WalkMatchingStatus status) { + Member member = memberService.getMemberFromUserDetail(); + + List chatRoomListResponseDtos = new ArrayList<>(); + + // 지원한 산책 + if (record.equals("applied") || record.equals("all")) { + List chatRooms = chatRoomRepository.findByChatParticipantIdAndDelYn(member.getMemberId(), "N"); + + chatRooms.stream() + .filter(chatRoom -> { + log.info("hello"); + Board board = boardRepository.findByBoardIdAndDelYn(chatRoom.getBoardId(), "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_BOARD)); + + LocalDateTime now = LocalDateTime.now(); + + WalkMatchingStatus boardStatus = null; + if (board.getWalkingStatus().equals(WalkingStatus.PENDING) && board.getStartTime().isAfter(now)) { + boardStatus = WalkMatchingStatus.PENDING; + } + else if (board.getWalkingStatus().equals(WalkingStatus.BEFORE)) { + boardStatus = WalkMatchingStatus.BEFORE; + } + else if (board.getWalkingStatus().equals(WalkingStatus.ING) || board.getWalkingStatus().equals(WalkingStatus.AFTER)) { + boardStatus = WalkMatchingStatus.AFTER; + } + else if (board.getWalkingStatus().equals(WalkingStatus.PENDING) && board.getStartTime().isBefore(now)) { + boardStatus = WalkMatchingStatus.REJECT; + } + + return boardStatus == status; + }) + .forEach(chatRoom -> { + Member owner = memberService.getMemberByMemberId(chatRoom.getChatOwnerId()) + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_USER)); + + Board board = boardRepository.findByBoardIdAndDelYn(chatRoom.getBoardId(), "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_BOARD)); + + Dog dog = dogRepository.findByDogIdAndDelYn(board.getDogId(), "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_DOG)); + + Chat chat = chatRepository.findFirstByRoomIdAndDelYnOrderByCreatedAtDesc(chatRoom.getRoomId(), "N") + .orElseThrow(null); + + ChatRoomListResponseDto chatRoomListResponseDto = ChatRoomListResponseDto.builder() + .tabStatus(TabStatus.APPLY) + .chatRoom(chatRoom) + .board(board) + .dog(dog) + .chat(chat) + .target(owner) + .build(); + + chatRoomListResponseDtos.add(chatRoomListResponseDto); + }); + } + + if (record.equals("requested") || record.equals("all")) { + List chatRooms = chatRoomRepository.findByChatOwnerIdAndDelYn(member.getMemberId(), "N"); + + chatRooms.stream() + .filter(chatRoom -> { + log.info("hello1"); + Board board = boardRepository.findByBoardIdAndDelYn(chatRoom.getBoardId(), "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_BOARD)); + + LocalDateTime now = LocalDateTime.now(); + + WalkMatchingStatus boardStatus = null; + if (board.getWalkingStatus().equals(WalkingStatus.PENDING) && board.getStartTime().isAfter(now)) { + boardStatus = WalkMatchingStatus.PENDING; + } + else if (board.getWalkingStatus().equals(WalkingStatus.BEFORE)) { + boardStatus = WalkMatchingStatus.BEFORE; + } + else if (board.getWalkingStatus().equals(WalkingStatus.ING) || board.getWalkingStatus().equals(WalkingStatus.AFTER)) { + boardStatus = WalkMatchingStatus.AFTER; + } + else if (board.getWalkingStatus().equals(WalkingStatus.PENDING) && board.getStartTime().isBefore(now)) { + boardStatus = WalkMatchingStatus.REJECT; + } + + return boardStatus == status; + }) + .forEach(chatRoom -> { + + log.info("hello2"); + Member walker = memberService.getMemberByMemberId(chatRoom.getChatParticipantId()) + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_USER)); + + + log.info("walker : " + walker.getMemberId()); + Board board = boardRepository.findByBoardIdAndDelYn(chatRoom.getBoardId(), "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_BOARD)); + + + log.info("board : " + board.getBoardId()); + + Dog dog = dogRepository.findByDogIdAndDelYn(board.getDogId(), "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_DOG)); + + Chat chat = chatRepository.findFirstByRoomIdAndDelYnOrderByCreatedAtDesc(chatRoom.getRoomId(), "N") + .orElseThrow(null); + + ChatRoomListResponseDto chatRoomListResponseDto = ChatRoomListResponseDto.builder() + .tabStatus(TabStatus.BOARD) + .chatRoom(chatRoom) + .board(board) + .dog(dog) + .chat(chat) + .target(walker) + .build(); + + chatRoomListResponseDtos.add(chatRoomListResponseDto); + }); + } + + return chatRoomListResponseDtos.stream() + .sorted(Comparator.comparing(ChatRoomListResponseDto::getStartTime)) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java index 8fa8d51..7f1c05f 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java @@ -129,6 +129,14 @@ public Long getMemberId () { return this.memberId; } + public String getName () { + return this.name; + } + + public String getProfile () { + return this.profile; + } + public final DogProfileResponseDto toDogProfileResponseDto() { int currentYear = LocalDate.now().getYear(); int dogAge = currentYear - this.birthYear + 1; // 나이 계산 diff --git a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java index 87ab712..d1809f8 100644 --- a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java +++ b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java @@ -42,8 +42,8 @@ public enum ErrorType { INVALID_APPLY("존재하지 않는 지원서입니다."), INVALID_GEO("현재 위치가 존재하지 않습니다."), INVALID_FCM_TOKEN("존재하지 않는 FCM 토큰입니다."), - FAIL_FCM_SEND("FCM 발송에 실패했습니다.") - ; + FAIL_FCM_SEND("FCM 발송에 실패했습니다."), + INVALID_DOG("존재하지 않는 강아지입니다."); private String message;