2017-10-21 21:10:33 -04:00
|
|
|
"use strict";
|
|
|
|
|
2017-10-15 19:47:05 -04:00
|
|
|
const sql = require('../../services/sql');
|
2018-11-06 17:47:40 +01:00
|
|
|
const protectedSessionService = require('../../services/protected_session');
|
2020-01-03 13:14:43 +01:00
|
|
|
const noteService = require('../../services/notes');
|
2020-08-06 23:55:17 +02:00
|
|
|
const noteCacheService = require('../../services/note_cache/note_cache_service');
|
2017-10-14 23:31:44 -04:00
|
|
|
|
2020-06-20 12:31:38 +02:00
|
|
|
function getRecentChanges(req) {
|
2020-03-29 19:37:34 +02:00
|
|
|
const {ancestorNoteId} = req.params;
|
|
|
|
|
2020-06-15 23:22:11 +02:00
|
|
|
let recentChanges = [];
|
2020-03-29 19:37:34 +02:00
|
|
|
|
2020-06-20 12:31:38 +02:00
|
|
|
const noteRevisions = sql.getRows(`
|
2020-06-15 23:22:11 +02:00
|
|
|
SELECT
|
|
|
|
notes.noteId,
|
|
|
|
notes.isDeleted AS current_isDeleted,
|
|
|
|
notes.deleteId AS current_deleteId,
|
|
|
|
notes.title AS current_title,
|
|
|
|
notes.isProtected AS current_isProtected,
|
|
|
|
note_revisions.title,
|
|
|
|
note_revisions.utcDateCreated AS utcDate,
|
|
|
|
note_revisions.dateCreated AS date
|
|
|
|
FROM
|
|
|
|
note_revisions
|
2020-12-16 15:01:20 +01:00
|
|
|
JOIN notes USING(noteId)`);
|
2020-06-15 23:22:11 +02:00
|
|
|
|
|
|
|
for (const noteRevision of noteRevisions) {
|
|
|
|
if (noteCacheService.isInAncestor(noteRevision.noteId, ancestorNoteId)) {
|
|
|
|
recentChanges.push(noteRevision);
|
2020-03-29 19:37:34 +02:00
|
|
|
}
|
2020-06-15 23:22:11 +02:00
|
|
|
}
|
2020-03-29 19:37:34 +02:00
|
|
|
|
2020-11-17 21:06:38 +01:00
|
|
|
// now we need to also collect date points not represented in note revisions:
|
|
|
|
// 1. creation for all notes (dateCreated)
|
|
|
|
// 2. deletion for deleted notes (dateModified)
|
2020-06-20 12:31:38 +02:00
|
|
|
const notes = sql.getRows(`
|
2020-11-17 21:06:38 +01:00
|
|
|
SELECT
|
|
|
|
notes.noteId,
|
|
|
|
notes.isDeleted AS current_isDeleted,
|
|
|
|
notes.deleteId AS current_deleteId,
|
|
|
|
notes.title AS current_title,
|
|
|
|
notes.isProtected AS current_isProtected,
|
|
|
|
notes.title,
|
|
|
|
notes.utcDateCreated AS utcDate,
|
|
|
|
notes.dateCreated AS date
|
2020-12-16 15:01:20 +01:00
|
|
|
FROM notes
|
2020-11-17 21:06:38 +01:00
|
|
|
UNION ALL
|
|
|
|
SELECT
|
|
|
|
notes.noteId,
|
|
|
|
notes.isDeleted AS current_isDeleted,
|
|
|
|
notes.deleteId AS current_deleteId,
|
|
|
|
notes.title AS current_title,
|
|
|
|
notes.isProtected AS current_isProtected,
|
|
|
|
notes.title,
|
|
|
|
notes.utcDateModified AS utcDate,
|
|
|
|
notes.dateModified AS date
|
2020-12-16 15:01:20 +01:00
|
|
|
FROM notes
|
|
|
|
WHERE notes.isDeleted = 1`);
|
2020-06-15 23:22:11 +02:00
|
|
|
|
|
|
|
for (const note of notes) {
|
|
|
|
if (noteCacheService.isInAncestor(note.noteId, ancestorNoteId)) {
|
|
|
|
recentChanges.push(note);
|
2020-03-29 19:37:34 +02:00
|
|
|
}
|
|
|
|
}
|
2017-10-14 23:31:44 -04:00
|
|
|
|
2020-06-15 23:22:11 +02:00
|
|
|
recentChanges.sort((a, b) => a.utcDate > b.utcDate ? -1 : 1);
|
|
|
|
|
|
|
|
recentChanges = recentChanges.slice(0, Math.min(500, recentChanges.length));
|
|
|
|
|
2019-03-04 20:44:20 +01:00
|
|
|
for (const change of recentChanges) {
|
|
|
|
if (change.current_isProtected) {
|
|
|
|
if (protectedSessionService.isProtectedSessionAvailable()) {
|
2019-11-02 07:50:23 +01:00
|
|
|
change.title = protectedSessionService.decryptString(change.title);
|
|
|
|
change.current_title = protectedSessionService.decryptString(change.current_title);
|
2019-03-04 20:44:20 +01:00
|
|
|
}
|
|
|
|
else {
|
2018-11-06 17:47:40 +01:00
|
|
|
change.title = change.current_title = "[Protected]";
|
|
|
|
}
|
|
|
|
}
|
2020-01-03 10:48:36 +01:00
|
|
|
|
|
|
|
if (change.current_isDeleted) {
|
2020-12-16 15:01:20 +01:00
|
|
|
const deleteId = change.current_deleteId;
|
2020-01-03 10:48:36 +01:00
|
|
|
|
2020-12-16 15:01:20 +01:00
|
|
|
const undeletedParentBranches = noteService.getUndeletedParentBranches(change.noteId, deleteId);
|
2020-01-03 10:48:36 +01:00
|
|
|
|
2020-12-16 15:01:20 +01:00
|
|
|
// note (and the subtree) can be undeleted if there's at least one undeleted parent (whose branch would be undeleted by this op)
|
|
|
|
change.canBeUndeleted = undeletedParentBranches.length > 0;
|
2020-01-03 10:48:36 +01:00
|
|
|
}
|
2018-11-06 17:47:40 +01:00
|
|
|
}
|
|
|
|
|
2018-03-30 13:56:46 -04:00
|
|
|
return recentChanges;
|
|
|
|
}
|
2017-10-14 23:31:44 -04:00
|
|
|
|
2018-03-30 13:56:46 -04:00
|
|
|
module.exports = {
|
|
|
|
getRecentChanges
|
2020-05-16 23:12:29 +02:00
|
|
|
};
|