Notes/src/routes/api/tree.js

83 lines
2.7 KiB
JavaScript
Raw Normal View History

2017-10-21 21:10:33 -04:00
"use strict";
2017-10-15 19:47:05 -04:00
const sql = require('../../services/sql');
const optionService = require('../../services/options');
const protectedSessionService = require('../../services/protected_session');
async function getNotes(noteIds) {
const questionMarks = noteIds.map(() => "?").join(",");
const notes = await sql.getRows(`
SELECT noteId, title, isProtected, type, mime
FROM notes WHERE isDeleted = 0 AND noteId IN (${questionMarks})`, noteIds);
protectedSessionService.decryptNotes(notes);
notes.forEach(note => note.isProtected = !!note.isProtected);
return notes;
}
async function getRelations(noteIds) {
const questionMarks = noteIds.map(() => "?").join(",");
2018-04-16 23:34:56 -04:00
const doubledNoteIds = noteIds.concat(noteIds);
return await sql.getRows(`SELECT branchId, noteId AS 'childNoteId', parentNoteId FROM branches WHERE isDeleted = 0
2018-04-16 23:34:56 -04:00
AND (parentNoteId IN (${questionMarks}) OR noteId IN (${questionMarks}))`, doubledNoteIds);
}
async function getTree() {
2018-04-16 23:34:56 -04:00
// we fetch all branches of notes, even if that particular branch isn't visible
// this allows us to e.g. detect and properly display clones
2018-03-24 21:39:15 -04:00
const branches = await sql.getRows(`
WITH RECURSIVE
tree(branchId, noteId, isExpanded) AS (
SELECT branchId, noteId, isExpanded FROM branches WHERE branchId = 'root'
UNION ALL
SELECT branches.branchId, branches.noteId, branches.isExpanded FROM branches
JOIN tree ON branches.parentNoteId = tree.noteId
WHERE tree.isExpanded = 1 AND branches.isDeleted = 0
)
2018-04-21 12:23:35 -04:00
SELECT branches.* FROM tree JOIN branches USING(noteId) ORDER BY branches.notePosition`);
const noteIds = branches.map(b => b.noteId);
const notes = await getNotes(noteIds);
const relations = await getRelations(noteIds);
return {
startNotePath: await optionService.getOption('startNotePath'),
branches,
notes,
relations
};
}
async function load(req) {
let noteIds = req.body.noteIds;
const branchIds = req.body.branchIds;
if (branchIds && branchIds.length > 0) {
noteIds = await sql.getColumn(`SELECT noteId FROM branches WHERE isDeleted = 0 AND branchId IN(${branchIds.map(() => "?").join(",")})`, branchIds);
}
const questionMarks = noteIds.map(() => "?").join(",");
const branches = await sql.getRows(`SELECT * FROM branches WHERE isDeleted = 0 AND noteId IN (${questionMarks})`, noteIds);
const notes = await getNotes(noteIds);
const relations = await getRelations(noteIds);
2018-03-30 12:57:22 -04:00
return {
branches,
notes,
relations
2018-03-30 12:57:22 -04:00
};
}
2018-03-30 12:57:22 -04:00
module.exports = {
getTree,
load
2018-03-30 12:57:22 -04:00
};