From 6b2bf369ff8cccc95f5e73219240a6cba80b089e Mon Sep 17 00:00:00 2001 From: Ammar Ahmed Date: Mon, 12 Jan 2026 12:36:17 +0500 Subject: [PATCH] core: ensure session content remains consistent when new session is created New sessions can be created with title or content only, hence we need to pull the missing data from the note itself to keep session history consistent with previous sessions --- packages/core/__tests__/note-history.test.js | 46 ++++++++++++++++++- packages/core/src/collections/notes.ts | 2 +- .../core/src/collections/session-content.ts | 24 ++++++++-- 3 files changed, 67 insertions(+), 5 deletions(-) diff --git a/packages/core/__tests__/note-history.test.js b/packages/core/__tests__/note-history.test.js index c1dcd7561..7fc57c73d 100644 --- a/packages/core/__tests__/note-history.test.js +++ b/packages/core/__tests__/note-history.test.js @@ -251,7 +251,6 @@ test("note history item can be created by setting note title and content both", content = await db.noteHistory.sessionContent.get( items[0].sessionContentId ); - console.log(content); expect(content.data).toBe(TEST_NOTE.content.data); expect(content.title).toBe("Test note"); @@ -314,3 +313,48 @@ test("restoring an old session should replace note's content and title", () => ); } )); + +test.only("note history item has consistent note and title data between sessions", () => + noteTest({ + ...TEST_NOTE, + title: "Test note", + sessionId: "notesession1" + }).then(async ({ db, id }) => { + expect(await db.noteHistory.get(id).count()).toBe(1); + const history = db.noteHistory.get(id); + let items = await history.items(); + let content = await db.noteHistory.sessionContent.get( + items[0].sessionContentId + ); + expect(await db.noteHistory.collection.count()).toBe(1); + expect(content.data).toBe(TEST_NOTE.content.data); + expect(content.title).toBe("Test note"); + + await db.notes.add({ + id: id, + content: TEST_NOTE.content, + sessionId: "notesession2" + }); + + items = await history.items(); + content = await db.noteHistory.sessionContent.get( + items[1].sessionContentId + ); + + expect(content.data).toBe(TEST_NOTE.content.data); + expect(content.title).toBe("Test note"); + + await db.notes.add({ + id: id, + title: "Test note updated", + sessionId: "notesession3" + }); + + items = await history.items(); + content = await db.noteHistory.sessionContent.get( + items[2].sessionContentId + ); + + expect(content.data).toBe(TEST_NOTE.content.data); + expect(content.title).toBe("Test note updated"); + })); diff --git a/packages/core/src/collections/notes.ts b/packages/core/src/collections/notes.ts index 7d3364f4d..ad5c868e5 100644 --- a/packages/core/src/collections/notes.ts +++ b/packages/core/src/collections/notes.ts @@ -206,7 +206,7 @@ export class Notes implements ICollection { this.totalNotes++; } - if (item.sessionId) { + if (item.sessionId && typeof item.title === "string") { await this.db.noteHistory.add(item.sessionId, { title: item.title, noteId: id diff --git a/packages/core/src/collections/session-content.ts b/packages/core/src/collections/session-content.ts index 1931b0f7f..b5d112656 100644 --- a/packages/core/src/collections/session-content.ts +++ b/packages/core/src/collections/session-content.ts @@ -44,7 +44,7 @@ export class SessionContent implements ICollection { async add( sessionId: string, - content: Partial> & { title?: string }, + content: Partial> & { title?: string; noteId: string }, locked?: TLocked ) { if (!sessionId || !content) return; @@ -52,8 +52,10 @@ export class SessionContent implements ICollection { // locked || isCipher(content.data) // ? content.data // : await this.db.compressor().compress(content.data); - const sessionContentItemId = makeSessionContentId(sessionId); + const sessionContentExists = await this.collection.exists( + sessionContentItemId + ); const sessionItem: Partial = { type: "sessioncontent", id: sessionContentItemId, @@ -67,13 +69,29 @@ export class SessionContent implements ICollection { if (content.data && content.type) { sessionItem.data = content.data; sessionItem.contentType = content.type; + + if (typeof content.title !== "string" && !sessionContentExists) { + const note = await this.db.notes.note(content.noteId); + sessionItem.title = note?.title; + } } if (content.title) { sessionItem.title = content.title; + + if (!content.data && !content.type && !sessionContentExists) { + const note = await this.db.notes.note(content.noteId); + if (note?.contentId) { + const noteContent = await this.db.content.get(note?.contentId); + if (noteContent) { + sessionItem.data = noteContent?.data; + sessionItem.contentType = noteContent?.type; + } + } + } } - if (await this.collection.exists(sessionContentItemId)) { + if (sessionContentExists) { this.collection.update([sessionContentItemId], sessionItem); } else { await this.collection.upsert(sessionItem as SessionContentItem);