diff --git a/src/main/java/dev/pasinduog/eventsphere/config/WebSocketConfig.java b/src/main/java/dev/pasinduog/eventsphere/config/WebSocketConfig.java new file mode 100644 index 0000000..1b96dbc --- /dev/null +++ b/src/main/java/dev/pasinduog/eventsphere/config/WebSocketConfig.java @@ -0,0 +1,23 @@ +package dev.pasinduog.eventsphere.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/ws-event-chat").setAllowedOrigins("*"); + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + registry.setApplicationDestinationPrefixes("/app"); + registry.enableSimpleBroker("/topic"); + } +} diff --git a/src/main/java/dev/pasinduog/eventsphere/controller/ChatController.java b/src/main/java/dev/pasinduog/eventsphere/controller/ChatController.java new file mode 100644 index 0000000..63cb227 --- /dev/null +++ b/src/main/java/dev/pasinduog/eventsphere/controller/ChatController.java @@ -0,0 +1,22 @@ +package dev.pasinduog.eventsphere.controller; + +import dev.pasinduog.eventsphere.dto.ChatMessageRequest; +import dev.pasinduog.eventsphere.dto.ChatMessageResponse; +import dev.pasinduog.eventsphere.service.ChatMessageService; +import lombok.RequiredArgsConstructor; +import org.springframework.messaging.handler.annotation.DestinationVariable; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.stereotype.Controller; + +@Controller +@RequiredArgsConstructor +public class ChatController { + private final ChatMessageService chatMessageService; + + @MessageMapping("/chat/{eventId}") + @SendTo("/topic/events/{eventId}") + ChatMessageResponse sendMessage(@DestinationVariable String eventId, ChatMessageRequest request) { + return chatMessageService.saveMessage(eventId, request); + } +} diff --git a/src/main/java/dev/pasinduog/eventsphere/dto/ChatMessageRequest.java b/src/main/java/dev/pasinduog/eventsphere/dto/ChatMessageRequest.java new file mode 100644 index 0000000..e1d9716 --- /dev/null +++ b/src/main/java/dev/pasinduog/eventsphere/dto/ChatMessageRequest.java @@ -0,0 +1,4 @@ +package dev.pasinduog.eventsphere.dto; + +public record ChatMessageRequest(String senderId, String message) { +} diff --git a/src/main/java/dev/pasinduog/eventsphere/dto/ChatMessageResponse.java b/src/main/java/dev/pasinduog/eventsphere/dto/ChatMessageResponse.java new file mode 100644 index 0000000..1de436f --- /dev/null +++ b/src/main/java/dev/pasinduog/eventsphere/dto/ChatMessageResponse.java @@ -0,0 +1,6 @@ +package dev.pasinduog.eventsphere.dto; + +import java.time.LocalDateTime; + +public record ChatMessageResponse(String id, String eventId, String senderId, String message, LocalDateTime sentAt) { +} diff --git a/src/main/java/dev/pasinduog/eventsphere/repository/ChatMessageRepository.java b/src/main/java/dev/pasinduog/eventsphere/repository/ChatMessageRepository.java new file mode 100644 index 0000000..ad31f6e --- /dev/null +++ b/src/main/java/dev/pasinduog/eventsphere/repository/ChatMessageRepository.java @@ -0,0 +1,7 @@ +package dev.pasinduog.eventsphere.repository; + +import dev.pasinduog.eventsphere.dto.ChatMessageResponse; + +public interface ChatMessageRepository { + ChatMessageResponse saveMessage(String eventId, String senderId, String message); +} diff --git a/src/main/java/dev/pasinduog/eventsphere/repository/impl/ChatMessageRepositoryImpl.java b/src/main/java/dev/pasinduog/eventsphere/repository/impl/ChatMessageRepositoryImpl.java new file mode 100644 index 0000000..e4bd22c --- /dev/null +++ b/src/main/java/dev/pasinduog/eventsphere/repository/impl/ChatMessageRepositoryImpl.java @@ -0,0 +1,25 @@ +package dev.pasinduog.eventsphere.repository.impl; + +import dev.pasinduog.eventsphere.dto.ChatMessageResponse; +import dev.pasinduog.eventsphere.repository.ChatMessageRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Repository +@RequiredArgsConstructor +public class ChatMessageRepositoryImpl implements ChatMessageRepository { + private final JdbcTemplate jdbcTemplate; + + @Override + public ChatMessageResponse saveMessage(String eventId, String senderId, String message) { + String id = UUID.randomUUID().toString(); + LocalDateTime sentAt = LocalDateTime.now(); + String sql = "INSERT INTO chat_messages (id, event_id, sender_id, message, sent_at) VALUES (?,?,?,?,?)"; + jdbcTemplate.update(sql, id, eventId, senderId, message, sentAt); + return new ChatMessageResponse(id, eventId, senderId, message, sentAt); + } +} diff --git a/src/main/java/dev/pasinduog/eventsphere/service/ChatMessageService.java b/src/main/java/dev/pasinduog/eventsphere/service/ChatMessageService.java new file mode 100644 index 0000000..4354506 --- /dev/null +++ b/src/main/java/dev/pasinduog/eventsphere/service/ChatMessageService.java @@ -0,0 +1,8 @@ +package dev.pasinduog.eventsphere.service; + +import dev.pasinduog.eventsphere.dto.ChatMessageRequest; +import dev.pasinduog.eventsphere.dto.ChatMessageResponse; + +public interface ChatMessageService { + ChatMessageResponse saveMessage(String eventId, ChatMessageRequest request); +} diff --git a/src/main/java/dev/pasinduog/eventsphere/service/impl/ChatMessageServiceImpl.java b/src/main/java/dev/pasinduog/eventsphere/service/impl/ChatMessageServiceImpl.java new file mode 100644 index 0000000..5a6c8b3 --- /dev/null +++ b/src/main/java/dev/pasinduog/eventsphere/service/impl/ChatMessageServiceImpl.java @@ -0,0 +1,19 @@ +package dev.pasinduog.eventsphere.service.impl; + +import dev.pasinduog.eventsphere.dto.ChatMessageRequest; +import dev.pasinduog.eventsphere.dto.ChatMessageResponse; +import dev.pasinduog.eventsphere.repository.ChatMessageRepository; +import dev.pasinduog.eventsphere.service.ChatMessageService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ChatMessageServiceImpl implements ChatMessageService { + private final ChatMessageRepository chatMessageRepository; + + @Override + public ChatMessageResponse saveMessage(String eventId, ChatMessageRequest request) { + return chatMessageRepository.saveMessage(eventId, request.senderId(), request.message()); + } +}