2018-04-03 22:15:28 -04:00
"use strict" ;
const sql = require ( './sql' ) ;
2021-06-29 22:15:57 +02:00
const eventChangesService = require ( './entity_changes' ) ;
2018-08-11 19:45:55 +02:00
const treeService = require ( './tree' ) ;
const noteService = require ( './notes' ) ;
2021-06-29 22:15:57 +02:00
const Branch = require ( '../becca/entities/branch' ) ;
const TaskContext = require ( "./task_context" ) ;
2020-02-01 16:05:23 +08:00
const utils = require ( './utils' ) ;
2021-06-29 22:15:57 +02:00
const becca = require ( "../becca/becca" ) ;
2021-06-06 11:01:10 +02:00
const beccaService = require ( "../becca/becca_service" ) ;
2022-02-05 12:06:23 +01:00
const log = require ( "./log" ) ;
2018-04-03 22:15:28 -04:00
2021-12-27 23:39:46 +01:00
function cloneNoteToNote ( noteId , parentNoteId , prefix ) {
if ( parentNoteId === 'share' ) {
2021-12-20 17:30:47 +01:00
const specialNotesService = require ( './special_notes' ) ;
// share root note is created lazily
specialNotesService . getShareRoot ( ) ;
}
2021-12-27 23:39:46 +01:00
if ( isNoteDeleted ( noteId ) || isNoteDeleted ( parentNoteId ) ) {
2019-01-17 23:24:59 +01:00
return { success : false , message : 'Note is deleted.' } ;
}
2021-12-27 23:39:46 +01:00
const validationResult = treeService . validateParentChild ( parentNoteId , noteId ) ;
2018-04-03 22:15:28 -04:00
if ( ! validationResult . success ) {
return validationResult ;
}
2020-06-20 12:31:38 +02:00
const branch = new Branch ( {
2018-04-03 22:15:28 -04:00
noteId : noteId ,
2021-12-27 23:39:46 +01:00
parentNoteId : parentNoteId ,
2018-04-03 22:15:28 -04:00
prefix : prefix ,
isExpanded : 0
} ) . save ( ) ;
2022-02-05 12:06:23 +01:00
log . info ( ` Cloned note ${ noteId } to new parent note ${ parentNoteId } with prefix ${ prefix } ` ) ;
2021-06-06 11:01:10 +02:00
return {
success : true ,
branchId : branch . branchId ,
2021-12-27 23:39:46 +01:00
notePath : beccaService . getNotePath ( parentNoteId ) . path + "/" + noteId
2021-06-06 11:01:10 +02:00
} ;
2018-04-03 22:15:28 -04:00
}
2021-12-27 23:39:46 +01:00
function cloneNoteToBranch ( noteId , parentBranchId , prefix ) {
const parentBranch = becca . getBranch ( parentBranchId ) ;
if ( ! parentBranch ) {
return { success : false , message : ` Parent branch ${ parentBranchId } does not exist. ` } ;
}
const ret = cloneNoteToNote ( noteId , parentBranch . noteId , prefix ) ;
parentBranch . isExpanded = true ; // the new target should be expanded so it immediately shows up to the user
parentBranch . save ( ) ;
return ret ;
}
2020-06-20 12:31:38 +02:00
function ensureNoteIsPresentInParent ( noteId , parentNoteId , prefix ) {
if ( isNoteDeleted ( noteId ) || isNoteDeleted ( parentNoteId ) ) {
2019-01-17 23:24:59 +01:00
return { success : false , message : 'Note is deleted.' } ;
}
2020-06-20 12:31:38 +02:00
const validationResult = treeService . validateParentChild ( parentNoteId , noteId ) ;
2018-08-13 10:59:31 +02:00
if ( ! validationResult . success ) {
return validationResult ;
}
2020-06-20 12:31:38 +02:00
new Branch ( {
2018-08-13 10:59:31 +02:00
noteId : noteId ,
parentNoteId : parentNoteId ,
prefix : prefix ,
isExpanded : 0
} ) . save ( ) ;
2022-02-05 12:06:23 +01:00
log . info ( ` Ensured note ${ noteId } is in parent note ${ parentNoteId } with prefix ${ prefix } ` ) ;
2018-08-11 19:45:55 +02:00
}
2020-06-20 12:31:38 +02:00
function ensureNoteIsAbsentFromParent ( noteId , parentNoteId ) {
2021-05-11 22:00:16 +02:00
const branchId = sql . getValue ( ` SELECT branchId FROM branches WHERE noteId = ? AND parentNoteId = ? AND isDeleted = 0 ` , [ noteId , parentNoteId ] ) ;
const branch = becca . getBranch ( branchId ) ;
2018-08-11 19:45:55 +02:00
if ( branch ) {
2022-01-31 22:09:39 +01:00
if ( branch . getNote ( ) . getParentBranches ( ) . length <= 1 ) {
throw new Error ( ` Cannot remove branch ${ branch . branchId } between child ${ noteId } and parent ${ parentNoteId } because this would delete the note as well. ` ) ;
}
2022-04-19 23:06:46 +02:00
branch . deleteBranch ( ) ;
2022-02-05 12:06:23 +01:00
log . info ( ` Ensured note ${ noteId } is NOT in parent note ${ parentNoteId } ` ) ;
2018-08-11 19:45:55 +02:00
}
}
2020-06-20 12:31:38 +02:00
function toggleNoteInParent ( present , noteId , parentNoteId , prefix ) {
2018-08-13 13:53:08 +02:00
if ( present ) {
2020-06-20 12:31:38 +02:00
ensureNoteIsPresentInParent ( noteId , parentNoteId , prefix ) ;
2018-08-13 13:53:08 +02:00
}
else {
2020-06-20 12:31:38 +02:00
ensureNoteIsAbsentFromParent ( noteId , parentNoteId ) ;
2018-08-13 13:53:08 +02:00
}
}
2020-06-20 12:31:38 +02:00
function cloneNoteAfter ( noteId , afterBranchId ) {
2021-05-02 11:23:58 +02:00
const afterNote = becca . getBranch ( afterBranchId ) ;
2018-04-03 22:15:28 -04:00
2020-06-20 12:31:38 +02:00
if ( isNoteDeleted ( noteId ) || isNoteDeleted ( afterNote . parentNoteId ) ) {
2019-01-17 23:24:59 +01:00
return { success : false , message : 'Note is deleted.' } ;
}
2020-06-20 12:31:38 +02:00
const validationResult = treeService . validateParentChild ( afterNote . parentNoteId , noteId ) ;
2018-04-03 22:15:28 -04:00
2019-10-26 21:14:06 +02:00
if ( ! validationResult . success ) {
2018-04-03 22:15:28 -04:00
return validationResult ;
}
2019-03-12 20:58:31 +01:00
// we don't change utcDateModified so other changes are prioritized in case of conflict
2018-04-03 22:15:28 -04:00
// also we would have to sync all those modified branches otherwise hash checks would fail
2020-06-20 12:31:38 +02:00
sql . execute ( "UPDATE branches SET notePosition = notePosition + 10 WHERE parentNoteId = ? AND notePosition > ? AND isDeleted = 0" ,
2018-04-03 22:15:28 -04:00
[ afterNote . parentNoteId , afterNote . notePosition ] ) ;
2020-08-02 23:43:39 +02:00
eventChangesService . addNoteReorderingEntityChange ( afterNote . parentNoteId ) ;
2018-04-03 22:15:28 -04:00
2020-06-20 12:31:38 +02:00
const branch = new Branch ( {
2018-04-03 22:15:28 -04:00
noteId : noteId ,
parentNoteId : afterNote . parentNoteId ,
2019-10-19 12:36:16 +02:00
notePosition : afterNote . notePosition + 10 ,
2018-04-03 22:15:28 -04:00
isExpanded : 0
} ) . save ( ) ;
2022-02-05 12:06:23 +01:00
log . info ( ` Cloned note ${ noteId } into parent note ${ afterNote . parentNoteId } after note ${ afterNote . noteId } , branch ${ afterBranchId } ` ) ;
2019-03-18 22:33:19 +01:00
return { success : true , branchId : branch . branchId } ;
2018-04-03 22:15:28 -04:00
}
2020-06-20 12:31:38 +02:00
function isNoteDeleted ( noteId ) {
2021-05-02 11:23:58 +02:00
const note = becca . getNote ( noteId ) ;
2019-01-17 23:24:59 +01:00
return note . isDeleted ;
}
2018-04-03 22:15:28 -04:00
module . exports = {
2021-12-27 23:39:46 +01:00
cloneNoteToBranch ,
cloneNoteToNote ,
2018-08-11 19:45:55 +02:00
ensureNoteIsPresentInParent ,
ensureNoteIsAbsentFromParent ,
2018-08-13 13:53:08 +02:00
toggleNoteInParent ,
2018-04-03 22:15:28 -04:00
cloneNoteAfter
2020-05-31 22:33:02 +02:00
} ;