Skip to content

Commit 79970ee

Browse files
committed
[feat] : 채팅방을 닫을 수 있는 권한은 요청자나 응답자만 가질 수 있도록 인증 로직 추가 #44
1 parent 594b4b3 commit 79970ee

File tree

4 files changed

+30
-14
lines changed

4 files changed

+30
-14
lines changed

src/main/java/org/dfbf/soundlink/domain/chat/controller/ChatController.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22

33
import io.swagger.v3.oas.annotations.Operation;
44
import io.swagger.v3.oas.annotations.tags.Tag;
5-
import jakarta.servlet.http.HttpServletRequest;
65
import lombok.RequiredArgsConstructor;
7-
import org.dfbf.soundlink.domain.chat.entity.ChatRoom;
86
import org.dfbf.soundlink.domain.chat.service.ChatRoomService;
97
import org.dfbf.soundlink.global.exception.ResponseResult;
8+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
109
import org.springframework.web.bind.annotation.PostMapping;
1110
import org.springframework.web.bind.annotation.RequestMapping;
1211
import org.springframework.web.bind.annotation.RequestParam;
@@ -21,13 +20,13 @@ public class ChatController {
2120

2221
@PostMapping("/create")
2322
@Operation(summary = "채팅요청 시 채팅방 생성", description = "requestId, responseId 값 확인")
24-
public ResponseResult create(HttpServletRequest request, @RequestParam Long recordId) {
25-
return chatRoomService.createChatRoom(request,recordId);
23+
public ResponseResult create(@AuthenticationPrincipal Long userId, @RequestParam Long recordId) {
24+
return chatRoomService.createChatRoom(userId, recordId);
2625
}
2726

2827
@PostMapping("/close")
2928
@Operation(summary = "채팅방 닫기" , description="닫을 시 상태값 'close'변경, 레디스에서 삭제")
30-
public ResponseResult close(Long chatRoomId) {
31-
return chatRoomService.closeChatRoom(chatRoomId);
29+
public ResponseResult close(@AuthenticationPrincipal Long userId, Long chatRoomId) {
30+
return chatRoomService.closeChatRoom(userId, chatRoomId);
3231
}
3332
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.dfbf.soundlink.domain.chat.exception;
2+
3+
import org.dfbf.soundlink.global.exception.BusinessException;
4+
import org.dfbf.soundlink.global.exception.ErrorCode;
5+
6+
public class UnauthorizedAccessException extends BusinessException {
7+
public UnauthorizedAccessException() {
8+
super(ErrorCode.CHAT_UNAUTHORIZED);
9+
}
10+
}

src/main/java/org/dfbf/soundlink/domain/chat/service/ChatRoomService.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package org.dfbf.soundlink.domain.chat.service;
22

3-
import jakarta.servlet.http.HttpServletRequest;
43
import lombok.RequiredArgsConstructor;
54
import org.dfbf.soundlink.domain.chat.dto.ChatReqDto;
65
import org.dfbf.soundlink.domain.chat.entity.ChatRoom;
76
import org.dfbf.soundlink.domain.chat.exception.ChatRoomNotFoundException;
7+
import org.dfbf.soundlink.domain.chat.exception.UnauthorizedAccessException;
88
import org.dfbf.soundlink.domain.chat.repository.ChatRoomRepository;
99
import org.dfbf.soundlink.domain.emotionRecord.entity.EmotionRecord;
1010
import org.dfbf.soundlink.domain.emotionRecord.exception.EmotionRecordNotFoundException;
@@ -18,6 +18,7 @@
1818
import org.dfbf.soundlink.global.exception.ResponseResult;
1919
import org.springframework.dao.DataIntegrityViolationException;
2020
import org.springframework.data.redis.core.RedisTemplate;
21+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
2122
import org.springframework.stereotype.Service;
2223
import org.springframework.transaction.annotation.Transactional;
2324

@@ -31,14 +32,11 @@ public class ChatRoomService {
3132
private final UserRepository userRepository;
3233
private final EmotionRecordRepository emotionRecordRepository;
3334
private final RedisTemplate<String, String> redisTemplate;
34-
private final JwtProvider jwtProvider;
35+
3536

3637
@Transactional
37-
public ResponseResult createChatRoom(HttpServletRequest request, Long recordId){
38+
public ResponseResult createChatRoom(@AuthenticationPrincipal Long userId, Long recordId){
3839
try {
39-
String accessToken = jwtProvider.resolveAccessToken(request); //AT 추출
40-
Long userId = jwtProvider.getUserId(accessToken);
41-
4240
//요청 보내는사람
4341
User requestUserId = userRepository.findById(userId)
4442
.orElseThrow(UserNotFoundException::new);
@@ -65,7 +63,8 @@ public ResponseResult createChatRoom(HttpServletRequest request, Long recordId){
6563
redisTemplate.opsForValue().set("Room::"+chatRoom.getChatRoomId(), String.valueOf(chatReqDto));
6664

6765
return new ResponseResult(ErrorCode.SUCCESS, chatRoom);
68-
}catch (DataIntegrityViolationException e) {
66+
}
67+
catch (DataIntegrityViolationException e) {
6968
return new ResponseResult(ErrorCode.CHAT_FAILED, "채팅방 생성 실패: 이미 존재하는 데이터입니다."); // recordId 값 중복 시
7069
} catch (Exception e) {
7170
return new ResponseResult(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
@@ -75,10 +74,17 @@ public ResponseResult createChatRoom(HttpServletRequest request, Long recordId){
7574

7675
//채팅방 닫기
7776
@Transactional
78-
public ResponseResult closeChatRoom(Long chatRoomId) {
77+
public ResponseResult closeChatRoom(@AuthenticationPrincipal Long userId, Long chatRoomId) {
7978
try {
8079
ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId)
8180
.orElseThrow(ChatRoomNotFoundException::new);
81+
82+
//요청자 또는 응답자가 아니면 예외 처리
83+
if(!chatRoom.getRequestUserId().getUserId().equals(userId) &&
84+
!chatRoom.getRecordId().getUser().getUserId().equals(userId)) {
85+
throw new UnauthorizedAccessException();//권한이 없을 경우 예외 발생
86+
}
87+
8288
chatRoom.updateChatRoomStatus(RoomStatus.CLOSED); //삳태 '닫기'로 변경
8389
chatRoomRepository.save(chatRoom);//DB에 저장
8490

src/main/java/org/dfbf/soundlink/global/exception/ErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public enum ErrorCode {
5959
KAKAOPAY_APPROVE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "카카오페이 결제 승인 에러"),
6060

6161
//채팅방 관련 에러
62+
CHAT_UNAUTHORIZED(HttpStatus.FORBIDDEN,"권한이 없습니다"),
6263
CHATROOM_NOT_FOUND(HttpStatus.NOT_FOUND,"채팅방을 찾을 수 없습니다."),
6364
CHAT_FAILED(HttpStatus.INTERNAL_SERVER_ERROR,"서버 내부 에러. 중복된 레코드가 존재합니다.");
6465

0 commit comments

Comments
 (0)