| 
									
										
										
										
											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(`
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  |       SELECT  | 
					
						
							|  |  |  |              noteId,  | 
					
						
							|  |  |  |              title,  | 
					
						
							|  |  |  |              isProtected,  | 
					
						
							|  |  |  |              type,  | 
					
						
							|  |  |  |              mime | 
					
						
							|  |  |  |       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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  | async function getNotesAndBranches(noteIds) { | 
					
						
							|  |  |  |     noteIds = Array.from(new Set(noteIds)); | 
					
						
							|  |  |  |     const notes = await getNotes(noteIds); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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) { | 
					
						
							|  |  |  |     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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-25 21:47:14 +02:00
										 |  |  |     return await getNotesAndBranches(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
										 |  |  | }; |