| 
									
										
										
										
											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'); | 
					
						
							| 
									
										
										
										
											2019-11-16 11:23:28 +01:00
										 |  |  | const treeService = require('../../services/tree'); | 
					
						
							| 
									
										
										
										
											2018-04-16 20:40:18 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  | async function getNotesAndBranches(noteIds) { | 
					
						
							|  |  |  |     noteIds = Array.from(new Set(noteIds)); | 
					
						
							| 
									
										
										
										
											2019-11-16 11:23:28 +01:00
										 |  |  |     const notes = await treeService.getNotes(noteIds); | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     noteIds = notes.map(n => n.noteId); | 
					
						
							| 
									
										
										
										
											2018-04-16 20:40:18 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  |     const branches = await sql.getManyRows(` 
 | 
					
						
							|  |  |  |         SELECT  | 
					
						
							|  |  |  |             branches.branchId, | 
					
						
							|  |  |  |             branches.noteId, | 
					
						
							|  |  |  |             branches.parentNoteId, | 
					
						
							|  |  |  |             branches.notePosition, | 
					
						
							|  |  |  |             branches.prefix, | 
					
						
							|  |  |  |             branches.isExpanded | 
					
						
							|  |  |  |         FROM branches | 
					
						
							|  |  |  |         WHERE branches.isDeleted = 0 | 
					
						
							|  |  |  |           AND (branches.noteId IN (???) OR parentNoteId IN (???))`, noteIds);
 | 
					
						
							| 
									
										
										
										
											2018-08-31 17:29:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  |     // sorting in memory is faster
 | 
					
						
							|  |  |  |     branches.sort((a, b) => a.notePosition - b.notePosition < 0 ? -1 : 1); | 
					
						
							| 
									
										
										
										
											2018-08-31 17:29:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  |     return { | 
					
						
							|  |  |  |         branches, | 
					
						
							|  |  |  |         notes | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  |     let noteIds = await sql.getColumn(`
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  |           ) | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  |         SELECT noteId FROM tree`, [hoistedNoteId]);
 | 
					
						
							| 
									
										
										
										
											2018-04-16 16:26:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  |     noteIds.push('root'); | 
					
						
							| 
									
										
										
										
											2018-12-12 20:39:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  |     return await getNotesAndBranches(noteIds); | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2019-10-26 09:58:00 +02:00
										 |  |  |     return await getNotesAndBranches(req.body.noteIds); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | }; |