Skip to content

Commit e7f8718

Browse files
authored
Merge branch 'dev' into feat/56
2 parents e43034d + 1e1b690 commit e7f8718

22 files changed

+634
-507
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.back.domain.chat.dm.controller;
2+
3+
public class PrivateChatWebSocketController {
4+
}

src/main/java/com/back/domain/chat/dto/ChatMessageDto.java

Lines changed: 0 additions & 51 deletions
This file was deleted.

src/main/java/com/back/domain/chat/dto/ChatPageResponse.java

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/main/java/com/back/domain/chat/controller/ChatApiController.java renamed to src/main/java/com/back/domain/chat/room/controller/RoomChatApiController.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package com.back.domain.chat.controller;
1+
package com.back.domain.chat.room.controller;
22

3-
import com.back.domain.chat.dto.ChatPageResponse;
4-
import com.back.domain.chat.service.ChatService;
3+
import com.back.domain.chat.room.dto.RoomChatPageResponse;
4+
import com.back.domain.chat.room.service.RoomChatService;
55
import com.back.global.common.dto.RsData;
66
import com.back.global.security.CustomUserDetails;
77
import io.swagger.v3.oas.annotations.Operation;
@@ -18,22 +18,22 @@
1818
@RestController
1919
@RequiredArgsConstructor
2020
@RequestMapping("/api")
21-
@Tag(name = "Chat API", description = "채팅 메시지 조회 관련 API")
22-
public class ChatApiController {
21+
@Tag(name = "RoomChat API", description = "스터디룸 채팅 메시지 조회 관련 API")
22+
public class RoomChatApiController {
2323

24-
private final ChatService chatService;
24+
private final RoomChatService roomChatService;
2525

2626
// 방 채팅 메시지 조회 (페이징, 특정 시간 이전 메시지)
2727
@GetMapping("/rooms/{roomId}/messages")
28-
@Operation(summary = "채팅방 메시지 목록 조회", description = "특정 채팅방의 이전 메시지 기록을 페이징하여 조회합니다.")
29-
public ResponseEntity<RsData<ChatPageResponse>> getRoomChatMessages(
28+
@Operation(summary = "스터디룸 채팅방 메시지 목록 조회", description = "특정 채팅방의 이전 메시지 기록을 페이징하여 조회합니다.")
29+
public ResponseEntity<RsData<RoomChatPageResponse>> getRoomChatMessages(
3030
@PathVariable Long roomId,
3131
@RequestParam(defaultValue = "0") int page,
3232
@RequestParam(defaultValue = "20") int size,
3333
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime before,
3434
@AuthenticationPrincipal CustomUserDetails userDetails) {
3535

36-
ChatPageResponse chatHistory = chatService.getRoomChatHistory(roomId, page, size, before);
36+
RoomChatPageResponse chatHistory = roomChatService.getRoomChatHistory(roomId, page, size, before);
3737

3838
return ResponseEntity
3939
.status(HttpStatus.OK)

src/main/java/com/back/domain/chat/controller/ChatWebSocketController.java renamed to src/main/java/com/back/domain/chat/room/controller/RoomChatWebSocketController.java

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package com.back.domain.chat.controller;
1+
package com.back.domain.chat.room.controller;
22

33
import com.back.domain.studyroom.entity.RoomChatMessage;
4-
import com.back.domain.chat.dto.ChatMessageDto;
4+
import com.back.domain.chat.room.dto.RoomChatMessageDto;
55
import com.back.global.security.CustomUserDetails;
66
import com.back.global.websocket.dto.WebSocketErrorResponse;
7-
import com.back.domain.chat.service.ChatService;
7+
import com.back.domain.chat.room.service.RoomChatService;
88
import io.swagger.v3.oas.annotations.tags.Tag;
99
import lombok.RequiredArgsConstructor;
1010
import org.springframework.messaging.handler.annotation.DestinationVariable;
@@ -18,10 +18,10 @@
1818

1919
@Controller
2020
@RequiredArgsConstructor
21-
@Tag(name = "Chat WebSocket", description = "STOMP를 이용한 실시간 채팅 WebSocket 컨트롤러 (Swagger에서 직접 테스트 불가)")
22-
public class ChatWebSocketController {
21+
@Tag(name = "RoomChat WebSocket", description = "STOMP를 이용한 실시간 채팅 WebSocket 컨트롤러 (Swagger에서 직접 테스트 불가)")
22+
public class RoomChatWebSocketController {
2323

24-
private final ChatService chatService;
24+
private final RoomChatService roomChatService;
2525
private final SimpMessagingTemplate messagingTemplate;
2626

2727
/**
@@ -35,7 +35,7 @@ public class ChatWebSocketController {
3535
*/
3636
@MessageMapping("/chat/room/{roomId}")
3737
public void handleRoomChat(@DestinationVariable Long roomId,
38-
ChatMessageDto chatMessage,
38+
RoomChatMessageDto chatMessage,
3939
SimpMessageHeaderAccessor headerAccessor,
4040
Principal principal) {
4141

@@ -51,25 +51,26 @@ public void handleRoomChat(@DestinationVariable Long roomId,
5151
String currentUserNickname = userDetails.getUsername();
5252

5353
// 메시지 정보 보완
54-
chatMessage.setRoomId(roomId);
55-
chatMessage.setUserId(currentUserId);
56-
chatMessage.setNickname(currentUserNickname);
54+
RoomChatMessageDto enrichedMessage = chatMessage
55+
.withRoomId(roomId)
56+
.withUserId(currentUserId)
57+
.withNickname(currentUserNickname);
5758

5859
// DB에 메시지 저장
59-
RoomChatMessage savedMessage = chatService.saveRoomChatMessage(chatMessage);
60+
RoomChatMessage savedMessage = roomChatService.saveRoomChatMessage(enrichedMessage);
6061

6162
// 저장된 메시지 정보로 응답 DTO 생성
62-
ChatMessageDto responseMessage = ChatMessageDto.builder()
63-
.messageId(savedMessage.getId())
64-
.roomId(roomId)
65-
.userId(savedMessage.getUser().getId())
66-
.nickname(savedMessage.getUser().getNickname())
67-
.profileImageUrl(savedMessage.getUser().getProfileImageUrl())
68-
.content(savedMessage.getContent())
69-
.messageType(chatMessage.getMessageType())
70-
.attachment(null) // 텍스트 채팅에서는 null
71-
.createdAt(savedMessage.getCreatedAt())
72-
.build();
63+
RoomChatMessageDto responseMessage = RoomChatMessageDto.createResponse(
64+
savedMessage.getId(),
65+
roomId,
66+
savedMessage.getUser().getId(),
67+
savedMessage.getUser().getNickname(),
68+
savedMessage.getUser().getProfileImageUrl(),
69+
savedMessage.getContent(),
70+
chatMessage.messageType(),
71+
null, // 텍스트 채팅에서는 null
72+
savedMessage.getCreatedAt()
73+
);
7374

7475
// 해당 방의 모든 구독자에게 브로드캐스트
7576
messagingTemplate.convertAndSend("/topic/room/" + roomId, responseMessage);
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.back.domain.chat.room.dto;
2+
3+
import java.time.LocalDateTime;
4+
5+
public record RoomChatMessageDto(
6+
// WebSocket Request
7+
String content,
8+
String messageType,
9+
Long attachmentId,
10+
11+
// WebSocket Response
12+
Long messageId,
13+
Long roomId,
14+
Long userId,
15+
String nickname,
16+
String profileImageUrl,
17+
AttachmentDto attachment,
18+
LocalDateTime createdAt
19+
) {
20+
21+
// 첨부파일 DTO (나중에 파일 기능 구현 시 사용)
22+
public record AttachmentDto(
23+
Long id,
24+
String originalName,
25+
String url,
26+
Long size,
27+
String mimeType
28+
) {}
29+
30+
// 텍스트 채팅 요청 생성 헬퍼
31+
public static RoomChatMessageDto createRequest(String content, String messageType) {
32+
return new RoomChatMessageDto(
33+
content,
34+
messageType,
35+
null, // attachmentId - 텍스트 채팅에서는 null
36+
null, // messageId
37+
null, // roomId
38+
null, // userId
39+
null, // nickname
40+
null, // profileImageUrl
41+
null, // attachment
42+
null // createdAt
43+
);
44+
}
45+
46+
// 필드 업데이트
47+
public RoomChatMessageDto withRoomId(Long roomId) {
48+
return new RoomChatMessageDto(content, messageType, attachmentId, messageId, roomId, userId, nickname, profileImageUrl, attachment, createdAt);
49+
}
50+
51+
public RoomChatMessageDto withUserId(Long userId) {
52+
return new RoomChatMessageDto(content, messageType, attachmentId, messageId, roomId, userId, nickname, profileImageUrl, attachment, createdAt);
53+
}
54+
55+
public RoomChatMessageDto withNickname(String nickname) {
56+
return new RoomChatMessageDto(content, messageType, attachmentId, messageId, roomId, userId, nickname, profileImageUrl, attachment, createdAt);
57+
}
58+
59+
// Response용 생성자
60+
public static RoomChatMessageDto createResponse(
61+
Long messageId, Long roomId, Long userId, String nickname,
62+
String profileImageUrl, String content, String messageType,
63+
AttachmentDto attachment, LocalDateTime createdAt) {
64+
return new RoomChatMessageDto(
65+
content, messageType, null, // attachmentId는 request용이므로 null
66+
messageId, roomId, userId, nickname, profileImageUrl, attachment, createdAt
67+
);
68+
}
69+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.back.domain.chat.room.dto;
2+
3+
import java.util.List;
4+
5+
public record RoomChatPageResponse(
6+
List<RoomChatMessageDto> content,
7+
PageableDto pageable,
8+
long totalElements
9+
) {
10+
11+
// 페이지 정보 DTO
12+
public record PageableDto(
13+
int page,
14+
int size,
15+
boolean hasNext
16+
) {}
17+
18+
// 페이지 응답 생성
19+
public static RoomChatPageResponse from(
20+
org.springframework.data.domain.Page<?> page,
21+
List<RoomChatMessageDto> convertedContent) {
22+
23+
return new RoomChatPageResponse(
24+
convertedContent,
25+
new PageableDto(
26+
page.getNumber(),
27+
page.getSize(),
28+
page.hasNext()
29+
),
30+
page.getTotalElements()
31+
);
32+
}
33+
34+
// 빈 페이지 응답 생성
35+
public static RoomChatPageResponse empty(int page, int size) {
36+
return new RoomChatPageResponse(
37+
List.of(),
38+
new PageableDto(page, size, false),
39+
0L
40+
);
41+
}
42+
43+
// 단일 페이지 응답 생성 (테스트용)
44+
public static RoomChatPageResponse of(List<RoomChatMessageDto> content,
45+
int page,
46+
int size,
47+
boolean hasNext,
48+
long totalElements) {
49+
return new RoomChatPageResponse(
50+
content,
51+
new PageableDto(page, size, hasNext),
52+
totalElements
53+
);
54+
}
55+
}

0 commit comments

Comments
 (0)