diff --git a/src/main/java/com/campick/server/api/chat/controller/ChatController.java b/src/main/java/com/campick/server/api/chat/controller/ChatController.java index 7dcffab..0590a19 100644 --- a/src/main/java/com/campick/server/api/chat/controller/ChatController.java +++ b/src/main/java/com/campick/server/api/chat/controller/ChatController.java @@ -5,13 +5,10 @@ import com.campick.server.api.chat.entity.ChatRoom; import com.campick.server.api.chat.service.ChatService; import com.campick.server.common.config.security.SecurityMember; -import com.campick.server.common.dto.PageResponseDto; import com.campick.server.common.response.ApiResponse; import com.campick.server.common.response.SuccessStatus; import lombok.RequiredArgsConstructor; import org.checkerframework.checker.units.qual.A; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; @@ -35,11 +32,8 @@ public ResponseEntity> startChat(@RequestBody ChatRoomReqDto c } @GetMapping("/{chatRoomId}") - public ResponseEntity>> getChatRoom(@PathVariable Long chatRoomId, - @RequestParam(defaultValue = "0") Integer page, - @RequestParam(defaultValue = "20") Integer size) { - Pageable pageable = PageRequest.of(page, size); - return ApiResponse.success(SuccessStatus.SEND_LOAD_CHATROOM, chatService.getChatRoom(chatRoomId, pageable)); + public ResponseEntity> getChatRoom(@PathVariable Long chatRoomId) { + return ApiResponse.success(SuccessStatus.SEND_LOAD_CHATROOM, chatService.getChatRoom(chatRoomId)); } @PatchMapping("/{chatRoomId}") @@ -51,13 +45,10 @@ public ResponseEntity> readChatRoom(@PathVariable Long chatRoo } @GetMapping("/my") - public ResponseEntity>> getMyChatRoom(@RequestParam(defaultValue = "0") Integer page, - @RequestParam(defaultValue = "10") Integer size, - @AuthenticationPrincipal SecurityMember securityMember) { - Pageable pageable = PageRequest.of(page, size); + public ResponseEntity> getMyChatRoom(@AuthenticationPrincipal SecurityMember securityMember) { Long memberId = securityMember.getId(); - return ApiResponse.success(SuccessStatus.SEND_MY_CHATROOMS, chatService.getMyChatRooms(memberId, pageable)); + return ApiResponse.success(SuccessStatus.SEND_MY_CHATROOMS, chatService.getMyChatRooms(memberId)); } @GetMapping("/totalUnreadMessage") diff --git a/src/main/java/com/campick/server/api/chat/dto/ChatRoomPageResDto.java b/src/main/java/com/campick/server/api/chat/dto/ChatRoomPageResDto.java deleted file mode 100644 index e9107ee..0000000 --- a/src/main/java/com/campick/server/api/chat/dto/ChatRoomPageResDto.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.campick.server.api.chat.dto; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.data.domain.Page; - -import java.util.List; - -@Getter @Setter -public class ChatRoomPageResDto { - private final long totalElements; // 잔체 요소 수 - private final int totalPages; // 전체 페이지 수 - private final int page; // 현재 페이지(0부터 시작) - private final int size; // 요청한 페이지 사이즈 - private final boolean isLast; // 마지막 페이지 여부 - - private Long sellerId; - private Long buyerId; - private String sellerNickname; - private String buyerNickname; - private String sellerProfileImage; - private String sellerPhoneNumber; - private Long productId; - private String productTitle; - private String productImage; - private String productStatus; - private String productPrice; - private Boolean isActive; - - private final List chatData; - - public ChatRoomPageResDto(Page page) { - this.chatData = page.getContent(); - this.page = page.getNumber(); - this.size = page.getSize(); - this.totalElements = page.getTotalElements(); - this.totalPages = page.getTotalPages(); - this.isLast = page.isLast(); - } -} diff --git a/src/main/java/com/campick/server/api/chat/dto/MyChatPageResDto.java b/src/main/java/com/campick/server/api/chat/dto/MyChatPageResDto.java deleted file mode 100644 index 2ee02fd..0000000 --- a/src/main/java/com/campick/server/api/chat/dto/MyChatPageResDto.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.campick.server.api.chat.dto; - -import lombok.Getter; -import org.springframework.data.domain.Page; - -import java.util.List; - -@Getter -public class MyChatPageResDto { - private final long totalElements; // 잔체 요소 수 - private final int totalPages; // 전체 페이지 수 - private final int page; // 현재 페이지(0부터 시작) - private final int size; // 요청한 페이지 사이즈 - private final boolean isLast; // 마지막 페이지 여부 - private final int totalUnreadMessage; - private final List content; - - public MyChatPageResDto(Page page, int totalUnreadMessage) { - this.content = page.getContent(); - this.page = page.getNumber(); - this.size = page.getSize(); - this.totalElements = page.getTotalElements(); - this.totalPages = page.getTotalPages(); - this.isLast = page.isLast(); - this.totalUnreadMessage = totalUnreadMessage; - } -} diff --git a/src/main/java/com/campick/server/api/chat/repository/ChatMessageRepository.java b/src/main/java/com/campick/server/api/chat/repository/ChatMessageRepository.java index f06eb87..e7ffc2f 100644 --- a/src/main/java/com/campick/server/api/chat/repository/ChatMessageRepository.java +++ b/src/main/java/com/campick/server/api/chat/repository/ChatMessageRepository.java @@ -1,8 +1,6 @@ package com.campick.server.api.chat.repository; import com.campick.server.api.chat.entity.ChatMessage; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -32,15 +30,6 @@ Integer markMessagesAsRead(@Param("chatRoomId") Long chatRoomId, "ORDER BY m.createdAt DESC LIMIT 1") ChatMessage findLastMessageByChatRoomId(@Param("chatRoomId") Long chatRoomId); - @Query(""" - SELECT m FROM ChatMessage m - WHERE m.chatRoom.id IN :chatRoomIds - AND m.createdAt IN ( - SELECT MAX(m2.createdAt) FROM ChatMessage m2 WHERE m2.chatRoom.id = m.chatRoom.id - ) - """) - List findLastMessages(@Param("chatRoomIds") List chatRoomIds); - @Query("SELECT COUNT(m) FROM ChatMessage m " + "WHERE m.chatRoom.id = :chatRoomId " + "AND m.isRead = false " + @@ -54,6 +43,4 @@ Integer countUnreadMessages(@Param("chatRoomId") Long chatRoomId, "AND cm.isRead = false " + "AND cm.member.id <> :memberId") Integer countAllUnreadMessages(@Param("memberId") Long memberId); - - Page findByChatRoomIdOrderByCreatedAtDesc(Long chatRoomId, Pageable pageable); } diff --git a/src/main/java/com/campick/server/api/chat/repository/ChatRoomRepository.java b/src/main/java/com/campick/server/api/chat/repository/ChatRoomRepository.java index 3a594c6..3ba29d2 100644 --- a/src/main/java/com/campick/server/api/chat/repository/ChatRoomRepository.java +++ b/src/main/java/com/campick/server/api/chat/repository/ChatRoomRepository.java @@ -3,8 +3,6 @@ import com.campick.server.api.chat.entity.ChatRoom; import com.campick.server.api.member.entity.Member; import com.campick.server.api.product.entity.Product; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -30,20 +28,5 @@ public interface ChatRoomRepository extends JpaRepository { " OR (b.id = :memberId AND cr.isBuyerOut = false))") List findAllByMemberId(@Param("memberId") Long memberId); - @Query(""" - SELECT c FROM ChatRoom c - WHERE c.seller.id = :memberId OR c.buyer.id = :memberId - ORDER BY ( - SELECT MAX(m.createdAt) FROM ChatMessage m WHERE m.chatRoom = c - ) DESC - """) - Page findByMemberIdOrderByLastMessageDesc(@Param("memberId") Long memberId, Pageable pageable); - Optional findByProductAndSellerAndBuyer(Product product, Member seller, Member buyer); - - @Query(""" - SELECT COUNT(c) FROM ChatRoom c - WHERE c.seller.id = :memberId OR c.buyer.id = :memberId - """) - long countChatRoomByMemberId(@Param("memberId") Long memberId); } diff --git a/src/main/java/com/campick/server/api/chat/service/ChatService.java b/src/main/java/com/campick/server/api/chat/service/ChatService.java index 710f960..7f15a6d 100644 --- a/src/main/java/com/campick/server/api/chat/service/ChatService.java +++ b/src/main/java/com/campick/server/api/chat/service/ChatService.java @@ -20,17 +20,12 @@ import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import java.io.IOException; import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -116,35 +111,21 @@ public Long startChatRoom(ChatRoomReqDto chatRoomReqDto, Long memberId) { return chatRoom.getId(); } - public ChatRoomPageResDto getChatRoom(Long chatRoomId, Pageable pageable) { + public ChatRoomResDto getChatRoom(Long chatRoomId) { ChatRoom chatRoom = chatRoomRepository.findDetailById(chatRoomId).orElseThrow( () -> new NotFoundException(ErrorStatus.CHAT_NOT_FOUND.getMessage()) ); - Page chatMessages = chatMessageRepository.findByChatRoomIdOrderByCreatedAtDesc(chatRoomId, pageable); - Page chatMessageResDtos = chatMessages.map( - cm -> ChatMessageResDto.builder() - .message(cm.getMessage()) - .senderId(cm.getMember().getId()) - .sendAt(TimeUtil.getTimeAgo(cm.getCreatedAt())) - .isRead(cm.getIsRead()) - .build() - ); + List chatMessages = chatMessageRepository.findMessagesByChatRoomId(chatRoomId); - return convertToChatRoomResDto(chatRoom, chatMessageResDtos); + return convertToChatRoomResDto(chatRoom, chatMessages); } public void readChatRoom(Long chatRoomId, Long memberId) { Integer readMessageCount = chatMessageRepository.markMessagesAsRead(chatRoomId, memberId); } - public MyChatPageResDto getMyChatRooms(Long memberId, Pageable pageable) { - Page myChatRooms = chatRoomRepository.findByMemberIdOrderByLastMessageDesc(memberId, pageable); - List chatRoomIds = myChatRooms.stream().map(ChatRoom::getId).toList(); - Map lastMessageMap = chatMessageRepository.findLastMessages(chatRoomIds) - .stream() - .collect(Collectors.toMap(m -> m.getChatRoom().getId(), Function.identity())); - long total = chatRoomRepository.countChatRoomByMemberId(memberId); - + public MyChatResDto getMyChatRooms(Long memberId) { + List myChatRooms = chatRoomRepository.findAllByMemberId(memberId); List chatListDtos = myChatRooms.stream().map( chatRoom -> { String thumbnailUrl = chatRoom.getProduct().getImages().stream() @@ -153,7 +134,7 @@ public MyChatPageResDto getMyChatRooms(Long memberId, Pageable page .findFirst() .orElse(null); - ChatMessage lastChatMessage = lastMessageMap.get(chatRoom.getId()); + ChatMessage lastChatMessage = chatMessageRepository.findLastMessageByChatRoomId(chatRoom.getId()); Integer unreadMessageCount = chatMessageRepository.countUnreadMessages(chatRoom.getId(), memberId); return ChatListDto.builder() @@ -168,10 +149,10 @@ public MyChatPageResDto getMyChatRooms(Long memberId, Pageable page .build(); }).toList(); - Integer totalUnreadMessage = chatMessageRepository.countAllUnreadMessages(memberId); - Page pageImpl = new PageImpl<>(chatListDtos, pageable, total); - - return new MyChatPageResDto<>(pageImpl, totalUnreadMessage); + return MyChatResDto.builder() + .chatRoom(chatListDtos) + .totalUnreadMessage(chatMessageRepository.countAllUnreadMessages(memberId)) + .build(); } public Integer getTotalUnreadMessage(Long memberId) { @@ -201,6 +182,7 @@ public void handleChatMessage(WebSocketSession session, JsonNode data) { private ChatMessageResDto convertToChatMessageResDto(ChatMessage chatMessage, Long chatRoomId) { return ChatMessageResDto.builder() + .chatId(chatRoomId) .message(chatMessage.getMessage()) .chatId(chatRoomId) .senderId(chatMessage.getMember().getId()) @@ -271,29 +253,34 @@ public void broadcastSoldEvent(WebSocketSession session, JsonNode data) { } } - private ChatRoomPageResDto convertToChatRoomResDto(ChatRoom chatRoom, Page chatMessages) { + private ChatRoomResDto convertToChatRoomResDto(ChatRoom chatRoom, List chatMessages) { String thumbnailImage = chatRoom.getProduct().getImages().stream() .filter(ProductImage::getIsThumbnail) .map(ProductImage::getImageUrl) .findFirst() .orElse(null); - ChatRoomPageResDto chatRoomPageResDto = new ChatRoomPageResDto<>(chatMessages); - - chatRoomPageResDto.setSellerId(chatRoom.getSeller().getId()); - chatRoomPageResDto.setSellerNickname(chatRoom.getSeller().getNickname()); - chatRoomPageResDto.setBuyerId(chatRoom.getBuyer().getId()); - chatRoomPageResDto.setBuyerNickname(chatRoom.getBuyer().getNickname()); - chatRoomPageResDto.setSellerProfileImage(chatRoom.getSeller().getProfileImageUrl()); - chatRoomPageResDto.setSellerPhoneNumber(chatRoom.getSeller().getMobileNumber()); - chatRoomPageResDto.setProductId(chatRoom.getProduct().getId()); - chatRoomPageResDto.setProductTitle(chatRoom.getProduct().getTitle()); - chatRoomPageResDto.setProductImage(thumbnailImage); - chatRoomPageResDto.setProductStatus(chatRoom.getProduct().getStatus().toString()); - chatRoomPageResDto.setProductPrice(chatRoom.getProduct().getCost().toString()); - chatRoomPageResDto.setIsActive(!chatRoom.getIsSellerOut() && !chatRoom.getIsBuyerOut()); - - return chatRoomPageResDto; + ChatRoomResDto chatRoomResDto = new ChatRoomResDto(); + chatRoomResDto.setSellerId(chatRoom.getSeller().getId()); + chatRoomResDto.setSellerNickname(chatRoom.getSeller().getNickname()); + chatRoomResDto.setBuyerId(chatRoom.getBuyer().getId()); + chatRoomResDto.setBuyerNickname(chatRoom.getBuyer().getNickname()); + chatRoomResDto.setSellerProfileImage(chatRoom.getSeller().getProfileImageUrl()); + chatRoomResDto.setSellerPhoneNumber(chatRoom.getSeller().getMobileNumber()); + chatRoomResDto.setProductId(chatRoom.getProduct().getId()); + chatRoomResDto.setProductTitle(chatRoom.getProduct().getTitle()); + chatRoomResDto.setProductImage(thumbnailImage); + chatRoomResDto.setProductStatus(chatRoom.getProduct().getStatus().toString()); + chatRoomResDto.setProductPrice(chatRoom.getProduct().getCost().toString()); + chatRoomResDto.setIsActive(!chatRoom.getIsSellerOut() && !chatRoom.getIsBuyerOut()); + + List chatMessageResDto = chatMessages.stream() + .map( + cm -> convertToChatMessageResDto(cm, chatRoom.getId()) + ).toList(); + chatRoomResDto.setChatData(chatMessageResDto); + + return chatRoomResDto; } public void removeFromChatRoomMap(Long memberId, WebSocketSession session) { diff --git a/src/main/java/com/campick/server/api/product/service/ProductService.java b/src/main/java/com/campick/server/api/product/service/ProductService.java index 2ec315a..5fdddf8 100644 --- a/src/main/java/com/campick/server/api/product/service/ProductService.java +++ b/src/main/java/com/campick/server/api/product/service/ProductService.java @@ -42,11 +42,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Random; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @@ -86,7 +82,6 @@ public Long createProduct(ProductCreateReqDto dto, Long memberId) { Random random = new Random(); Car car = cars.get(random.nextInt(cars.size())); - Member member = memberRepository.findById(memberId) .orElseThrow(() -> new BadRequestException(ErrorStatus.MEMBER_NOT_FOUND.getMessage())); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9630357..3a8825d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -13,7 +13,7 @@ spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #! TODO When Start Deploy must change this option 'create' to 'update' -spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=create spring.jpa.defer-datasource-initialization=true #spring.sql.init.mode=always spring.jpa.show-sql=true diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 03dfa94..c9dcab4 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -28,6 +28,9 @@ INSERT INTO model (type_id, model_name) VALUES ((SELECT type_id FROM `type` WHER -- TRUCK_CAMPER INSERT INTO model (type_id, model_name) VALUES ((SELECT type_id FROM `type` WHERE type_name = 'TRUCK_CAMPER'), '그외'); +-- ETC +INSERT INTO model (type_id, model_name) VALUES ((SELECT type_id FROM `type` WHERE type_name = 'ETC'), '기타'); + -- Engines INSERT INTO `engine` (feul_type, transmission, horse_power, fuel_efficiency) VALUES ('GASOLINE', 'MANUAL', 150, 10.0); INSERT INTO `engine` (feul_type, transmission, horse_power, fuel_efficiency) VALUES ('GASOLINE', 'AUTOMATIC', 150, 10.0);