| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-09 10:12:02 +01:00
										 |  |  | const attributeService = require("../../services/attributes"); | 
					
						
							| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | const noteService = require('../../services/notes'); | 
					
						
							|  |  |  | const dateNoteService = require('../../services/date_notes'); | 
					
						
							|  |  |  | const dateUtils = require('../../services/date_utils'); | 
					
						
							|  |  |  | const imageService = require('../../services/image'); | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | const appInfo = require('../../services/app_info'); | 
					
						
							| 
									
										
										
										
											2019-08-26 20:21:43 +02:00
										 |  |  | const ws = require('../../services/ws.js'); | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | const log = require('../../services/log'); | 
					
						
							| 
									
										
										
										
											2019-07-07 13:12:40 +02:00
										 |  |  | const utils = require('../../services/utils'); | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | const path = require('path'); | 
					
						
							| 
									
										
										
										
											2019-08-19 20:12:00 +02:00
										 |  |  | const Attribute = require('../../entities/attribute'); | 
					
						
							| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | async function findClippingNote(todayNote, pageUrl) { | 
					
						
							|  |  |  |     const notes = await todayNote.getDescendantNotesWithLabel('pageUrl', pageUrl); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (const note of notes) { | 
					
						
							| 
									
										
										
										
											2019-12-01 11:10:04 +01:00
										 |  |  |         if (await note.getOwnedLabelValue('clipType') === 'clippings') { | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  |             return note; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-09 10:12:02 +01:00
										 |  |  | async function getClipperInboxNote() { | 
					
						
							|  |  |  |     let clipperInbox = await attributeService.getNoteWithLabel('clipperInbox'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!clipperInbox) { | 
					
						
							|  |  |  |         clipperInbox = await dateNoteService.getDateNote(dateUtils.localNowDate()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return clipperInbox; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | async function addClipping(req) { | 
					
						
							|  |  |  |     const {title, content, pageUrl, images} = req.body; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-09 10:12:02 +01:00
										 |  |  |     const clipperInbox = await getClipperInboxNote(); | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-09 10:12:02 +01:00
										 |  |  |     let clippingNote = await findClippingNote(clipperInbox, pageUrl); | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!clippingNote) { | 
					
						
							| 
									
										
										
										
											2019-11-16 11:09:52 +01:00
										 |  |  |         clippingNote = (await noteService.createNewNote({ | 
					
						
							| 
									
										
										
										
											2020-02-09 10:12:02 +01:00
										 |  |  |             parentNoteId: clipperInbox.noteId, | 
					
						
							| 
									
										
										
										
											2019-11-16 11:09:52 +01:00
										 |  |  |             title: title, | 
					
						
							| 
									
										
										
										
											2019-12-08 09:41:31 +01:00
										 |  |  |             content: '', | 
					
						
							|  |  |  |             type: 'text' | 
					
						
							| 
									
										
										
										
											2019-11-16 11:09:52 +01:00
										 |  |  |         })).note; | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         await clippingNote.setLabel('clipType', 'clippings'); | 
					
						
							|  |  |  |         await clippingNote.setLabel('pageUrl', pageUrl); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const rewrittenContent = await addImagesToNote(images, clippingNote, content); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-05 15:35:01 +02:00
										 |  |  |     const existingContent = await clippingNote.getContent(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await clippingNote.setContent(existingContent + (existingContent.trim() ? "<br/>" : "") + rewrittenContent); | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |         noteId: clippingNote.noteId | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | async function createNote(req) { | 
					
						
							| 
									
										
										
										
											2019-07-19 21:03:47 +02:00
										 |  |  |     const {title, content, pageUrl, images, clipType} = req.body; | 
					
						
							| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-08 11:07:38 +02:00
										 |  |  |     log.info(`Creating clipped note from ${pageUrl}`); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-09 10:12:02 +01:00
										 |  |  |     const clipperInbox = await getClipperInboxNote(); | 
					
						
							| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-16 11:09:52 +01:00
										 |  |  |     const {note} = await noteService.createNewNote({ | 
					
						
							| 
									
										
										
										
											2020-02-09 10:12:02 +01:00
										 |  |  |         parentNoteId: clipperInbox.noteId, | 
					
						
							| 
									
										
										
										
											2019-11-16 11:09:52 +01:00
										 |  |  |         title, | 
					
						
							| 
									
										
										
										
											2019-12-08 09:41:31 +01:00
										 |  |  |         content, | 
					
						
							|  |  |  |         type: 'text' | 
					
						
							| 
									
										
										
										
											2019-11-16 11:09:52 +01:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-19 21:03:47 +02:00
										 |  |  |     await note.setLabel('clipType', clipType); | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (pageUrl) { | 
					
						
							|  |  |  |         await note.setLabel('pageUrl', pageUrl); | 
					
						
							| 
									
										
										
										
											2019-07-06 16:48:06 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  |     const rewrittenContent = await addImagesToNote(images, note, content); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await note.setContent(rewrittenContent); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |         noteId: note.noteId | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async function addImagesToNote(images, note, content) { | 
					
						
							| 
									
										
										
										
											2019-07-06 16:48:06 +02:00
										 |  |  |     let rewrittenContent = content; | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 16:48:06 +02:00
										 |  |  |     if (images) { | 
					
						
							|  |  |  |         for (const {src, dataUrl, imageId} of images) { | 
					
						
							|  |  |  |             const filename = path.basename(src); | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 16:48:06 +02:00
										 |  |  |             if (!dataUrl.startsWith("data:image")) { | 
					
						
							|  |  |  |                 log.info("Image could not be recognized as data URL:", dataUrl.substr(0, Math.min(100, dataUrl.length))); | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 16:48:06 +02:00
										 |  |  |             const buffer = Buffer.from(dataUrl.split(",")[1], 'base64'); | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-08 22:34:30 +01:00
										 |  |  |             const {note: imageNote, url} = await imageService.saveImage(note.noteId, buffer, filename, true); | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 23:06:13 +02:00
										 |  |  |             await new Attribute({ | 
					
						
							|  |  |  |                 noteId: imageNote.noteId, | 
					
						
							|  |  |  |                 type: 'label', | 
					
						
							|  |  |  |                 name: 'hideInAutocomplete' | 
					
						
							|  |  |  |             }).save(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-19 20:12:00 +02:00
										 |  |  |             await new Attribute({ | 
					
						
							| 
									
										
										
										
											2019-07-06 16:48:06 +02:00
										 |  |  |                 noteId: note.noteId, | 
					
						
							| 
									
										
										
										
											2019-08-19 20:12:00 +02:00
										 |  |  |                 type: 'relation', | 
					
						
							| 
									
										
										
										
											2020-05-13 23:06:13 +02:00
										 |  |  |                 name: 'imageLink', | 
					
						
							|  |  |  |                 value: imageNote.noteId | 
					
						
							| 
									
										
										
										
											2019-07-06 16:48:06 +02:00
										 |  |  |             }).save(); | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 16:48:06 +02:00
										 |  |  |             console.log(`Replacing ${imageId} with ${url}`); | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-02 22:55:11 +02:00
										 |  |  |             rewrittenContent = utils.replaceAll(rewrittenContent, imageId, url); | 
					
						
							| 
									
										
										
										
											2019-07-06 16:48:06 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-23 11:25:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  |     return rewrittenContent; | 
					
						
							| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 13:25:00 +02:00
										 |  |  | async function openNote(req) { | 
					
						
							| 
									
										
										
										
											2019-07-07 13:12:40 +02:00
										 |  |  |     if (utils.isElectron()) { | 
					
						
							| 
									
										
										
										
											2019-08-26 20:21:43 +02:00
										 |  |  |         ws.sendMessageToAllClients({ | 
					
						
							| 
									
										
										
										
											2019-07-07 13:12:40 +02:00
										 |  |  |             type: 'open-note', | 
					
						
							|  |  |  |             noteId: req.params.noteId | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             result: 'ok' | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             result: 'open-in-browser' | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  | async function handshake() { | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |         appName: "trilium", | 
					
						
							| 
									
										
										
										
											2019-07-07 22:27:06 +02:00
										 |  |  |         protocolVersion: appInfo.clipperProtocolVersion | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-22 19:49:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  |     createNote, | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  |     addClipping, | 
					
						
							| 
									
										
										
										
											2019-06-23 13:25:00 +02:00
										 |  |  |     openNote, | 
					
						
							| 
									
										
										
										
											2019-07-06 23:54:48 +02:00
										 |  |  |     handshake | 
					
						
							| 
									
										
										
										
											2020-05-13 23:06:13 +02:00
										 |  |  | }; |