Skip to content

Commit 5603080

Browse files
authored
Merge branch 'dev' into fix-chat
2 parents 154d03c + cddfb81 commit 5603080

File tree

78 files changed

+1707
-456
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+1707
-456
lines changed

โ€Ž.gitignoreโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ docker-compose.yaml
7777
db/
7878
.docker
7979
data/
80+
.dummy
8081

8182
### secret ํ”„๋กœํ•„
8283
application-secret.yml

โ€Žbuild.gradle.ktsโ€Ž

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ dependencies {
4747

4848
//redis
4949
implementation("org.springframework.boot:spring-boot-starter-data-redis")
50+
implementation ("org.redisson:redisson-spring-boot-starter:3.42.0") // redis message broker(lock)
51+
implementation ("org.springframework.session:spring-session-data-redis")
52+
5053

5154
// Security
5255
implementation("org.springframework.boot:spring-boot-starter-security")
@@ -73,18 +76,6 @@ dependencies {
7376
// Spring Security OAuth2
7477
implementation ("org.springframework.security:spring-security-oauth2-client:6.4.2") // Or the version you're using
7578
implementation ("org.springframework.security:spring-security-oauth2-core:6.4.2") // Or the version you're using
76-
77-
// Spring Kafka
78-
implementation("org.springframework.kafka:spring-kafka")
79-
80-
// Kafka ํด๋ผ์ด์–ธํŠธ (Redpanda์™€ ํ˜ธํ™˜)
81-
implementation("org.apache.kafka:kafka-clients:3.6.0")
82-
83-
// JSON ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” (Kafka ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ)
84-
implementation("com.fasterxml.jackson.core:jackson-databind")
85-
86-
// ํ…Œ์ŠคํŠธ์šฉ Kafka ์ž„๋ฒ ๋””๋“œ ์„œ๋ฒ„ (์„ ํƒ ์‚ฌํ•ญ)
87-
testImplementation("org.springframework.kafka:spring-kafka-test")
8879
}
8980

9081
tasks.withType<Test> {

โ€Žsrc/main/java/cmf/commitField/CommitFieldApplication.javaโ€Ž

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
6+
import org.springframework.scheduling.annotation.EnableScheduling;
67

78
@SpringBootApplication
89
@EnableJpaAuditing
10+
// ์Šค์ผ€์ฅด๋ง ํ™œ์„ฑํ™”
11+
// ํ…Œ์ŠคํŠธ์‹œ์—๋งŒ ์ฃผ์„ ํ’€๊ธฐ
12+
@EnableScheduling
913
public class CommitFieldApplication {
10-
1114
public static void main(String[] args) {
1215
SpringApplication.run(CommitFieldApplication.class, args);
1316
}

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatMessage/dto/ChatMsgDto.javaโ€Ž

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
package cmf.commitField.domain.chat.chatMessage.dto;
22

3-
import lombok.AllArgsConstructor;
4-
import lombok.Getter;
5-
import lombok.NoArgsConstructor;
6-
import lombok.Setter;
3+
import lombok.*;
74

85
import java.time.LocalDateTime;
96

107
@Getter
118
@Setter
129
@NoArgsConstructor
1310
@AllArgsConstructor
11+
@Builder
1412
public class ChatMsgDto {
1513
private Long chatMsgId;
1614
private Long userId;

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatMessage/service/ChatMessageServiceImpl.javaโ€Ž

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import cmf.commitField.domain.chat.chatMessage.repository.ChatMessageRepository;
99
import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
1010
import cmf.commitField.domain.chat.chatRoom.repository.ChatRoomRepository;
11+
import cmf.commitField.domain.chat.userChatRoom.entity.UserChatRoom;
12+
import cmf.commitField.domain.chat.userChatRoom.repository.UserChatRoomRepository;
1113
import cmf.commitField.domain.user.entity.User;
1214
import cmf.commitField.domain.user.repository.UserRepository;
1315
import cmf.commitField.global.error.ErrorCode;
@@ -17,8 +19,9 @@
1719
import org.springframework.transaction.annotation.Transactional;
1820

1921
import java.time.LocalDateTime;
22+
import java.util.ArrayList;
2023
import java.util.List;
21-
import java.util.stream.Collectors;
24+
import java.util.Optional;
2225

2326
@Service
2427
@RequiredArgsConstructor
@@ -28,6 +31,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
2831
private final UserRepository userRepository;
2932
private final ChatRoomRepository chatRoomRepository;
3033
private final ChatMessageCustomRepository chatMessageCustomRepository;
34+
private final UserChatRoomRepository userChatRoomRepository;
3135

3236
@Override
3337
@Transactional
@@ -62,13 +66,24 @@ public List<ChatMsgDto> getRoomChatMsgList(Long roomId, Long userId, Long lastId
6266
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
6367

6468
List<ChatMsg> chatMsgsList = chatMessageCustomRepository.findChatRoomIdByChatMsg(roomId, lastId);
65-
return chatMsgsList.stream().map(chatMsg -> new ChatMsgDto(
66-
chatMsg.getId(),
67-
chatMsg.getUser().getId(),
68-
chatMsg.getUser().getNickname(),
69-
chatMsg.getMessage(),
70-
chatMsg.getCreatedAt()
71-
))
72-
.collect(Collectors.toList());
69+
Optional<UserChatRoom> joinUser = userChatRoomRepository.findByUserIdAndChatRoomId(userId,roomId);
70+
if (joinUser.isEmpty()) {
71+
throw new CustomException(ErrorCode.NOT_FOUND_USER);
72+
}
73+
LocalDateTime joinDt = joinUser.get().getJoinDt();
74+
List<ChatMsgDto> chatMsgDtos = new ArrayList<>();
75+
for (ChatMsg chatMsg : chatMsgsList) {
76+
ChatMsgDto build = ChatMsgDto.builder()
77+
.chatMsgId(chatMsg.getId())
78+
.nickname(chatMsg.getUser().getNickname())
79+
.sendAt(chatMsg.getCreatedAt())
80+
.message(chatMsg.getMessage())
81+
.userId(chatMsg.getUser().getId())
82+
.build();
83+
if (build.getSendAt().isAfter(joinDt)) {
84+
chatMsgDtos.add(build);
85+
}
86+
}
87+
return chatMsgDtos;
7388
}
7489
}

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/controller/ChatRoomController.javaโ€Ž

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package cmf.commitField.domain.chat.chatRoom.controller;
22

33
import cmf.commitField.domain.chat.chatRoom.controller.request.ChatRoomRequest;
4+
import cmf.commitField.domain.chat.chatRoom.controller.request.ChatRoomUpdateRequest;
45
import cmf.commitField.domain.chat.chatRoom.dto.ChatRoomDto;
6+
import cmf.commitField.domain.chat.chatRoom.dto.ChatRoomUserDto;
57
import cmf.commitField.domain.chat.chatRoom.service.ChatRoomService;
68
import cmf.commitField.domain.user.entity.CustomOAuth2User;
79
import cmf.commitField.global.error.ErrorCode;
@@ -11,6 +13,7 @@
1113
import lombok.RequiredArgsConstructor;
1214
import org.springframework.data.domain.Pageable;
1315
import org.springframework.security.core.Authentication;
16+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1417
import org.springframework.security.core.context.SecurityContextHolder;
1518
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
1619
import org.springframework.web.bind.annotation.*;
@@ -41,13 +44,13 @@ public GlobalResponse<Object> createRoom(
4144

4245
//์ฑ„ํŒ…๋ฐฉ ์ž…์žฅ
4346
@PostMapping("/room/join/{roomId}")
44-
public GlobalResponse<Object> joinRoom(@PathVariable Long roomId) {
47+
public GlobalResponse<Object> joinRoom(@PathVariable Long roomId, @RequestBody ChatRoomRequest chatRoomRequest) {
4548
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
4649

4750
if (authentication instanceof OAuth2AuthenticationToken) {
4851
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
4952
Long userId = principal.getId(); // getId()๋ฅผ ํ†ตํ•ด userId๋ฅผ ์ถ”์ถœ
50-
chatRoomService.joinRoom(roomId, userId); // userId๋ฅผ ์ „๋‹ฌ
53+
chatRoomService.joinRoom(roomId, userId, chatRoomRequest); // userId๋ฅผ ์ „๋‹ฌ
5154
return GlobalResponse.success("ํ•ด๋‹น ์ฑ„ํŒ…๋ฐฉ์— ์ž…์žฅํ•˜์…จ์Šต๋‹ˆ๋‹ค");
5255
} else {
5356
throw new IllegalArgumentException("๋กœ๊ทธ์ธ ํ›„์— ์ด์šฉํ•ด ์ฃผ์„ธ์š”.");
@@ -113,6 +116,24 @@ public GlobalResponse<Object> getByUserRoomPartList(Pageable pageable) {
113116
}
114117
}
115118

119+
//์ฑ„ํŒ…๋ฐฉ ์ œ๋ชฉ ์ˆ˜์ •
120+
@PutMapping("/room/update/{roomId}")
121+
@LoginCheck
122+
public GlobalResponse<Object> updateRoom(
123+
@PathVariable Long roomId,
124+
@RequestBody @Valid ChatRoomUpdateRequest chatRoomUpdateRequest) {
125+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
126+
127+
if (authentication instanceof OAuth2AuthenticationToken) {
128+
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
129+
Long userId = principal.getId(); // getId()๋ฅผ ํ†ตํ•ด userId๋ฅผ ์ถ”์ถœ
130+
chatRoomService.updateRoom(roomId, chatRoomUpdateRequest, userId); // userId๋ฅผ ์ „๋‹ฌ
131+
return GlobalResponse.success("์ฑ„ํŒ…๋ฐฉ์„ ์—…๋ฐ์ดํŠธ ํ–ˆ์Šต๋‹ˆ๋‹ค.");
132+
} else {
133+
throw new IllegalArgumentException("๋กœ๊ทธ์ธ ํ›„์— ์ด์šฉํ•ด ์ฃผ์„ธ์š”.");
134+
}
135+
}
136+
116137
// ์ฑ„ํŒ…๋ฐฉ ๋‚˜๊ฐ€๊ธฐ
117138
@DeleteMapping("/room/out/{roomId}")
118139
@LoginCheck
@@ -147,4 +168,53 @@ public GlobalResponse<Object> deleteRoom(
147168
}
148169
}
149170

171+
//์ฑ„ํŒ…๋ฐฉ ์œ ์ € ๋ชฉ๋ก ์กฐํšŒ
172+
@GetMapping("/room/users/{roomId}")
173+
@LoginCheck
174+
public GlobalResponse<Object> getRoomUsers(
175+
@PathVariable Long roomId) {
176+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
177+
178+
if (authentication instanceof OAuth2AuthenticationToken) {
179+
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
180+
Long userId = principal.getId(); // Extract userId from the principal
181+
List<ChatRoomUserDto> roomUsers = chatRoomService.getRoomUsers(roomId, userId);
182+
return GlobalResponse.success(roomUsers);
183+
} else {
184+
throw new IllegalArgumentException("๋กœ๊ทธ์ธ ํ›„์— ์ด์šฉํ•ด ์ฃผ์„ธ์š”.");
185+
}
186+
}
187+
188+
// ์ „์ฒด ๋ฆฌ์ŠคํŠธ์—์„œ ์ข‹์•„์š” ์ˆœ์œผ๋กœ ์ •๋ ฌ
189+
@GetMapping("/room/heart")
190+
@LoginCheck
191+
public GlobalResponse<Object> roomHeartSort(Pageable pageable) {
192+
List<ChatRoomDto> roomList = chatRoomService.getRoomHeartSortList(pageable);
193+
if (roomList.isEmpty()) {
194+
return GlobalResponse.error(ErrorCode.NO_ROOM);
195+
} else {
196+
return GlobalResponse.success(roomList);
197+
}
198+
}
199+
200+
// ์‚ฌ์šฉ์ž(์ž์‹ )๊ฐ€ ์ข‹์•„์š” ๋ˆ„๋ฅธ ๋ฐฉ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ
201+
@GetMapping("/room/myHeart/list")
202+
@LoginCheck
203+
public GlobalResponse<Object> getMyHeartRoomList(
204+
Pageable pageable,
205+
@AuthenticationPrincipal CustomOAuth2User principal) { // ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ฃผ์ž…
206+
207+
Long userId = principal.getId(); // ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž ID ๊ฐ€์ ธ์˜ค๊ธฐ
208+
List<ChatRoomDto> list = chatRoomService.myHeartRoomList(userId, pageable);
209+
210+
if (list.isEmpty()) {
211+
return GlobalResponse.error(ErrorCode.NO_ROOM_FOUND);
212+
}
213+
return GlobalResponse.success("์ข‹์•„์š” ๋ˆ„๋ฅธ ์ฑ„ํŒ…๋ฐฉ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ ์™„๋ฃŒ", list);
214+
}
215+
216+
217+
218+
219+
150220
}

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/controller/request/ChatRoomRequest.javaโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,7 @@ public class ChatRoomRequest {
2121
@Max(100)
2222
private Integer userCountMax;
2323

24+
@Length(min = 4, max = 20)
25+
private String password;
2426

2527
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package cmf.commitField.domain.chat.chatRoom.controller.request;
2+
3+
import jakarta.validation.constraints.NotEmpty;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import org.hibernate.validator.constraints.Length;
8+
9+
@Getter
10+
@AllArgsConstructor
11+
@NoArgsConstructor
12+
public class ChatRoomUpdateRequest {
13+
@NotEmpty
14+
@Length(min = 2, max = 20)
15+
private String title;
16+
}

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/dto/ChatRoomDto.javaโ€Ž

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cmf.commitField.domain.chat.chatRoom.dto;
22

3+
import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
34
import lombok.*;
45

56
@Getter
@@ -15,4 +16,16 @@ public class ChatRoomDto {
1516
private Long currentUserCount;
1617

1718
private Integer userCountMax;
19+
20+
private Integer heartCount;
21+
22+
public static ChatRoomDto of(ChatRoom chatRoom) {
23+
return ChatRoomDto.builder()
24+
.id(chatRoom.getId())
25+
.title(chatRoom.getTitle())
26+
.currentUserCount((long) chatRoom.getUserChatRooms().size())
27+
.userCountMax(chatRoom.getUserCountMax())
28+
.heartCount(chatRoom.getHearts().size())
29+
.build();
30+
}
1831
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package cmf.commitField.domain.chat.chatRoom.dto;
2+
3+
import lombok.*;
4+
5+
@Getter
6+
@Setter
7+
@NoArgsConstructor
8+
@AllArgsConstructor
9+
@Builder
10+
public class ChatRoomUserDto {
11+
private String nickname;
12+
private Boolean status;
13+
}

0 commit comments

Comments
ย (0)