Skip to content
Snippets Groups Projects
Commit 131fc9ea authored by Hoai Viet Nguyen's avatar Hoai Viet Nguyen
Browse files

implement functionality which make chat messages persistent

parent 26e8e691
No related branches found
No related tags found
No related merge requests found
...@@ -27,6 +27,7 @@ dependencies { ...@@ -27,6 +27,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-validation'
testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.json:org.json:chargebee-1.0'
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit5' testImplementation 'org.jetbrains.kotlin:kotlin-test-junit5'
developmentOnly 'org.springframework.boot:spring-boot-devtools' developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.h2database:h2' runtimeOnly 'com.h2database:h2'
......
...@@ -3,6 +3,8 @@ package de.thk.gm.websocketsdemo.configs ...@@ -3,6 +3,8 @@ package de.thk.gm.websocketsdemo.configs
import de.thk.gm.websocketsdemo.handlers.ChatRoomsHandler import de.thk.gm.websocketsdemo.handlers.ChatRoomsHandler
import de.thk.gm.websocketsdemo.handlers.EchoHandler import de.thk.gm.websocketsdemo.handlers.EchoHandler
import de.thk.gm.websocketsdemo.handlers.SimpleChatHandler import de.thk.gm.websocketsdemo.handlers.SimpleChatHandler
import de.thk.gm.websocketsdemo.services.ChatMessageService
import de.thk.gm.websocketsdemo.services.ChatRoomsService
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.web.socket.WebSocketHandler import org.springframework.web.socket.WebSocketHandler
import org.springframework.web.socket.config.annotation.EnableWebSocket import org.springframework.web.socket.config.annotation.EnableWebSocket
...@@ -11,10 +13,10 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry ...@@ -11,10 +13,10 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry
@Configuration @Configuration
@EnableWebSocket @EnableWebSocket
class WebSocketsConfig(): WebSocketConfigurer { class WebSocketsConfig(private val chatMessageService: ChatMessageService, private val chatRoomsService: ChatRoomsService): WebSocketConfigurer {
override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) { override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) {
registry.addHandler(EchoHandler(), "/echo").setAllowedOrigins("*") registry.addHandler(EchoHandler(), "/echo").setAllowedOrigins("*")
registry.addHandler(SimpleChatHandler(), "/chat") registry.addHandler(SimpleChatHandler(), "/chat")
registry.addHandler(ChatRoomsHandler(),"/rooms") registry.addHandler(ChatRoomsHandler(chatRoomsService, chatMessageService),"/rooms")
} }
} }
\ No newline at end of file
...@@ -2,6 +2,7 @@ package de.thk.gm.websocketsdemo.controllers ...@@ -2,6 +2,7 @@ package de.thk.gm.websocketsdemo.controllers
import de.thk.gm.websocketsdemo.dtos.ChatRoomDto import de.thk.gm.websocketsdemo.dtos.ChatRoomDto
import de.thk.gm.websocketsdemo.models.ChatRoom import de.thk.gm.websocketsdemo.models.ChatRoom
import de.thk.gm.websocketsdemo.services.ChatMessageService
import de.thk.gm.websocketsdemo.services.ChatRoomsService import de.thk.gm.websocketsdemo.services.ChatRoomsService
import org.springframework.stereotype.Controller import org.springframework.stereotype.Controller
import org.springframework.ui.Model import org.springframework.ui.Model
...@@ -10,7 +11,7 @@ import java.util.* ...@@ -10,7 +11,7 @@ import java.util.*
@Controller @Controller
@RequestMapping("/chatrooms") @RequestMapping("/chatrooms")
class ChatRoomsController (private val chatRoomsService: ChatRoomsService) { class ChatRoomsController (private val chatRoomsService: ChatRoomsService, private val chatMessageService: ChatMessageService) {
@GetMapping @GetMapping
fun getChatRooms(model: Model): String { fun getChatRooms(model: Model): String {
...@@ -28,8 +29,11 @@ class ChatRoomsController (private val chatRoomsService: ChatRoomsService) { ...@@ -28,8 +29,11 @@ class ChatRoomsController (private val chatRoomsService: ChatRoomsService) {
@GetMapping("/{id}") @GetMapping("/{id}")
fun getChatRoom(@PathVariable("id") id: UUID, model: Model): String { fun getChatRoom(@PathVariable("id") id: UUID, model: Model): String {
var chatRoom = chatRoomsService.getChatRoomById(id) var chatRoom = chatRoomsService.getChatRoomById(id)
var chatMessages = chatMessageService.getChatMessagesByChatRoomId(id)
model.addAttribute("chatRoom", chatRoom) model.addAttribute("chatRoom", chatRoom)
model.addAttribute("chatMessages", chatMessages)
return "chatRooms/showChatRoom" return "chatRooms/showChatRoom"
} }
} }
\ No newline at end of file
package de.thk.gm.websocketsdemo.handlers package de.thk.gm.websocketsdemo.handlers
import de.thk.gm.websocketsdemo.models.ChatMessage
import de.thk.gm.websocketsdemo.services.ChatMessageService
import de.thk.gm.websocketsdemo.services.ChatRoomsService
import org.json.JSONObject
import org.springframework.web.socket.CloseStatus import org.springframework.web.socket.CloseStatus
import org.springframework.web.socket.TextMessage import org.springframework.web.socket.TextMessage
import org.springframework.web.socket.WebSocketSession import org.springframework.web.socket.WebSocketSession
import org.springframework.web.socket.handler.TextWebSocketHandler import org.springframework.web.socket.handler.TextWebSocketHandler
import org.springframework.web.util.UriComponents import org.springframework.web.util.UriComponents
import org.springframework.web.util.UriComponentsBuilder import org.springframework.web.util.UriComponentsBuilder
import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.HashMap
class ChatRoomsHandler : TextWebSocketHandler() { class ChatRoomsHandler (private val chatRoomsService: ChatRoomsService, private val chatMessageService: ChatMessageService) : TextWebSocketHandler() {
private val hashMapOfSessions : HashMap<String, ArrayList<WebSocketSession>> = HashMap() private val hashMapOfSessions : HashMap<String, ArrayList<WebSocketSession>> = HashMap()
override fun afterConnectionEstablished(session: WebSocketSession) { override fun afterConnectionEstablished(session: WebSocketSession) {
var uri : UriComponents = UriComponentsBuilder.fromUri(session.uri!!).build() var uri : UriComponents = UriComponentsBuilder.fromUri(session.uri!!).build()
...@@ -26,6 +33,15 @@ class ChatRoomsHandler : TextWebSocketHandler() { ...@@ -26,6 +33,15 @@ class ChatRoomsHandler : TextWebSocketHandler() {
var uri : UriComponents = UriComponentsBuilder.fromUri(session.uri!!).build() var uri : UriComponents = UriComponentsBuilder.fromUri(session.uri!!).build()
var id = uri.queryParams.getFirst("id") var id = uri.queryParams.getFirst("id")
var sessions = hashMapOfSessions[id] var sessions = hashMapOfSessions[id]
val chatMessageJSONObject = JSONObject(message.payload)
val chatRoom = chatRoomsService.getChatRoomById(UUID.fromString(id));
val chatMessage = ChatMessage()
chatMessage.chatRoom = chatRoom
chatMessage.text = chatMessageJSONObject.getString("text")
chatMessage.username = chatMessageJSONObject.getString("username")
chatMessageService.save(chatMessage)
if(sessions != null) { if(sessions != null) {
for (chatSession in sessions) { for (chatSession in sessions) {
chatSession.sendMessage(message) chatSession.sendMessage(message)
......
package de.thk.gm.websocketsdemo.models
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.ManyToOne
import java.util.*
@Entity
class ChatMessage {
@Id
val id: UUID = UUID.randomUUID()
var username: String? = null
var text: String? = null
var createdAt: Date = Date()
@ManyToOne
var chatRoom: ChatRoom? = null
}
\ No newline at end of file
package de.thk.gm.websocketsdemo.repositories
import de.thk.gm.websocketsdemo.models.ChatMessage
import de.thk.gm.websocketsdemo.models.ChatRoom
import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository
import java.util.*
@Repository
interface ChatMessageRepository : CrudRepository<ChatMessage, UUID> {
fun findChatMessagesByChatRoomOrderByCreatedAt(chatRoom: ChatRoom): List<ChatMessage>
}
\ No newline at end of file
package de.thk.gm.websocketsdemo.services
import de.thk.gm.websocketsdemo.models.ChatMessage
import java.util.*
interface ChatMessageService {
fun getChatMessagesByChatRoomId(roomId: UUID): List<ChatMessage>
fun save(chatMessage: ChatMessage)
}
\ No newline at end of file
package de.thk.gm.websocketsdemo.services
import de.thk.gm.websocketsdemo.models.ChatMessage
import de.thk.gm.websocketsdemo.repositories.ChatMessageRepository
import de.thk.gm.websocketsdemo.repositories.ChatRoomsRepository
import org.springframework.stereotype.Service
import java.util.*
@Service
class ChatMessageServiceImpl (private val chatMessageRepository: ChatMessageRepository, private val chatRoomsRepository: ChatRoomsRepository) : ChatMessageService {
override fun getChatMessagesByChatRoomId(roomId: UUID): List<ChatMessage> {
val chatRoom = chatRoomsRepository.findById(roomId).orElse(null)
if(chatRoom != null) {
return chatMessageRepository.findChatMessagesByChatRoomOrderByCreatedAt(chatRoom)
} else {
return listOf()
}
}
override fun save(chatMessage: ChatMessage) {
chatMessageRepository.save(chatMessage)
}
}
\ No newline at end of file
...@@ -13,7 +13,11 @@ ...@@ -13,7 +13,11 @@
<input type="text" id="text" placeholder="message"> <input type="text" id="text" placeholder="message">
<br> <br>
<button onclick="sendMessage()">Send</button> <button onclick="sendMessage()">Send</button>
<div id="chat"></div> <div id="chat">
<#list chatMessages as chatMessage>
<p><b>${chatMessage.username}:</b>${chatMessage.text}</p>
</#list>
</div>
<script> <script>
var ws = new WebSocket("/rooms?id=${chatRoom.id}") var ws = new WebSocket("/rooms?id=${chatRoom.id}")
var chat = document.getElementById("chat") var chat = document.getElementById("chat")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment