2017-10-21 21:10:33 -04:00
"use strict" ;
2018-04-01 21:27:46 -04:00
const noteService = require ( '../../services/notes' ) ;
const treeService = require ( '../../services/tree' ) ;
2018-03-31 10:51:37 -04:00
const repository = require ( '../../services/repository' ) ;
2017-10-14 23:31:44 -04:00
2018-03-30 12:57:22 -04:00
async function getNote ( req ) {
2017-11-15 00:04:26 -05:00
const noteId = req . params . noteId ;
2018-04-01 11:42:12 -04:00
const note = await repository . getNote ( noteId ) ;
2017-10-14 23:31:44 -04:00
2018-03-30 12:57:22 -04:00
if ( ! note ) {
return [ 404 , "Note " + noteId + " has not been found." ] ;
2017-11-26 23:10:23 -05:00
}
2018-03-30 12:57:22 -04:00
if ( note . type === 'file' ) {
2018-03-27 22:11:06 -04:00
// no need to transfer (potentially large) file payload for this request
2018-03-30 12:57:22 -04:00
note . content = null ;
2018-02-18 21:28:24 -05:00
}
2018-03-30 12:57:22 -04:00
return note ;
}
2017-10-14 23:31:44 -04:00
2018-10-21 10:26:14 +02:00
async function getChildren ( req ) {
const parentNoteId = req . params . parentNoteId ;
const parentNote = await repository . getNote ( parentNoteId ) ;
if ( ! parentNote ) {
return [ 404 , ` Note ${ parentNoteId } has not been found. ` ] ;
}
const ret = [ ] ;
for ( const childNote of await parentNote . getChildNotes ( ) ) {
ret . push ( {
noteId : childNote . noteId ,
title : childNote . title ,
relations : ( await childNote . getRelations ( ) ) . map ( relation => { return {
attributeId : relation . attributeId ,
name : relation . name ,
targetNoteId : relation . value
} ; } )
} ) ;
}
return ret ;
}
2018-03-30 12:57:22 -04:00
async function createNote ( req ) {
2017-11-22 23:16:54 -05:00
const parentNoteId = req . params . parentNoteId ;
2018-01-28 10:37:43 -05:00
const newNote = req . body ;
2017-10-14 23:31:44 -04:00
2018-04-01 21:27:46 -04:00
const { note , branch } = await noteService . createNewNote ( parentNoteId , newNote , req ) ;
2017-10-14 23:31:44 -04:00
2018-09-01 13:18:55 +02:00
note . cssClass = ( await note . getLabels ( "cssClass" ) ) . map ( label => label . value ) . join ( " " ) ;
2018-03-30 12:57:22 -04:00
return {
2018-04-01 11:42:12 -04:00
note ,
branch
2018-03-30 12:57:22 -04:00
} ;
}
2017-10-14 23:31:44 -04:00
2018-03-30 12:57:22 -04:00
async function updateNote ( req ) {
2017-11-14 21:54:12 -05:00
const note = req . body ;
2017-11-15 00:04:26 -05:00
const noteId = req . params . noteId ;
2017-11-05 10:41:54 -05:00
2018-04-01 21:27:46 -04:00
await noteService . updateNote ( noteId , note ) ;
2018-03-30 12:57:22 -04:00
}
2017-10-14 23:31:44 -04:00
2018-03-30 12:57:22 -04:00
async function sortNotes ( req ) {
2018-01-13 17:00:40 -05:00
const noteId = req . params . noteId ;
2018-04-01 21:27:46 -04:00
await treeService . sortNotesAlphabetically ( noteId ) ;
2018-03-30 12:57:22 -04:00
}
2018-01-13 17:00:40 -05:00
2018-08-31 18:22:53 +02:00
async function protectSubtree ( req ) {
2018-01-13 20:53:00 -05:00
const noteId = req . params . noteId ;
2018-04-19 22:18:19 -04:00
const note = await repository . getNote ( noteId ) ;
2018-03-31 10:51:37 -04:00
const protect = ! ! parseInt ( req . params . isProtected ) ;
2018-01-13 17:00:40 -05:00
2018-04-01 21:27:46 -04:00
await noteService . protectNoteRecursively ( note , protect ) ;
2018-03-30 12:57:22 -04:00
}
2018-01-13 17:00:40 -05:00
2018-03-30 12:57:22 -04:00
async function setNoteTypeMime ( req ) {
2018-04-04 23:04:31 -04:00
// can't use [] destructuring because req.params is not iterable
const noteId = req . params [ 0 ] ;
const type = req . params [ 1 ] ;
const mime = req . params [ 2 ] ;
2018-01-20 21:56:03 -05:00
2018-04-01 17:38:24 -04:00
const note = await repository . getNote ( noteId ) ;
note . type = type ;
note . mime = mime ;
await note . save ( ) ;
2018-03-30 12:57:22 -04:00
}
2018-01-20 21:56:03 -05:00
2018-10-25 12:06:36 +02:00
async function getRelationMap ( req ) {
const noteIds = req . body . noteIds ;
const resp = {
noteTitles : { } ,
relations : [ ]
} ;
if ( noteIds . length === 0 ) {
return resp ;
}
const questionMarks = noteIds . map ( noteId => '?' ) . join ( ',' ) ;
2018-10-25 14:01:03 +02:00
( await repository . getEntities ( ` SELECT * FROM notes WHERE isDeleted = 0 AND noteId IN ( ${ questionMarks } ) ` , noteIds ) )
2018-10-25 12:06:36 +02:00
. forEach ( note => resp . noteTitles [ note . noteId ] = note . title ) ;
// FIXME: this actually doesn't take into account inherited relations! But maybe it is better this way?
2018-10-25 14:01:03 +02:00
resp . relations = ( await repository . getEntities ( ` SELECT * FROM attributes WHERE isDeleted = 0 AND type = 'relation' AND noteId IN ( ${ questionMarks } ) ` , noteIds ) )
2018-10-25 12:06:36 +02:00
. map ( relation => { return {
2018-10-30 10:36:19 +01:00
attributeId : relation . attributeId ,
2018-10-25 12:06:36 +02:00
sourceNoteId : relation . noteId ,
targetNoteId : relation . value ,
name : relation . name
} ; } )
// both sourceNoteId and targetNoteId has to be in the included notes, but source was already checked in the SQL query
. filter ( relation => noteIds . includes ( relation . targetNoteId ) ) ;
return resp ;
}
2018-03-30 12:57:22 -04:00
module . exports = {
getNote ,
updateNote ,
createNote ,
sortNotes ,
2018-08-31 18:22:53 +02:00
protectSubtree ,
2018-10-21 10:26:14 +02:00
setNoteTypeMime ,
2018-10-25 12:06:36 +02:00
getChildren ,
getRelationMap
2018-03-30 12:57:22 -04:00
} ;