2017-10-21 21:10:33 -04:00
"use strict" ;
2017-10-15 19:47:05 -04:00
const sql = require ( '../../services/sql' ) ;
2018-04-01 21:27:46 -04:00
const optionService = require ( '../../services/options' ) ;
const protectedSessionService = require ( '../../services/protected_session' ) ;
2018-04-16 20:40:18 -04:00
async function getNotes ( noteIds ) {
2018-05-30 20:28:10 -04:00
const notes = await sql . getManyRows ( `
2018-04-16 20:40:18 -04:00
SELECT noteId , title , isProtected , type , mime
2018-05-30 20:28:10 -04:00
FROM notes WHERE isDeleted = 0 AND noteId IN ( ? ? ? ) ` , noteIds);
2018-04-16 20:40:18 -04:00
2018-08-13 10:59:31 +02:00
const cssClassLabels = await sql . getManyRows ( `
SELECT noteId , value FROM attributes WHERE isDeleted = 0 AND type = 'label'
AND name = 'cssClass' AND noteId IN ( ? ? ? ) ` , noteIds);
for ( const label of cssClassLabels ) {
// FIXME: inefficient!
const note = notes . find ( note => note . noteId === label . noteId ) ;
if ( ! note ) {
continue ;
}
if ( note . cssClass ) {
note . cssClass += " " + label . value ;
}
else {
note . cssClass = label . value ;
}
}
2018-04-16 20:40:18 -04:00
protectedSessionService . decryptNotes ( notes ) ;
notes . forEach ( note => note . isProtected = ! ! note . isProtected ) ;
return notes ;
}
2018-04-16 23:13:33 -04:00
async function getRelations ( noteIds ) {
2018-05-30 20:28:10 -04:00
// we need to fetch both parentNoteId and noteId matches because we can have loaded child
// of which only some of the parents has been loaded.
2018-04-16 20:40:18 -04:00
2018-08-31 17:29:54 +02:00
const relations = await sql . getManyRows ( ` SELECT branchId, noteId AS 'childNoteId', parentNoteId, notePosition FROM branches WHERE isDeleted = 0
2018-05-30 20:28:10 -04:00
AND ( parentNoteId IN ( ? ? ? ) OR noteId IN ( ? ? ? ) ) ` , noteIds);
2018-08-31 17:29:54 +02:00
// although we're fetching relations for multiple notes, ordering will stay correct for single note as well - relations are being added into tree cache in the order they were returned
// cannot use ORDER BY because of usage of getManyRows which is not a single SQL query
relations . sort ( ( a , b ) => a . notePosition > b . notePosition ? 1 : - 1 ) ;
return relations ;
2018-04-16 20:40:18 -04:00
}
2017-10-14 23:31:44 -04:00
2018-04-01 11:05:09 -04:00
async function getTree ( ) {
2018-12-11 21:53:56 +01:00
const hoistedNoteId = await optionService . getOption ( 'hoistedNoteId' ) ;
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 ( `
2018-04-16 16:26:47 -04:00
WITH RECURSIVE
tree ( branchId , noteId , isExpanded ) AS (
2018-12-11 21:53:56 +01:00
SELECT branchId , noteId , isExpanded FROM branches WHERE noteId = ?
2018-04-16 16:26:47 -04:00
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-12-11 21:53:56 +01:00
SELECT branches . * FROM tree JOIN branches USING ( noteId ) WHERE branches . isDeleted = 0 ORDER BY branches . notePosition ` , [hoistedNoteId]);
2018-04-16 16:26:47 -04:00
2018-08-12 12:59:38 +02:00
const noteIds = Array . from ( new Set ( branches . map ( b => b . noteId ) ) ) ;
2018-03-24 20:41:27 -04:00
2018-04-16 20:40:18 -04:00
const notes = await getNotes ( noteIds ) ;
2018-03-24 20:41:27 -04:00
2018-04-16 23:13:33 -04:00
const relations = await getRelations ( noteIds ) ;
2018-04-16 16:26:47 -04:00
2018-04-16 20:40:18 -04:00
return {
2018-08-17 18:11:03 +02:00
startNotePath : ( await optionService . getOption ( 'startNotePath' ) ) || 'root' ,
2018-04-16 20:40:18 -04:00
branches ,
notes ,
2018-04-16 23:13:33 -04:00
relations
2018-04-16 20:40:18 -04:00
} ;
}
2018-04-16 16:26:47 -04:00
2018-04-16 20:40:18 -04:00
async function load ( req ) {
let noteIds = req . body . noteIds ;
const branchIds = req . body . branchIds ;
2018-04-16 16:26:47 -04:00
2018-04-16 20:40:18 -04:00
if ( branchIds && branchIds . length > 0 ) {
2018-05-30 23:18:56 -04:00
noteIds = ( await sql . getManyRows ( ` SELECT noteId FROM branches WHERE isDeleted = 0 AND branchId IN(???) ` , branchIds ) )
2018-05-30 20:28:10 -04:00
. map ( note => note . noteId ) ;
2018-04-16 16:26:47 -04:00
}
2018-02-13 22:30:33 -05:00
2018-05-30 20:28:10 -04:00
const branches = await sql . getManyRows ( ` SELECT * FROM branches WHERE isDeleted = 0 AND noteId IN (???) ` , noteIds ) ;
2018-04-16 20:40:18 -04:00
const notes = await getNotes ( noteIds ) ;
2018-04-16 23:13:33 -04:00
const relations = await getRelations ( noteIds ) ;
2018-04-16 20:40:18 -04:00
2018-03-30 12:57:22 -04:00
return {
2018-04-16 20:40:18 -04:00
branches ,
notes ,
2018-04-16 23:13:33 -04:00
relations
2018-03-30 12:57:22 -04:00
} ;
}
2017-10-14 23:31:44 -04:00
2018-03-30 12:57:22 -04:00
module . exports = {
2018-04-16 20:40:18 -04:00
getTree ,
load
2018-03-30 12:57:22 -04:00
} ;