Skip to content

Commit f35ddd4

Browse files
authored
Merge pull request #63 from CommitField/feat/#20
Feat: ์ฑ„ํŒ… ๋ฐฉ ์ƒ์„ฑ, ์ž…์žฅ, chatRoom ์ˆ˜์ •
2 parents c3a5d39 + 4275ea9 commit f35ddd4

File tree

20 files changed

+456
-28
lines changed

20 files changed

+456
-28
lines changed

โ€Žbuild.gradle.ktsโ€Ž

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ dependencies {
5959

6060
//Swagger
6161
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0")
62+
63+
//Web Socket
6264
implementation("org.java-websocket:Java-WebSocket:1.5.2")
65+
implementation ("org.springframework:spring-messaging")
6366

6467
// JWT
6568
implementation("io.jsonwebtoken:jjwt-api:0.12.6")
@@ -68,6 +71,11 @@ dependencies {
6871

6972
// WebClient
7073
implementation ("org.springframework.boot:spring-boot-starter-webflux")
74+
75+
// Spring Security OAuth2
76+
implementation ("org.springframework.security:spring-security-oauth2-client:6.4.2") // Or the version you're using
77+
implementation ("org.springframework.security:spring-security-oauth2-core:6.4.2") // Or the version you're using
78+
7179
}
7280

7381
tasks.withType<Test> {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package cmf.commitField.domain.chat.chatMessage.controller;
2+
3+
import cmf.commitField.domain.chat.chatMessage.entity.ChatMessage;
4+
import cmf.commitField.domain.chat.chatMessage.repository.ChatMessageRepository;
5+
import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
6+
import cmf.commitField.domain.chat.chatRoom.repository.ChatRoomRepository;
7+
import cmf.commitField.domain.user.entity.CustomOAuth2User;
8+
import cmf.commitField.domain.user.entity.User;
9+
import cmf.commitField.domain.user.repository.UserRepository;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.messaging.handler.annotation.MessageMapping;
12+
import org.springframework.messaging.simp.SimpMessagingTemplate;
13+
import org.springframework.security.core.Authentication;
14+
import org.springframework.security.core.context.SecurityContextHolder;
15+
import org.springframework.stereotype.Controller;
16+
17+
import java.util.Optional;
18+
19+
@Controller
20+
@RequiredArgsConstructor
21+
public class ChatController {
22+
23+
private final ChatMessageRepository chatMessageRepository;
24+
private final ChatRoomRepository chatRoomRepository;
25+
private final UserRepository userRepository;
26+
private final SimpMessagingTemplate messagingTemplate;
27+
28+
@MessageMapping("/chat.sendMessage") // ํด๋ผ์ด์–ธํŠธ์—์„œ "/app/chat.sendMessage"๋กœ ๋ณด๋‚ผ ๋•Œ ์ฒ˜๋ฆฌ๋จ
29+
public void sendMessage(ChatMessage chatMessage) {
30+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
31+
32+
if (authentication != null && authentication.isAuthenticated() &&
33+
authentication.getPrincipal() instanceof CustomOAuth2User) {
34+
35+
CustomOAuth2User oauth2User = (CustomOAuth2User) authentication.getPrincipal();
36+
Optional<User> userOptional = userRepository.findByUsername(oauth2User.getName());
37+
38+
if (userOptional.isPresent()) {
39+
User user = userOptional.get();
40+
Optional<ChatRoom> chatRoomOptional = chatRoomRepository.findById(chatMessage.getChatRoom().getId());
41+
42+
if (chatRoomOptional.isPresent()) {
43+
ChatRoom chatRoom = chatRoomOptional.get();
44+
chatMessage.setUser(user);
45+
chatMessage.setChatRoom(chatRoom);
46+
47+
ChatMessage savedMessage = chatMessageRepository.save(chatMessage);
48+
49+
// ์ฑ„ํŒ…๋ฐฉ ๊ตฌ๋…์ž๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „์†ก
50+
messagingTemplate.convertAndSend("/sub/chat/room/" + chatRoom.getId(), savedMessage);
51+
}
52+
}
53+
}
54+
}
55+
}

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatMessage/entity/ChatMessage.javaโ€Ž

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,20 @@
77
import jakarta.persistence.FetchType;
88
import jakarta.persistence.JoinColumn;
99
import jakarta.persistence.ManyToOne;
10-
import lombok.AllArgsConstructor;
11-
import lombok.Getter;
12-
import lombok.NoArgsConstructor;
10+
import lombok.*;
1311
import lombok.experimental.SuperBuilder;
1412

15-
import java.time.LocalDateTime;
16-
1713
@Entity
1814
@SuperBuilder
1915
@Getter
20-
@NoArgsConstructor
21-
@AllArgsConstructor
16+
@Setter
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
@AllArgsConstructor(access = AccessLevel.PROTECTED)
2219
public class ChatMessage extends BaseEntity {
2320

2421
private String message;
2522

26-
private LocalDateTime sendTime;
23+
// private LocalDateTime sendTime;
2724

2825
@ManyToOne(fetch = FetchType.LAZY)
2926
@JoinColumn(name = "user_id")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package cmf.commitField.domain.chat.chatMessage.repository;
2+
3+
import cmf.commitField.domain.chat.chatMessage.entity.ChatMessage;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
@Repository
8+
public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long> {
9+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package cmf.commitField.domain.chat.chatRoom.controller;
2+
3+
import cmf.commitField.domain.chat.chatRoom.controller.request.ChatRoomRequest;
4+
import cmf.commitField.domain.chat.chatRoom.service.ChatRoomService;
5+
import cmf.commitField.domain.user.entity.CustomOAuth2User;
6+
import cmf.commitField.global.globalDto.GlobalResponse;
7+
import jakarta.validation.Valid;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.security.core.Authentication;
10+
import org.springframework.security.core.context.SecurityContextHolder;
11+
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
12+
import org.springframework.web.bind.annotation.*;
13+
14+
@RestController
15+
@RequiredArgsConstructor
16+
@RequestMapping("/chat")
17+
public class ChatRoomController {
18+
private final ChatRoomService chatRoomService;
19+
20+
//์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ
21+
@PostMapping("/room")
22+
public GlobalResponse<Object> createRoom(
23+
@RequestBody @Valid ChatRoomRequest chatRoomRequest) {
24+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
25+
26+
if (authentication instanceof OAuth2AuthenticationToken) {
27+
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
28+
Long userId = principal.getId(); // getId()๋ฅผ ํ†ตํ•ด userId๋ฅผ ์ถ”์ถœ
29+
chatRoomService.createRoom(chatRoomRequest, userId); // userId๋ฅผ ์ „๋‹ฌ
30+
return GlobalResponse.success();
31+
} else {
32+
throw new IllegalArgumentException("User not logged in.");
33+
}
34+
}
35+
36+
//์ฑ„ํŒ…๋ฐฉ ์ž…์žฅ
37+
@PostMapping("/room/join/{roomId}")
38+
public GlobalResponse<Object> joinRoom(@PathVariable Long roomId) {
39+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
40+
41+
if (authentication instanceof OAuth2AuthenticationToken) {
42+
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
43+
Long userId = principal.getId(); // getId()๋ฅผ ํ†ตํ•ด userId๋ฅผ ์ถ”์ถœ
44+
chatRoomService.joinRoom(roomId, userId); // userId๋ฅผ ์ „๋‹ฌ
45+
return GlobalResponse.success();
46+
} else {
47+
throw new IllegalArgumentException("User not logged in.");
48+
}
49+
}
50+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package cmf.commitField.domain.chat.chatRoom.controller.request;
2+
3+
import jakarta.validation.constraints.Max;
4+
import jakarta.validation.constraints.NotEmpty;
5+
import jakarta.validation.constraints.NotNull;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import org.hibernate.validator.constraints.Length;
10+
11+
@Getter
12+
@AllArgsConstructor
13+
@NoArgsConstructor
14+
public class ChatRoomRequest {
15+
16+
@NotEmpty
17+
@Length(min = 2, max = 20)
18+
private String title;
19+
20+
@NotNull
21+
@Max(100)
22+
private Integer userCountMax;
23+
24+
25+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package cmf.commitField.domain.chat.chatRoom.controller.response;
2+
3+
public class ChatRoomResponse {
4+
}

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/entity/ChatRoom.javaโ€Ž

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,26 @@
55
import cmf.commitField.domain.user.entity.User;
66
import cmf.commitField.global.jpa.BaseEntity;
77
import jakarta.persistence.*;
8-
import lombok.AllArgsConstructor;
9-
import lombok.Getter;
10-
import lombok.NoArgsConstructor;
8+
import lombok.*;
119
import lombok.experimental.SuperBuilder;
1210

13-
import java.time.LocalDateTime;
1411
import java.util.List;
1512

1613
@Entity
1714
@SuperBuilder
1815
@Getter
19-
@NoArgsConstructor
20-
@AllArgsConstructor
16+
@Setter
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
@AllArgsConstructor(access = AccessLevel.PROTECTED)
2119
public class ChatRoom extends BaseEntity {
2220

2321
private String title;
22+
private String tier;
23+
private Long roomCreator;
24+
//์ตœ๋Œ€ ์ธ์› 100๋ช…
25+
private Integer userCountMax;
2426

25-
private LocalDateTime deletedAt;
27+
// private LocalDateTime deletedAt;
2628

2729
@ManyToOne(fetch = FetchType.LAZY)
2830
@JoinColumn(name = "user_id")
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package cmf.commitField.domain.chat.chatRoom.repository;
2+
3+
import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
4+
import jakarta.persistence.LockModeType;
5+
import jakarta.persistence.QueryHint;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Lock;
8+
import org.springframework.data.jpa.repository.QueryHints;
9+
import org.springframework.stereotype.Repository;
10+
11+
import java.util.Optional;
12+
13+
@Repository
14+
public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
15+
16+
@Lock(LockModeType.PESSIMISTIC_WRITE)
17+
@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="1000")})
18+
Optional<ChatRoom> findById(Long aLong);
19+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package cmf.commitField.domain.chat.chatRoom.service;
2+
3+
import cmf.commitField.domain.chat.chatRoom.controller.request.ChatRoomRequest;
4+
5+
public interface ChatRoomService {
6+
7+
void createRoom(ChatRoomRequest chatRoomRequest, Long userId); // userId๋ฅผ ๋ฐ›๋„๋ก ์ˆ˜์ •
8+
9+
void joinRoom(Long roomId, Long userId); // userId๋ฅผ ๋ฐ›๋„๋ก ์ˆ˜์ •
10+
}

0 commit comments

Comments
ย (0)