diff --git a/src/main/java/com/gachtaxi/domain/chat/entity/ChattingParticipant.java b/src/main/java/com/gachtaxi/domain/chat/entity/ChattingParticipant.java index 7cd81acd..7a488407 100644 --- a/src/main/java/com/gachtaxi/domain/chat/entity/ChattingParticipant.java +++ b/src/main/java/com/gachtaxi/domain/chat/entity/ChattingParticipant.java @@ -2,10 +2,7 @@ import com.gachtaxi.domain.members.entity.Members; import com.gachtaxi.global.common.entity.BaseEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; +import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -18,6 +15,12 @@ @Entity @SuperBuilder @NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table( + name = "chatting_participant", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"members_id", "chatting_room_id"}) + } +) public class ChattingParticipant extends BaseEntity { @ManyToOne diff --git a/src/main/java/com/gachtaxi/domain/chat/service/ChattingRoomService.java b/src/main/java/com/gachtaxi/domain/chat/service/ChattingRoomService.java index e5fa8eca..086dcb48 100644 --- a/src/main/java/com/gachtaxi/domain/chat/service/ChattingRoomService.java +++ b/src/main/java/com/gachtaxi/domain/chat/service/ChattingRoomService.java @@ -65,13 +65,13 @@ public ChattingRoomCountResponse getCount(Long memberId, Long roomId) { } @Transactional - public void subscribeChatRoom(long roomId, SimpMessageHeaderAccessor accessor) { + public void postSubscribeChatroom(SimpMessageHeaderAccessor accessor) { + Long roomId = (Long) accessor.getSessionAttributes().get(CHAT_ROOM_ID); Long senderId = (Long) accessor.getSessionAttributes().get(CHAT_USER_ID); ChattingRoom chattingRoom = find(roomId); Members members = memberService.findById(senderId); - accessor.getSessionAttributes().put(CHAT_ROOM_ID, roomId); accessor.getSessionAttributes().put(CHAT_USER_NAME, members.getNickname()); if (chattingParticipantService.checkSubscription(chattingRoom, members)) { diff --git a/src/main/java/com/gachtaxi/domain/chat/stomp/CustomChannelInterceptor.java b/src/main/java/com/gachtaxi/domain/chat/stomp/CustomChannelInterceptor.java index 7d5a5680..1c677513 100644 --- a/src/main/java/com/gachtaxi/domain/chat/stomp/CustomChannelInterceptor.java +++ b/src/main/java/com/gachtaxi/domain/chat/stomp/CustomChannelInterceptor.java @@ -19,4 +19,11 @@ public Message preSend(Message message, MessageChannel channel) { return chatStrategyHandler.handle(message, accessor, channel); } + + @Override + public void postSend(Message message, MessageChannel channel, boolean sent) { + StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message); + + chatStrategyHandler.handle(message, accessor, channel, sent); + } } diff --git a/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/ChatStrategyHandler.java b/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/ChatStrategyHandler.java index f93f593a..adb9ad8a 100644 --- a/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/ChatStrategyHandler.java +++ b/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/ChatStrategyHandler.java @@ -25,4 +25,14 @@ public Message handle(Message message, StompHeaderAccessor accessor, Messa .orElse(defaultCommandStrategy) .preSend(message, accessor, channel); } + + public void handle(Message message, StompHeaderAccessor accessor, MessageChannel channel, boolean sent) { + StompCommand command = accessor.getCommand(); + + stompCommandStrategies.stream() + .filter(strategy -> strategy.supports(command)) + .findFirst() + .orElse(defaultCommandStrategy) + .postSend(message, accessor, channel, sent); + } } diff --git a/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/StompCommandStrategy.java b/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/StompCommandStrategy.java index 2093bb4b..0f22f15c 100644 --- a/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/StompCommandStrategy.java +++ b/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/StompCommandStrategy.java @@ -10,4 +10,8 @@ public interface StompCommandStrategy { boolean supports(StompCommand command); Message preSend(Message message, StompHeaderAccessor accessor, MessageChannel channel); + + default void postSend(Message message, StompHeaderAccessor accessor, MessageChannel channel, boolean sent) { + + } } diff --git a/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/StompSubscribeStrategy.java b/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/StompSubscribeStrategy.java index 29f08b1f..96545832 100644 --- a/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/StompSubscribeStrategy.java +++ b/src/main/java/com/gachtaxi/domain/chat/stomp/strategy/StompSubscribeStrategy.java @@ -34,7 +34,7 @@ public Message preSend(Message message, StompHeaderAccessor accessor, Mess if (destination.startsWith(SUB_END_POINT)) { Long roomId = Long.valueOf(destination.replace(SUB_END_POINT, "")); - chattingRoomService.subscribeChatRoom(roomId, accessor); + accessor.getSessionAttributes().put(CHAT_ROOM_ID, roomId); return message; } @@ -45,5 +45,12 @@ public Message preSend(Message message, StompHeaderAccessor accessor, Mess throw new ChatSubscribeException(); } + + @Override + public void postSend(Message message, StompHeaderAccessor accessor, MessageChannel channel, boolean sent) { + if (sent) { + chattingRoomService.postSubscribeChatroom(accessor); + } + } } diff --git a/src/main/java/com/gachtaxi/global/config/WebSocketConfig.java b/src/main/java/com/gachtaxi/global/config/WebSocketConfig.java index 797132ed..41def4ab 100644 --- a/src/main/java/com/gachtaxi/global/config/WebSocketConfig.java +++ b/src/main/java/com/gachtaxi/global/config/WebSocketConfig.java @@ -25,8 +25,8 @@ public void registerStompEndpoints(StompEndpointRegistry registry) { registry .setErrorHandler(stompExceptionHandler) .addEndpoint("/ws") - .setAllowedOriginPatterns("http://localhost:3000"); -// .withSockJS(); + .setAllowedOriginPatterns("http://localhost:3000") + .withSockJS(); } @Override