Skip to content

Commit a348fc1

Browse files
authored
Merge pull request #21 from 9ITHON/feat/chat
fix: 분실물 상태 정보 추가 및 채팅 로직 개선
2 parents 8a0eb2c + ac27c3f commit a348fc1

14 files changed

Lines changed: 208 additions & 55 deletions

File tree

src/main/java/_ITHON/ReturnZone/domain/chat/controller/ChatController.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22

33
import _ITHON.ReturnZone.domain.chat.dto.req.AddChatRoomRequestDto;
44
import _ITHON.ReturnZone.domain.chat.dto.res.ChatRoomResponseDto;
5+
import _ITHON.ReturnZone.domain.chat.dto.res.MessageContentResponseDto;
56
import _ITHON.ReturnZone.domain.chat.dto.res.MessageResponseDto;
67
import _ITHON.ReturnZone.domain.chat.service.ChatService;
8+
import _ITHON.ReturnZone.global.response.SliceResponse;
79
import io.swagger.v3.oas.annotations.Operation;
810
import io.swagger.v3.oas.annotations.media.Content;
911
import io.swagger.v3.oas.annotations.media.Schema;
1012
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1113
import io.swagger.v3.oas.annotations.tags.Tag;
1214
import lombok.RequiredArgsConstructor;
13-
import org.springframework.data.domain.Slice;
1415
import org.springframework.http.HttpStatus;
1516
import org.springframework.http.MediaType;
1617
import org.springframework.http.ResponseEntity;
@@ -34,8 +35,8 @@ public class ChatController {
3435
}
3536
)
3637
@GetMapping("/rooms")
37-
public ResponseEntity<Slice<ChatRoomResponseDto>> getChatRooms(@RequestHeader("X-USER-ID") Long myId,
38-
@RequestParam(defaultValue = "0") int page) {
38+
public ResponseEntity<SliceResponse<ChatRoomResponseDto>> getChatRooms(@RequestHeader("X-USER-ID") Long myId,
39+
@RequestParam(defaultValue = "0") int page) {
3940
return ResponseEntity.status(HttpStatus.OK).body(chatService.getChatRooms(myId, page));
4041
}
4142

@@ -48,8 +49,8 @@ public ResponseEntity<Slice<ChatRoomResponseDto>> getChatRooms(@RequestHeader("X
4849
}
4950
)
5051
@GetMapping("/rooms/{roomId}/messages")
51-
public ResponseEntity<Slice<MessageResponseDto>> getChats(@RequestHeader("X-USER-ID") Long myId, @PathVariable Long roomId,
52-
@RequestParam(defaultValue = "0") int page) {
52+
public ResponseEntity<MessageResponseDto> getChats(@RequestHeader("X-USER-ID") Long myId, @PathVariable Long roomId,
53+
@RequestParam(defaultValue = "0") int page) {
5354
return ResponseEntity.status(HttpStatus.OK).body(chatService.getChats(myId, roomId, page));
5455
}
5556

@@ -92,7 +93,7 @@ public ResponseEntity<Void> markRead(@RequestHeader("X-USER-ID") Long myId,
9293
}
9394

9495
@PostMapping(value = "/rooms/{roomId}/messages", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
95-
public ResponseEntity<MessageResponseDto> uploadMessage(
96+
public ResponseEntity<MessageContentResponseDto> uploadMessage(
9697
@PathVariable Long roomId,
9798
@RequestHeader("X-USER-ID") Long senderId,
9899
@RequestPart("image") MultipartFile imageFile) {

src/main/java/_ITHON/ReturnZone/domain/chat/controller/ChatWebSocketController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package _ITHON.ReturnZone.domain.chat.controller;
22

33
import _ITHON.ReturnZone.domain.chat.dto.req.SendMessageRequestDto;
4-
import _ITHON.ReturnZone.domain.chat.dto.res.MessageResponseDto;
4+
import _ITHON.ReturnZone.domain.chat.dto.res.MessageContentResponseDto;
55
import _ITHON.ReturnZone.domain.chat.service.ChatService;
66
import lombok.RequiredArgsConstructor;
77
import org.springframework.messaging.handler.annotation.MessageMapping;
@@ -24,9 +24,9 @@ public void handleMessage(SendMessageRequestDto request) {
2424
}
2525

2626
// 채팅 메시지 처리
27-
MessageResponseDto response = chatService.sendMessage(request.getRoomId(), request.getSenderId(), request.getContent(), null);
27+
MessageContentResponseDto response = chatService.sendMessage(request.getRoomId(), request.getSenderId(), request.getContent(), null);
2828

2929
// WebSocket을 통해 클라이언트에게 메시지 전송
30-
messagingTemplate.convertAndSend("/topic/chat/" + response.getRoomId(), response);
30+
messagingTemplate.convertAndSend("/topic/chat/" + request.getRoomId(), response);
3131
}
3232
}

src/main/java/_ITHON/ReturnZone/domain/chat/dto/req/AddChatRoomRequestDto.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@ public class AddChatRoomRequestDto {
1111

1212
@Schema(description = "채팅 상대 회원 ID", example = "17")
1313
private Long opponentId;
14+
15+
@Schema(description = "분실물 ID", example = "17")
16+
private Long lostPostId;
1417
}

src/main/java/_ITHON/ReturnZone/domain/chat/dto/res/ChatRoomResponseDto.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package _ITHON.ReturnZone.domain.chat.dto.res;
22

33
import _ITHON.ReturnZone.domain.chat.entity.ChatRoom;
4+
import _ITHON.ReturnZone.domain.lostpost.entity.Status;
45
import _ITHON.ReturnZone.domain.member.entity.Member;
56
import io.swagger.v3.oas.annotations.media.Schema;
67
import lombok.Builder;
@@ -33,14 +34,18 @@ public class ChatRoomResponseDto {
3334
@Schema(description = "읽지 않은 메시지 수", example = "3")
3435
private final int unreadCount;
3536

37+
@Schema(description = "분실물 상태", example = "주인 찾는 중")
38+
private final String lostPostStatus;
39+
3640
@Builder
37-
public ChatRoomResponseDto(ChatRoom chatRoom, Member otherMember, String lastMessage, int unreadCount) {
41+
public ChatRoomResponseDto(ChatRoom chatRoom, Member otherMember, String lastMessage, int unreadCount, Status lostPostStatus) {
3842
this.roomId = chatRoom.getId();
3943
this.otherMemberId = otherMember.getId();
4044
this.otherMemberNickname = otherMember.getNickname();
4145
this.otherMemberProfileImage = otherMember.getImageUrl();
4246
this.lastMessage = lastMessage;
4347
this.lastMessageAt = chatRoom.getLastMessageAt();
4448
this.unreadCount = unreadCount;
49+
this.lostPostStatus = lostPostStatus.getDescription();
4550
}
4651
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package _ITHON.ReturnZone.domain.chat.dto.res;
2+
3+
import _ITHON.ReturnZone.domain.chat.entity.Message;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
8+
import java.time.LocalDateTime;
9+
10+
@Getter
11+
@Schema(description = "채팅 내용 응답 DTO")
12+
public class MessageContentResponseDto {
13+
14+
@Schema(description = "채팅 메시지 Id", example = "1")
15+
private final Long messageId;
16+
17+
@Schema(description = "전송자 Id", example = "1")
18+
private final Long senderId;
19+
20+
@Schema(description = "채팅 내용", example = "안녕하세요!")
21+
private final String content;
22+
23+
@Schema(description = "채팅 이미지 URL")
24+
private final String imageUrl;
25+
26+
@Schema(description = "채팅 전송 시간", example = "2023-10-01T12:00:00")
27+
private final LocalDateTime createdAt;
28+
29+
@Builder
30+
private MessageContentResponseDto(Message message) {
31+
this.messageId = message.getId();
32+
this.senderId = message.getSenderId();
33+
this.content = message.getContent();
34+
this.imageUrl = message.getImageUrl();
35+
this.createdAt = message.getCreatedAt();
36+
}
37+
}
Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,32 @@
11
package _ITHON.ReturnZone.domain.chat.dto.res;
22

3-
import _ITHON.ReturnZone.domain.chat.entity.Message;
3+
import _ITHON.ReturnZone.domain.lostpost.dto.res.SimpleLostPostResponseDto;
4+
import _ITHON.ReturnZone.global.response.PageInfo;
45
import io.swagger.v3.oas.annotations.media.Schema;
56
import lombok.Builder;
67
import lombok.Getter;
7-
8-
import java.time.LocalDateTime;
8+
import org.springframework.data.domain.Slice;
99

1010
@Getter
11-
@Schema(description = "채팅 응답 DTO")
11+
@Schema(description = "채팅 정보 응답 DTO")
1212
public class MessageResponseDto {
1313

14-
@Schema(description = "채팅 메시지 Id", example = "1")
15-
private final Long messageId;
16-
1714
@Schema(description = "채팅방 Id", example = "1")
1815
private final Long roomId;
1916

20-
@Schema(description = "전송자 Id", example = "1")
21-
private final Long senderId;
22-
23-
@Schema(description = "채팅 내용", example = "안녕하세요!")
24-
private final String content;
17+
@Schema(description = "분실물 정보")
18+
private final SimpleLostPostResponseDto lostPost;
2519

26-
@Schema(description = "채팅 이미지 URL")
27-
private final String imageUrl;
20+
@Schema(description = "채팅 내용")
21+
private final Slice<MessageContentResponseDto> messages;
2822

29-
@Schema(description = "채팅 전송 시간", example = "2023-10-01T12:00:00")
30-
private final LocalDateTime createdAt;
23+
private final PageInfo page;
3124

3225
@Builder
33-
private MessageResponseDto(Message message) {
34-
this.messageId = message.getId();
35-
this.roomId = message.getChatRoomId();
36-
this.senderId = message.getSenderId();
37-
this.content = message.getContent();
38-
this.imageUrl = message.getImageUrl();
39-
this.createdAt = message.getCreatedAt();
26+
private MessageResponseDto(Long roomId, SimpleLostPostResponseDto lostPost, Slice<MessageContentResponseDto> messages, PageInfo page) {
27+
this.roomId = roomId;
28+
this.lostPost = lostPost;
29+
this.messages = messages;
30+
this.page = page;
4031
}
4132
}

src/main/java/_ITHON/ReturnZone/domain/chat/entity/ChatRoom.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ public class ChatRoom {
2424
@GeneratedValue(strategy = GenerationType.IDENTITY)
2525
private Long id;
2626

27+
@Column(name = "lost_post_id", nullable = false)
28+
private Long lostPostId;
29+
2730
@Column(name = "smaller_member_id", nullable = false)
2831
private Long smallerMemberId;
2932

@@ -39,7 +42,7 @@ public class ChatRoom {
3942
@Column(name = "last_read_at_greater")
4043
private LocalDateTime lastReadAtGreater;
4144

42-
public static ChatRoom of(Long aId, Long bId) {
45+
public static ChatRoom of(Long aId, Long bId, Long lostPostId) {
4346
ChatRoom room = new ChatRoom();
4447
if (aId < bId) {
4548
room.smallerMemberId = aId;
@@ -49,6 +52,7 @@ public static ChatRoom of(Long aId, Long bId) {
4952
room.greaterMemberId = aId;
5053
}
5154
room.lastMessageAt = LocalDateTime.now();
55+
room.lostPostId = lostPostId;
5256
return room;
5357
}
5458

src/main/java/_ITHON/ReturnZone/domain/chat/repository/MessageRepository.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import org.springframework.data.domain.Pageable;
55
import org.springframework.data.domain.Slice;
66
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Modifying;
78
import org.springframework.data.jpa.repository.Query;
89
import org.springframework.data.repository.query.Param;
10+
import org.springframework.transaction.annotation.Transactional;
911

1012
import java.time.LocalDateTime;
1113
import java.util.List;
@@ -32,4 +34,9 @@ WHERE chat_room_id IN (:roomIds)
3234
AND m1.created_at = x.maxCreated
3335
""", nativeQuery = true)
3436
List<Message> findLastMessages(@Param("roomIds") List<Long> roomIds);
37+
38+
@Modifying
39+
@Transactional
40+
@Query("delete from Message m where m.chatRoomId = :roomId")
41+
void deleteByChatRoomId(@Param("roomId") Long roomId);
3542
}

0 commit comments

Comments
 (0)