From 049c48bbd05caa897655f9bfadde8862a55c420d Mon Sep 17 00:00:00 2001 From: Caroline Nordbrandt Date: Fri, 8 May 2026 13:46:36 +0200 Subject: [PATCH] Implement session persistence and chat history retrieval - Refactored `ChatMessage` class to include `senderName`. - Updated `ChatService` to store sender names when adding user and assistant messages. - Added logic to persist and retrieve sessions via `sessionId` in the frontend. - Prefetched session chat history on page load and rendered stored messages in the chat window. --- .../projectbifrost/domain/ChatMessage.java | 4 +- .../projectbifrost/service/ChatService.java | 4 +- src/main/resources/static/app.js | 40 +++++++++++++++++-- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/example/projectbifrost/domain/ChatMessage.java b/src/main/java/org/example/projectbifrost/domain/ChatMessage.java index 47edcfa..1a72518 100644 --- a/src/main/java/org/example/projectbifrost/domain/ChatMessage.java +++ b/src/main/java/org/example/projectbifrost/domain/ChatMessage.java @@ -19,11 +19,13 @@ public class ChatMessage { private String role; private String content; + private String senderName; //For chat private LocalDateTime timeStamp; - public ChatMessage(String role, String message) { + public ChatMessage(String role, String message, String senderName) { this.role = role; this.content = message; + this.senderName = senderName; this.timeStamp = LocalDateTime.now();//Adds the current time to each message } } diff --git a/src/main/java/org/example/projectbifrost/service/ChatService.java b/src/main/java/org/example/projectbifrost/service/ChatService.java index 953c956..313c199 100644 --- a/src/main/java/org/example/projectbifrost/service/ChatService.java +++ b/src/main/java/org/example/projectbifrost/service/ChatService.java @@ -60,8 +60,8 @@ public String chatWithLLM(ChatRequestDTO dto) { try { String content = fetchResponseFromLLM(apiMessages); // Only store in history if we got a real LLM response (not a circuit breaker fallback) - chatSession.addMessage(new ChatMessage("user", dto.message())); - chatSession.addMessage(new ChatMessage("assistant", content)); + chatSession.addMessage(new ChatMessage("user", dto.message(), "You")); + chatSession.addMessage(new ChatMessage("assistant", content, dto.personality().toString())); return content; } catch (RetryableHttpException e) { // Circuit breaker is open or service unavailable - don't pollute history diff --git a/src/main/resources/static/app.js b/src/main/resources/static/app.js index 71fb9b4..cbbaf5a 100644 --- a/src/main/resources/static/app.js +++ b/src/main/resources/static/app.js @@ -1,6 +1,15 @@ +const getSessionId = () => { + let id = localStorage.getItem('bifrost_session_id'); //Try to find the old sessionID or create a new one + if (!id) { + id = crypto.randomUUID(); + localStorage.setItem('bifrost_session_id', id); + } + return id; +}; + const chatState = { - sessionId: crypto.randomUUID(), - isWaiting: false //Flag for waiting for response, to prevent multiple sends + sessionId: getSessionId(), + isWaiting: false }; //Save all HTML-elements to reduce boilerplate @@ -135,4 +144,29 @@ dom.input.addEventListener('keydown', (e) => { sendMessage().then(r => { }).catch(err => console.error(err)); } -}); \ No newline at end of file +}); + +// Körs automatiskt när sidan laddas om +window.addEventListener('DOMContentLoaded', async () => { + try { + // Vi anropar din befintliga GetMapping: /api/v1/chat/{sessionId} + const response = await fetch(`/api/v1/chat/${chatState.sessionId}`); + + if (response.ok) { + const sessionData = await response.json(); // Detta matchar din ChatSession-klass + + // if there is sessionData.chatHistory saved, we loop through it and display the messages in the chat window + if (sessionData && sessionData.chatHistory && sessionData.chatHistory.length > 0) { + sessionData.chatHistory.forEach(msg => { + const role = msg.role === 'assistant' ? 'assistant' : 'user'; + // Name saved from backend + const name = role === 'assistant' ? getGodName(msg.senderName) : null; + + appendMessage(role, name, msg.content); + }); + } + } + } catch (err) { + console.error("Could not fetch chat history:", err); + } +});