feat: implement chat persistence with MongoDB

- Add full chat persistence to database (conversations and messages)
- Implement MongoChatRepository with cursor-based pagination
- Add getConversations/getConversation endpoints in ChatController
- Save user and assistant messages in ChatService.processMessage()
- Track respondedAction (confirm/reject) on proposed event messages
- Load existing messages on chat screen mount
- Add addMessages() bulk action and chatMessageToMessageData() helper to ChatStore
- Add RespondedAction type and UpdateMessageDTO to shared types
This commit is contained in:
2026-01-09 16:21:01 +01:00
parent d86b18173f
commit c897b6d680
11 changed files with 245 additions and 45 deletions

View File

@@ -1,5 +1,5 @@
import { create } from "zustand";
import { ProposedEventChange } from "@caldav/shared";
import { ChatMessage, ProposedEventChange } from "@caldav/shared";
type BubbleSide = "left" | "right";
@@ -14,6 +14,7 @@ export type MessageData = {
interface ChatState {
messages: MessageData[];
addMessages: (messages: MessageData[]) => void;
addMessage: (message: MessageData) => void;
updateMessage: (id: string, updates: Partial<MessageData>) => void;
clearMessages: () => void;
@@ -21,6 +22,9 @@ interface ChatState {
export const useChatStore = create<ChatState>((set) => ({
messages: [],
addMessages(messages) {
set((state) => ({messages: [...state.messages, ...messages]}))
},
addMessage: (message: MessageData) => {
set((state) => ({ messages: [...state.messages, message] }));
},
@@ -35,3 +39,15 @@ export const useChatStore = create<ChatState>((set) => ({
set({ messages: [] });
},
}));
// Helper to convert server ChatMessage to client MessageData
export function chatMessageToMessageData(msg: ChatMessage): MessageData {
return {
id: msg.id,
side: msg.sender === "assistant" ? "left" : "right",
content: msg.content,
proposedChange: msg.proposedChange,
respondedAction: msg.respondedAction,
conversationId: msg.conversationId,
};
}