From f8fe5446ee1355913fea831ac9a9a4e1f3794d81 Mon Sep 17 00:00:00 2001 From: Chungs0604 Date: Thu, 13 Aug 2026 14:41:27 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=C2=A0Fix:=20=EB=AF=B8=ED=8C=90?= =?UTF-8?q?=EB=A7=A4=20+=20=EA=B5=AC=EB=A7=A4=EC=A0=9C=EC=95=88=20->=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=83=9D=EC=84=B1=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/service/ChatRoomService.java | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/tenure/domain/chat/service/ChatRoomService.java b/src/main/java/com/tenure/domain/chat/service/ChatRoomService.java index 90aeee05..685e3353 100644 --- a/src/main/java/com/tenure/domain/chat/service/ChatRoomService.java +++ b/src/main/java/com/tenure/domain/chat/service/ChatRoomService.java @@ -51,6 +51,7 @@ import java.util.Objects; import static com.tenure.domain.product.enums.ProductStatus.*; +import static com.tenure.domain.purchase.enums.PurchaseOfferStatus.*; @Service @Slf4j @@ -120,12 +121,34 @@ public ChatRoomResponse findOrCreateChatRoom(Long buyerId, Long itemId) { //product 중에서 해당 아이템이 판매중이거나 거래중인 항목을 찾음 Product product = productRepository.findByItemIdAndProductStatusIn(itemId, List.of(ON_SALE, TRADING)) - .orElseThrow(() -> { - log.warn("[채팅방 생성/조회] 해당 상품은 판매중이거나 거래중이 아닙니다. itemId = {}", itemId); - return new CustomException(ProductErrorCode.PRODUCT_NOT_ON_SALE); + .orElseGet(() -> { + + // 미판매 or 판매완료 상품인 경우 + // 미판매 상품 + 구매제안 = 채팅방 생성 가능 + boolean hasSentOffer = purchaseOfferRepository + .findIdByProposerIdAndOwnerIdAndItemIdAndStatus(buyerId, owner.getId(), itemId, SENT) + .isPresent(); + + if(!hasSentOffer) { + log.warn("[채팅방 생성/조회] 해당 상품은 미판매 상품입니다. itemId = {}", itemId); + throw new CustomException(ProductErrorCode.PRODUCT_NOT_ON_SALE); + } + Product offerSentProduct = productRepository.findByItemId(itemId) + .orElseThrow(() -> { + log.warn("[채팅방 생성/조회] 상품을 찾을 수 없습니다. itemId = {}", itemId); + return new CustomException(ProductErrorCode.PRODUCT_NOT_FOUND); + }); + + // 상품이 판매 완료 된 경우 + if(offerSentProduct.getProductStatus() == SOLD) { + log.warn("[채팅방 생성/조회] 해당 상품은 판매 완료된 상품입니다. itemId = {}", itemId); + throw new CustomException(ProductErrorCode.PRODUCT_NOT_ON_SALE); + } + + // 미판매 + 구매제안 + return offerSentProduct; }); - ChatRoom chatRoom; // 사용자가 동시에 채팅방 생성을 할 경우 방지 @@ -150,7 +173,7 @@ public ChatRoomResponse findOrCreateChatRoom(Long buyerId, Long itemId) { .orElse(null); Long purchaseOfferId = purchaseOfferRepository - .findIdByProposerIdAndOwnerIdAndItemIdAndStatus(buyerId, owner.getId(), itemId, PurchaseOfferStatus.SENT) + .findIdByProposerIdAndOwnerIdAndItemIdAndStatus(buyerId, owner.getId(), itemId, SENT) .orElse(null); // 아이템 상세에서 바로 들어온 경우 처음엔 isOpponentExited false 고정 @@ -232,7 +255,7 @@ public ChatRoomResponse enterChatroom(Long currentUserId, Long chatRoomId) { // 해당 아이템에 대해 구매 제안을 보낸 적이 있는가 Long purchaseOfferId = purchaseOfferRepository - .findIdByProposerIdAndOwnerIdAndItemIdAndStatus(buyerId, sellerId, item.getId(), PurchaseOfferStatus.SENT) + .findIdByProposerIdAndOwnerIdAndItemIdAndStatus(buyerId, sellerId, item.getId(), SENT) .orElse(null); // 상대방이 나를 차단했는지 여부