diff --git a/src/public/javascripts/dialogs/recent_changes.js b/src/public/javascripts/dialogs/recent_changes.js index a6136863d..42fdd75bb 100644 --- a/src/public/javascripts/dialogs/recent_changes.js +++ b/src/public/javascripts/dialogs/recent_changes.js @@ -4,6 +4,7 @@ import server from '../services/server.js'; import treeService from "../services/tree.js"; import treeCache from "../services/tree_cache.js"; import appContext from "../services/app_context.js"; +import hoistedNoteService from "../services/hoisted_note.js"; const $dialog = $("#recent-changes-dialog"); const $content = $("#recent-changes-content"); @@ -11,7 +12,7 @@ const $content = $("#recent-changes-content"); export async function showDialog() { utils.openDialog($dialog); - const result = await server.get('recent-changes'); + const result = await server.get('recent-changes/' + hoistedNoteService.getHoistedNoteId()); // preload all notes into cache await treeCache.getNotes(result.map(r => r.noteId), true); diff --git a/src/routes/api/recent_changes.js b/src/routes/api/recent_changes.js index c4fda587c..44a4d1d6d 100644 --- a/src/routes/api/recent_changes.js +++ b/src/routes/api/recent_changes.js @@ -3,45 +3,73 @@ const sql = require('../../services/sql'); const protectedSessionService = require('../../services/protected_session'); const noteService = require('../../services/notes'); +const noteCacheService = require('../../services/note_cache'); -async function getRecentChanges() { - const recentChanges = await sql.getRows( +async function getRecentChanges(req) { + const {ancestorNoteId} = req.params; + + const noteRows = await sql.getRows( ` SELECT * FROM ( - SELECT - notes.noteId, - notes.isDeleted AS current_isDeleted, - notes.deleteId AS current_deleteId, - notes.isErased AS current_isErased, - notes.title AS current_title, - notes.isProtected AS current_isProtected, - note_revisions.title, - note_revisions.utcDateCreated AS date - FROM - note_revisions - JOIN notes USING(noteId) - ORDER BY - note_revisions.utcDateCreated DESC - LIMIT 200 + SELECT note_revisions.noteId, + note_revisions.noteRevisionId, + note_revisions.utcDateCreated AS date + FROM note_revisions + ORDER BY note_revisions.utcDateCreated DESC ) UNION ALL SELECT * FROM ( - SELECT - notes.noteId, - notes.isDeleted AS current_isDeleted, - notes.deleteId AS current_deleteId, - notes.isErased AS current_isErased, - notes.title AS current_title, - notes.isProtected AS current_isProtected, - notes.title, - notes.utcDateModified AS date - FROM - notes - ORDER BY - utcDateModified DESC - LIMIT 200 + SELECT + notes.noteId, + NULL AS noteRevisionId, + utcDateModified AS date + FROM notes + ORDER BY utcDateModified DESC ) - ORDER BY date DESC - LIMIT 200`); + ORDER BY date DESC`); + + const recentChanges = []; + + for (const noteRow of noteRows) { + if (!noteCacheService.isInAncestor(noteRow.noteId, ancestorNoteId)) { + continue; + } + + if (noteRow.noteRevisionId) { + recentChanges.push(await sql.getRow(` + SELECT + notes.noteId, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.isErased AS current_isErased, + notes.title AS current_title, + notes.isProtected AS current_isProtected, + note_revisions.title, + note_revisions.utcDateCreated AS date + FROM + note_revisions + JOIN notes USING(noteId) + WHERE noteRevisionId = ?`, [noteRow.noteRevisionId])); + } + else { + recentChanges.push(await sql.getRow(` + SELECT + notes.noteId, + notes.isDeleted AS current_isDeleted, + notes.deleteId AS current_deleteId, + notes.isErased AS current_isErased, + notes.title AS current_title, + notes.isProtected AS current_isProtected, + notes.title, + notes.utcDateModified AS date + FROM + notes + WHERE noteId = ?`, [noteRow.noteId])); + } + + if (recentChanges.length >= 200) { + break; + } + } for (const change of recentChanges) { if (change.current_isProtected) { diff --git a/src/routes/routes.js b/src/routes/routes.js index e61948e63..02bf1cabc 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -181,7 +181,7 @@ function register(app) { route(POST, '/api/images', [auth.checkApiAuthOrElectron, uploadMiddleware, csrfMiddleware], imageRoute.uploadImage, apiResultHandler); route(PUT, '/api/images/:noteId', [auth.checkApiAuthOrElectron, uploadMiddleware, csrfMiddleware], imageRoute.updateImage, apiResultHandler); - apiRoute(GET, '/api/recent-changes', recentChangesApiRoute.getRecentChanges); + apiRoute(GET, '/api/recent-changes/:ancestorNoteId', recentChangesApiRoute.getRecentChanges); apiRoute(GET, '/api/options', optionsApiRoute.getOptions); // FIXME: possibly change to sending value in the body to avoid host of HTTP server issues with slashes