diff --git a/src/main/java/com/golab/talk/config/WebSocketConfig.java b/src/main/java/com/golab/talk/config/WebSocketConfig.java index 54ed095..f970909 100644 --- a/src/main/java/com/golab/talk/config/WebSocketConfig.java +++ b/src/main/java/com/golab/talk/config/WebSocketConfig.java @@ -9,6 +9,7 @@ import com.golab.talk.repository.ChattingRepository; import com.golab.talk.repository.RoomRepository; import com.golab.talk.websocket.SocketHandler; +import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; @Configuration @EnableWebSocket @@ -21,7 +22,9 @@ public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { - registry.addHandler(new SocketHandler(roomRepository, chattingRepository), "/socket").setAllowedOrigins("*"); + registry.addHandler(new SocketHandler(roomRepository, chattingRepository), "/socket") + .addInterceptors(new HttpSessionHandshakeInterceptor()) + .setAllowedOrigins("*"); } } diff --git a/src/main/java/com/golab/talk/controller/ChattingController.java b/src/main/java/com/golab/talk/controller/ChattingController.java index ca50af6..287c985 100644 --- a/src/main/java/com/golab/talk/controller/ChattingController.java +++ b/src/main/java/com/golab/talk/controller/ChattingController.java @@ -2,6 +2,8 @@ import java.util.List; +import com.golab.talk.dto.ChattingListDto; +import com.golab.talk.dto.UserDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -13,6 +15,9 @@ import com.golab.talk.domain.Chatting; import com.golab.talk.service.ChattingService; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + @RestController @RequestMapping("/chatting") public class ChattingController { @@ -21,8 +26,8 @@ public class ChattingController { private ChattingService chattingService; @GetMapping("/{receiveUserId}") - public ResponseEntity> getChattingList(@PathVariable int receiveUserId) { - List list = chattingService.getChattingList(receiveUserId); + public ResponseEntity> getChattingList(@PathVariable int receiveUserId, HttpServletRequest request) { + List list = chattingService.getChattingList(receiveUserId, request); if (list != null) { return new ResponseEntity<>(list, HttpStatus.OK); @@ -30,4 +35,19 @@ public ResponseEntity> getChattingList(@PathVariable int receiveU return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } } + + //범석 추가 + // 왼쪽 채팅목록들 가져오기.. + @GetMapping("/") + public ResponseEntity> getList(HttpServletRequest request) { + HttpSession session = request.getSession(false); + if(session.getAttribute("loggedInUser")!=null) { + int id = ((UserDto) session.getAttribute("loggedInUser")).getId(); + List list = chattingService.getRoomList(id); + System.out.println(list.get(0).getRoom_id()); + return new ResponseEntity<>(list, HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } } diff --git a/src/main/java/com/golab/talk/controller/FriendController.java b/src/main/java/com/golab/talk/controller/FriendController.java index 0365076..d2f20ec 100644 --- a/src/main/java/com/golab/talk/controller/FriendController.java +++ b/src/main/java/com/golab/talk/controller/FriendController.java @@ -2,6 +2,7 @@ import java.util.List; +import com.golab.talk.dto.UserDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -16,6 +17,9 @@ import com.golab.talk.dto.FriendDto; import com.golab.talk.service.FriendService; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + @RestController @RequestMapping("/friend") public class FriendController { @@ -43,8 +47,15 @@ public ResponseEntity deleteFriendList(@RequestBody FriendDto friendDto) } } - @GetMapping("/{myId}") - public ResponseEntity> showFriendList(@PathVariable("myId") int myId) { +// @GetMapping("/{myId}") +// public ResponseEntity> showFriendList(@PathVariable("myId") int myId, + + @GetMapping("/") + public ResponseEntity> showFriendList(HttpServletRequest request) { + HttpSession session = request.getSession(false); + if(session == null) return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);; + UserDto a = (UserDto)session.getAttribute("loggedInUser"); + int myId = a.getId(); List list = friendService.showFriendList(myId); if (list != null) { diff --git a/src/main/java/com/golab/talk/controller/UserController.java b/src/main/java/com/golab/talk/controller/UserController.java index 381d08c..76f962a 100644 --- a/src/main/java/com/golab/talk/controller/UserController.java +++ b/src/main/java/com/golab/talk/controller/UserController.java @@ -93,7 +93,6 @@ public ResponseEntity login(@RequestBody LoginDto loginDto, HttpServletR // 로그인에 성공한 경우 "loggedInUser" 모델 속성에 유저 정보를 저장하고 세션에 저장 HttpSession session = request.getSession(); session.setAttribute("loggedInUser", loggedInUser); - UserDto a = (UserDto)session.getAttribute("loggedInUser"); return new ResponseEntity<>("로그인에 성공했습니다.", HttpStatus.OK); } else { return new ResponseEntity<>("로그인에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR); @@ -106,7 +105,7 @@ public ResponseEntity logout(HttpServletRequest request) { HttpSession session = request.getSession(false); // session이 null이 아니라는건 기존에 세션이 존재했었다는 뜻이므로 // 세션이 null이 아니라면 session.invalidate()로 세션 삭제해주기. - if(session != null) { + if(session.getAttribute("loggedInUser")!=null) { session.invalidate(); return new ResponseEntity<>("로그아웃 되었습니다.", HttpStatus.OK); } @@ -161,4 +160,14 @@ public boolean existSession(HttpServletRequest request) { // return new UserDto(); // } + @GetMapping("/id") + public ResponseEntity getId(HttpServletRequest request) { + Integer idValue = 0; + if(existSession(request)) { + idValue = Integer.valueOf(userService.getId(request)); + return new ResponseEntity<>(idValue,HttpStatus.OK); + } + else return new ResponseEntity<>(idValue,HttpStatus.INTERNAL_SERVER_ERROR); + } + } \ No newline at end of file diff --git a/src/main/java/com/golab/talk/domain/User.java b/src/main/java/com/golab/talk/domain/User.java index 9a4ecb7..9c7cb74 100644 --- a/src/main/java/com/golab/talk/domain/User.java +++ b/src/main/java/com/golab/talk/domain/User.java @@ -42,7 +42,8 @@ public class User { @Column(name = "UPDATED_AT") private String updatedAt; - public User(String userId, String name, String email, String password){ + public User(int id, String userId, String name, String email, String password){ + this.id = id; this.userId = userId; this.name = name; this.email = email; @@ -51,6 +52,7 @@ public User(String userId, String name, String email, String password){ public UserDto toDto() { return UserDto.builder() + .id(id) .userId(userId) .name(name) .email(email) diff --git a/src/main/java/com/golab/talk/dto/ChattingListDto.java b/src/main/java/com/golab/talk/dto/ChattingListDto.java new file mode 100644 index 0000000..454def2 --- /dev/null +++ b/src/main/java/com/golab/talk/dto/ChattingListDto.java @@ -0,0 +1,16 @@ +package com.golab.talk.dto; +// 범석 추가 +// projection으로 원하는 필드만 DB에서 가져오고 싶을 시, +// Dto를 interface로 선언해야하며 +// 가져올 필드명을 get + [필드명 그대로](단, 첫글자는 대문자로) 선언해야 한다. + +//import org.springframework.lang.Nullable; + + +public interface ChattingListDto { +// @Nullable + String getProfile_img_url(); + String getName(); + int getRoom_id(); + int getId(); +} diff --git a/src/main/java/com/golab/talk/dto/UserDto.java b/src/main/java/com/golab/talk/dto/UserDto.java index f66f109..f35de04 100644 --- a/src/main/java/com/golab/talk/dto/UserDto.java +++ b/src/main/java/com/golab/talk/dto/UserDto.java @@ -14,6 +14,7 @@ @AllArgsConstructor @NoArgsConstructor public class UserDto { + private int id; private String userId; private String name; private String email; @@ -27,5 +28,4 @@ public User toEntity() { .password(password) .build(); } - } \ No newline at end of file diff --git a/src/main/java/com/golab/talk/repository/ChattingRepository.java b/src/main/java/com/golab/talk/repository/ChattingRepository.java index 46728ce..a3eaf09 100644 --- a/src/main/java/com/golab/talk/repository/ChattingRepository.java +++ b/src/main/java/com/golab/talk/repository/ChattingRepository.java @@ -16,6 +16,11 @@ public interface ChattingRepository extends JpaRepository { List findByIdLessThanAndRoomIdOrderByIdDesc(int cursor, int roomId, Pageable pageable); + @Modifying + @Transactional + @Query(value = "update chatting set not_read=?3 where room_id=?1 and send_user_id=?2", nativeQuery = true) + int updateByRoomId(int roomId, int sendUserId, int notRead); + // Repository + Service + Controller 로직 정비 // 채팅 생성 -> {roomId, sendUserId, message, 1, datetime, datetime} @@ -42,8 +47,8 @@ public interface ChattingRepository extends JpaRepository { @Query(value = "select * from chatting where room_id=?1 order by id", nativeQuery = true) List getChattingListByRoomId(int roodId); - @Modifying - @Transactional - @Query(value = "update chatting set not_read=?3 where room_id=?1 and send_user_id=?2", nativeQuery = true) - int updateByRoomId(int roomId, int sendUserId, int notRead); +// @Modifying +// @Transactional +// @Query(value = "update chatting set not_read=?3 where room_id=?1 and send_user_id=?2", nativeQuery = true) +// int updateByRoomId(int roomId, int sendUserId, int notRead); } diff --git a/src/main/java/com/golab/talk/repository/ParticipantRepository.java b/src/main/java/com/golab/talk/repository/ParticipantRepository.java index 6b11f31..64afcd4 100644 --- a/src/main/java/com/golab/talk/repository/ParticipantRepository.java +++ b/src/main/java/com/golab/talk/repository/ParticipantRepository.java @@ -2,6 +2,7 @@ import java.util.List; +import com.golab.talk.dto.ChattingListDto; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @@ -23,4 +24,11 @@ public interface ParticipantRepository extends JpaRepository :userId", nativeQuery = true) + List getRoomByUserId(int userId); + } diff --git a/src/main/java/com/golab/talk/service/ChattingService.java b/src/main/java/com/golab/talk/service/ChattingService.java index c59aa76..0bf03ad 100644 --- a/src/main/java/com/golab/talk/service/ChattingService.java +++ b/src/main/java/com/golab/talk/service/ChattingService.java @@ -4,10 +4,9 @@ import com.golab.talk.domain.Chatting; import com.golab.talk.domain.Participant; -import com.golab.talk.dto.ChattingResponseDto; -import com.golab.talk.dto.ParticipantDto; -import com.golab.talk.dto.RoomDto; -import com.golab.talk.dto.RoomListResponseDto; +import com.golab.talk.dto.*; + +import javax.servlet.http.HttpServletRequest; public interface ChattingService { @@ -23,6 +22,9 @@ public interface ChattingService { Participant saveParticipant(Participant participant); - List getChattingList(int receiveUserId); + List getChattingList(int receiveUserId, HttpServletRequest request); + + //범석추가 + List getRoomList(int userId); } diff --git a/src/main/java/com/golab/talk/service/UserService.java b/src/main/java/com/golab/talk/service/UserService.java index b70263a..0afe741 100644 --- a/src/main/java/com/golab/talk/service/UserService.java +++ b/src/main/java/com/golab/talk/service/UserService.java @@ -26,4 +26,6 @@ public interface UserService { int updatePassword(String password, HttpServletRequest request); int updateName(String name, HttpServletRequest request); + + int getId(HttpServletRequest request); } \ No newline at end of file diff --git a/src/main/java/com/golab/talk/service/impl/ChattingServiceImpl.java b/src/main/java/com/golab/talk/service/impl/ChattingServiceImpl.java index d466b96..615dc79 100644 --- a/src/main/java/com/golab/talk/service/impl/ChattingServiceImpl.java +++ b/src/main/java/com/golab/talk/service/impl/ChattingServiceImpl.java @@ -3,6 +3,7 @@ import java.util.LinkedList; import java.util.List; +import com.golab.talk.dto.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -12,15 +13,14 @@ import com.golab.talk.domain.Chatting; import com.golab.talk.domain.Participant; import com.golab.talk.domain.Room; -import com.golab.talk.dto.ChattingResponseDto; -import com.golab.talk.dto.ParticipantDto; -import com.golab.talk.dto.RoomDto; -import com.golab.talk.dto.RoomListResponseDto; import com.golab.talk.repository.ChattingRepository; import com.golab.talk.repository.ParticipantRepository; import com.golab.talk.repository.RoomRepository; import com.golab.talk.service.ChattingService; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + @Service public class ChattingServiceImpl implements ChattingService { @@ -123,13 +123,14 @@ public Participant saveParticipant(Participant participant) { } @Override - public List getChattingList(int receiveUserId) { + public List getChattingList(int receiveUserId, HttpServletRequest request) { + int sendUserId = 1; // 임시로 1로 설정 + // session을 파싱하여 처리 - // int sendUserId = - // session.getAttributes().get("userId") != null ? - // Integer.parseInt(session.getAttributes().get("userId").toString()) : -1; + HttpSession session = request.getSession(false); + sendUserId = ((UserDto)session.getAttribute("loggedInUser")).getId(); + - int sendUserId = 1; // 임시로 1로 설정 String identifier = sendUserId < receiveUserId ? sendUserId + "-" + receiveUserId : receiveUserId + "-" + sendUserId; @@ -145,4 +146,9 @@ public List getChattingList(int receiveUserId) { return chattingRepository.getChattingListByRoomId(roomId); } + //범석 추가 + @Override + public List getRoomList(int userId) { + return participantRepository.getRoomByUserId(userId); + } } diff --git a/src/main/java/com/golab/talk/service/impl/UserServiceImpl.java b/src/main/java/com/golab/talk/service/impl/UserServiceImpl.java index 635b528..33c7592 100644 --- a/src/main/java/com/golab/talk/service/impl/UserServiceImpl.java +++ b/src/main/java/com/golab/talk/service/impl/UserServiceImpl.java @@ -104,4 +104,14 @@ public int updateName(String name, HttpServletRequest request) { } return check; } + + @Override + public int getId(HttpServletRequest request) { + int id = 0; + HttpSession session = request.getSession(false); + if(session!=null) { + id = ((UserDto) session.getAttribute("loggedInUser")).getId(); + } + return id; + } } \ No newline at end of file diff --git a/src/main/java/com/golab/talk/websocket/SocketHandler.java b/src/main/java/com/golab/talk/websocket/SocketHandler.java index f8bd775..945ba0b 100644 --- a/src/main/java/com/golab/talk/websocket/SocketHandler.java +++ b/src/main/java/com/golab/talk/websocket/SocketHandler.java @@ -3,6 +3,7 @@ import java.time.LocalDateTime; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; @@ -74,26 +75,26 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message) // session.getAttributes().get("userId") != null ? // Integer.parseInt(session.getAttributes().get("userId").toString()) : -1; - int sendUserId = 1; // 임시로 1로 설정 + Map map = (Map)session.getAttributes(); + UserDto loginInfo = (UserDto)map.get("loggedInUser"); + + int sendUserId = loginInfo.getId(); // 임시로 1로 설정 int receiveUserId = Integer.parseInt(receiveDto.getReceiveUserId()); + + System.out.println("sendUserId : "+sendUserId+"\nreceiveUserId : "+receiveUserId); String content = receiveDto.getMessage(); LocalDateTime currentDateTime = LocalDateTime.now(); + // 채팅방 update String identifier = sendUserId < receiveUserId ? sendUserId + "-" + receiveUserId : receiveUserId + "-" + sendUserId; + roomRepository.updateByIdentifier(content, currentDateTime, identifier); + + // 채팅 update int roomId = roomRepository.findByIdentifier(identifier).getId(); - if (receiveDto.getType().equals("chat")) { - // 채팅방 update - roomRepository.updateByIdentifier(content, currentDateTime, identifier); - - // 채팅 update - chattingRepository.insertByRoomId(roomId, sendUserId, content, 1); - } else { - // 읽음 처리(receiveUserId는 실제로 보낸 사람의 id(sendUserId)이다.(추후 수정할 예정)) - chattingRepository.updateByRoomId(roomId, receiveUserId, 0); - } + chattingRepository.insertByRoomId(roomId, sendUserId, content, 1); for (WebSocketSession currentSession : sessions) { if (currentSession == session) { @@ -108,8 +109,8 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message) continue; } - /* 세션 구현 전까지 막음(채팅방에 있는 유저 중 본인이 아닌 상대방 세션을 찾는 부분) - int currentUserId = Integer.parseInt(currentSession.getAttributes().get("userId").toString()); +// int currentUserId = Integer.parseInt(currentSession.getAttributes().get("userId").toString()); + int currentUserId = sendUserId; if (receiveUserId == currentUserId) { objectMapper = new ObjectMapper(); @@ -120,8 +121,7 @@ protected void handleTextMessage(WebSocketSession session, TextMessage message) List chatList = chattingRepository.getChattingListByRoomId(roomId); SocketSendDto sendDto = new SocketSendDto(roomList, chatList); currentSession.sendMessage(new TextMessage(objectMapper.writeValueAsString(sendDto))); - } */ + } } - } }