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' ) ;  
						 
					
						
							
								
									
										
										
										
											2019-10-15 19:16:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  noteCacheService  =  require ( '../../services/note_cache' ) ;  
						 
					
						
							
								
									
										
										
										
											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 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-10-15 19:16:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    notes . forEach ( note  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        note . isProtected  =  ! ! note . isProtected ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        note . archived  =  noteCacheService . isArchived ( note . noteId ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-04-16 20:40:18 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    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-12-12 20:39:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // also now with note hoisting, it is possible to have the note displayed without its parent chain being 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-12-12 20:39:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    // we also want root branch in there because all the paths start with root
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    branches . push ( await  sql . getRow ( ` SELECT * FROM branches WHERE branchId = 'root' ` ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;