Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package cmf.commitField.domain.chat.chatMessage.controller;

import cmf.commitField.domain.chat.chatMessage.controller.request.ChatMsgRequest;
import cmf.commitField.domain.chat.chatMessage.controller.response.ChatMsgResponse;
import cmf.commitField.domain.chat.chatMessage.dto.ChatMsgDto;
import cmf.commitField.domain.chat.chatMessage.service.ChatMessageService;
import cmf.commitField.domain.user.entity.CustomOAuth2User;
import cmf.commitField.global.error.ErrorCode;
import cmf.commitField.global.globalDto.GlobalResponse;
import cmf.commitField.global.security.LoginCheck;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/chat")
public class ChatMessageController {

private final ChatMessageService chatMessageService;

@PostMapping("/msg/{roomId}")
@LoginCheck
public GlobalResponse<Object> sendChat(
@PathVariable Long roomId,
@RequestBody @Valid ChatMsgRequest message) {

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (!(authentication instanceof OAuth2AuthenticationToken)) {
return GlobalResponse.error(ErrorCode.NOT_AUTHENTICATED);
}

CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
Long userId = principal.getId(); // OAuth2 로그인한 유저의 ID 가져오기

if (message == null || message.getMessage().trim().isEmpty()) {
return GlobalResponse.error(ErrorCode.EMPTY_MESSAGE);
}

ChatMsgResponse response = chatMessageService.sendMessage(message, userId, roomId);
return GlobalResponse.success("채팅 메시지 보내기 성공", response);
}

@GetMapping("/msg/{roomId}")
@LoginCheck
public GlobalResponse<Object> getChatList(
@PathVariable Long roomId,
@RequestParam(required = false) Long lastId) {

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (!(authentication instanceof OAuth2AuthenticationToken)) {
return GlobalResponse.error(ErrorCode.NOT_AUTHENTICATED);
}

CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
Long userId = principal.getId(); // OAuth2 로그인한 유저의 ID 가져오기

List<ChatMsgDto> roomChatMsgList = chatMessageService.getRoomChatMsgList(roomId, userId, lastId);
if (roomChatMsgList == null || roomChatMsgList.isEmpty()) {
return GlobalResponse.error(ErrorCode.CHAT_NOT_FOUND);
}

return GlobalResponse.success("해당 채팅방의 메시지들을 조회하였습니다.", roomChatMsgList);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package cmf.commitField.domain.chat.chatMessage.controller.request;

import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class ChatMsgRequest {
@NotEmpty
@Length(max = 300)
private String message;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package cmf.commitField.domain.chat.chatMessage.controller.response;

import lombok.*;

import java.time.LocalDateTime;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ChatMsgResponse {
private Long roomId;
//사용자(user)
private String from;
private String message;
private LocalDateTime sendAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package cmf.commitField.domain.chat.chatMessage.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ChatMsgDto {
private Long chatMsgId;
private Long userId;
private String nickname;
private String message;
private LocalDateTime sendAt;
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ChatMessage extends BaseEntity {
public class ChatMsg extends BaseEntity {

private String message;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package cmf.commitField.domain.chat.chatMessage.repository;

import cmf.commitField.domain.chat.chatMessage.entity.ChatMsg;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ChatMessageCustomRepository {
List<ChatMsg> findChatRoomIdByChatMsg(Long chatMsg, Long lastId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package cmf.commitField.domain.chat.chatMessage.repository;

import cmf.commitField.domain.chat.chatMessage.entity.ChatMsg;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@RequiredArgsConstructor
public class ChatMessageCustomRepositoryImpl implements ChatMessageCustomRepository {

private final EntityManager entityManager;

@Override
public List<ChatMsg> findChatRoomIdByChatMsg(Long chatMsg, Long lastId) {
String first = "select c from ChatMsg c where c.chatRoom.id =: chatMsg order by c.id asc";
String paging = "select c from ChatMsg c where c.chatRoom.id =: chatMsg and c.id > :lastId order by c.id asc";

TypedQuery<ChatMsg> query = null;

if (lastId == null) {
query = entityManager
.createQuery(first, ChatMsg.class)
.setParameter("chatMsg", chatMsg);
} else {
query = entityManager
.createQuery(paging, ChatMsg.class)
.setParameter("chatMsg", chatMsg)
.setParameter("lastId", lastId);
}
return query
.setMaxResults(10)
.getResultList();
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package cmf.commitField.domain.chat.chatMessage.repository;

import cmf.commitField.domain.chat.chatMessage.entity.ChatMessage;
import cmf.commitField.domain.chat.chatMessage.entity.ChatMsg;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long> {
public interface ChatMessageRepository extends JpaRepository<ChatMsg, Long> {
void deleteChatMsgByChatRoom_Id(Long chatRoomId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package cmf.commitField.domain.chat.chatMessage.service;

import cmf.commitField.domain.chat.chatMessage.controller.request.ChatMsgRequest;
import cmf.commitField.domain.chat.chatMessage.controller.response.ChatMsgResponse;
import cmf.commitField.domain.chat.chatMessage.dto.ChatMsgDto;

import java.util.List;

public interface ChatMessageService {
ChatMsgResponse sendMessage(ChatMsgRequest message, Long userId, Long roomId);

List<ChatMsgDto> getRoomChatMsgList(Long roomId, Long userId, Long lastId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package cmf.commitField.domain.chat.chatMessage.service;

import cmf.commitField.domain.chat.chatMessage.controller.request.ChatMsgRequest;
import cmf.commitField.domain.chat.chatMessage.controller.response.ChatMsgResponse;
import cmf.commitField.domain.chat.chatMessage.dto.ChatMsgDto;
import cmf.commitField.domain.chat.chatMessage.entity.ChatMsg;
import cmf.commitField.domain.chat.chatMessage.repository.ChatMessageCustomRepository;
import cmf.commitField.domain.chat.chatMessage.repository.ChatMessageRepository;
import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
import cmf.commitField.domain.chat.chatRoom.repository.ChatRoomRepository;
import cmf.commitField.domain.user.entity.User;
import cmf.commitField.domain.user.repository.UserRepository;
import cmf.commitField.global.error.ErrorCode;
import cmf.commitField.global.exception.CustomException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class ChatMessageServiceImpl implements ChatMessageService {

private final ChatMessageRepository chatMessageRepository;
private final UserRepository userRepository;
private final ChatRoomRepository chatRoomRepository;
private final ChatMessageCustomRepository chatMessageCustomRepository;

@Override
public ChatMsgResponse sendMessage(ChatMsgRequest message, Long userId, Long roomId) {
User findUser = userRepository.findById(userId)
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));

ChatRoom chatRoom = chatRoomRepository.findChatRoomById(roomId)
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_ROOM));
// 채팅 메시지 생성
ChatMsg chatMsg = ChatMsg.builder()
.message(message.getMessage())
.createdAt(LocalDateTime.now())
.user(findUser)
.chatRoom(chatRoom)
.build();
// Response
ChatMsgResponse response = ChatMsgResponse.builder()
.roomId(roomId)
.from(findUser.getNickname())
.message(message.getMessage())
.sendAt(chatMsg.getCreatedAt())
.build();
chatMessageRepository.save(chatMsg);
return response;
}

@Transactional(readOnly = true)
@Override
public List<ChatMsgDto> getRoomChatMsgList(Long roomId, Long userId, Long lastId) {
userRepository.findById(userId)
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));

List<ChatMsg> chatMsgsList = chatMessageCustomRepository.findChatRoomIdByChatMsg(roomId, lastId);
return chatMsgsList.stream().map(chatMsg -> new ChatMsgDto(
chatMsg.getId(),
chatMsg.getUser().getId(),
chatMsg.getUser().getNickname(),
chatMsg.getMessage(),
chatMsg.getCreatedAt()
))
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public GlobalResponse<Object> getByUserRoomList(Pageable pageable) {
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
Long userId = principal.getId(); // getId()를 통해 userId를 추출

List<ChatRoomDto> userByRoomList = chatRoomService.getUserByRoomList(userId, pageable);
List<ChatRoomDto> userByRoomList = chatRoomService.roomsByCreatorUser(userId, pageable);

// 방 리스트가 비어 있으면 notFound 응답 반환
if (userByRoomList.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cmf.commitField.domain.chat.chatRoom.entity;

import cmf.commitField.domain.chat.chatMessage.entity.ChatMessage;
import cmf.commitField.domain.chat.chatMessage.entity.ChatMsg;
import cmf.commitField.domain.chat.userChatRoom.entity.UserChatRoom;
import cmf.commitField.domain.user.entity.User;
import cmf.commitField.global.jpa.BaseEntity;
Expand Down Expand Up @@ -34,7 +34,7 @@ public class ChatRoom extends BaseEntity {
private List<UserChatRoom> userChatRooms;

@OneToMany(mappedBy = "chatRoom", fetch = FetchType.LAZY)
private List<ChatMessage> chatMessages;
private List<ChatMsg> chatMsgs;

@Override
public String toString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,14 @@ public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="1000")})
Optional<ChatRoom> findById(Long aLong);

Optional<ChatRoom> findChatRoomById(Long id);

@Query("select c from ChatRoom c where c.roomCreator=:userId")
Page<ChatRoom> findAllByUserId(@Param("userId")Long userId,Pageable pageable);

Page<ChatRoom> findAllByUserChatRoomsUserId(Long userId,Pageable pageable);

@Query(value = "SELECT ROOM_CREATOR FROM chat_room WHERE ID = ?", nativeQuery = true)
Long findChatRoomByRoomCreator(Long roomId);
@Query(value = "SELECT ROOM_CREATOR FROM chat_room WHERE CHAT_ROOM_ID = ?", nativeQuery = true)
Optional<Long> findChatRoomIdByRoomId(@Param("roomId") Long roomId);

}
Loading