diff --git a/src/becca/becca_loader.js b/src/becca/becca_loader.js index 4d18ad17c..25b4cd04d 100644 --- a/src/becca/becca_loader.js +++ b/src/becca/becca_loader.js @@ -70,7 +70,7 @@ function postProcessEntityUpdate(entityName, entity) { } } -eventService.subscribe([eventService.ENTITY_CHANGE_SYNCED], ({entityName, entityRow}) => { +eventService.subscribeBeccaLoader([eventService.ENTITY_CHANGE_SYNCED], ({entityName, entityRow}) => { if (!becca.loaded) { return; } @@ -93,7 +93,7 @@ eventService.subscribe([eventService.ENTITY_CHANGE_SYNCED], ({entityName, entit postProcessEntityUpdate(entityName, entityRow); }); -eventService.subscribe(eventService.ENTITY_CHANGED, ({entityName, entity}) => { +eventService.subscribeBeccaLoader(eventService.ENTITY_CHANGED, ({entityName, entity}) => { if (!becca.loaded) { return; } @@ -101,7 +101,7 @@ eventService.subscribe(eventService.ENTITY_CHANGED, ({entityName, entity}) => { postProcessEntityUpdate(entityName, entity); }); -eventService.subscribe([eventService.ENTITY_DELETED, eventService.ENTITY_DELETE_SYNCED], ({entityName, entityId}) => { +eventService.subscribeBeccaLoader([eventService.ENTITY_DELETED, eventService.ENTITY_DELETE_SYNCED], ({entityName, entityId}) => { if (!becca.loaded) { return; } @@ -220,7 +220,7 @@ function noteReorderingUpdated(branchIdList) { } } -eventService.subscribe(eventService.ENTER_PROTECTED_SESSION, () => { +eventService.subscribeBeccaLoader(eventService.ENTER_PROTECTED_SESSION, () => { try { becca.decryptProtectedNotes(); } @@ -229,7 +229,7 @@ eventService.subscribe(eventService.ENTER_PROTECTED_SESSION, () => { } }); -eventService.subscribe(eventService.LEAVE_PROTECTED_SESSION, load); +eventService.subscribeBeccaLoader(eventService.LEAVE_PROTECTED_SESSION, load); module.exports = { load, diff --git a/src/becca/entities/attribute.js b/src/becca/entities/attribute.js index 91f75d15f..c990b44c9 100644 --- a/src/becca/entities/attribute.js +++ b/src/becca/entities/attribute.js @@ -145,6 +145,10 @@ class Attribute extends AbstractEntity { } } + get isDeleted() { + return !(this.attributeId in this.becca.attributes); + } + beforeSaving() { if (!this.value) { if (this.type === 'relation') { diff --git a/src/becca/entities/branch.js b/src/becca/entities/branch.js index 159622fdd..83f77b2bc 100644 --- a/src/becca/entities/branch.js +++ b/src/becca/entities/branch.js @@ -101,6 +101,10 @@ class Branch extends AbstractEntity { return this.becca.notes[this.parentNoteId]; } + get isDeleted() { + return !(this.branchId in this.becca.branches); + } + beforeSaving() { if (this.notePosition === undefined || this.notePosition === null) { // TODO finding new position can be refactored into becca diff --git a/src/becca/entities/note.js b/src/becca/entities/note.js index cae3731db..449951b9f 100644 --- a/src/becca/entities/note.js +++ b/src/becca/entities/note.js @@ -1112,6 +1112,10 @@ class Note extends AbstractEntity { } } + get isDeleted() { + return !(this.noteId in this.becca.notes); + } + beforeSaving() { super.beforeSaving(); diff --git a/src/routes/api/attributes.js b/src/routes/api/attributes.js index fbed52df0..63435991b 100644 --- a/src/routes/api/attributes.js +++ b/src/routes/api/attributes.js @@ -147,7 +147,7 @@ function updateNoteAttributes(req) { if (incAttr.type === 'relation') { const targetNote = becca.getNote(incAttr.value); - if (!targetNote || targetNote.isDeleted) { + if (!targetNote) { log.error(`Target note of relation ${JSON.stringify(incAttr)} does not exist or is deleted`); continue; } diff --git a/src/services/events.js b/src/services/events.js index f04dcf7b8..a9dd44496 100644 --- a/src/services/events.js +++ b/src/services/events.js @@ -27,6 +27,19 @@ function subscribe(eventTypes, listener) { } } +function subscribeBeccaLoader(eventTypes, listener) { + if (!Array.isArray(eventTypes)) { + eventTypes = [ eventTypes ]; + } + + for (const eventType of eventTypes) { + eventListeners[eventType] = eventListeners[eventType] || []; + // becca loader should be the first listener so that other listeners can already work + // with updated becca + eventListeners[eventType] = [listener, ...eventListeners[eventType]]; + } +} + function emit(eventType, data) { const listeners = eventListeners[eventType]; @@ -45,6 +58,7 @@ function emit(eventType, data) { module.exports = { subscribe, + subscribeBeccaLoader, emit, // event types: NOTE_TITLE_CHANGED,