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
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ public WebSocketHandler(WebSocketSessionService webSocketSessionService) {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
Long roomId = (Long) session.getAttributes().get("RoomId");
Long clientId = (Long) session.getAttributes().get("clientId");
String senderNickname = (String) session.getAttributes().get("senderNickname");
webSocketSessionService.addSession(roomId, senderNickname, session);
webSocketSessionService.addSession(roomId, clientId, senderNickname, session);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.goorm.team9.icontact.domain.chat.controller;

import com.goorm.team9.icontact.domain.chat.dto.request.ChatRequestCountDto;
import com.goorm.team9.icontact.domain.chat.dto.request.ChatRequestCreateDto;
import com.goorm.team9.icontact.domain.chat.dto.request.ChatRequestDto;
import com.goorm.team9.icontact.domain.chat.dto.request.ChatResponseDto;
import com.goorm.team9.icontact.domain.chat.entity.RequestStatus;
Expand Down Expand Up @@ -32,10 +33,10 @@ public ChatRequestController(ChatRoomService chatRoomService, ClientRepository c

@Operation(summary = "์ฑ„ํŒ… ์š”์ฒญ API", description = "์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ฑ„ํŒ…์„ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.")
@PostMapping
public ResponseEntity<ChatResponseDto> requestChat(@RequestBody ChatRequestDto requestDto) {
ClientEntity sender = clientRepository.findByNickName(requestDto.getSenderNickname())
public ResponseEntity<ChatResponseDto> requestChat(@RequestBody ChatRequestCreateDto requestDto) {
ClientEntity sender = clientRepository.findById(requestDto.getSenderId())
.orElseThrow(() -> new IllegalArgumentException("๋ฐœ์‹ ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));
ClientEntity receiver = clientRepository.findByNickName(requestDto.getReceiverNickname())
ClientEntity receiver = clientRepository.findById(requestDto.getReceiverId())
.orElseThrow(() -> new IllegalArgumentException("์ˆ˜์‹ ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));

return chatRequestService.requestChat(sender, receiver);
Expand Down Expand Up @@ -75,9 +76,13 @@ public ResponseEntity<List<ChatRequestDto>> getReceivedRequests(
@Operation(summary = "๋ณด๋‚ธ ์ฑ„ํŒ… ์š”์ฒญ ์กฐํšŒ API", description = "์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ์ฑ„ํŒ… ์š”์ฒญ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.")
@GetMapping("/sent")
public ResponseEntity<List<ChatRequestDto>> getSentRequests(
@RequestParam String senderNickname,
@RequestParam Long senderId,
@RequestParam RequestStatus status) {
List<ChatRequestDto> sentRequests = chatRequestService.getSentRequest(senderNickname, status);

ClientEntity sender = clientRepository.findById(senderId)
.orElseThrow(() -> new IllegalArgumentException("๋ฐœ์‹ ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));

List<ChatRequestDto> sentRequests = chatRequestService.getSentRequest(sender, status);
return ResponseEntity.ok(sentRequests);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,33 +71,31 @@ public ResponseEntity<Map<String, String>> enterChatRoom(

@Operation(summary = "์ตœ์‹  ๋ฉ”์‹œ์ง€ ์ˆœ์œผ๋กœ ์ฑ„ํŒ…๋ฐฉ ์กฐํšŒ", description = "ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ์ฐธ์—ฌํ•œ ์ฑ„ํŒ…๋ฐฉ์„ ์ตœ์‹  ๋ฉ”์‹œ์ง€ ์ˆœ์œผ๋กœ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.")
@GetMapping("/latest")
public ResponseEntity<List<ChatRoomResponseDto>> getLatestChatRooms(@RequestParam String nickname) {
public ResponseEntity<List<ChatRoomResponseDto>> getLatestChatRooms(@RequestParam Long clientId) {
try {
ClientEntity client = clientRepository.findByNickName(nickname)
ClientEntity client = clientRepository.findById(clientId)
.orElseThrow(() -> new IllegalArgumentException("์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));

List<ChatRoomResponseDto> chatRooms = chatRoomService.getLatestChatRooms(client);

return ResponseEntity.ok(chatRooms);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(null);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}

@Operation(summary = "์ฝ์ง€ ์•Š์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š” ์ฑ„ํŒ…๋ฐฉ ์กฐํšŒ", description = "ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ์ฐธ์—ฌํ•œ ์ฑ„ํŒ…๋ฐฉ ์ค‘ ์ตœ๊ทผ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฝ์ง€ ์•Š์€ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.")
@GetMapping("/unread")
public ResponseEntity<List<ChatRoomResponseDto>> getUnreadChatRooms(@RequestParam String nickname) {
public ResponseEntity<List<ChatRoomResponseDto>> getUnreadChatRooms(@RequestParam Long clientId) {
try {
ClientEntity client = clientRepository.findByNickName(nickname)
ClientEntity client = clientRepository.findById(clientId)
.orElseThrow(() -> new IllegalArgumentException("์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));

List<ChatRoomResponseDto> chatRooms = chatRoomService.getUnreadChatRooms(client);

return ResponseEntity.ok(chatRooms);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(null);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}

Expand Down Expand Up @@ -135,26 +133,23 @@ public ResponseEntity<Map<String, Long>> getUnreadMessageCount(
public ResponseEntity<Map<String, Object>> createChatRoom(@RequestBody ChatRoomRequestDto request) {
Map<String, Object> response = new HashMap<>();
try {
ClientEntity senderNickname = clientRepository.findByNickName(request.getSenderNickname())
ClientEntity sender = clientRepository.findById(request.getSenderId())
.orElseThrow(() -> new IllegalArgumentException("๋ฐœ์‹ ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));
ClientEntity receiverNickname = clientRepository.findByNickName(request.getReceiverNickname())
ClientEntity receiver = clientRepository.findById(request.getReceiverId())
.orElseThrow(() -> new IllegalArgumentException("์ˆ˜์‹ ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));

Long roomId = chatRoomService.createChatRoom(senderNickname, receiverNickname);
Long roomId = chatRoomService.createChatRoom(sender, receiver);

Map<String, Object> data = new HashMap<>();
data.put("roomId", roomId);
data.put("senderNickname", senderNickname.getNickName());
data.put("receiverNickname", receiverNickname.getNickName());
data.put("senderNickname", sender.getNickName());
data.put("receiverNickname", receiver.getNickName());

response.put("data", data);
response.put("message", "์ฑ„ํŒ…๋ฐฉ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
return ResponseEntity.ok(response);
} catch (IllegalArgumentException e) {
response.put("error", e.getMessage());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
} catch (Exception e) {
response.put("error", "์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");
response.put("error", e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.goorm.team9.icontact.domain.chat.dto.request;

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

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class ChatRequestCreateDto {

private Long senderId;
private Long receiverId;

}

Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
@AllArgsConstructor
public class ChatRoomRequestDto {

private String senderNickname;
private String receiverNickname;
private Long senderId;
private Long receiverId;

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.goorm.team9.icontact.domain.chat.entity.ChatMessage;
import com.goorm.team9.icontact.domain.chat.entity.ChatMessageType;
import com.goorm.team9.icontact.domain.client.entity.ClientEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -17,6 +18,7 @@ public class ChatMessageDto {

private Long messageId;
private Long roomId;
private Long senderId;
private String senderNickname;
private String content;
private ChatMessageType type;
Expand All @@ -26,7 +28,8 @@ public static ChatMessageDto fromEntity(ChatMessage chatMessage) {
return ChatMessageDto.builder()
.messageId(chatMessage.getId())
.roomId(chatMessage.getChatRoom().getRoomId())
.senderNickname(chatMessage.getSenderNickname())
.senderId(chatMessage.getSender().getId())
.senderNickname(chatMessage.getSender().getNickName())
.content(chatMessage.getContent())
.type(chatMessage.getType())
.timeStamp(chatMessage.getCreated_at())
Expand All @@ -42,6 +45,7 @@ public static ChatMessageDto createJoinMessage(Long roomId, String senderNicknam
.timeStamp(LocalDateTime.now())
.build();
}

public static ChatMessageDto createLeaveMessage(Long roomId, String senderNickname) {
return ChatMessageDto.builder()
.roomId(roomId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,30 @@ public class ChatRoomResponseDto {
private Long unreadCount;
private boolean exited;
private Long otherId;
private String otherUserNickname;

public static ChatRoomResponseDto fromEntity(ChatRoom chatRoom, Long unreadCount, boolean exited, Long myId) {
Long otherId = chatRoom.getSenderNickname().getId().equals(myId)
? chatRoom.getReceiverNickname().getId()
: chatRoom.getSenderNickname().getId();
boolean isSenderMe = chatRoom.getSender().getId().equals(myId);

Long otherId = isSenderMe
? chatRoom.getReceiver().getId()
: chatRoom.getSender().getId();

String otherUserNickname = isSenderMe
? chatRoom.getReceiver().getNickName()
: chatRoom.getSender().getNickName();

return new ChatRoomResponseDto(
chatRoom.getRoomId(),
List.of(chatRoom.getSenderNickname().getNickName(), chatRoom.getReceiverNickname().getNickName()),
List.of(chatRoom.getSender().getNickName(), chatRoom.getReceiver().getNickName()),
chatRoom.getLastMessage() != null ? chatRoom.getLastMessage() : "์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.",
chatRoom.getLastMessageTime(),
unreadCount,
exited,
otherId
otherId,
otherUserNickname
);
}

}

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.goorm.team9.icontact.domain.chat.entity;

import com.goorm.team9.icontact.domain.client.entity.ClientEntity;
import com.goorm.team9.icontact.domain.common.BaseTimeEntity;
import jakarta.persistence.*;
import lombok.AccessLevel;
Expand All @@ -8,7 +9,6 @@
import lombok.Getter;
import lombok.NoArgsConstructor;


@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
Expand All @@ -24,8 +24,9 @@ public class ChatMessage extends BaseTimeEntity {
@JoinColumn(name = "room_id", nullable = false)
private ChatRoom chatRoom;

@Column(name = "sender_nickname", nullable = false)
private String senderNickname;
@ManyToOne
@JoinColumn(name = "sender_id", nullable = false)
private ClientEntity sender;

@Column(nullable = false, length = 1000)
private String content;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,25 +34,15 @@ public class ChatRequest {
@JoinColumn(name = "receiver_id", nullable = false)
private ClientEntity receiver;

@Column(name = "sender_nickname", nullable = false)
private String senderNickname;

@Column(name = "receiver_nickname", nullable = false)
private String receiverNickname;

@Enumerated(EnumType.STRING)
private RequestStatus status;

public static ChatRequest create(ClientEntity senderNickname, ClientEntity receiverNickname) {
return new ChatRequest(senderNickname, receiverNickname);
}

public ChatRequest(ClientEntity sender, ClientEntity receiver) {
this.sender = sender;
this.receiver = receiver;
this.senderNickname = sender.getNickName();
this.receiverNickname = receiver.getNickName();
this.status = RequestStatus.PENDING;
public static ChatRequest create(ClientEntity sender, ClientEntity receiver) {
ChatRequest chatRequest = new ChatRequest();
chatRequest.sender = sender;
chatRequest.receiver = receiver;
chatRequest.status = RequestStatus.PENDING;
return chatRequest;
}

public void accept() {
Expand All @@ -62,5 +52,4 @@ public void accept() {
public void reject() {
this.status = RequestStatus.REJECTED;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ public class ChatRoom {
private Long roomId;

@ManyToOne
@JoinColumn(name = "sender_nickname", referencedColumnName = "nickName", nullable = false)
private ClientEntity senderNickname;
@JoinColumn(name = "sender_id", nullable = false)
private ClientEntity sender;

@ManyToOne
@JoinColumn(name = "receiver_nickname", referencedColumnName = "nickName", nullable = false)
private ClientEntity receiverNickname;
@JoinColumn(name = "receiver_id", nullable = false)
private ClientEntity receiver;

@Column(name = "last_message", length = 1000)
private String lastMessage;
Expand All @@ -49,16 +49,10 @@ public class ChatRoom {
@OneToMany(mappedBy = "chatRoom", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<ChatMessage> messages = new ArrayList<>();

@ElementCollection
@CollectionTable(name = "chat_room_exit_status", joinColumns = @JoinColumn(name = "room_id"))
@MapKeyColumn(name = "nickname")
@Column(name = "exit_status")
private Map<String, Boolean> exitStatus = new HashMap<>();

public static ChatRoom createChatRoom(ClientEntity sender, ClientEntity receiver) {
ChatRoom chatRoom = new ChatRoom();
chatRoom.setSenderNickname(sender);
chatRoom.setReceiverNickname(receiver);
chatRoom.setSender(sender);
chatRoom.setReceiver(receiver);
chatRoom.setLastMessage(null);
chatRoom.setLastMessageTime(null);
return chatRoom;
Expand All @@ -69,4 +63,4 @@ public void updateLastMessage(String lastMessage, LocalDateTime lastMessageTime)
this.lastMessageTime = lastMessageTime;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

Expand All @@ -17,7 +16,9 @@ public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long>

@Query("SELECT COUNT(m) FROM ChatMessage m " +
"WHERE m.chatRoom.roomId = :chatRoomId " +
"AND m.created_at > (SELECT cj.lastReadAt FROM ChatJoin cj WHERE cj.chatRoom.roomId = :chatRoomId AND cj.client.id = :clientId)")
"AND m.created_at > (" +
"SELECT cj.lastReadAt FROM ChatJoin cj " +
"WHERE cj.chatRoom.roomId = :chatRoomId AND cj.client.id = :clientId)")
long countUnreadMessages(@Param("chatRoomId") Long chatRoomId, @Param("clientId") Long clientId);

@Query("SELECT m FROM ChatMessage m WHERE m.chatRoom.roomId = :roomId ORDER BY m.created_at ASC")
Expand All @@ -26,7 +27,7 @@ public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long>
@Query("SELECT m FROM ChatMessage m " +
"WHERE m.chatRoom = :chatRoom " +
"AND m.isRead = false " +
"AND m.senderNickname <> :reader")
"AND m.sender <> :reader")
List<ChatMessage> findUnreadMessages(@Param("chatRoom") ChatRoom chatRoom,
@Param("reader") ClientEntity reader);

Expand All @@ -38,9 +39,7 @@ List<ChatMessage> findUnreadMessages(@Param("chatRoom") ChatRoom chatRoom,
"SET m.isRead = true " +
"WHERE m.chatRoom = :chatRoom " +
"AND m.isRead = false " +
"AND m.senderNickname <> :readerNickname")
"AND m.sender.nickName <> :readerNickname")
int markMessagesAsRead(@Param("chatRoom") ChatRoom chatRoom,
@Param("readerNickname") String readerNickname);


}
}
Loading