From 07c33979c3e0397c0974f7e40a2552521dfd2502 Mon Sep 17 00:00:00 2001 From: azivner Date: Wed, 3 Jan 2018 22:13:02 -0500 Subject: [PATCH] consistent checking of is_deleted, some small refactorings --- routes/api/notes_move.js | 20 ++++++++++++-------- routes/api/sync.js | 2 +- routes/api/tree.js | 22 ++++++++++++++-------- services/consistency_checks.js | 2 +- services/notes.js | 2 +- services/sql.js | 4 ++-- services/sync.js | 2 +- 7 files changed, 32 insertions(+), 22 deletions(-) diff --git a/routes/api/notes_move.js b/routes/api/notes_move.js index 105df5d9d..708d8680e 100644 --- a/routes/api/notes_move.js +++ b/routes/api/notes_move.js @@ -12,7 +12,7 @@ router.put('/:noteTreeId/move-to/:parentNoteId', auth.checkApiAuth, async (req, const parentNoteId = req.params.parentNoteId; const sourceId = req.headers.source_id; - const noteToMove = await sql.getFirst("SELECT * FROM notes_tree WHERE note_tree_id = ?", [noteTreeId]); + const noteToMove = await getNoteTree(noteTreeId); if (!await validateParentChild(res, parentNoteId, noteToMove.note_id, noteTreeId)) { return; @@ -38,8 +38,8 @@ router.put('/:noteTreeId/move-before/:beforeNoteTreeId', auth.checkApiAuth, asyn const beforeNoteTreeId = req.params.beforeNoteTreeId; const sourceId = req.headers.source_id; - const noteToMove = await sql.getFirst("SELECT * FROM notes_tree WHERE note_tree_id = ?", [noteTreeId]); - const beforeNote = await sql.getFirst("SELECT * FROM notes_tree WHERE note_tree_id = ?", [beforeNoteTreeId]); + const noteToMove = await getNoteTree(noteTreeId); + const beforeNote = await getNoteTree(beforeNoteTreeId); if (!await validateParentChild(res, beforeNote.parent_note_id, noteToMove.note_id, noteTreeId)) { return; @@ -69,8 +69,8 @@ router.put('/:noteTreeId/move-after/:afterNoteTreeId', auth.checkApiAuth, async const afterNoteTreeId = req.params.afterNoteTreeId; const sourceId = req.headers.source_id; - const noteToMove = await sql.getFirst("SELECT * FROM notes_tree WHERE note_tree_id = ?", [noteTreeId]); - const afterNote = await sql.getFirst("SELECT * FROM notes_tree WHERE note_tree_id = ?", [afterNoteTreeId]); + const noteToMove = await getNoteTree(noteTreeId); + const afterNote = await getNoteTree(afterNoteTreeId); if (!await validateParentChild(res, afterNote.parent_note_id, noteToMove.note_id, noteTreeId)) { return; @@ -133,7 +133,7 @@ router.put('/:noteId/clone-after/:afterNoteTreeId', auth.checkApiAuth, async (re const afterNoteTreeId = req.params.afterNoteTreeId; const sourceId = req.headers.source_id; - const afterNote = await sql.getFirst("SELECT * FROM notes_tree WHERE note_tree_id = ?", [afterNoteTreeId]); + const afterNote = await getNoteTree(afterNoteTreeId); if (!await validateParentChild(res, afterNote.parent_note_id, noteId)) { return; @@ -168,13 +168,17 @@ router.put('/:noteId/clone-after/:afterNoteTreeId', auth.checkApiAuth, async (re async function loadSubTreeNoteIds(parentNoteId, subTreeNoteIds) { subTreeNoteIds.push(parentNoteId); - const children = await sql.getFirstColumn("SELECT note_id FROM notes_tree WHERE parent_note_id = ?", [parentNoteId]); + const children = await sql.getFirstColumn("SELECT note_id FROM notes_tree WHERE parent_note_id = ? AND is_deleted = 0", [parentNoteId]); for (const childNoteId of children) { await loadSubTreeNoteIds(childNoteId, subTreeNoteIds); } } +async function getNoteTree(noteTreeId) { + return sql.getFirst("SELECT * FROM notes_tree WHERE note_tree_id = ?", [noteTreeId]); +} + async function validateParentChild(res, parentNoteId, childNoteId, noteTreeId = null) { const existing = await getExistingNoteTree(parentNoteId, childNoteId); @@ -223,7 +227,7 @@ async function checkTreeCycle(parentNoteId, childNoteId) { return false; } - const parentNoteIds = await sql.getFirstColumn("SELECT DISTINCT parent_note_id FROM notes_tree WHERE note_id = ?", [parentNoteId]); + const parentNoteIds = await sql.getFirstColumn("SELECT DISTINCT parent_note_id FROM notes_tree WHERE note_id = ? AND is_deleted = 0", [parentNoteId]); for (const pid of parentNoteIds) { if (!await checkTreeCycleInner(pid)) { diff --git a/routes/api/sync.js b/routes/api/sync.js index 0f1bdd89e..1b605ccff 100644 --- a/routes/api/sync.js +++ b/routes/api/sync.js @@ -112,7 +112,7 @@ router.get('/notes_reordering/:noteTreeParentId', auth.checkApiAuth, async (req, res.send({ parent_note_id: noteTreeParentId, - ordering: await sql.getMap("SELECT note_tree_id, note_position FROM notes_tree WHERE parent_note_id = ?", [noteTreeParentId]) + ordering: await sql.getMap("SELECT note_tree_id, note_position FROM notes_tree WHERE parent_note_id = ? AND is_deleted = 0", [noteTreeParentId]) }); }); diff --git a/routes/api/tree.js b/routes/api/tree.js index fc1fd54ae..6bbdf7688 100644 --- a/routes/api/tree.js +++ b/routes/api/tree.js @@ -12,14 +12,20 @@ const notes = require('../../services/notes'); const sync_table = require('../../services/sync_table'); router.get('/', auth.checkApiAuth, async (req, res, next) => { - const notes = await sql.getAll("SELECT " - + "notes_tree.*, " - + "notes.note_title, " - + "notes.is_protected " - + "FROM notes_tree " - + "JOIN notes ON notes.note_id = notes_tree.note_id " - + "WHERE notes.is_deleted = 0 AND notes_tree.is_deleted = 0 " - + "ORDER BY note_position"); + const notes = await sql.getAll(` + SELECT + notes_tree.*, + notes.note_title, + notes.is_protected + FROM + notes_tree + JOIN + notes ON notes.note_id = notes_tree.note_id + WHERE + notes.is_deleted = 0 + AND notes_tree.is_deleted = 0 + ORDER BY + note_position`); const dataKey = protected_session.getDataKey(req); diff --git a/services/consistency_checks.js b/services/consistency_checks.js index 1599f2ac4..cb4217c13 100644 --- a/services/consistency_checks.js +++ b/services/consistency_checks.js @@ -19,7 +19,7 @@ async function runCheck(query, errorText, errorList) { async function checkTreeCycles(errorList) { const childToParents = {}; - const rows = await sql.getAll("SELECT note_id, parent_note_id FROM notes_tree"); + const rows = await sql.getAll("SELECT note_id, parent_note_id FROM notes_tree WHERE is_deleted = 0"); for (const row of rows) { const childNoteId = row.note_id; diff --git a/services/notes.js b/services/notes.js index e43dcbf74..e1db5b014 100644 --- a/services/notes.js +++ b/services/notes.js @@ -74,7 +74,7 @@ async function protectNoteRecursively(noteId, dataKey, protect, sourceId) { await protectNote(note, dataKey, protect, sourceId); - const children = await sql.getFirstColumn("SELECT note_id FROM notes_tree WHERE parent_note_id = ?", [noteId]); + const children = await sql.getFirstColumn("SELECT note_id FROM notes_tree WHERE parent_note_id = ? AND is_deleted = 0", [noteId]); for (const childNoteId of children) { await protectNoteRecursively(childNoteId, dataKey, protect, sourceId); diff --git a/services/sql.js b/services/sql.js index fa5d5c406..92dfa0a4c 100644 --- a/services/sql.js +++ b/services/sql.js @@ -37,9 +37,9 @@ const dbReady = new Promise((resolve, reject) => { await executeScript(notesSql); await executeScript(notesTreeSql); - const noteId = await getFirstValue("SELECT note_id FROM notes_tree WHERE parent_note_id = 'root' ORDER BY note_position"); + const startNoteId = await getFirstValue("SELECT note_id FROM notes_tree WHERE parent_note_id = 'root' AND is_deleted = 0 ORDER BY note_position"); - await require('./options').initOptions(noteId); + await require('./options').initOptions(startNoteId); await require('./sync_table').fillAllSyncRows(); }); diff --git a/services/sync.js b/services/sync.js index f0895284f..f3bcf394d 100644 --- a/services/sync.js +++ b/services/sync.js @@ -214,7 +214,7 @@ async function pushEntity(sync, syncContext) { else if (sync.entity_name === 'notes_reordering') { entity = { parent_note_id: sync.entity_id, - ordering: await sql.getMap('SELECT note_tree_id, note_position FROM notes_tree WHERE parent_note_id = ?', [sync.entity_id]) + ordering: await sql.getMap('SELECT note_tree_id, note_position FROM notes_tree WHERE parent_note_id = ? AND is_deleted = 0', [sync.entity_id]) }; } else if (sync.entity_name === 'options') {