mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
cleanup of note (& revisions) content is now postponed and done 48 hours after deleting it. This makes it possible to correct user mistake without having to use a real backup
This commit is contained in:
parent
370efdc034
commit
80178b52c0
@ -104,6 +104,13 @@ class Note extends Entity {
|
|||||||
return await repository.getEntities(`SELECT * FROM attributes WHERE isDeleted = 0 AND noteId = ?`, [this.noteId]);
|
return await repository.getEntities(`SELECT * FROM attributes WHERE isDeleted = 0 AND noteId = ?`, [this.noteId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns {Promise<Attribute[]>} relations targetting this specific note
|
||||||
|
*/
|
||||||
|
async getTargetRelations() {
|
||||||
|
return await repository.getEntities("SELECT * FROM attributes WHERE type = 'relation' AND isDeleted = 0 AND value = ?", [this.noteId]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} [name] - attribute name to filter
|
* @param {string} [name] - attribute name to filter
|
||||||
* @returns {Promise<Attribute[]>} all note's attributes, including inherited ones
|
* @returns {Promise<Attribute[]>} all note's attributes, including inherited ones
|
||||||
|
@ -278,11 +278,11 @@ async function deleteNote(branch) {
|
|||||||
|
|
||||||
if (notDeletedBranches.length === 0) {
|
if (notDeletedBranches.length === 0) {
|
||||||
note.isDeleted = true;
|
note.isDeleted = true;
|
||||||
note.content = '';
|
// we don't reset content here, that's postponed and done later to give the user
|
||||||
|
// a chance to correct a mistake
|
||||||
await note.save();
|
await note.save();
|
||||||
|
|
||||||
for (const noteRevision of await note.getRevisions()) {
|
for (const noteRevision of await note.getRevisions()) {
|
||||||
noteRevision.content = '';
|
|
||||||
await noteRevision.save();
|
await noteRevision.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,15 +295,36 @@ async function deleteNote(branch) {
|
|||||||
await attribute.save();
|
await attribute.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
const targetAttributes = await repository.getEntities("SELECT * FROM attributes WHERE type = 'relation' AND isDeleted = 0 AND value = ?", [note.noteId]);
|
for (const attribute of await note.getTargetRelations()) {
|
||||||
|
|
||||||
for (const attribute of targetAttributes) {
|
|
||||||
attribute.isDeleted = true;
|
attribute.isDeleted = true;
|
||||||
await attribute.save();
|
await attribute.save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function cleanupDeletedNotes() {
|
||||||
|
const cutoffDate = new Date(new Date().getTime() - 48 * 3600 * 1000);
|
||||||
|
|
||||||
|
const notesForCleanup = await repository.getEntities("SELECT * FROM notes WHERE isDeleted = 1 AND content != '' AND dateModified <= ?", [dateUtils.dateStr(cutoffDate)]);
|
||||||
|
|
||||||
|
for (const note of notesForCleanup) {
|
||||||
|
note.content = '';
|
||||||
|
await note.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
const notesRevisionsForCleanup = await repository.getEntities("SELECT note_revisions.* FROM notes JOIN note_revisions USING(noteId) WHERE notes.isDeleted = 1 AND note_revisions.content != '' AND notes.dateModified <= ?", [dateUtils.dateStr(cutoffDate)]);
|
||||||
|
|
||||||
|
for (const noteRevision of notesRevisionsForCleanup) {
|
||||||
|
noteRevision.content = '';
|
||||||
|
await noteRevision.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// first cleanup kickoff 5 minutes after startup
|
||||||
|
setTimeout(cleanupDeletedNotes, 5 * 60 * 1000);
|
||||||
|
|
||||||
|
setInterval(cleanupDeletedNotes, 4 * 3600 * 1000);
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
createNewNote,
|
createNewNote,
|
||||||
createNote,
|
createNote,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user