diff --git a/build.gradle b/build.gradle index 73893fa83c57fc92870ba2b25919711f7071e446..6e5533219adc12e9249818bc920f3b5c75869ad3 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.json:org.json:chargebee-1.0' testImplementation 'org.jetbrains.kotlin:kotlin-test-junit5' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/configs/WebSocketsConfig.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/configs/WebSocketsConfig.kt index 7ef2d66f6660a7a1ce676ee2599266fbee4949d8..b12c62efa4256b025554df16425ea127d6100509 100644 --- a/src/main/kotlin/de/thk/gm/websocketsdemo/configs/WebSocketsConfig.kt +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/configs/WebSocketsConfig.kt @@ -3,6 +3,8 @@ package de.thk.gm.websocketsdemo.configs import de.thk.gm.websocketsdemo.handlers.ChatRoomsHandler import de.thk.gm.websocketsdemo.handlers.EchoHandler 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.web.socket.WebSocketHandler import org.springframework.web.socket.config.annotation.EnableWebSocket @@ -11,10 +13,10 @@ import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry @Configuration @EnableWebSocket -class WebSocketsConfig(): WebSocketConfigurer { +class WebSocketsConfig(private val chatMessageService: ChatMessageService, private val chatRoomsService: ChatRoomsService): WebSocketConfigurer { override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) { registry.addHandler(EchoHandler(), "/echo").setAllowedOrigins("*") registry.addHandler(SimpleChatHandler(), "/chat") - registry.addHandler(ChatRoomsHandler(),"/rooms") + registry.addHandler(ChatRoomsHandler(chatRoomsService, chatMessageService),"/rooms") } } \ No newline at end of file diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/controllers/ChatRoomsController.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/controllers/ChatRoomsController.kt index 36fdf8c044b4095146c63d2c081dc05807b63c89..da08a7ae30f5a2d1f72647a9fdcb291362fcc2bd 100644 --- a/src/main/kotlin/de/thk/gm/websocketsdemo/controllers/ChatRoomsController.kt +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/controllers/ChatRoomsController.kt @@ -2,6 +2,7 @@ package de.thk.gm.websocketsdemo.controllers import de.thk.gm.websocketsdemo.dtos.ChatRoomDto import de.thk.gm.websocketsdemo.models.ChatRoom +import de.thk.gm.websocketsdemo.services.ChatMessageService import de.thk.gm.websocketsdemo.services.ChatRoomsService import org.springframework.stereotype.Controller import org.springframework.ui.Model @@ -10,7 +11,7 @@ import java.util.* @Controller @RequestMapping("/chatrooms") -class ChatRoomsController (private val chatRoomsService: ChatRoomsService) { +class ChatRoomsController (private val chatRoomsService: ChatRoomsService, private val chatMessageService: ChatMessageService) { @GetMapping fun getChatRooms(model: Model): String { @@ -28,8 +29,11 @@ class ChatRoomsController (private val chatRoomsService: ChatRoomsService) { @GetMapping("/{id}") fun getChatRoom(@PathVariable("id") id: UUID, model: Model): String { + var chatRoom = chatRoomsService.getChatRoomById(id) + var chatMessages = chatMessageService.getChatMessagesByChatRoomId(id) model.addAttribute("chatRoom", chatRoom) + model.addAttribute("chatMessages", chatMessages) return "chatRooms/showChatRoom" } } \ No newline at end of file diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/ChatRoomsHandler.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/ChatRoomsHandler.kt index 9d80ede0d367e539e7d17a78dd80fe5ca9b97ddf..f6f25e55d41facbd072ffe804a51e60675e10a0f 100644 --- a/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/ChatRoomsHandler.kt +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/ChatRoomsHandler.kt @@ -1,13 +1,20 @@ 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.TextMessage import org.springframework.web.socket.WebSocketSession import org.springframework.web.socket.handler.TextWebSocketHandler import org.springframework.web.util.UriComponents 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() override fun afterConnectionEstablished(session: WebSocketSession) { var uri : UriComponents = UriComponentsBuilder.fromUri(session.uri!!).build() @@ -24,8 +31,17 @@ class ChatRoomsHandler : TextWebSocketHandler() { override fun handleTextMessage(session: WebSocketSession, message: TextMessage) { var uri : UriComponents = UriComponentsBuilder.fromUri(session.uri!!).build() - var id = uri.queryParams.getFirst("id") + var id = uri.queryParams.getFirst("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) { for (chatSession in sessions) { chatSession.sendMessage(message) diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/models/ChatMessage.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/models/ChatMessage.kt new file mode 100644 index 0000000000000000000000000000000000000000..1d55057075eabc0db25579e7c8cc3b8392f38d68 --- /dev/null +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/models/ChatMessage.kt @@ -0,0 +1,19 @@ +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 diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/repositories/ChatMessageRepository.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/repositories/ChatMessageRepository.kt new file mode 100644 index 0000000000000000000000000000000000000000..15932e0e0ef4d15d2070029ccaac8f92e4c220ab --- /dev/null +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/repositories/ChatMessageRepository.kt @@ -0,0 +1,12 @@ +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 diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/services/ChatMessageService.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/services/ChatMessageService.kt new file mode 100644 index 0000000000000000000000000000000000000000..ba1d2fbb9709e80de600bf014baad9eb155c0dba --- /dev/null +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/services/ChatMessageService.kt @@ -0,0 +1,9 @@ +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 diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/services/ChatMessageServiceImpl.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/services/ChatMessageServiceImpl.kt new file mode 100644 index 0000000000000000000000000000000000000000..2248e817b389b835c920baebe65801f63b76f1b0 --- /dev/null +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/services/ChatMessageServiceImpl.kt @@ -0,0 +1,24 @@ +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 diff --git a/src/main/resources/templates/chatRooms/showChatRoom.ftlh b/src/main/resources/templates/chatRooms/showChatRoom.ftlh index 8aaac5ef50306699d218891571c335040fccdbcd..f5530e70ea2ae72f972f3b6b904869f3a70ba1b1 100644 --- a/src/main/resources/templates/chatRooms/showChatRoom.ftlh +++ b/src/main/resources/templates/chatRooms/showChatRoom.ftlh @@ -13,7 +13,11 @@ <input type="text" id="text" placeholder="message"> <br> <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> var ws = new WebSocket("/rooms?id=${chatRoom.id}") var chat = document.getElementById("chat")