From cb8e551ee040ae4be6de822ac59da032bda15d53 Mon Sep 17 00:00:00 2001 From: zadam Date: Sat, 15 May 2021 23:05:20 +0200 Subject: [PATCH 1/8] release 0.47.3 --- package.json | 2 +- src/services/build.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3033a8ab1..be61c942e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "trilium", "productName": "Trilium Notes", "description": "Trilium Notes", - "version": "0.47.2", + "version": "0.47.3", "license": "AGPL-3.0-only", "main": "electron.js", "bin": { diff --git a/src/services/build.js b/src/services/build.js index f304c7fce..66897a31a 100644 --- a/src/services/build.js +++ b/src/services/build.js @@ -1 +1 @@ -module.exports = { buildDate:"2021-04-26T22:32:54+02:00", buildRevision: "6f1b0b92fe8dcea736c15217c69512c7fee769cb" }; +module.exports = { buildDate:"2021-05-15T23:05:20+02:00", buildRevision: "f6dd1110e842a8b84f2bbdaadad315763045c152" }; From 8bd3e17a3b38180b287be7959c61f46250532e94 Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 17 May 2021 22:05:35 +0200 Subject: [PATCH 2/8] removed legacy entities and repository --- src/entities/attribute.js | 124 --- src/entities/branch.js | 77 -- src/entities/entity.js | 62 -- src/entities/note.js | 957 ------------------ src/routes/api/attributes.js | 33 +- src/routes/api/autocomplete.js | 1 - src/routes/api/branches.js | 1 - src/routes/api/export.js | 1 - src/routes/api/import.js | 1 - src/routes/api/note_revisions.js | 1 - src/routes/api/notes.js | 1 - src/routes/api/sql.js | 1 - src/routes/api/sync.js | 1 - src/routes/custom.js | 1 - src/services/backend_script_api.js | 1 - src/services/becca/becca.js | 2 +- .../becca}/entity_constructor.js | 22 +- src/services/cls.js | 10 - src/services/consistency_checks.js | 3 +- src/services/entity_changes.js | 4 +- src/services/export/opml.js | 1 - src/services/export/zip.js | 1 - src/services/repository.js | 146 --- src/services/script.js | 2 +- src/services/setup.js | 1 - src/services/sync.js | 3 +- src/services/sync_update.js | 2 +- src/tools/generate_document.js | 1 - 28 files changed, 30 insertions(+), 1431 deletions(-) delete mode 100644 src/entities/attribute.js delete mode 100644 src/entities/branch.js delete mode 100644 src/entities/entity.js delete mode 100644 src/entities/note.js rename src/{entities => services/becca}/entity_constructor.js (62%) delete mode 100644 src/services/repository.js diff --git a/src/entities/attribute.js b/src/entities/attribute.js deleted file mode 100644 index fe6a2f44f..000000000 --- a/src/entities/attribute.js +++ /dev/null @@ -1,124 +0,0 @@ -"use strict"; - - -const Entity = require('./entity'); -const dateUtils = require('../services/date_utils'); -const sql = require('../services/sql'); -const promotedAttributeDefinitionParser = require("../services/promoted_attribute_definition_parser"); - -/** - * Attribute is key value pair owned by a note. - * - * @property {string} attributeId - immutable - * @property {string} noteId - immutable - * @property {string} type - immutable - * @property {string} name - immutable - * @property {string} value - * @property {int} position - * @property {boolean} isInheritable - immutable - * @property {boolean} isDeleted - * @property {string|null} deleteId - ID identifying delete transaction - * @property {string} utcDateModified - * - * @extends Entity - */ -class Attribute extends Entity { - static get entityName() { return "attributes"; } - static get primaryKeyName() { return "attributeId"; } - static get hashedProperties() { return ["attributeId", "noteId", "type", "name", "value", "isInheritable", "isDeleted"]; } - - constructor(row) { - super(row); - - this.isInheritable = !!this.isInheritable; - } - - isAutoLink() { - return this.type === 'relation' && ['internalLink', 'imageLink', 'relationMapLink', 'includeNoteLink'].includes(this.name); - } - - /** - * @returns {Note|null} - */ - getNote() { - return this.becca.getNote(this.noteId); - } - - /** - * @returns {Note|null} - */ - getTargetNote() { - if (this.type !== 'relation') { - throw new Error(`Attribute ${this.attributeId} is not relation`); - } - - if (!this.value) { - return null; - } - - return this.becca.getNote(this.value); - } - - /** - * @return {boolean} - */ - isDefinition() { - return this.type === 'label' && (this.name.startsWith('label:') || this.name.startsWith('relation:')); - } - - getDefinition() { - return promotedAttributeDefinitionParser.parse(this.value); - } - - getDefinedName() { - if (this.type === 'label' && this.name.startsWith('label:')) { - return this.name.substr(6); - } else if (this.type === 'label' && this.name.startsWith('relation:')) { - return this.name.substr(9); - } else { - return this.name; - } - } - - beforeSaving() { - if (!this.value) { - if (this.type === 'relation') { - throw new Error(`Cannot save relation ${this.name} since it does not target any note.`); - } - - // null value isn't allowed - this.value = ""; - } - - if (this.position === undefined) { - this.position = 1 + sql.getValue(`SELECT COALESCE(MAX(position), 0) FROM attributes WHERE noteId = ?`, [this.noteId]); - } - - if (!this.isInheritable) { - this.isInheritable = false; - } - - if (!this.isDeleted) { - this.isDeleted = false; - } - - super.beforeSaving(); - - this.utcDateModified = dateUtils.utcNowDateTime(); - } - - createClone(type, name, value, isInheritable) { - return new Attribute({ - noteId: this.noteId, - type: type, - name: name, - value: value, - position: this.position, - isInheritable: isInheritable, - isDeleted: false, - utcDateModified: this.utcDateModified - }); - } -} - -module.exports = Attribute; diff --git a/src/entities/branch.js b/src/entities/branch.js deleted file mode 100644 index 61d48e32c..000000000 --- a/src/entities/branch.js +++ /dev/null @@ -1,77 +0,0 @@ -"use strict"; - -const Entity = require('./entity'); -const dateUtils = require('../services/date_utils'); -const sql = require('../services/sql'); - -/** - * Branch represents note's placement in the tree - it's essentially pair of noteId and parentNoteId. - * Each note can have multiple (at least one) branches, meaning it can be placed into multiple places in the tree. - * - * @property {string} branchId - primary key, immutable - * @property {string} noteId - immutable - * @property {string} parentNoteId - immutable - * @property {int} notePosition - * @property {string} prefix - * @property {boolean} isExpanded - * @property {boolean} isDeleted - * @property {string|null} deleteId - ID identifying delete transaction - * @property {string} utcDateModified - * @property {string} utcDateCreated - * - * @extends Entity - */ -class Branch extends Entity { - static get entityName() { return "branches"; } - static get primaryKeyName() { return "branchId"; } - // notePosition is not part of hash because it would produce a lot of updates in case of reordering - static get hashedProperties() { return ["branchId", "noteId", "parentNoteId", "isDeleted", "deleteId", "prefix"]; } - - /** @returns {Note|null} */ - getNote() { - return this.becca.getNote(this.noteId); - } - - /** @returns {Note|null} */ - getParentNote() { - return this.becca.getNote(this.parentNoteId); - } - - beforeSaving() { - if (this.notePosition === undefined || this.notePosition === null) { - const maxNotePos = sql.getValue('SELECT MAX(notePosition) FROM branches WHERE parentNoteId = ? AND isDeleted = 0', [this.parentNoteId]); - this.notePosition = maxNotePos === null ? 0 : maxNotePos + 10; - } - - if (!this.isExpanded) { - this.isExpanded = false; - } - - if (!this.isDeleted) { - this.isDeleted = false; - } - - if (!this.utcDateCreated) { - this.utcDateCreated = dateUtils.utcNowDateTime(); - } - - super.beforeSaving(); - - this.utcDateModified = dateUtils.utcNowDateTime(); - } - - createClone(parentNoteId, notePosition) { - return new Branch({ - noteId: this.noteId, - parentNoteId: parentNoteId, - notePosition: notePosition, - prefix: this.prefix, - isExpanded: this.isExpanded, - isDeleted: false, - utcDateCreated: this.utcDateCreated, - utcDateModified: this.utcDateModified - }); - } -} - -module.exports = Branch; diff --git a/src/entities/entity.js b/src/entities/entity.js deleted file mode 100644 index 1bb652583..000000000 --- a/src/entities/entity.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; - -const utils = require('../services/utils'); -let repo = null; - -class Entity { - /** - * @param {object} [row] - database row representing given entity - */ - constructor(row = {}) { - for (const key in row) { - // ! is used when joint-fetching notes and note_contents objects for performance - if (!key.startsWith('!')) { - this[key] = row[key]; - } - } - - if ('isDeleted' in this && this.constructor.entityName !== 'recent_notes') { - this.isDeleted = !!this.isDeleted; - } - } - - beforeSaving() { - this.generateIdIfNecessary(); - } - - generateIdIfNecessary() { - if (!this[this.constructor.primaryKeyName]) { - this[this.constructor.primaryKeyName] = utils.newEntityId(); - } - } - - generateHash() { - let contentToHash = ""; - - for (const propertyName of this.constructor.hashedProperties) { - contentToHash += "|" + this[propertyName]; - } - - return utils.hash(contentToHash).substr(0, 10); - } - - getUtcDateChanged() { - return this.utcDateModified || this.utcDateCreated; - } - - get repository() { - if (!repo) { - repo = require('../services/repository'); - } - - return repo; - } - - save() { - this.repository.updateEntity(this); - - return this; - } -} - -module.exports = Entity; diff --git a/src/entities/note.js b/src/entities/note.js deleted file mode 100644 index f24f67bf5..000000000 --- a/src/entities/note.js +++ /dev/null @@ -1,957 +0,0 @@ -"use strict"; - -const Entity = require('./entity'); -const Attribute = require('./attribute'); -const protectedSessionService = require('../services/protected_session'); -const sql = require('../services/sql'); -const utils = require('../services/utils'); -const dateUtils = require('../services/date_utils'); -const entityChangesService = require('../services/entity_changes.js'); - -const LABEL = 'label'; -const RELATION = 'relation'; - -/** - * This represents a Note which is a central object in the Trilium Notes project. - * - * @property {string} noteId - primary key - * @property {string} type - one of "text", "code", "file" or "render" - * @property {string} mime - MIME type, e.g. "text/html" - * @property {string} title - note title - * @property {boolean} isProtected - true if note is protected - * @property {boolean} isDeleted - true if note is deleted - * @property {string|null} deleteId - ID identifying delete transaction - * @property {string} dateCreated - local date time (with offset) - * @property {string} dateModified - local date time (with offset) - * @property {string} utcDateCreated - * @property {string} utcDateModified - * - * @extends Entity - */ -class Note extends Entity { - static get entityName() { return "notes"; } - static get primaryKeyName() { return "noteId"; } - static get hashedProperties() { return ["noteId", "title", "type", "mime", "isProtected", "isDeleted", "deleteId"]; } - - /** - * @param row - object containing database row from "notes" table - */ - constructor(row) { - super(row); - - this.isProtected = !!this.isProtected; - /* true if content is either not encrypted - * or encrypted, but with available protected session (so effectively decrypted) */ - this.isContentAvailable = true; - - // check if there's noteId, otherwise this is a new entity which wasn't encrypted yet - if (this.isProtected && this.noteId) { - this.isContentAvailable = protectedSessionService.isProtectedSessionAvailable(); - - if (this.isContentAvailable) { - try { - this.title = protectedSessionService.decryptString(this.title); - } - catch (e) { - throw new Error(`Could not decrypt title of note ${this.noteId}: ${e.message} ${e.stack}`) - } - } - else { - this.title = "[protected]"; - } - } - } - - /* - * Note content has quite special handling - it's not a separate entity, but a lazily loaded - * part of Note entity with it's own sync. Reasons behind this hybrid design has been: - * - * - content can be quite large and it's not necessary to load it / fill memory for any note access even if we don't need a content, especially for bulk operations like search - * - changes in the note metadata or title should not trigger note content sync (so we keep separate utcDateModified and entity changes records) - * - but to the user note content and title changes are one and the same - single dateModified (so all changes must go through Note and content is not a separate entity) - */ - - /** @returns {*} */ - getContent(silentNotFoundError = false) { - if (this.content === undefined) { - const row = sql.getRow(`SELECT content FROM note_contents WHERE noteId = ?`, [this.noteId]); - - if (!row) { - if (silentNotFoundError) { - return undefined; - } - else { - throw new Error("Cannot find note content for noteId=" + this.noteId); - } - } - - this.content = row.content; - - if (this.isProtected) { - if (this.isContentAvailable) { - this.content = this.content === null ? null : protectedSessionService.decrypt(this.content); - } - else { - this.content = ""; - } - } - } - - if (this.isStringNote()) { - return this.content === null - ? "" - : this.content.toString("UTF-8"); - } - else { - return this.content; - } - } - - /** @returns {{contentLength, dateModified, utcDateModified}} */ - getContentMetadata() { - return sql.getRow(` - SELECT - LENGTH(content) AS contentLength, - dateModified, - utcDateModified - FROM note_contents - WHERE noteId = ?`, [this.noteId]); - } - - /** @returns {*} */ - getJsonContent() { - const content = this.getContent(); - - if (!content || !content.trim()) { - return null; - } - - return JSON.parse(content); - } - - setContent(content) { - if (content === null || content === undefined) { - throw new Error(`Cannot set null content to note ${this.noteId}`); - } - - if (this.isStringNote()) { - content = content.toString(); - } - else { - content = Buffer.isBuffer(content) ? content : Buffer.from(content); - } - - this.content = content; - - const pojo = { - noteId: this.noteId, - content: content, - dateModified: dateUtils.localNowDateTime(), - utcDateModified: dateUtils.utcNowDateTime() - }; - - if (this.isProtected) { - if (this.isContentAvailable) { - pojo.content = protectedSessionService.encrypt(pojo.content); - } - else { - throw new Error(`Cannot update content of noteId=${this.noteId} since we're out of protected session.`); - } - } - - sql.upsert("note_contents", "noteId", pojo); - - const hash = utils.hash(this.noteId + "|" + pojo.content.toString()); - - entityChangesService.addEntityChange({ - entityName: 'note_contents', - entityId: this.noteId, - hash: hash, - isErased: false, - utcDateChanged: pojo.utcDateModified - }, null); - } - - setJsonContent(content) { - this.setContent(JSON.stringify(content, null, '\t')); - } - - /** @returns {boolean} true if this note is the root of the note tree. Root note has "root" noteId */ - isRoot() { - return this.noteId === 'root'; - } - - /** @returns {boolean} true if this note is of application/json content type */ - isJson() { - return this.mime === "application/json"; - } - - /** @returns {boolean} true if this note is JavaScript (code or attachment) */ - isJavaScript() { - return (this.type === "code" || this.type === "file") - && (this.mime.startsWith("application/javascript") - || this.mime === "application/x-javascript" - || this.mime === "text/javascript"); - } - - /** @returns {boolean} true if this note is HTML */ - isHtml() { - return (this.type === "code" || this.type === "file" || this.type === "render") && this.mime === "text/html"; - } - - /** @returns {boolean} true if the note has string content (not binary) */ - isStringNote() { - return utils.isStringNote(this.type, this.mime); - } - - /** @returns {string} JS script environment - either "frontend" or "backend" */ - getScriptEnv() { - if (this.isHtml() || (this.isJavaScript() && this.mime.endsWith('env=frontend'))) { - return "frontend"; - } - - if (this.type === 'render') { - return "frontend"; - } - - if (this.isJavaScript() && this.mime.endsWith('env=backend')) { - return "backend"; - } - - return null; - } - - loadOwnedAttributesToCache() { - this.__ownedAttributeCache = this.repository.getEntities(`SELECT * FROM attributes WHERE isDeleted = 0 AND noteId = ?`, [this.noteId]); - return this.__ownedAttributeCache; - } - - /** - * This method is a faster variant of getAttributes() which looks for only owned attributes. - * Use when inheritance is not needed and/or in batch/performance sensitive operations. - * - * @param {string} [type] - (optional) attribute type to filter - * @param {string} [name] - (optional) attribute name to filter - * @returns {Attribute[]} note's "owned" attributes - excluding inherited ones - */ - getOwnedAttributes(type, name) { - if (!this.__ownedAttributeCache) { - this.loadOwnedAttributesToCache(); - } - - if (type && name) { - return this.__ownedAttributeCache.filter(attr => attr.type === type && attr.name === name); - } - else if (type) { - return this.__ownedAttributeCache.filter(attr => attr.type === type); - } - else if (name) { - return this.__ownedAttributeCache.filter(attr => attr.name === name); - } - else { - return this.__ownedAttributeCache.slice(); - } - } - - /** - * @returns {Attribute} attribute belonging to this specific note (excludes inherited attributes) - * - * This method can be significantly faster than the getAttribute() - */ - getOwnedAttribute(type, name) { - const attrs = this.getOwnedAttributes(type, name); - - return attrs.length > 0 ? attrs[0] : null; - } - - /** - * @returns {Attribute[]} relations targetting this specific note - */ - getTargetRelations() { - return this.repository.getEntities("SELECT * FROM attributes WHERE type = 'relation' AND isDeleted = 0 AND value = ?", [this.noteId]); - } - - /** - * @param {string} [type] - (optional) attribute type to filter - * @param {string} [name] - (optional) attribute name to filter - * @returns {Attribute[]} all note's attributes, including inherited ones - */ - getAttributes(type, name) { - if (!this.__attributeCache) { - this.loadAttributesToCache(); - } - - if (type && name) { - return this.__attributeCache.filter(attr => attr.type === type && attr.name === name); - } - else if (type) { - return this.__attributeCache.filter(attr => attr.type === type); - } - else if (name) { - return this.__attributeCache.filter(attr => attr.name === name); - } - else { - return this.__attributeCache.slice(); - } - } - - /** - * @param {string} [name] - label name to filter - * @returns {Attribute[]} all note's labels (attributes with type label), including inherited ones - */ - getLabels(name) { - return this.getAttributes(LABEL, name); - } - - /** - * @param {string} [name] - label name to filter - * @returns {string[]} all note's label values, including inherited ones - */ - getLabelValues(name) { - return this.getLabels(name).map(l => l.value); - } - - /** - * @param {string} [name] - label name to filter - * @returns {Attribute[]} all note's labels (attributes with type label), excluding inherited ones - */ - getOwnedLabels(name) { - return this.getOwnedAttributes(LABEL, name); - } - - /** - * @param {string} [name] - label name to filter - * @returns {string[]} all note's label values, excluding inherited ones - */ - getOwnedLabelValues(name) { - return this.getOwnedAttributes(LABEL, name).map(l => l.value); - } - - /** - * @param {string} [name] - relation name to filter - * @returns {Attribute[]} all note's relations (attributes with type relation), including inherited ones - */ - getRelations(name) { - return this.getAttributes(RELATION, name); - } - - /** - * @param {string} [name] - relation name to filter - * @returns {Attribute[]} all note's relations (attributes with type relation), excluding inherited ones - */ - getOwnedRelations(name) { - return this.getOwnedAttributes(RELATION, name); - } - - /** - * @param {string} [name] - relation name to filter - * @returns {Note[]} - */ - getRelationTargets(name) { - const relations = this.getRelations(name); - const targets = []; - - for (const relation of relations) { - targets.push(relation.getTargetNote()); - } - - return targets; - } - - /** - * Clear note's attributes cache to force fresh reload for next attribute request. - * Cache is note instance scoped. - */ - invalidateAttributeCache() { - this.__attributeCache = null; - this.__ownedAttributeCache = null; - } - - loadAttributesToCache() { - const attributes = this.repository.getEntities(` - WITH RECURSIVE - tree(noteId, level) AS ( - SELECT ?, 0 - UNION - SELECT branches.parentNoteId, tree.level + 1 - FROM branches - JOIN tree ON branches.noteId = tree.noteId - WHERE branches.isDeleted = 0 - ), - treeWithAttrs(noteId, level) AS ( - SELECT * FROM tree - UNION - SELECT attributes.value, treeWithAttrs.level FROM attributes - JOIN treeWithAttrs ON treeWithAttrs.noteId = attributes.noteId - WHERE attributes.isDeleted = 0 - AND attributes.type = 'relation' - AND attributes.name = 'template' - ) - SELECT attributes.* FROM attributes JOIN treeWithAttrs ON attributes.noteId = treeWithAttrs.noteId - WHERE attributes.isDeleted = 0 AND (attributes.isInheritable = 1 OR treeWithAttrs.level = 0) - ORDER BY level, noteId, position`, [this.noteId]); - // attributes are ordered so that "closest" attributes are first - // we order by noteId so that attributes from same note stay together. Actual noteId ordering doesn't matter. - - const filteredAttributes = attributes.filter((attr, index) => { - // if this exact attribute already appears then don't include it (can happen via cloning) - if (attributes.findIndex(it => it.attributeId === attr.attributeId) !== index) { - return false; - } - - // FIXME: this code is quite questionable, one problem is that other caches (Froca, Becca) have nothing like that - if (attr.isDefinition()) { - const firstDefinitionIndex = attributes.findIndex(el => el.type === attr.type && el.name === attr.name); - - // keep only if this element is the first definition for this type & name - return firstDefinitionIndex === index; - } - else { - const definitionAttr = attributes.find(el => el.type === 'label' && el.name === attr.type + ':' + attr.name); - - if (!definitionAttr) { - return true; - } - - const definition = definitionAttr.getDefinition(); - - if (definition.multiplicity === 'multi') { - return true; - } - else { - const firstAttrIndex = attributes.findIndex(el => el.type === attr.type && el.name === attr.name); - - // in case of single-valued attribute we'll keep it only if it's first (closest) - return firstAttrIndex === index; - } - } - }); - - this.__attributeCache = filteredAttributes; - } - - /** - * @param {string} type - attribute type (label, relation, etc.) - * @param {string} name - attribute name - * @returns {boolean} true if note has an attribute with given type and name (including inherited) - */ - hasAttribute(type, name) { - return !!this.getAttribute(type, name); - } - - /** - * @param {string} type - attribute type (label, relation, etc.) - * @param {string} name - attribute name - * @returns {boolean} true if note has an attribute with given type and name (excluding inherited) - */ - hasOwnedAttribute(type, name) { - return !!this.getOwnedAttribute(type, name); - } - - /** - * @param {string} type - attribute type (label, relation, etc.) - * @param {string} name - attribute name - * @returns {Attribute} attribute of given type and name. If there's more such attributes, first is returned. Returns null if there's no such attribute belonging to this note. - */ - getAttribute(type, name) { - const attributes = this.getAttributes(); - - return attributes.find(attr => attr.type === type && attr.name === name); - } - - /** - * @param {string} type - attribute type (label, relation, etc.) - * @param {string} name - attribute name - * @returns {string|null} attribute value of given type and name or null if no such attribute exists. - */ - getAttributeValue(type, name) { - const attr = this.getAttribute(type, name); - - return attr ? attr.value : null; - } - - /** - * @param {string} type - attribute type (label, relation, etc.) - * @param {string} name - attribute name - * @returns {string|null} attribute value of given type and name or null if no such attribute exists. - */ - getOwnedAttributeValue(type, name) { - const attr = this.getOwnedAttribute(type, name); - - return attr ? attr.value : null; - } - - /** - * Based on enabled, attribute is either set or removed. - * - * @param {string} type - attribute type ('relation', 'label' etc.) - * @param {boolean} enabled - toggle On or Off - * @param {string} name - attribute name - * @param {string} [value] - attribute value (optional) - */ - toggleAttribute(type, enabled, name, value) { - if (enabled) { - this.setAttribute(type, name, value); - } - else { - this.removeAttribute(type, name, value); - } - } - - /** - * Update's given attribute's value or creates it if it doesn't exist - * - * @param {string} type - attribute type (label, relation, etc.) - * @param {string} name - attribute name - * @param {string} [value] - attribute value (optional) - */ - setAttribute(type, name, value) { - const attributes = this.loadOwnedAttributesToCache(); - let attr = attributes.find(attr => attr.type === type && attr.name === name); - - if (attr) { - if (attr.value !== value) { - attr.value = value; - attr.save(); - - this.invalidateAttributeCache(); - } - } - else { - attr = new Attribute({ - noteId: this.noteId, - type: type, - name: name, - value: value !== undefined ? value : "" - }); - - attr.save(); - - this.invalidateAttributeCache(); - } - } - - /** - * Removes given attribute name-value pair if it exists. - * - * @param {string} type - attribute type (label, relation, etc.) - * @param {string} name - attribute name - * @param {string} [value] - attribute value (optional) - */ - removeAttribute(type, name, value) { - const attributes = this.loadOwnedAttributesToCache(); - - for (const attribute of attributes) { - if (attribute.type === type && attribute.name === name && (value === undefined || value === attribute.value)) { - attribute.markAsDeleted(); - - this.invalidateAttributeCache(); - } - } - } - - /** - * @return {Attribute} - */ - addAttribute(type, name, value = "", isInheritable = false, position = 1000) { - const attr = new Attribute({ - noteId: this.noteId, - type: type, - name: name, - value: value, - isInheritable: isInheritable, - position: position - }); - - attr.save(); - - this.invalidateAttributeCache(); - - return attr; - } - - addLabel(name, value = "", isInheritable = false) { - return this.addAttribute(LABEL, name, value, isInheritable); - } - - addRelation(name, targetNoteId, isInheritable = false) { - return this.addAttribute(RELATION, name, targetNoteId, isInheritable); - } - - /** - * @param {string} name - label name - * @returns {boolean} true if label exists (including inherited) - */ - hasLabel(name) { return this.hasAttribute(LABEL, name); } - - /** - * @param {string} name - label name - * @returns {boolean} true if label exists (excluding inherited) - */ - hasOwnedLabel(name) { return this.hasOwnedAttribute(LABEL, name); } - - /** - * @param {string} name - relation name - * @returns {boolean} true if relation exists (including inherited) - */ - hasRelation(name) { return this.hasAttribute(RELATION, name); } - - /** - * @param {string} name - relation name - * @returns {boolean} true if relation exists (excluding inherited) - */ - hasOwnedRelation(name) { return this.hasOwnedAttribute(RELATION, name); } - - /** - * @param {string} name - label name - * @returns {Attribute|null} label if it exists, null otherwise - */ - getLabel(name) { return this.getAttribute(LABEL, name); } - - /** - * @param {string} name - label name - * @returns {Attribute|null} label if it exists, null otherwise - */ - getOwnedLabel(name) { return this.getOwnedAttribute(LABEL, name); } - - /** - * @param {string} name - relation name - * @returns {Attribute|null} relation if it exists, null otherwise - */ - getRelation(name) { return this.getAttribute(RELATION, name); } - - /** - * @param {string} name - relation name - * @returns {Attribute|null} relation if it exists, null otherwise - */ - getOwnedRelation(name) { return this.getOwnedAttribute(RELATION, name); } - - /** - * @param {string} name - label name - * @returns {string|null} label value if label exists, null otherwise - */ - getLabelValue(name) { return this.getAttributeValue(LABEL, name); } - - /** - * @param {string} name - label name - * @returns {string|null} label value if label exists, null otherwise - */ - getOwnedLabelValue(name) { return this.getOwnedAttributeValue(LABEL, name); } - - /** - * @param {string} name - relation name - * @returns {string|null} relation value if relation exists, null otherwise - */ - getRelationValue(name) { return this.getAttributeValue(RELATION, name); } - - /** - * @param {string} name - relation name - * @returns {string|null} relation value if relation exists, null otherwise - */ - getOwnedRelationValue(name) { return this.getOwnedAttributeValue(RELATION, name); } - - /** - * @param {string} name - * @returns {Note|null} target note of the relation or null (if target is empty or note was not found) - */ - getRelationTarget(name) { - const relation = this.getRelation(name); - - return relation ? this.becca.getNote(relation.value) : null; - } - - /** - * @param {string} name - * @returns {Note|null} target note of the relation or null (if target is empty or note was not found) - */ - getOwnedRelationTarget(name) { - const relation = this.getOwnedRelation(name); - - return relation ? this.becca.getNote(relation.value) : null; - } - - /** - * Based on enabled, label is either set or removed. - * - * @param {boolean} enabled - toggle On or Off - * @param {string} name - label name - * @param {string} [value] - label value (optional) - */ - toggleLabel(enabled, name, value) { return this.toggleAttribute(LABEL, enabled, name, value); } - - /** - * Based on enabled, relation is either set or removed. - * - * @param {boolean} enabled - toggle On or Off - * @param {string} name - relation name - * @param {string} [value] - relation value (noteId) - */ - toggleRelation(enabled, name, value) { return this.toggleAttribute(RELATION, enabled, name, value); } - - /** - * Update's given label's value or creates it if it doesn't exist - * - * @param {string} name - label name - * @param {string} [value] - label value - */ - setLabel(name, value) { return this.setAttribute(LABEL, name, value); } - - /** - * Update's given relation's value or creates it if it doesn't exist - * - * @param {string} name - relation name - * @param {string} value - relation value (noteId) - */ - setRelation(name, value) { return this.setAttribute(RELATION, name, value); } - - /** - * Remove label name-value pair, if it exists. - * - * @param {string} name - label name - * @param {string} [value] - label value - */ - removeLabel(name, value) { return this.removeAttribute(LABEL, name, value); } - - /** - * Remove relation name-value pair, if it exists. - * - * @param {string} name - relation name - * @param {string} [value] - relation value (noteId) - */ - removeRelation(name, value) { return this.removeAttribute(RELATION, name, value); } - - /** - * @return {string[]} return list of all descendant noteIds of this note. Returning just noteIds because number of notes can be huge. Includes also this note's noteId - */ - getDescendantNoteIds() { - return sql.getColumn(` - WITH RECURSIVE - tree(noteId) AS ( - SELECT ? - UNION - SELECT branches.noteId FROM branches - JOIN tree ON branches.parentNoteId = tree.noteId - JOIN notes ON notes.noteId = branches.noteId - WHERE notes.isDeleted = 0 - AND branches.isDeleted = 0 - ) - SELECT noteId FROM tree`, [this.noteId]); - } - - /** - * Finds descendant notes with given attribute name and value. Only own attributes are considered, not inherited ones - * - * @param {string} type - attribute type (label, relation, etc.) - * @param {string} name - attribute name - * @param {string} [value] - attribute value - * @returns {Note[]} - */ - getDescendantNotesWithAttribute(type, name, value) { - const params = [this.noteId, name]; - let valueCondition = ""; - - if (value !== undefined) { - params.push(value); - valueCondition = " AND attributes.value = ?"; - } - - const notes = this.repository.getEntities(` - WITH RECURSIVE - tree(noteId) AS ( - SELECT ? - UNION - SELECT branches.noteId FROM branches - JOIN tree ON branches.parentNoteId = tree.noteId - JOIN notes ON notes.noteId = branches.noteId - WHERE notes.isDeleted = 0 - AND branches.isDeleted = 0 - ) - SELECT notes.* FROM notes - JOIN tree ON tree.noteId = notes.noteId - JOIN attributes ON attributes.noteId = notes.noteId - WHERE attributes.isDeleted = 0 - AND attributes.name = ? - ${valueCondition} - ORDER BY noteId, position`, params); - - return notes; - } - - /** - * Finds descendant notes with given label name and value. Only own labels are considered, not inherited ones - * - * @param {string} name - label name - * @param {string} [value] - label value - * @returns {Note[]} - */ - getDescendantNotesWithLabel(name, value) { return this.getDescendantNotesWithAttribute(LABEL, name, value); } - - /** - * Finds descendant notes with given relation name and value. Only own relations are considered, not inherited ones - * - * @param {string} name - relation name - * @param {string} [value] - relation value - * @returns {Note[]} - */ - getDescendantNotesWithRelation(name, value) { return this.getDescendantNotesWithAttribute(RELATION, name, value); } - - /** - * Returns note revisions of this note. - * - * @returns {NoteRevision[]} - */ - getNoteRevisions() { - return this.repository.getEntities("SELECT * FROM note_revisions WHERE noteId = ?", [this.noteId]); - } - - /** - * Get list of links coming out of this note. - * - * @deprecated - not intended for general use - * @returns {Attribute[]} - */ - getLinks() { - return this.repository.getEntities(` - SELECT * - FROM attributes - WHERE noteId = ? AND - isDeleted = 0 AND - type = 'relation' AND - name IN ('internalLink', 'imageLink', 'relationMapLink', 'includeNoteLink')`, [this.noteId]); - } - - /** - * @returns {Branch[]} - */ - getBranches() { - return this.repository.getEntities("SELECT * FROM branches WHERE isDeleted = 0 AND noteId = ?", [this.noteId]); - } - - /** - * @returns {boolean} - true if note has children - */ - hasChildren() { - return this.getChildNotes().length > 0; - } - - /** - * @returns {Note[]} child notes of this note - */ - getChildNotes() { - return this.repository.getEntities(` - SELECT notes.* - FROM branches - JOIN notes USING(noteId) - WHERE notes.isDeleted = 0 - AND branches.isDeleted = 0 - AND branches.parentNoteId = ? - ORDER BY branches.notePosition`, [this.noteId]); - } - - /** - * @returns {Branch[]} child branches of this note - */ - getChildBranches() { - return this.repository.getEntities(` - SELECT branches.* - FROM branches - WHERE branches.isDeleted = 0 - AND branches.parentNoteId = ? - ORDER BY branches.notePosition`, [this.noteId]); - } - - /** - * @returns {Note[]} parent notes of this note (note can have multiple parents because of cloning) - */ - getParentNotes() { - return this.repository.getEntities(` - SELECT parent_notes.* - FROM - branches AS child_tree - JOIN notes AS parent_notes ON parent_notes.noteId = child_tree.parentNoteId - WHERE child_tree.noteId = ? - AND child_tree.isDeleted = 0 - AND parent_notes.isDeleted = 0`, [this.noteId]); - } - - /** - * @return {string[][]} - array of notePaths (each represented by array of noteIds constituting the particular note path) - */ - getAllNotePaths() { - if (this.noteId === 'root') { - return [['root']]; - } - - const notePaths = []; - - for (const parentNote of this.getParentNotes()) { - for (const parentPath of parentNote.getAllNotePaths()) { - parentPath.push(this.noteId); - notePaths.push(parentPath); - } - } - - return notePaths; - } - - getRelationDefinitions() { - return this.getLabels() - .filter(l => l.name.startsWith("relation:")); - } - - getLabelDefinitions() { - return this.getLabels() - .filter(l => l.name.startsWith("relation:")); - } - - /** - * @param ancestorNoteId - * @return {boolean} - true if ancestorNoteId occurs in at least one of the note's paths - */ - isDescendantOfNote(ancestorNoteId) { - const notePaths = this.getAllNotePaths(); - - return notePaths.some(path => path.includes(ancestorNoteId)); - } - - beforeSaving() { - if (!this.isDeleted) { - this.isDeleted = false; - } - - if (!this.dateCreated) { - this.dateCreated = dateUtils.localNowDateTime(); - } - - if (!this.utcDateCreated) { - this.utcDateCreated = dateUtils.utcNowDateTime(); - } - - super.beforeSaving(); - - this.dateModified = dateUtils.localNowDateTime(); - this.utcDateModified = dateUtils.utcNowDateTime(); - } - - // cannot be static! - updatePojo(pojo) { - if (pojo.isProtected) { - if (this.isContentAvailable) { - pojo.title = protectedSessionService.encrypt(pojo.title); - } - else { - // updating protected note outside of protected session means we will keep original ciphertexts - delete pojo.title; - } - } - - delete pojo.isContentAvailable; - delete pojo.__attributeCache; - delete pojo.__ownedAttributeCache; - delete pojo.content; - /** zero references to contentHash, probably can be removed */ - delete pojo.contentHash; - } -} - -module.exports = Note; diff --git a/src/routes/api/attributes.js b/src/routes/api/attributes.js index 2794cb26a..0c3f42b0e 100644 --- a/src/routes/api/attributes.js +++ b/src/routes/api/attributes.js @@ -3,7 +3,6 @@ const sql = require('../../services/sql'); const log = require('../../services/log'); const attributeService = require('../../services/attributes'); -const repository = require('../../services/repository'); const Attribute = require('../../services/becca/entities/attribute'); const becca = require("../../services/becca/becca"); @@ -73,16 +72,17 @@ function setNoteAttribute(req) { const noteId = req.params.noteId; const body = req.body; - let attr = repository.getEntity(`SELECT * FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = ? AND name = ?`, [noteId, body.type, body.name]); + const attributeId = sql.getValue(`SELECT attributeId FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = ? AND name = ?`, [noteId, body.type, body.name]); - if (attr) { + if (attributeId) { + const attr = becca.getAttribute(attributeId); attr.value = body.value; + attr.save(); } else { - attr = new Attribute(body); + const attr = new Attribute(body); attr.noteId = noteId; + attr.save(); } - - attr.save(); } function addNoteAttribute(req) { @@ -195,16 +195,16 @@ function createRelation(req) { const targetNoteId = req.params.targetNoteId; const name = req.params.name; - let attribute = repository.getEntity(`SELECT * FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = 'relation' AND name = ? AND value = ?`, [sourceNoteId, name, targetNoteId]); + const attributeId = sql.getValue(`SELECT attributeId FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = 'relation' AND name = ? AND value = ?`, [sourceNoteId, name, targetNoteId]); + let attribute = becca.getAttribute(attributeId); if (!attribute) { - attribute = new Attribute(); - attribute.noteId = sourceNoteId; - attribute.name = name; - attribute.type = 'relation'; - attribute.value = targetNoteId; - - attribute.save(); + attribute = new Attribute({ + noteId: sourceNoteId, + name: name, + type: 'relation', + value: targetNoteId + }).save(); } return attribute; @@ -215,9 +215,10 @@ function deleteRelation(req) { const targetNoteId = req.params.targetNoteId; const name = req.params.name; - let attribute = repository.getEntity(`SELECT * FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = 'relation' AND name = ? AND value = ?`, [sourceNoteId, name, targetNoteId]); + const attributeId = sql.getValue(`SELECT attributeId FROM attributes WHERE isDeleted = 0 AND noteId = ? AND type = 'relation' AND name = ? AND value = ?`, [sourceNoteId, name, targetNoteId]); - if (attribute) { + if (attributeId) { + const attribute = becca.getAttribute(attributeId); attribute.markAsDeleted(); } } diff --git a/src/routes/api/autocomplete.js b/src/routes/api/autocomplete.js index 0b2fca7d3..9082b3d25 100644 --- a/src/routes/api/autocomplete.js +++ b/src/routes/api/autocomplete.js @@ -2,7 +2,6 @@ const beccaService = require('../../services/becca/becca_service.js'); const searchService = require('../../services/search/services/search.js'); -const repository = require('../../services/repository'); const log = require('../../services/log'); const utils = require('../../services/utils'); const cls = require('../../services/cls'); diff --git a/src/routes/api/branches.js b/src/routes/api/branches.js index 823572246..53eb027af 100644 --- a/src/routes/api/branches.js +++ b/src/routes/api/branches.js @@ -6,7 +6,6 @@ const entityChangesService = require('../../services/entity_changes.js'); const treeService = require('../../services/tree'); const noteService = require('../../services/notes'); const becca = require('../../services/becca/becca.js'); -const repository = require('../../services/repository'); const TaskContext = require('../../services/task_context'); /** diff --git a/src/routes/api/export.js b/src/routes/api/export.js index e4c81db52..5503c7a27 100644 --- a/src/routes/api/export.js +++ b/src/routes/api/export.js @@ -3,7 +3,6 @@ const zipExportService = require('../../services/export/zip'); const singleExportService = require('../../services/export/single'); const opmlExportService = require('../../services/export/opml'); -const repository = require("../../services/repository"); const TaskContext = require("../../services/task_context"); const log = require("../../services/log"); diff --git a/src/routes/api/import.js b/src/routes/api/import.js index 619ef4f07..8c8794b67 100644 --- a/src/routes/api/import.js +++ b/src/routes/api/import.js @@ -1,6 +1,5 @@ "use strict"; -const repository = require('../../services/repository'); const enexImportService = require('../../services/import/enex'); const opmlImportService = require('../../services/import/opml'); const zipImportService = require('../../services/import/zip'); diff --git a/src/routes/api/note_revisions.js b/src/routes/api/note_revisions.js index a0cf7fbab..0a1f736e8 100644 --- a/src/routes/api/note_revisions.js +++ b/src/routes/api/note_revisions.js @@ -1,6 +1,5 @@ "use strict"; -const repository = require('../../services/repository'); const beccaService = require('../../services/becca/becca_service.js'); const protectedSessionService = require('../../services/protected_session'); const noteRevisionService = require('../../services/note_revisions'); diff --git a/src/routes/api/notes.js b/src/routes/api/notes.js index ce2a2dfc5..1ee5d695a 100644 --- a/src/routes/api/notes.js +++ b/src/routes/api/notes.js @@ -2,7 +2,6 @@ const noteService = require('../../services/notes'); const treeService = require('../../services/tree'); -const repository = require('../../services/repository'); const sql = require('../../services/sql'); const utils = require('../../services/utils'); const log = require('../../services/log'); diff --git a/src/routes/api/sql.js b/src/routes/api/sql.js index a50f5829b..585beb022 100644 --- a/src/routes/api/sql.js +++ b/src/routes/api/sql.js @@ -1,7 +1,6 @@ "use strict"; const sql = require('../../services/sql'); -const repository = require('../../services/repository'); function getSchema() { const tableNames = sql.getColumn(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name`); diff --git a/src/routes/api/sync.js b/src/routes/api/sync.js index b2aa33412..9279a6438 100644 --- a/src/routes/api/sync.js +++ b/src/routes/api/sync.js @@ -10,7 +10,6 @@ const contentHashService = require('../../services/content_hash'); const log = require('../../services/log'); const syncOptions = require('../../services/sync_options'); const dateUtils = require('../../services/date_utils'); -const entityConstructor = require('../../entities/entity_constructor'); const utils = require('../../services/utils'); async function testSync() { diff --git a/src/routes/custom.js b/src/routes/custom.js index 50bd75a63..2cc9b8d35 100644 --- a/src/routes/custom.js +++ b/src/routes/custom.js @@ -1,4 +1,3 @@ -const repository = require('../services/repository'); const log = require('../services/log'); const fileUploadService = require('./api/files.js'); const scriptService = require('../services/script'); diff --git a/src/services/backend_script_api.js b/src/services/backend_script_api.js index 660bf7e16..aaef0741b 100644 --- a/src/services/backend_script_api.js +++ b/src/services/backend_script_api.js @@ -6,7 +6,6 @@ const attributeService = require('./attributes'); const dateNoteService = require('./date_notes'); const treeService = require('./tree'); const config = require('./config'); -const repository = require('./repository'); const axios = require('axios'); const dayjs = require('dayjs'); const xml2js = require('xml2js'); diff --git a/src/services/becca/becca.js b/src/services/becca/becca.js index 1036c184f..2c03aebb5 100644 --- a/src/services/becca/becca.js +++ b/src/services/becca/becca.js @@ -93,7 +93,7 @@ class Becca { return this.options[name]; } - getEntityFromName(entityName, entityId) { + getEntity(entityName, entityId) { if (!entityName || !entityId) { return null; } diff --git a/src/entities/entity_constructor.js b/src/services/becca/entity_constructor.js similarity index 62% rename from src/entities/entity_constructor.js rename to src/services/becca/entity_constructor.js index f02c27eae..4a8731493 100644 --- a/src/entities/entity_constructor.js +++ b/src/services/becca/entity_constructor.js @@ -1,11 +1,9 @@ -const repository = require('../services/repository'); -const Note = require('../entities/note'); -const NoteRevision = require('../services/becca/entities/note_revision.js'); -const Branch = require('../entities/branch'); -const Attribute = require('../entities/attribute'); -const RecentNote = require('../services/becca/entities/recent_note.js'); -const ApiToken = require('../services/becca/entities/api_token.js'); -const cls = require('../services/cls'); +const Note = require('./entities/note'); +const NoteRevision = require('./entities/note_revision.js'); +const Branch = require('./entities/branch'); +const Attribute = require('./entities/attribute'); +const RecentNote = require('./entities/recent_note.js'); +const ApiToken = require('./entities/api_token.js'); const ENTITY_NAME_TO_ENTITY = { "attributes": Attribute, @@ -31,13 +29,9 @@ function createEntityFromRow(row) { if (row.attributeId) { entity = new Attribute(row); - - cls.setEntityToCache('attributes', row.attributeId, entity); } else if (row.noteRevisionId) { entity = new NoteRevision(row); - - cls.setEntityToCache('note_revisions', row.noteRevisionId, entity); } else if (row.branchId && row.notePath) { entity = new RecentNote(row); @@ -47,13 +41,9 @@ function createEntityFromRow(row) { } else if (row.branchId) { entity = new Branch(row); - - cls.setEntityToCache('branches', row.branchId, entity); } else if (row.noteId) { entity = new Note(row); - - cls.setEntityToCache('notes', row.noteId, entity); } else { throw new Error('Unknown entity type for row: ' + JSON.stringify(row)); diff --git a/src/services/cls.js b/src/services/cls.js index 7754da700..25f5b02c2 100644 --- a/src/services/cls.js +++ b/src/services/cls.js @@ -72,14 +72,6 @@ function reset() { clsHooked.reset(); } -function getEntityFromCache(entityName, entityId) { - return namespace.get(entityName + '-' + entityId); -} - -function setEntityToCache(entityName, entityId, entity) { - namespace.set(entityName + '-' + entityId, entity); -} - function ignoreEntityChanges() { namespace.set('ignoreEntityChanges', true); } @@ -99,7 +91,5 @@ module.exports = { clearEntityChanges, getAndClearEntityChanges, addEntityChange, - getEntityFromCache, - setEntityToCache, ignoreEntityChanges }; diff --git a/src/services/consistency_checks.js b/src/services/consistency_checks.js index 871d7ff7f..cc3a046be 100644 --- a/src/services/consistency_checks.js +++ b/src/services/consistency_checks.js @@ -5,7 +5,6 @@ const sqlInit = require('./sql_init'); const log = require('./log'); const ws = require('./ws.js'); const syncMutexService = require('./sync_mutex'); -const repository = require('./repository'); const cls = require('./cls'); const entityChangesService = require('./entity_changes.js'); const optionsService = require('./options'); @@ -459,7 +458,7 @@ class ConsistencyChecks { entity_changes.id IS NULL AND ` + (entityName === 'options' ? 'options.isSynced = 1' : '1'), ({entityId}) => { if (this.autoFix) { - const entity = repository.getEntity(`SELECT * FROM ${entityName} WHERE ${key} = ?`, [entityId]); + const entity = becca.getEntity(entityName, entityId); entityChangesService.addEntityChange({ entityName, diff --git a/src/services/entity_changes.js b/src/services/entity_changes.js index 6bd7eeb48..04ef50fbc 100644 --- a/src/services/entity_changes.js +++ b/src/services/entity_changes.js @@ -3,6 +3,7 @@ const sourceIdService = require('./source_id'); const dateUtils = require('./date_utils'); const log = require('./log'); const cls = require('./cls'); +const becca = require("./becca/becca.js"); let maxEntityChangeId = 0; @@ -82,7 +83,6 @@ function cleanupEntityChangesForMissingEntities(entityName, entityPrimaryKey) { function fillEntityChanges(entityName, entityPrimaryKey, condition = '') { try { cleanupEntityChangesForMissingEntities(entityName, entityPrimaryKey); - const repository = require("./repository.js"); sql.transactional(() => { const entityIds = sql.getColumn(`SELECT ${entityPrimaryKey} FROM ${entityName}` @@ -97,7 +97,7 @@ function fillEntityChanges(entityName, entityPrimaryKey, condition = '') { if (existingRows === 0) { createdCount++; - const entity = repository.getEntity(`SELECT * FROM ${entityName} WHERE ${entityPrimaryKey} = ?`, [entityId]); + const entity = becca.getEntity(entityName, entityId); addEntityChange({ entityName, diff --git a/src/services/export/opml.js b/src/services/export/opml.js index 8b0d8f7dd..a3a1842a4 100644 --- a/src/services/export/opml.js +++ b/src/services/export/opml.js @@ -1,6 +1,5 @@ "use strict"; -const repository = require("../repository"); const utils = require('../utils'); const becca = require("../becca/becca"); diff --git a/src/services/export/zip.js b/src/services/export/zip.js index 28c558057..814986bfc 100644 --- a/src/services/export/zip.js +++ b/src/services/export/zip.js @@ -1,7 +1,6 @@ "use strict"; const html = require('html'); -const repository = require('../repository'); const dateUtils = require('../date_utils'); const path = require('path'); const mimeTypes = require('mime-types'); diff --git a/src/services/repository.js b/src/services/repository.js deleted file mode 100644 index 84e3b0401..000000000 --- a/src/services/repository.js +++ /dev/null @@ -1,146 +0,0 @@ -"use strict"; - -const sql = require('./sql'); -const entityChangesService = require('./entity_changes.js'); -const eventService = require('./events'); -const cls = require('./cls'); -const entityConstructor = require('../entities/entity_constructor'); - -function getEntities(query, params = []) { - const rows = sql.getRows(query, params); - - return rows.map(entityConstructor.createEntityFromRow); -} - -function getEntity(query, params = []) { - const row = sql.getRowOrNull(query, params); - - if (!row) { - return null; - } - - return entityConstructor.createEntityFromRow(row); -} - -function getCachedEntity(entityName, entityId, query) { - let entity = cls.getEntityFromCache(entityName, entityId); - - if (!entity) { - entity = getEntity(query, [entityId]); - - cls.setEntityToCache(entityName, entityId, entity); - } - - return entity; -} - -/** @returns {Note|null} */ -function getNote(noteId) { - return getCachedEntity('notes', noteId, "SELECT * FROM notes WHERE noteId = ?"); -} - -/** @returns {Note[]} */ -function getNotes(noteIds) { - // this note might be optimised, but remember that it must keep the existing order of noteIds - // (important e.g. for @orderBy in search) - const notes = []; - - for (const noteId of noteIds) { - const note = getNote(noteId); - - notes.push(note); - } - - return notes; -} - -/** @returns {NoteRevision|null} */ -function getNoteRevision(noteRevisionId) { - return getCachedEntity('note_revisions', noteRevisionId, "SELECT * FROM note_revisions WHERE noteRevisionId = ?"); -} - -/** @returns {Branch|null} */ -function getBranch(branchId) { - return getCachedEntity('branches', branchId, "SELECT * FROM branches WHERE branchId = ?", [branchId]); -} - -/** @returns {Attribute|null} */ -function getAttribute(attributeId) { - return getCachedEntity('attributes', attributeId, "SELECT * FROM attributes WHERE attributeId = ?"); -} - -/** @returns {Option|null} */ -function getOption(name) { - return getEntity("SELECT * FROM options WHERE name = ?", [name]); -} - -function updateEntity(entity) { - const entityName = entity.constructor.entityName; - const primaryKeyName = entity.constructor.primaryKeyName; - - const isNewEntity = !entity[primaryKeyName]; - - if (entity.beforeSaving) { - entity.beforeSaving(); - } - - let clone; - - if (entity.getPojo) { - clone = entity.getPojo(); - } - else { - // FIXME: delete this branch after migration to becca - clone = Object.assign({}, entity); - - // this check requires that updatePojo is not static - if (entity.updatePojo) { - entity.updatePojo(clone); - } - } - - for (const key in clone) { - // !isBuffer is for images and attachments - if (clone[key] !== null && typeof clone[key] === 'object' && !Buffer.isBuffer(clone[key])) { - clone[key] = JSON.stringify(clone[key]); - } - } - - sql.transactional(() => { - sql.upsert(entityName, primaryKeyName, clone); - - if (entityName === 'recent_notes') { - return; - } - - const entityId = entity[primaryKeyName]; - - const isSynced = entityName !== 'options' || entity.isSynced; - - entityChangesService.addEntityChange({ - entityName, - entityId, - hash: entity.generateHash(), - isErased: false, - utcDateChanged: entity.getUtcDateChanged() - }, null, isSynced); - - if (!cls.isEntityEventsDisabled()) { - const eventPayload = { - entityName, - entity - }; - - if (isNewEntity && !entity.isDeleted) { - eventService.emit(eventService.ENTITY_CREATED, eventPayload); - } - - eventService.emit(entity.isDeleted ? eventService.ENTITY_DELETED : eventService.ENTITY_CHANGED, eventPayload); - } - }); -} - -module.exports = { - getEntities, - updateEntity -}; diff --git a/src/services/script.js b/src/services/script.js index 096019c16..30180a8f4 100644 --- a/src/services/script.js +++ b/src/services/script.js @@ -57,7 +57,7 @@ function executeBundle(bundle, apiParams = {}) { function executeScript(script, params, startNoteId, currentNoteId, originEntityName, originEntityId) { const startNote = becca.getNote(startNoteId); const currentNote = becca.getNote(currentNoteId); - const originEntity = becca.getEntityFromName(originEntityName, originEntityId); + const originEntity = becca.getEntity(originEntityName, originEntityId); // we're just executing an excerpt of the original frontend script in the backend context so we must // override normal note's content and it's mime type / script environment diff --git a/src/services/setup.js b/src/services/setup.js index 867510c6e..2cefe3e23 100644 --- a/src/services/setup.js +++ b/src/services/setup.js @@ -1,7 +1,6 @@ const syncService = require('./sync'); const log = require('./log'); const sqlInit = require('./sql_init'); -const repository = require('./repository'); const optionService = require('./options'); const syncOptions = require('./sync_options'); const request = require('./request'); diff --git a/src/services/sync.js b/src/services/sync.js index edb64ce9b..7355d66dd 100644 --- a/src/services/sync.js +++ b/src/services/sync.js @@ -2,7 +2,6 @@ const log = require('./log'); const sql = require('./sql'); -const sqlInit = require('./sql_init'); const optionService = require('./options'); const utils = require('./utils'); const sourceIdService = require('./source_id'); @@ -16,7 +15,7 @@ const cls = require('./cls'); const request = require('./request'); const ws = require('./ws'); const entityChangesService = require('./entity_changes.js'); -const entityConstructor = require('../entities/entity_constructor'); +const entityConstructor = require('../services/becca/entity_constructor'); let proxyToggle = true; diff --git a/src/services/sync_update.js b/src/services/sync_update.js index fe346ad21..d785377a8 100644 --- a/src/services/sync_update.js +++ b/src/services/sync_update.js @@ -2,7 +2,7 @@ const sql = require('./sql'); const log = require('./log'); const entityChangesService = require('./entity_changes.js'); const eventService = require('./events'); -const entityConstructor = require('../entities/entity_constructor'); +const entityConstructor = require("./becca/entity_constructor.js"); function updateEntity(entityChange, entity, sourceId) { // can be undefined for options with isSynced=false diff --git a/src/tools/generate_document.js b/src/tools/generate_document.js index 67a6c8936..fb3869c83 100644 --- a/src/tools/generate_document.js +++ b/src/tools/generate_document.js @@ -9,7 +9,6 @@ const noteService = require('../services/notes'); const attributeService = require('../services/attributes'); const cls = require('../services/cls'); const cloningService = require('../services/cloning'); -const repository = require('../services/repository'); const noteRevisionService = require('../services/note_revisions'); const loremIpsum = require('lorem-ipsum').loremIpsum; From 439ef4a8cbf3aef3f72f739cb2229a8253ec30cb Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 17 May 2021 22:09:49 +0200 Subject: [PATCH 3/8] moved becca to top level source dir --- spec/search/note_cache_mocking.js | 8 ++++---- spec/search/search.spec.js | 6 +++--- spec/search/value_extractor.spec.js | 2 +- src/app.js | 2 +- src/{services => }/becca/becca_loader.js | 20 +++++++++---------- .../becca/entities/abstract_entity.js | 14 ++++++------- src/{services => }/becca/entities/note.js | 20 +++++++++---------- .../becca/entities/note_revision.js | 14 ++++++------- .../becca/entity_constructor.js | 6 +++--- src/routes/api/attributes.js | 4 ++-- src/routes/api/autocomplete.js | 4 ++-- src/routes/api/branches.js | 2 +- src/routes/api/clipper.js | 2 +- src/routes/api/files.js | 2 +- src/routes/api/image.js | 2 +- src/routes/api/import.js | 2 +- src/routes/api/login.js | 2 +- src/routes/api/note_revisions.js | 4 ++-- src/routes/api/notes.js | 2 +- src/routes/api/recent_changes.js | 2 +- src/routes/api/recent_notes.js | 2 +- src/routes/api/script.js | 2 +- src/routes/api/search.js | 2 +- src/routes/api/similar_notes.js | 4 ++-- src/routes/api/stats.js | 2 +- src/routes/api/tree.js | 2 +- src/routes/custom.js | 2 +- src/services/attributes.js | 4 ++-- src/services/backend_script_api.js | 2 +- src/services/cloning.js | 4 ++-- src/services/consistency_checks.js | 6 +++--- src/services/date_notes.js | 2 +- src/services/entity_changes.js | 2 +- src/services/export/opml.js | 2 +- src/services/handlers.js | 4 ++-- src/services/image.js | 2 +- src/services/import/zip.js | 6 +++--- src/services/note_revisions.js | 2 +- src/services/notes.js | 8 ++++---- src/services/options.js | 6 +++--- src/services/scheduler.js | 2 +- src/services/script.js | 2 +- src/services/search/expressions/ancestor.js | 2 +- .../search/expressions/attribute_exists.js | 2 +- .../search/expressions/descendant_of.js | 2 +- .../search/expressions/label_comparison.js | 2 +- .../expressions/note_cache_flat_text.js | 4 ++-- .../note_content_protected_fulltext.js | 2 +- .../note_content_unprotected_fulltext.js | 2 +- .../search/expressions/relation_where.js | 2 +- src/services/search/search_result.js | 2 +- src/services/search/services/search.js | 4 ++-- src/services/setup.js | 2 +- src/services/sql.js | 2 +- src/services/sql_init.js | 8 ++++---- src/services/sync.js | 4 ++-- src/services/sync_update.js | 2 +- src/services/tree.js | 4 ++-- 58 files changed, 118 insertions(+), 118 deletions(-) rename src/{services => }/becca/becca_loader.js (90%) rename src/{services => }/becca/entities/abstract_entity.js (89%) rename src/{services => }/becca/entities/note.js (98%) rename src/{services => }/becca/entities/note_revision.js (93%) rename src/{services => }/becca/entity_constructor.js (90%) diff --git a/spec/search/note_cache_mocking.js b/spec/search/note_cache_mocking.js index b3fc35c8a..69b17cc3c 100644 --- a/spec/search/note_cache_mocking.js +++ b/spec/search/note_cache_mocking.js @@ -1,7 +1,7 @@ -const Note = require('../../src/services/becca/entities/note.js'); -const Branch = require('../../src/services/becca/entities/branch.js'); -const Attribute = require('../../src/services/becca/entities/attribute.js'); -const becca = require('../../src/services/becca/becca.js'); +const Note = require('../../src/becca/entities/note.js'); +const Branch = require('../../src/becca/entities/branch.js'); +const Attribute = require('../../src/becca/entities/attribute.js'); +const becca = require('../../src/becca/becca.js'); const randtoken = require('rand-token').generator({source: 'crypto'}); /** @return {Note} */ diff --git a/spec/search/search.spec.js b/spec/search/search.spec.js index 3d46b6170..611072c5d 100644 --- a/spec/search/search.spec.js +++ b/spec/search/search.spec.js @@ -1,9 +1,9 @@ const searchService = require('../../src/services/search/services/search.js'); -const Note = require('../../src/services/becca/entities/note.js'); -const Branch = require('../../src/services/becca/entities/branch.js'); +const Note = require('../../src/becca/entities/note.js'); +const Branch = require('../../src/becca/entities/branch.js'); const SearchContext = require('../../src/services/search/search_context.js'); const dateUtils = require('../../src/services/date_utils.js'); -const becca = require('../../src/services/becca/becca.js'); +const becca = require('../../src/becca/becca.js'); const {NoteBuilder, findNoteByTitle, note} = require('./note_cache_mocking.js'); describe("Search", () => { diff --git a/spec/search/value_extractor.spec.js b/spec/search/value_extractor.spec.js index aa3096756..a8bd3a505 100644 --- a/spec/search/value_extractor.spec.js +++ b/spec/search/value_extractor.spec.js @@ -1,6 +1,6 @@ const {note} = require('./note_cache_mocking.js'); const ValueExtractor = require('../../src/services/search/value_extractor.js'); -const becca = require('../../src/services/becca/becca.js'); +const becca = require('../../src/becca/becca.js'); const SearchContext = require("../../src/services/search/search_context.js"); const dsc = new SearchContext(); diff --git a/src/app.js b/src/app.js index 195625df2..462d07342 100644 --- a/src/app.js +++ b/src/app.js @@ -10,7 +10,7 @@ const FileStore = require('session-file-store')(session); const sessionSecret = require('./services/session_secret'); const dataDir = require('./services/data_dir'); require('./services/handlers'); -require('./services/becca/becca_loader.js'); +require('./becca/becca_loader.js'); const app = express(); diff --git a/src/services/becca/becca_loader.js b/src/becca/becca_loader.js similarity index 90% rename from src/services/becca/becca_loader.js rename to src/becca/becca_loader.js index 0eb3df1b4..675206f2b 100644 --- a/src/services/becca/becca_loader.js +++ b/src/becca/becca_loader.js @@ -1,21 +1,21 @@ "use strict"; -const sql = require('../sql.js'); -const eventService = require('../events.js'); +const sql = require('../services/sql.js'); +const eventService = require('../services/events.js'); const becca = require('./becca.js'); -const sqlInit = require('../sql_init'); -const log = require('../log'); -const Note = require('./entities/note'); -const Branch = require('./entities/branch'); -const Attribute = require('./entities/attribute'); -const Option = require('./entities/option'); -const cls = require("../cls.js"); +const sqlInit = require('../services/sql_init'); +const log = require('../services/log'); +const Note = require('./entities/note.js'); +const Branch = require('./entities/branch.js'); +const Attribute = require('./entities/attribute.js'); +const Option = require('./entities/option.js'); +const cls = require("../services/cls.js"); const beccaLoaded = new Promise((res, rej) => { sqlInit.dbReady.then(() => { load(); - cls.init(() => require('../options_init').initStartupOptions()); + cls.init(() => require('../services/options_init').initStartupOptions()); res(); }); diff --git a/src/services/becca/entities/abstract_entity.js b/src/becca/entities/abstract_entity.js similarity index 89% rename from src/services/becca/entities/abstract_entity.js rename to src/becca/entities/abstract_entity.js index 465f1a69f..7b7c176f6 100644 --- a/src/services/becca/entities/abstract_entity.js +++ b/src/becca/entities/abstract_entity.js @@ -1,11 +1,11 @@ "use strict"; -const utils = require('../../utils'); -const sql = require('../../sql'); -const entityChangesService = require('../../entity_changes'); -const eventService = require("../../events"); -const dateUtils = require("../../date_utils"); -const cls = require("../../cls"); +const utils = require('../../services/utils'); +const sql = require('../../services/sql'); +const entityChangesService = require('../../services/entity_changes'); +const eventService = require("../../services/events"); +const dateUtils = require("../../services/date_utils"); +const cls = require("../../services/cls"); let becca = null; @@ -41,7 +41,7 @@ class AbstractEntity { get becca() { if (!becca) { - becca = require('../becca'); + becca = require('../becca.js'); } return becca; diff --git a/src/services/becca/entities/note.js b/src/becca/entities/note.js similarity index 98% rename from src/services/becca/entities/note.js rename to src/becca/entities/note.js index 249be39e5..776bf8675 100644 --- a/src/services/becca/entities/note.js +++ b/src/becca/entities/note.js @@ -1,13 +1,13 @@ "use strict"; -const protectedSessionService = require('../../protected_session'); -const log = require('../../log'); -const sql = require('../../sql'); -const utils = require('../../utils'); -const dateUtils = require('../../date_utils'); -const entityChangesService = require('../../entity_changes'); -const AbstractEntity = require("./abstract_entity"); -const NoteRevision = require("./note_revision"); +const protectedSessionService = require('../../services/protected_session'); +const log = require('../../services/log'); +const sql = require('../../services/sql'); +const utils = require('../../services/utils'); +const dateUtils = require('../../services/date_utils'); +const entityChangesService = require('../../services/entity_changes'); +const AbstractEntity = require("./abstract_entity.js"); +const NoteRevision = require("./note_revision.js"); const LABEL = 'label'; const RELATION = 'relation'; @@ -879,7 +879,7 @@ class Note extends AbstractEntity { } } else { - const Attribute = require("./attribute"); + const Attribute = require("./attribute.js"); new Attribute({ noteId: this.noteId, @@ -911,7 +911,7 @@ class Note extends AbstractEntity { * @return {Attribute} */ addAttribute(type, name, value = "", isInheritable = false, position = 1000) { - const Attribute = require("./attribute"); + const Attribute = require("./attribute.js"); return new Attribute({ noteId: this.noteId, diff --git a/src/services/becca/entities/note_revision.js b/src/becca/entities/note_revision.js similarity index 93% rename from src/services/becca/entities/note_revision.js rename to src/becca/entities/note_revision.js index 4c62b4d17..b78c11aa2 100644 --- a/src/services/becca/entities/note_revision.js +++ b/src/becca/entities/note_revision.js @@ -1,12 +1,12 @@ "use strict"; -const protectedSessionService = require('../../protected_session'); -const utils = require('../../utils'); -const sql = require('../../sql'); -const dateUtils = require('../../date_utils'); -const becca = require('../../becca/becca'); -const entityChangesService = require('../../entity_changes'); -const AbstractEntity = require("./abstract_entity"); +const protectedSessionService = require('../../services/protected_session'); +const utils = require('../../services/utils'); +const sql = require('../../services/sql'); +const dateUtils = require('../../services/date_utils'); +const becca = require('../becca.js'); +const entityChangesService = require('../../services/entity_changes'); +const AbstractEntity = require("./abstract_entity.js"); /** * NoteRevision represents snapshot of note's title and content at some point in the past. It's used for seamless note versioning. diff --git a/src/services/becca/entity_constructor.js b/src/becca/entity_constructor.js similarity index 90% rename from src/services/becca/entity_constructor.js rename to src/becca/entity_constructor.js index 4a8731493..3f5b84915 100644 --- a/src/services/becca/entity_constructor.js +++ b/src/becca/entity_constructor.js @@ -1,7 +1,7 @@ -const Note = require('./entities/note'); +const Note = require('./entities/note.js'); const NoteRevision = require('./entities/note_revision.js'); -const Branch = require('./entities/branch'); -const Attribute = require('./entities/attribute'); +const Branch = require('./entities/branch.js'); +const Attribute = require('./entities/attribute.js'); const RecentNote = require('./entities/recent_note.js'); const ApiToken = require('./entities/api_token.js'); diff --git a/src/routes/api/attributes.js b/src/routes/api/attributes.js index 0c3f42b0e..132c41c5e 100644 --- a/src/routes/api/attributes.js +++ b/src/routes/api/attributes.js @@ -3,8 +3,8 @@ const sql = require('../../services/sql'); const log = require('../../services/log'); const attributeService = require('../../services/attributes'); -const Attribute = require('../../services/becca/entities/attribute'); -const becca = require("../../services/becca/becca"); +const Attribute = require('../../becca/entities/attribute.js'); +const becca = require("../../becca/becca.js"); function getEffectiveNoteAttributes(req) { const note = becca.getNote(req.params.noteId); diff --git a/src/routes/api/autocomplete.js b/src/routes/api/autocomplete.js index 9082b3d25..6fb2f5e3d 100644 --- a/src/routes/api/autocomplete.js +++ b/src/routes/api/autocomplete.js @@ -1,11 +1,11 @@ "use strict"; -const beccaService = require('../../services/becca/becca_service.js'); +const beccaService = require('../../becca/becca_service.js'); const searchService = require('../../services/search/services/search.js'); const log = require('../../services/log'); const utils = require('../../services/utils'); const cls = require('../../services/cls'); -const becca = require("../../services/becca/becca"); +const becca = require("../../becca/becca.js"); function getAutocomplete(req) { const query = req.query.query.trim(); diff --git a/src/routes/api/branches.js b/src/routes/api/branches.js index 53eb027af..bc22d35a9 100644 --- a/src/routes/api/branches.js +++ b/src/routes/api/branches.js @@ -5,7 +5,7 @@ const utils = require('../../services/utils'); const entityChangesService = require('../../services/entity_changes.js'); const treeService = require('../../services/tree'); const noteService = require('../../services/notes'); -const becca = require('../../services/becca/becca.js'); +const becca = require('../../becca/becca.js'); const TaskContext = require('../../services/task_context'); /** diff --git a/src/routes/api/clipper.js b/src/routes/api/clipper.js index 1aea27a72..15753ae0c 100644 --- a/src/routes/api/clipper.js +++ b/src/routes/api/clipper.js @@ -10,7 +10,7 @@ const ws = require('../../services/ws.js'); const log = require('../../services/log'); const utils = require('../../services/utils'); const path = require('path'); -const Attribute = require('../../services/becca/entities/attribute'); +const Attribute = require('../../becca/entities/attribute.js'); const htmlSanitizer = require('../../services/html_sanitizer'); function findClippingNote(todayNote, pageUrl) { diff --git a/src/routes/api/files.js b/src/routes/api/files.js index 4cb671ae1..fd0cf11cc 100644 --- a/src/routes/api/files.js +++ b/src/routes/api/files.js @@ -9,7 +9,7 @@ const fs = require('fs'); const { Readable } = require('stream'); const chokidar = require('chokidar'); const ws = require('../../services/ws'); -const becca = require("../../services/becca/becca"); +const becca = require("../../becca/becca.js"); function updateFile(req) { const {noteId} = req.params; diff --git a/src/routes/api/image.js b/src/routes/api/image.js index 4c21386c5..6b9a3b195 100644 --- a/src/routes/api/image.js +++ b/src/routes/api/image.js @@ -1,7 +1,7 @@ "use strict"; const imageService = require('../../services/image'); -const becca = require('../../services/becca/becca'); +const becca = require('../../becca/becca.js'); const RESOURCE_DIR = require('../../services/resource_dir').RESOURCE_DIR; const fs = require('fs'); diff --git a/src/routes/api/import.js b/src/routes/api/import.js index 8c8794b67..0ac52b1e9 100644 --- a/src/routes/api/import.js +++ b/src/routes/api/import.js @@ -6,7 +6,7 @@ const zipImportService = require('../../services/import/zip'); const singleImportService = require('../../services/import/single'); const cls = require('../../services/cls'); const path = require('path'); -const beccaLoader = require('../../services/becca/becca_loader.js'); +const beccaLoader = require('../../becca/becca_loader.js'); const log = require('../../services/log'); const TaskContext = require('../../services/task_context.js'); diff --git a/src/routes/api/login.js b/src/routes/api/login.js index 9cb21931b..34a01db60 100644 --- a/src/routes/api/login.js +++ b/src/routes/api/login.js @@ -11,7 +11,7 @@ const eventService = require('../../services/events'); const sqlInit = require('../../services/sql_init'); const sql = require('../../services/sql'); const optionService = require('../../services/options'); -const ApiToken = require('../../services/becca/entities/api_token.js'); +const ApiToken = require('../../becca/entities/api_token.js'); const ws = require("../../services/ws.js"); function loginSync(req) { diff --git a/src/routes/api/note_revisions.js b/src/routes/api/note_revisions.js index 0a1f736e8..cdedee5bf 100644 --- a/src/routes/api/note_revisions.js +++ b/src/routes/api/note_revisions.js @@ -1,12 +1,12 @@ "use strict"; -const beccaService = require('../../services/becca/becca_service.js'); +const beccaService = require('../../becca/becca_service.js'); const protectedSessionService = require('../../services/protected_session'); const noteRevisionService = require('../../services/note_revisions'); const utils = require('../../services/utils'); const sql = require('../../services/sql'); const path = require('path'); -const becca = require("../../services/becca/becca"); +const becca = require("../../becca/becca.js"); function getNoteRevisions(req) { return becca.getNoteRevisionsFromQuery(` diff --git a/src/routes/api/notes.js b/src/routes/api/notes.js index 1ee5d695a..cb20e38c9 100644 --- a/src/routes/api/notes.js +++ b/src/routes/api/notes.js @@ -8,7 +8,7 @@ const log = require('../../services/log'); const TaskContext = require('../../services/task_context'); const fs = require('fs'); const noteRevisionService = require("../../services/note_revisions.js"); -const becca = require("../../services/becca/becca"); +const becca = require("../../becca/becca.js"); function getNote(req) { const noteId = req.params.noteId; diff --git a/src/routes/api/recent_changes.js b/src/routes/api/recent_changes.js index 750a4e23a..f1e58a3d9 100644 --- a/src/routes/api/recent_changes.js +++ b/src/routes/api/recent_changes.js @@ -3,7 +3,7 @@ const sql = require('../../services/sql'); const protectedSessionService = require('../../services/protected_session'); const noteService = require('../../services/notes'); -const beccaService = require('../../services/becca/becca_service.js'); +const beccaService = require('../../becca/becca_service.js'); function getRecentChanges(req) { const {ancestorNoteId} = req.params; diff --git a/src/routes/api/recent_notes.js b/src/routes/api/recent_notes.js index 3c8108a30..50e07b72d 100644 --- a/src/routes/api/recent_notes.js +++ b/src/routes/api/recent_notes.js @@ -1,6 +1,6 @@ "use strict"; -const RecentNote = require('../../services/becca/entities/recent_note.js'); +const RecentNote = require('../../becca/entities/recent_note.js'); const sql = require('../../services/sql'); const dateUtils = require('../../services/date_utils'); diff --git a/src/routes/api/script.js b/src/routes/api/script.js index 6cf8e9e5d..799af134f 100644 --- a/src/routes/api/script.js +++ b/src/routes/api/script.js @@ -2,7 +2,7 @@ const scriptService = require('../../services/script'); const attributeService = require('../../services/attributes'); -const becca = require('../../services/becca/becca'); +const becca = require('../../becca/becca.js'); const syncService = require('../../services/sync'); function exec(req) { diff --git a/src/routes/api/search.js b/src/routes/api/search.js index 593ada04f..ed618ff22 100644 --- a/src/routes/api/search.js +++ b/src/routes/api/search.js @@ -1,6 +1,6 @@ "use strict"; -const becca = require('../../services/becca/becca'); +const becca = require('../../becca/becca.js'); const SearchContext = require('../../services/search/search_context'); const log = require('../../services/log'); const scriptService = require('../../services/script'); diff --git a/src/routes/api/similar_notes.js b/src/routes/api/similar_notes.js index 1d20a2664..741ef20f6 100644 --- a/src/routes/api/similar_notes.js +++ b/src/routes/api/similar_notes.js @@ -1,7 +1,7 @@ "use strict"; -const similarityService = require('../../services/becca/similarity.js'); -const becca = require("../../services/becca/becca"); +const similarityService = require('../../becca/similarity.js'); +const becca = require("../../becca/becca.js"); async function getSimilarNotes(req) { const noteId = req.params.noteId; diff --git a/src/routes/api/stats.js b/src/routes/api/stats.js index c96e6da43..bbb16fd04 100644 --- a/src/routes/api/stats.js +++ b/src/routes/api/stats.js @@ -1,5 +1,5 @@ const sql = require('../../services/sql'); -const becca = require('../../services/becca/becca.js'); +const becca = require('../../becca/becca.js'); function getNoteSize(req) { const {noteId} = req.params; diff --git a/src/routes/api/tree.js b/src/routes/api/tree.js index 49bb8bf37..72b0a79b2 100644 --- a/src/routes/api/tree.js +++ b/src/routes/api/tree.js @@ -1,6 +1,6 @@ "use strict"; -const becca = require('../../services/becca/becca.js'); +const becca = require('../../becca/becca.js'); const log = require('../../services/log'); function getNotesAndBranchesAndAttributes(noteIds) { diff --git a/src/routes/custom.js b/src/routes/custom.js index 2cc9b8d35..c56b54aa7 100644 --- a/src/routes/custom.js +++ b/src/routes/custom.js @@ -3,7 +3,7 @@ const fileUploadService = require('./api/files.js'); const scriptService = require('../services/script'); const cls = require('../services/cls'); const sql = require("../services/sql"); -const becca = require("../services/becca/becca"); +const becca = require("../becca/becca.js"); function handleRequest(req, res) { // express puts content after first slash into 0 index element diff --git a/src/services/attributes.js b/src/services/attributes.js index 87d72c968..e91c8bf69 100644 --- a/src/services/attributes.js +++ b/src/services/attributes.js @@ -2,8 +2,8 @@ const searchService = require('./search/services/search'); const sql = require('./sql'); -const becca = require('./becca/becca.js'); -const Attribute = require('./becca/entities/attribute'); +const becca = require('../becca/becca.js'); +const Attribute = require('../becca/entities/attribute.js'); const {formatAttrForSearch} = require("./attribute_formatter.js"); const ATTRIBUTE_TYPES = [ 'label', 'relation' ]; diff --git a/src/services/backend_script_api.js b/src/services/backend_script_api.js index aaef0741b..47149b50e 100644 --- a/src/services/backend_script_api.js +++ b/src/services/backend_script_api.js @@ -13,7 +13,7 @@ const cloningService = require('./cloning'); const appInfo = require('./app_info'); const searchService = require('./search/services/search'); const SearchContext = require("./search/search_context.js"); -const becca = require("./becca/becca"); +const becca = require("../becca/becca.js"); /** * This is the main backend API interface for scripts. It's published in the local "api" object. diff --git a/src/services/cloning.js b/src/services/cloning.js index 42d58c931..ca113e13f 100644 --- a/src/services/cloning.js +++ b/src/services/cloning.js @@ -4,10 +4,10 @@ const sql = require('./sql'); const eventChangesService = require('./entity_changes.js'); const treeService = require('./tree'); const noteService = require('./notes'); -const Branch = require('../services/becca/entities/branch'); +const Branch = require('../becca/entities/branch.js'); const TaskContext = require("./task_context.js"); const utils = require('./utils'); -const becca = require("./becca/becca"); +const becca = require("../becca/becca.js"); function cloneNoteToParent(noteId, parentBranchId, prefix) { const parentBranch = becca.getBranch(parentBranchId); diff --git a/src/services/consistency_checks.js b/src/services/consistency_checks.js index cc3a046be..e95049c94 100644 --- a/src/services/consistency_checks.js +++ b/src/services/consistency_checks.js @@ -8,11 +8,11 @@ const syncMutexService = require('./sync_mutex'); const cls = require('./cls'); const entityChangesService = require('./entity_changes.js'); const optionsService = require('./options'); -const Branch = require('../services/becca/entities/branch'); +const Branch = require('../becca/entities/branch.js'); const dateUtils = require('./date_utils'); const attributeService = require('./attributes'); const noteRevisionService = require('./note_revisions'); -const becca = require("./becca/becca"); +const becca = require("../becca/becca.js"); class ConsistencyChecks { constructor(autoFix) { @@ -579,7 +579,7 @@ class ConsistencyChecks { } if (this.fixedIssues) { - require("../services/becca/becca_loader").load(); + require("../becca/becca_loader.js").load(); } return !this.unrecoveredConsistencyErrors; diff --git a/src/services/date_notes.js b/src/services/date_notes.js index 2c2d129d3..18997109d 100644 --- a/src/services/date_notes.js +++ b/src/services/date_notes.js @@ -3,7 +3,7 @@ const noteService = require('./notes'); const attributeService = require('./attributes'); const dateUtils = require('./date_utils'); -const becca = require('./becca/becca'); +const becca = require('../becca/becca.js'); const sql = require('./sql'); const protectedSessionService = require('./protected_session'); diff --git a/src/services/entity_changes.js b/src/services/entity_changes.js index 04ef50fbc..3a9c79c2a 100644 --- a/src/services/entity_changes.js +++ b/src/services/entity_changes.js @@ -3,7 +3,7 @@ const sourceIdService = require('./source_id'); const dateUtils = require('./date_utils'); const log = require('./log'); const cls = require('./cls'); -const becca = require("./becca/becca.js"); +const becca = require("../becca/becca.js"); let maxEntityChangeId = 0; diff --git a/src/services/export/opml.js b/src/services/export/opml.js index a3a1842a4..12ae6721a 100644 --- a/src/services/export/opml.js +++ b/src/services/export/opml.js @@ -1,7 +1,7 @@ "use strict"; const utils = require('../utils'); -const becca = require("../becca/becca"); +const becca = require("../../becca/becca.js"); function exportToOpml(taskContext, branch, version, res) { if (!['1.0', '2.0'].includes(version)) { diff --git a/src/services/handlers.js b/src/services/handlers.js index 525ba87cf..a427625b8 100644 --- a/src/services/handlers.js +++ b/src/services/handlers.js @@ -2,8 +2,8 @@ const eventService = require('./events'); const scriptService = require('./script'); const treeService = require('./tree'); const noteService = require('./notes'); -const becca = require('./becca/becca.js'); -const Attribute = require('./becca/entities/attribute'); +const becca = require('../becca/becca.js'); +const Attribute = require('../becca/entities/attribute.js'); function runAttachedRelations(note, relationName, originEntity) { // same script note can get here with multiple ways, but execute only once diff --git a/src/services/image.js b/src/services/image.js index 66edae160..aa4118f68 100644 --- a/src/services/image.js +++ b/src/services/image.js @@ -1,6 +1,6 @@ "use strict"; -const becca = require('./becca/becca'); +const becca = require('../becca/becca.js'); const log = require('./log'); const protectedSessionService = require('./protected_session'); const noteService = require('./notes'); diff --git a/src/services/import/zip.js b/src/services/import/zip.js index 7c2726d9e..36ad4c301 100644 --- a/src/services/import/zip.js +++ b/src/services/import/zip.js @@ -1,11 +1,11 @@ "use strict"; -const Attribute = require('../../services/becca/entities/attribute'); +const Attribute = require('../../becca/entities/attribute.js'); const utils = require('../../services/utils'); const log = require('../../services/log'); const noteService = require('../../services/notes'); const attributeService = require('../../services/attributes'); -const Branch = require('../../services/becca/entities/branch'); +const Branch = require('../../becca/entities/branch.js'); const path = require('path'); const commonmark = require('commonmark'); const protectedSessionService = require('../protected_session'); @@ -13,7 +13,7 @@ const mimeService = require("./mime"); const treeService = require("../tree"); const yauzl = require("yauzl"); const htmlSanitizer = require('../html_sanitizer'); -const becca = require("../becca/becca.js"); +const becca = require("../../becca/becca.js"); /** * @param {TaskContext} taskContext diff --git a/src/services/note_revisions.js b/src/services/note_revisions.js index 8d0c77996..966e69c8a 100644 --- a/src/services/note_revisions.js +++ b/src/services/note_revisions.js @@ -1,6 +1,6 @@ "use strict"; -const NoteRevision = require('./becca/entities/note_revision.js'); +const NoteRevision = require('../becca/entities/note_revision.js'); const dateUtils = require('./date_utils'); const log = require('./log'); const sql = require('./sql'); diff --git a/src/services/notes.js b/src/services/notes.js index 223afafef..d823b318f 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -13,10 +13,10 @@ const attributeService = require('../services/attributes'); const request = require('./request'); const path = require('path'); const url = require('url'); -const becca = require('../services/becca/becca'); -const Branch = require('../services/becca/entities/branch'); -const Note = require('../services/becca/entities/note'); -const Attribute = require('../services/becca/entities/attribute'); +const becca = require('../becca/becca.js'); +const Branch = require('../becca/entities/branch.js'); +const Note = require('../becca/entities/note.js'); +const Attribute = require('../becca/entities/attribute.js'); function getNewNotePosition(parentNoteId) { const note = becca.notes[parentNoteId]; diff --git a/src/services/options.js b/src/services/options.js index c27e050ed..7cb49930d 100644 --- a/src/services/options.js +++ b/src/services/options.js @@ -1,7 +1,7 @@ -const becca = require('./becca/becca'); +const becca = require('../becca/becca.js'); function getOption(name) { - const option = require('./becca/becca').getOption(name); + const option = require('../becca/becca.js').getOption(name); if (!option) { throw new Error(`Option "${name}" doesn't exist`); @@ -57,7 +57,7 @@ function setOption(name, value) { function createOption(name, value, isSynced) { // to avoid circular dependency, need to find better solution - const Option = require('../services/becca/entities/option'); + const Option = require('../becca/entities/option.js'); new Option({ name: name, diff --git a/src/services/scheduler.js b/src/services/scheduler.js index 49280e5a0..9965a6c95 100644 --- a/src/services/scheduler.js +++ b/src/services/scheduler.js @@ -4,7 +4,7 @@ const sqlInit = require('./sql_init'); const config = require('./config'); const log = require('./log'); const sql = require("./sql"); -const becca = require("./becca/becca"); +const becca = require("../becca/becca.js"); function getRunAtHours(note) { try { diff --git a/src/services/script.js b/src/services/script.js index 30180a8f4..8bc1fc0f1 100644 --- a/src/services/script.js +++ b/src/services/script.js @@ -1,7 +1,7 @@ const ScriptContext = require('./script_context'); const cls = require('./cls'); const log = require('./log'); -const becca = require("./becca/becca"); +const becca = require("../becca/becca.js"); function executeNote(note, apiParams) { if (!note.isJavaScript() || note.getScriptEnv() !== 'backend' || !note.isContentAvailable) { diff --git a/src/services/search/expressions/ancestor.js b/src/services/search/expressions/ancestor.js index 7ce085427..63384789c 100644 --- a/src/services/search/expressions/ancestor.js +++ b/src/services/search/expressions/ancestor.js @@ -3,7 +3,7 @@ const Expression = require('./expression'); const NoteSet = require('../note_set'); const log = require('../../log'); -const becca = require('../../becca/becca.js'); +const becca = require('../../../becca/becca.js'); class AncestorExp extends Expression { constructor(ancestorNoteId, ancestorDepth) { diff --git a/src/services/search/expressions/attribute_exists.js b/src/services/search/expressions/attribute_exists.js index 4067f4655..8aba8fb32 100644 --- a/src/services/search/expressions/attribute_exists.js +++ b/src/services/search/expressions/attribute_exists.js @@ -1,7 +1,7 @@ "use strict"; const NoteSet = require('../note_set'); -const becca = require('../../becca/becca.js'); +const becca = require('../../../becca/becca.js'); const Expression = require('./expression'); class AttributeExistsExp extends Expression { diff --git a/src/services/search/expressions/descendant_of.js b/src/services/search/expressions/descendant_of.js index b50302a73..8e12f40e2 100644 --- a/src/services/search/expressions/descendant_of.js +++ b/src/services/search/expressions/descendant_of.js @@ -2,7 +2,7 @@ const Expression = require('./expression'); const NoteSet = require('../note_set'); -const becca = require('../../becca/becca.js'); +const becca = require('../../../becca/becca.js'); class DescendantOfExp extends Expression { constructor(subExpression) { diff --git a/src/services/search/expressions/label_comparison.js b/src/services/search/expressions/label_comparison.js index 59506da2b..cb0b178ed 100644 --- a/src/services/search/expressions/label_comparison.js +++ b/src/services/search/expressions/label_comparison.js @@ -2,7 +2,7 @@ const Expression = require('./expression'); const NoteSet = require('../note_set'); -const becca = require('../../becca/becca.js'); +const becca = require('../../../becca/becca.js'); class LabelComparisonExp extends Expression { constructor(attributeType, attributeName, comparator) { diff --git a/src/services/search/expressions/note_cache_flat_text.js b/src/services/search/expressions/note_cache_flat_text.js index 54d3892c9..6324b6dd7 100644 --- a/src/services/search/expressions/note_cache_flat_text.js +++ b/src/services/search/expressions/note_cache_flat_text.js @@ -2,7 +2,7 @@ const Expression = require('./expression'); const NoteSet = require('../note_set'); -const becca = require('../../becca/becca.js'); +const becca = require('../../../becca/becca.js'); class BeccaFlatTextExp extends Expression { constructor(tokens) { @@ -13,7 +13,7 @@ class BeccaFlatTextExp extends Expression { execute(inputNoteSet, executionContext) { // has deps on SQL which breaks unit test so needs to be dynamically required - const beccaService = require('../../becca/becca_service.js'); + const beccaService = require('../../../becca/becca_service.js'); const resultNoteSet = new NoteSet(); function searchDownThePath(note, tokens, path) { diff --git a/src/services/search/expressions/note_content_protected_fulltext.js b/src/services/search/expressions/note_content_protected_fulltext.js index b1224f634..23c99e674 100644 --- a/src/services/search/expressions/note_content_protected_fulltext.js +++ b/src/services/search/expressions/note_content_protected_fulltext.js @@ -3,7 +3,7 @@ const Expression = require('./expression'); const NoteSet = require('../note_set'); const log = require('../../log'); -const becca = require('../../becca/becca.js'); +const becca = require('../../../becca/becca.js'); const protectedSessionService = require('../../protected_session'); const striptags = require('striptags'); diff --git a/src/services/search/expressions/note_content_unprotected_fulltext.js b/src/services/search/expressions/note_content_unprotected_fulltext.js index 230df2f1d..5ad190081 100644 --- a/src/services/search/expressions/note_content_unprotected_fulltext.js +++ b/src/services/search/expressions/note_content_unprotected_fulltext.js @@ -2,7 +2,7 @@ const Expression = require('./expression'); const NoteSet = require('../note_set'); -const becca = require('../../becca/becca.js'); +const becca = require('../../../becca/becca.js'); const striptags = require('striptags'); class NoteContentUnprotectedFulltextExp extends Expression { diff --git a/src/services/search/expressions/relation_where.js b/src/services/search/expressions/relation_where.js index 2086e0601..8ea60c5fb 100644 --- a/src/services/search/expressions/relation_where.js +++ b/src/services/search/expressions/relation_where.js @@ -2,7 +2,7 @@ const Expression = require('./expression'); const NoteSet = require('../note_set'); -const becca = require('../../becca/becca.js'); +const becca = require('../../../becca/becca.js'); class RelationWhereExp extends Expression { constructor(relationName, subExpression) { diff --git a/src/services/search/search_result.js b/src/services/search/search_result.js index c7045a789..b91e0f016 100644 --- a/src/services/search/search_result.js +++ b/src/services/search/search_result.js @@ -1,6 +1,6 @@ "use strict"; -const beccaService = require('../becca/becca_service.js'); +const beccaService = require('../../becca/becca_service.js'); class SearchResult { constructor(notePathArray) { diff --git a/src/services/search/services/search.js b/src/services/search/services/search.js index 99039b5c5..bbf7a924c 100644 --- a/src/services/search/services/search.js +++ b/src/services/search/services/search.js @@ -6,8 +6,8 @@ const parse = require('./parse.js'); const NoteSet = require("../note_set.js"); const SearchResult = require("../search_result.js"); const SearchContext = require("../search_context.js"); -const becca = require('../../becca/becca.js'); -const beccaService = require('../../becca/becca_service.js'); +const becca = require('../../../becca/becca.js'); +const beccaService = require('../../../becca/becca_service.js'); const utils = require('../../utils.js'); const log = require('../../log.js'); diff --git a/src/services/setup.js b/src/services/setup.js index 2cefe3e23..0d4d67ada 100644 --- a/src/services/setup.js +++ b/src/services/setup.js @@ -6,7 +6,7 @@ const syncOptions = require('./sync_options'); const request = require('./request'); const appInfo = require('./app_info'); const utils = require('./utils'); -const becca = require("./becca/becca"); +const becca = require("../becca/becca.js"); async function hasSyncServerSchemaAndSeed() { const response = await requestToSyncServer('GET', '/api/setup/status'); diff --git a/src/services/sql.js b/src/services/sql.js index d29192afe..ba01ff773 100644 --- a/src/services/sql.js +++ b/src/services/sql.js @@ -249,7 +249,7 @@ function transactional(func) { if (entityChanges.length > 0) { log.info("Transaction rollback dirtied the becca, forcing reload."); - require('./becca/becca_loader.js').load(); + require('../becca/becca_loader.js').load(); } throw e; diff --git a/src/services/sql_init.js b/src/services/sql_init.js index 26ac6c416..bff5001d8 100644 --- a/src/services/sql_init.js +++ b/src/services/sql_init.js @@ -5,7 +5,7 @@ const sql = require('./sql'); const utils = require('./utils'); const optionService = require('./options'); const port = require('./port'); -const Option = require('./becca/entities/option'); +const Option = require('../becca/entities/option.js'); const TaskContext = require('./task_context.js'); const migrationService = require('./migration'); const cls = require('./cls'); @@ -60,10 +60,10 @@ async function createInitialDatabase(username, password, theme) { sql.transactional(() => { sql.executeScript(schema); - require("./becca/becca_loader").load(); + require("../becca/becca_loader.js").load(); - const Note = require("./becca/entities/note"); - const Branch = require("./becca/entities/branch"); + const Note = require("../becca/entities/note.js"); + const Branch = require("../becca/entities/branch.js"); rootNote = new Note({ noteId: 'root', diff --git a/src/services/sync.js b/src/services/sync.js index 7355d66dd..e7fc470c8 100644 --- a/src/services/sync.js +++ b/src/services/sync.js @@ -15,7 +15,7 @@ const cls = require('./cls'); const request = require('./request'); const ws = require('./ws'); const entityChangesService = require('./entity_changes.js'); -const entityConstructor = require('../services/becca/entity_constructor'); +const entityConstructor = require('../becca/entity_constructor.js'); let proxyToggle = true; @@ -385,7 +385,7 @@ function getOutstandingPullCount() { return outstandingPullCount; } -require("./becca/becca_loader").beccaLoaded.then(() => { +require("../becca/becca_loader.js").beccaLoaded.then(() => { setInterval(cls.wrap(sync), 60000); // kickoff initial sync immediately diff --git a/src/services/sync_update.js b/src/services/sync_update.js index d785377a8..a13748c10 100644 --- a/src/services/sync_update.js +++ b/src/services/sync_update.js @@ -2,7 +2,7 @@ const sql = require('./sql'); const log = require('./log'); const entityChangesService = require('./entity_changes.js'); const eventService = require('./events'); -const entityConstructor = require("./becca/entity_constructor.js"); +const entityConstructor = require("../becca/entity_constructor.js"); function updateEntity(entityChange, entity, sourceId) { // can be undefined for options with isSynced=false diff --git a/src/services/tree.js b/src/services/tree.js index 6cab39a9b..aa90d301e 100644 --- a/src/services/tree.js +++ b/src/services/tree.js @@ -2,10 +2,10 @@ const sql = require('./sql'); const log = require('./log'); -const Branch = require('../services/becca/entities/branch'); +const Branch = require('../becca/entities/branch.js'); const entityChangesService = require('./entity_changes.js'); const protectedSessionService = require('./protected_session'); -const becca = require('./becca/becca.js'); +const becca = require('../becca/becca.js'); function getNotes(noteIds) { // we return also deleted notes which have been specifically asked for From a5d702b143e630afe9c6cac1761beea56892a999 Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 17 May 2021 22:10:00 +0200 Subject: [PATCH 4/8] moved becca to top level source dir --- src/{services => }/becca/becca.js | 2 +- src/{services => }/becca/becca_service.js | 6 +++--- src/{services => }/becca/entities/api_token.js | 2 +- src/{services => }/becca/entities/attribute.js | 6 +++--- src/{services => }/becca/entities/branch.js | 4 ++-- src/{services => }/becca/entities/option.js | 2 +- src/{services => }/becca/entities/recent_note.js | 2 +- src/{services => }/becca/similarity.js | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) rename src/{services => }/becca/becca.js (98%) rename src/{services => }/becca/becca_service.js (97%) rename src/{services => }/becca/entities/api_token.js (93%) rename src/{services => }/becca/entities/attribute.js (95%) rename src/{services => }/becca/entities/branch.js (97%) rename src/{services => }/becca/entities/option.js (94%) rename src/{services => }/becca/entities/recent_note.js (91%) rename src/{services => }/becca/similarity.js (99%) diff --git a/src/services/becca/becca.js b/src/becca/becca.js similarity index 98% rename from src/services/becca/becca.js rename to src/becca/becca.js index 2c03aebb5..eed48199c 100644 --- a/src/services/becca/becca.js +++ b/src/becca/becca.js @@ -1,6 +1,6 @@ "use strict"; -const sql = require("../sql.js"); +const sql = require("../services/sql.js"); const NoteRevision = require("./entities/note_revision.js"); const RecentNote = require("./entities/recent_note.js"); diff --git a/src/services/becca/becca_service.js b/src/becca/becca_service.js similarity index 97% rename from src/services/becca/becca_service.js rename to src/becca/becca_service.js index 65d29af09..6c51e9271 100644 --- a/src/services/becca/becca_service.js +++ b/src/becca/becca_service.js @@ -1,9 +1,9 @@ "use strict"; const becca = require('./becca.js'); -const cls = require('../cls'); -const protectedSessionService = require('../protected_session'); -const log = require('../log'); +const cls = require('../services/cls'); +const protectedSessionService = require('../services/protected_session'); +const log = require('../services/log'); function isNotePathArchived(notePath) { const noteId = notePath[notePath.length - 1]; diff --git a/src/services/becca/entities/api_token.js b/src/becca/entities/api_token.js similarity index 93% rename from src/services/becca/entities/api_token.js rename to src/becca/entities/api_token.js index 57ba2ce10..a445fef6e 100644 --- a/src/services/becca/entities/api_token.js +++ b/src/becca/entities/api_token.js @@ -1,6 +1,6 @@ "use strict"; -const dateUtils = require('../../date_utils.js'); +const dateUtils = require('../../services/date_utils.js'); const AbstractEntity = require("./abstract_entity.js"); /** diff --git a/src/services/becca/entities/attribute.js b/src/becca/entities/attribute.js similarity index 95% rename from src/services/becca/entities/attribute.js rename to src/becca/entities/attribute.js index b2115a240..fbd950310 100644 --- a/src/services/becca/entities/attribute.js +++ b/src/becca/entities/attribute.js @@ -2,9 +2,9 @@ const Note = require('./note.js'); const AbstractEntity = require("./abstract_entity.js"); -const sql = require("../../sql.js"); -const dateUtils = require("../../date_utils.js"); -const promotedAttributeDefinitionParser = require("../../promoted_attribute_definition_parser"); +const sql = require("../../services/sql.js"); +const dateUtils = require("../../services/date_utils.js"); +const promotedAttributeDefinitionParser = require("../../services/promoted_attribute_definition_parser"); class Attribute extends AbstractEntity { static get entityName() { return "attributes"; } diff --git a/src/services/becca/entities/branch.js b/src/becca/entities/branch.js similarity index 97% rename from src/services/becca/entities/branch.js rename to src/becca/entities/branch.js index 679797f2c..2848667e4 100644 --- a/src/services/becca/entities/branch.js +++ b/src/becca/entities/branch.js @@ -2,8 +2,8 @@ const Note = require('./note.js'); const AbstractEntity = require("./abstract_entity.js"); -const sql = require("../../sql.js"); -const dateUtils = require("../../date_utils.js"); +const sql = require("../../services/sql.js"); +const dateUtils = require("../../services/date_utils.js"); class Branch extends AbstractEntity { static get entityName() { return "branches"; } diff --git a/src/services/becca/entities/option.js b/src/becca/entities/option.js similarity index 94% rename from src/services/becca/entities/option.js rename to src/becca/entities/option.js index d535d02ac..599840975 100644 --- a/src/services/becca/entities/option.js +++ b/src/becca/entities/option.js @@ -1,6 +1,6 @@ "use strict"; -const dateUtils = require('../../date_utils.js'); +const dateUtils = require('../../services/date_utils.js'); const AbstractEntity = require("./abstract_entity.js"); /** diff --git a/src/services/becca/entities/recent_note.js b/src/becca/entities/recent_note.js similarity index 91% rename from src/services/becca/entities/recent_note.js rename to src/becca/entities/recent_note.js index f3765970c..06776d965 100644 --- a/src/services/becca/entities/recent_note.js +++ b/src/becca/entities/recent_note.js @@ -1,6 +1,6 @@ "use strict"; -const dateUtils = require('../../date_utils.js'); +const dateUtils = require('../../services/date_utils.js'); const AbstractEntity = require("./abstract_entity.js"); /** diff --git a/src/services/becca/similarity.js b/src/becca/similarity.js similarity index 99% rename from src/services/becca/similarity.js rename to src/becca/similarity.js index 8b9ecca9a..b4b1cb7de 100644 --- a/src/services/becca/similarity.js +++ b/src/becca/similarity.js @@ -1,7 +1,7 @@ const becca = require('./becca.js'); -const log = require('../log'); +const log = require('../services/log'); const beccaService = require('./becca_service.js'); -const dateUtils = require('../date_utils'); +const dateUtils = require('../services/date_utils'); const { JSDOM } = require("jsdom"); const DEBUG = false; From 2451596e8cd4766b9d63a9e412f95aba6e161e2a Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 17 May 2021 22:35:36 +0200 Subject: [PATCH 5/8] converting note properties to methods --- spec/search/search.spec.js | 4 +-- src/becca/becca_loader.js | 4 +-- src/becca/becca_service.js | 4 +-- src/becca/entities/note.js | 36 +++++++++---------- src/becca/similarity.js | 4 +-- src/public/app/entities/note_short.js | 4 +-- src/public/app/widgets/note_paths.js | 2 +- src/routes/api/notes.js | 2 +- src/routes/api/search.js | 2 +- src/routes/api/stats.js | 2 +- src/services/handlers.js | 2 +- src/services/notes.js | 2 +- src/services/script.js | 4 +-- src/services/search/expressions/ancestor.js | 2 +- .../search/expressions/attribute_exists.js | 6 ++-- .../search/expressions/descendant_of.js | 2 +- .../search/expressions/label_comparison.js | 6 ++-- .../expressions/note_cache_flat_text.js | 2 +- .../search/expressions/relation_where.js | 6 ++-- 19 files changed, 48 insertions(+), 48 deletions(-) diff --git a/spec/search/search.spec.js b/spec/search/search.spec.js index 611072c5d..9c4ec61b9 100644 --- a/spec/search/search.spec.js +++ b/spec/search/search.spec.js @@ -337,11 +337,11 @@ describe("Search", () => { const searchContext = new SearchContext(); - let searchResults = searchService.findResultsWithQuery('#city AND note.ancestors.title = Europe', searchContext); + let searchResults = searchService.findResultsWithQuery('#city AND note.getAncestors().title = Europe', searchContext); expect(searchResults.length).toEqual(1); expect(findNoteByTitle(searchResults, "Prague")).toBeTruthy(); - searchResults = searchService.findResultsWithQuery('#city AND note.ancestors.title = Asia', searchContext); + searchResults = searchService.findResultsWithQuery('#city AND note.getAncestors().title = Asia', searchContext); expect(searchResults.length).toEqual(1); expect(findNoteByTitle(searchResults, "Taipei")).toBeTruthy(); }); diff --git a/src/becca/becca_loader.js b/src/becca/becca_loader.js index 675206f2b..ed45b9484 100644 --- a/src/becca/becca_loader.js +++ b/src/becca/becca_loader.js @@ -115,7 +115,7 @@ function attributeDeleted(attribute) { if (note) { // first invalidate and only then remove the attribute (otherwise invalidation wouldn't be complete) - if (attribute.isAffectingSubtree || note.isTemplate) { + if (attribute.isAffectingSubtree || note.isTemplate()) { note.invalidateSubTree(); } else { note.invalidateThisCache(); @@ -143,7 +143,7 @@ function attributeUpdated(attribute) { const note = becca.notes[attribute.noteId]; if (note) { - if (attribute.isAffectingSubtree || note.isTemplate) { + if (attribute.isAffectingSubtree || note.isTemplate()) { note.invalidateSubTree(); } else { note.invalidateThisCache(); diff --git a/src/becca/becca_service.js b/src/becca/becca_service.js index 6c51e9271..5b559c095 100644 --- a/src/becca/becca_service.js +++ b/src/becca/becca_service.js @@ -9,7 +9,7 @@ function isNotePathArchived(notePath) { const noteId = notePath[notePath.length - 1]; const note = becca.notes[noteId]; - if (note.isArchived) { + if (note.isArchived()) { return true; } @@ -17,7 +17,7 @@ function isNotePathArchived(notePath) { const note = becca.notes[notePath[i]]; // this is going through parents so archived must be inheritable - if (note.hasInheritableOwnedArchivedLabel) { + if (note.hasInheritableOwnedArchivedLabel()) { return true; } } diff --git a/src/becca/entities/note.js b/src/becca/entities/note.js index 776bf8675..29bf4bdbb 100644 --- a/src/becca/entities/note.js +++ b/src/becca/entities/note.js @@ -79,7 +79,7 @@ class Note extends AbstractEntity { // ------ Derived attributes ------ /** @param {boolean} */ - this.isDecrypted = !row.isProtected || row.isContentAvailable; + this.isDecrypted = !this.isProtected; this.decrypt(); @@ -87,7 +87,7 @@ class Note extends AbstractEntity { this.flatTextCache = null; } - get isContentAvailable() { + isContentAvailable() { return !this.noteId // new note which was not encrypted yet || !this.isProtected || protectedSessionService.isProtectedSessionAvailable() @@ -568,11 +568,11 @@ class Note extends AbstractEntity { return attrs.length > 0 ? attrs[0] : null; } - get isArchived() { + isArchived() { return this.hasAttribute('label', 'archived'); } - get hasInheritableOwnedArchivedLabel() { + hasInheritableOwnedArchivedLabel() { return !!this.ownedAttributes.find(attr => attr.type === 'label' && attr.name === 'archived' && attr.isInheritable); } @@ -581,7 +581,7 @@ class Note extends AbstractEntity { resortParents() { this.parentBranches.sort((a, b) => a.branchId.startsWith('virt-') - || a.parentNote.hasInheritableOwnedArchivedLabel ? 1 : -1); + || a.parentNote.hasInheritableOwnedArchivedLabel() ? 1 : -1); this.parents = this.parentBranches.map(branch => branch.parentNote); } @@ -593,7 +593,7 @@ class Note extends AbstractEntity { * * @return {string} - returns flattened textual representation of note, prefixes and attributes */ - get flatText() { + getFlatText() { if (!this.flatTextCache) { this.flatTextCache = this.noteId + ' ' + this.type + ' ' + this.mime + ' '; @@ -674,16 +674,16 @@ class Note extends AbstractEntity { } } - get isTemplate() { + isTemplate() { return !!this.targetRelations.find(rel => rel.name === 'template'); } /** @return {Note[]} */ - get subtreeNotesIncludingTemplated() { + getSubtreeNotesIncludingTemplated() { const arr = [[this]]; for (const childNote of this.children) { - arr.push(childNote.subtreeNotesIncludingTemplated); + arr.push(childNote.getSubtreeNotesIncludingTemplated()); } for (const targetRelation of this.targetRelations) { @@ -691,7 +691,7 @@ class Note extends AbstractEntity { const note = targetRelation.note; if (note) { - arr.push(note.subtreeNotesIncludingTemplated); + arr.push(note.getSubtreeNotesIncludingTemplated()); } } } @@ -700,23 +700,23 @@ class Note extends AbstractEntity { } /** @return {Note[]} */ - get subtreeNotes() { + getSubtreeNotes() { const arr = [[this]]; for (const childNote of this.children) { - arr.push(childNote.subtreeNotes); + arr.push(childNote.getSubtreeNotes()); } return arr.flat(); } /** @return {String[]} */ - get subtreeNoteIds() { - return this.subtreeNotes.map(note => note.noteId); + getSubtreeNoteIds() { + return this.getSubtreeNotes().map(note => note.noteId); } getDescendantNoteIds() { - return this.subtreeNoteIds; + return this.getSubtreeNoteIds(); } get parentCount() { @@ -767,7 +767,7 @@ class Note extends AbstractEntity { return this.getAttributes().length; } - get ancestors() { + getAncestors() { if (!this.ancestorCache) { const noteIds = new Set(); this.ancestorCache = []; @@ -778,7 +778,7 @@ class Note extends AbstractEntity { noteIds.add(parent.noteId); } - for (const ancestorNote of parent.ancestors) { + for (const ancestorNote of parent.getAncestors()) { if (!noteIds.has(ancestorNote.noteId)) { this.ancestorCache.push(ancestorNote); noteIds.add(ancestorNote.noteId); @@ -796,7 +796,7 @@ class Note extends AbstractEntity { /** @return {Note[]} - returns only notes which are templated, does not include their subtrees * in effect returns notes which are influenced by note's non-inheritable attributes */ - get templatedNotes() { + getTemplatedNotes() { const arr = [this]; for (const targetRelation of this.targetRelations) { diff --git a/src/becca/similarity.js b/src/becca/similarity.js index b4b1cb7de..5835ca629 100644 --- a/src/becca/similarity.js +++ b/src/becca/similarity.js @@ -64,7 +64,7 @@ function buildRewardMap(note) { } } - for (const ancestorNote of note.ancestors) { + for (const ancestorNote of note.getAncestors()) { if (ancestorNote.noteId === 'root') { continue; } @@ -249,7 +249,7 @@ async function findSimilarNotes(noteId) { const rewardMap = buildRewardMap(baseNote); let ancestorRewardCache = {}; - const ancestorNoteIds = new Set(baseNote.ancestors.map(note => note.noteId)); + const ancestorNoteIds = new Set(baseNote.getAncestors().map(note => note.noteId)); ancestorNoteIds.add(baseNote.noteId); let displayRewards = false; diff --git a/src/public/app/entities/note_short.js b/src/public/app/entities/note_short.js index 1fa815344..3a0e6d682 100644 --- a/src/public/app/entities/note_short.js +++ b/src/public/app/entities/note_short.js @@ -308,8 +308,8 @@ class NoteShort { return a.isInHoistedSubTree ? -1 : 1; } else if (a.isSearch !== b.isSearch) { return a.isSearch ? 1 : -1; - } else if (a.isArchived !== b.isArchived) { - return a.isArchived ? 1 : -1; + } else if (a.isArchived() !== b.isArchived()) { + return a.isArchived() ? 1 : -1; } else { return a.notePath.length - b.notePath.length; } diff --git a/src/public/app/widgets/note_paths.js b/src/public/app/widgets/note_paths.js index d18a664af..7bd33f279 100644 --- a/src/public/app/widgets/note_paths.js +++ b/src/public/app/widgets/note_paths.js @@ -100,7 +100,7 @@ export default class NotePathsWidget extends TabAwareWidget { icons.push(``); } - if (notePathRecord.isArchived) { + if (notePathRecord.isArchived()) { $noteLink.addClass("path-archived"); icons.push(``); diff --git a/src/routes/api/notes.js b/src/routes/api/notes.js index cb20e38c9..0ca8f5a2b 100644 --- a/src/routes/api/notes.js +++ b/src/routes/api/notes.js @@ -195,7 +195,7 @@ function changeTitle(req) { return [404, `Note ${noteId} has not been found`]; } - if (!note.isContentAvailable) { + if (!note.isContentAvailable()) { return [400, `Note ${noteId} is not available for change`]; } diff --git a/src/routes/api/search.js b/src/routes/api/search.js index ed618ff22..bbdd32a22 100644 --- a/src/routes/api/search.js +++ b/src/routes/api/search.js @@ -182,7 +182,7 @@ function searchFromRelation(note, relationName) { return []; } - if (!note.isContentAvailable) { + if (!note.isContentAvailable()) { log.info(`Note ${scriptNote.noteId} is not available outside of protected session.`); return []; diff --git a/src/routes/api/stats.js b/src/routes/api/stats.js index bbb16fd04..e6946ff3b 100644 --- a/src/routes/api/stats.js +++ b/src/routes/api/stats.js @@ -29,7 +29,7 @@ function getSubtreeSize(req) { return [404, `Note ${noteId} was not found.`]; } - const subTreeNoteIds = note.subtreeNotes.map(note => note.noteId); + const subTreeNoteIds = note.getSubtreeNotes().map(note => note.noteId); sql.fillParamList(subTreeNoteIds); diff --git a/src/services/handlers.js b/src/services/handlers.js index a427625b8..144287091 100644 --- a/src/services/handlers.js +++ b/src/services/handlers.js @@ -89,7 +89,7 @@ eventService.subscribe(eventService.ENTITY_CREATED, ({ entityName, entity }) => const note = becca.notes[entity.noteId]; if (note) { - for (const noteId of note.subtreeNoteIds) { + for (const noteId of note.getSubtreeNoteIds()) { treeService.sortNotesByTitle(noteId); } } diff --git a/src/services/notes.js b/src/services/notes.js index d823b318f..fe7f547f3 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -475,7 +475,7 @@ function saveNoteRevision(note) { function updateNote(noteId, noteUpdates) { const note = becca.getNote(noteId); - if (!note.isContentAvailable) { + if (!note.isContentAvailable()) { throw new Error(`Note ${noteId} is not available for change!`); } diff --git a/src/services/script.js b/src/services/script.js index 8bc1fc0f1..882b8154a 100644 --- a/src/services/script.js +++ b/src/services/script.js @@ -4,7 +4,7 @@ const log = require('./log'); const becca = require("../becca/becca.js"); function executeNote(note, apiParams) { - if (!note.isJavaScript() || note.getScriptEnv() !== 'backend' || !note.isContentAvailable) { + if (!note.isJavaScript() || note.getScriptEnv() !== 'backend' || !note.isContentAvailable()) { log.info(`Cannot execute note ${note.noteId} "${note.title}", note must be of type "Code: JS frontend"`); return; @@ -105,7 +105,7 @@ function getScriptBundleForFrontend(note) { } function getScriptBundle(note, root = true, scriptEnv = null, includedNoteIds = [], backendOverrideContent = null) { - if (!note.isContentAvailable) { + if (!note.isContentAvailable()) { return; } diff --git a/src/services/search/expressions/ancestor.js b/src/services/search/expressions/ancestor.js index 63384789c..fccebbd61 100644 --- a/src/services/search/expressions/ancestor.js +++ b/src/services/search/expressions/ancestor.js @@ -23,7 +23,7 @@ class AncestorExp extends Expression { return new NoteSet([]); } - const subTreeNoteSet = new NoteSet(ancestorNote.subtreeNotes).intersection(inputNoteSet); + const subTreeNoteSet = new NoteSet(ancestorNote.getSubtreeNotes()).intersection(inputNoteSet); if (!this.ancestorDepthComparator) { return subTreeNoteSet; diff --git a/src/services/search/expressions/attribute_exists.js b/src/services/search/expressions/attribute_exists.js index 8aba8fb32..e21fe4135 100644 --- a/src/services/search/expressions/attribute_exists.js +++ b/src/services/search/expressions/attribute_exists.js @@ -25,10 +25,10 @@ class AttributeExistsExp extends Expression { if (inputNoteSet.hasNoteId(note.noteId)) { if (attr.isInheritable) { - resultNoteSet.addAll(note.subtreeNotesIncludingTemplated); + resultNoteSet.addAll(note.getSubtreeNotesIncludingTemplated()); } - else if (note.isTemplate) { - resultNoteSet.addAll(note.templatedNotes); + else if (note.isTemplate()) { + resultNoteSet.addAll(note.getTemplatedNotes()); } else { resultNoteSet.add(note); diff --git a/src/services/search/expressions/descendant_of.js b/src/services/search/expressions/descendant_of.js index 8e12f40e2..473062107 100644 --- a/src/services/search/expressions/descendant_of.js +++ b/src/services/search/expressions/descendant_of.js @@ -18,7 +18,7 @@ class DescendantOfExp extends Expression { const subTreeNoteSet = new NoteSet(); for (const note of subResNoteSet.notes) { - subTreeNoteSet.addAll(note.subtreeNotes); + subTreeNoteSet.addAll(note.getSubtreeNotes()); } return inputNoteSet.intersection(subTreeNoteSet); diff --git a/src/services/search/expressions/label_comparison.js b/src/services/search/expressions/label_comparison.js index cb0b178ed..f808b4458 100644 --- a/src/services/search/expressions/label_comparison.js +++ b/src/services/search/expressions/label_comparison.js @@ -23,10 +23,10 @@ class LabelComparisonExp extends Expression { if (inputNoteSet.hasNoteId(note.noteId) && this.comparator(value)) { if (attr.isInheritable) { - resultNoteSet.addAll(note.subtreeNotesIncludingTemplated); + resultNoteSet.addAll(note.getSubtreeNotesIncludingTemplated()); } - else if (note.isTemplate) { - resultNoteSet.addAll(note.templatedNotes); + else if (note.isTemplate()) { + resultNoteSet.addAll(note.getTemplatedNotes()); } else { resultNoteSet.add(note); diff --git a/src/services/search/expressions/note_cache_flat_text.js b/src/services/search/expressions/note_cache_flat_text.js index 6324b6dd7..e355deeb5 100644 --- a/src/services/search/expressions/note_cache_flat_text.js +++ b/src/services/search/expressions/note_cache_flat_text.js @@ -129,7 +129,7 @@ class BeccaFlatTextExp extends Expression { for (const note of noteSet.notes) { for (const token of this.tokens) { - if (note.flatText.includes(token)) { + if (note.getFlatText().includes(token)) { candidateNotes.push(note); break; } diff --git a/src/services/search/expressions/relation_where.js b/src/services/search/expressions/relation_where.js index 8ea60c5fb..951326c3e 100644 --- a/src/services/search/expressions/relation_where.js +++ b/src/services/search/expressions/relation_where.js @@ -24,9 +24,9 @@ class RelationWhereExp extends Expression { if (subResNoteSet.hasNote(attr.targetNote)) { if (attr.isInheritable) { - candidateNoteSet.addAll(note.subtreeNotesIncludingTemplated); - } else if (note.isTemplate) { - candidateNoteSet.addAll(note.templatedNotes); + candidateNoteSet.addAll(note.getSubtreeNotesIncludingTemplated()); + } else if (note.isTemplate()) { + candidateNoteSet.addAll(note.getTemplatedNotes()); } else { candidateNoteSet.add(note); } From a4aaa497744fe3dbb51f545f2f616c53511706e8 Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 18 May 2021 20:30:06 +0200 Subject: [PATCH 6/8] fix width in zen mode, closes #1965 --- package-lock.json | 8 ++++---- package.json | 2 +- src/public/app/services/entrypoints.js | 14 -------------- .../app/widgets/containers/root_container.js | 17 +++++++++++++++++ src/public/stylesheets/style.css | 8 ++++---- 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2de07a769..02a1f5f00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "trilium", - "version": "0.47.2", + "version": "0.47.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2797,9 +2797,9 @@ } }, "electron": { - "version": "13.0.0-beta.26", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.0.0-beta.26.tgz", - "integrity": "sha512-glDAQjSzV26JvmB9pbdd1dLkjqUvBv9X0B8FrRvIK0BAhEmMzzZ3gKD6VPsxg2omDYMI35oThQ+92D4RxRcb+g==", + "version": "13.0.0-beta.27", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.0.0-beta.27.tgz", + "integrity": "sha512-Co5143QQBiUHLY8qKPbe4axGnFxFLIPbdBuKh0pMvhmsGsVbTK3mEihmhl/lBKQe36cu+gnODpvtZZ0uGsqlxA==", "dev": true, "requires": { "@electron/get": "^1.0.1", diff --git a/package.json b/package.json index be61c942e..d1c6b9210 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ }, "devDependencies": { "cross-env": "7.0.3", - "electron": "13.0.0-beta.26", + "electron": "13.0.0-beta.27", "electron-builder": "22.11.1", "electron-packager": "15.2.0", "electron-rebuild": "2.3.5", diff --git a/src/public/app/services/entrypoints.js b/src/public/app/services/entrypoints.js index 08f4747c8..ffaf2e9e3 100644 --- a/src/public/app/services/entrypoints.js +++ b/src/public/app/services/entrypoints.js @@ -128,20 +128,6 @@ export default class Entrypoints extends Component { } } - toggleZenModeCommand() { - if (!this.zenModeActive) { - $(".hide-in-zen-mode,.gutter").addClass("hidden-by-zen-mode"); - $("#root-widget").addClass("zen-mode"); - this.zenModeActive = true; - } - else { - // not hiding / showing explicitly since element might be hidden also for other reasons - $(".hide-in-zen-mode,.gutter").removeClass("hidden-by-zen-mode"); - $("#root-widget").removeClass("zen-mode"); - this.zenModeActive = false; - } - } - reloadFrontendAppCommand() { utils.reloadApp(); } diff --git a/src/public/app/widgets/containers/root_container.js b/src/public/app/widgets/containers/root_container.js index aecc8f2c3..82f64a939 100644 --- a/src/public/app/widgets/containers/root_container.js +++ b/src/public/app/widgets/containers/root_container.js @@ -22,6 +22,23 @@ export default class RootContainer extends FlexContainer { this.$widget.toggleClass("protected", note.isProtected); } + + this.setZenMode(this.isZenModeActive); + } + + setZenMode(active) { + this.isZenModeActive = active; + + if (this.isZenModeActive) { + $("#root-widget").addClass("zen-mode"); + } + else { + $("#root-widget").removeClass("zen-mode"); + } + } + + toggleZenModeEvent() { + this.setZenMode(!this.isZenModeActive); } tabNoteSwitchedEvent() { diff --git a/src/public/stylesheets/style.css b/src/public/stylesheets/style.css index f4e3a4706..2c70e24a5 100644 --- a/src/public/stylesheets/style.css +++ b/src/public/stylesheets/style.css @@ -131,6 +131,10 @@ span.fancytree-node.muted { opacity: 0.6; } margin-right: auto; } +.zen-mode .hide-in-zen-mode, .zen-mode .gutter { + display: none !important; +} + .ui-autocomplete { max-height: 300px; overflow-y: auto; @@ -775,10 +779,6 @@ body { font-size: var(--main-font-size); } -.hidden-by-zen-mode { - display: none !important; -} - .gutter { background: linear-gradient(to bottom, transparent, var(--accented-background-color), transparent); } From 5860b2eebbc8527b3660ef8d9fc9db3aa973cfd6 Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 18 May 2021 20:46:19 +0200 Subject: [PATCH 7/8] style cleanup --- src/public/stylesheets/style.css | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/public/stylesheets/style.css b/src/public/stylesheets/style.css index 2c70e24a5..09a28c4c1 100644 --- a/src/public/stylesheets/style.css +++ b/src/public/stylesheets/style.css @@ -103,26 +103,6 @@ span.fancytree-node.muted { opacity: 0.6; } display: none; } -.note-tab-content-template { - display: none !important; -} - -.note-tab-content { - display: flex; - flex-direction: row; - height: 100%; - width: 100%; -} - -/** we disable shield background when in zen mode because I couldn't get it to stay static - (it kept growing with content) */ -#root-widget:not(.zen-mode) .note-tab-content.protected { - /* DON'T COLLAPSE THE RULES INTO SINGLE ONE, BACKGROUND WON'T DISPLAY */ - background: url('../images/shield.svg') no-repeat; - background-size: contain; - background-position: center; -} - .zen-mode #center-pane { width: 100% !important; /* limit max width to improve readability */ From a093508fbe72088554fd58bf394237b08086efdc Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 18 May 2021 20:56:49 +0200 Subject: [PATCH 8/8] converting note properties to methods --- spec/search/note_cache_mocking.js | 4 ++-- src/becca/becca_service.js | 4 ++-- src/becca/entities/note.js | 2 +- src/public/app/entities/note_short.js | 4 ++-- src/public/app/services/zoom.js | 4 +++- src/public/app/widgets/note_paths.js | 2 +- src/routes/api/attributes.js | 9 +++++---- src/services/search/services/search.js | 2 ++ 8 files changed, 18 insertions(+), 13 deletions(-) diff --git a/spec/search/note_cache_mocking.js b/spec/search/note_cache_mocking.js index 69b17cc3c..855b0c80a 100644 --- a/spec/search/note_cache_mocking.js +++ b/spec/search/note_cache_mocking.js @@ -17,7 +17,7 @@ class NoteBuilder { } label(name, value = '', isInheritable = false) { - new Attribute(becca, { + new Attribute({ attributeId: id(), noteId: this.note.noteId, type: 'label', @@ -30,7 +30,7 @@ class NoteBuilder { } relation(name, targetNote) { - new Attribute(becca, { + new Attribute({ attributeId: id(), noteId: this.note.noteId, type: 'relation', diff --git a/src/becca/becca_service.js b/src/becca/becca_service.js index 5b559c095..dda9d53ad 100644 --- a/src/becca/becca_service.js +++ b/src/becca/becca_service.js @@ -9,7 +9,7 @@ function isNotePathArchived(notePath) { const noteId = notePath[notePath.length - 1]; const note = becca.notes[noteId]; - if (note.isArchived()) { + if (note.isArchived) { return true; } @@ -123,7 +123,7 @@ function getNoteTitleForPath(notePathArray) { * Returns notePath for noteId from cache. Note hoisting is respected. * Archived notes are also returned, but non-archived paths are preferred if available * - this means that archived paths is returned only if there's no non-archived path - * - you can check whether returned path is archived using isArchived() + * - you can check whether returned path is archived using isArchived */ function getSomePath(note, path = []) { // first try to find note within hoisted note, otherwise take any existing note path diff --git a/src/becca/entities/note.js b/src/becca/entities/note.js index 29bf4bdbb..383ad611e 100644 --- a/src/becca/entities/note.js +++ b/src/becca/entities/note.js @@ -568,7 +568,7 @@ class Note extends AbstractEntity { return attrs.length > 0 ? attrs[0] : null; } - isArchived() { + get isArchived() { return this.hasAttribute('label', 'archived'); } diff --git a/src/public/app/entities/note_short.js b/src/public/app/entities/note_short.js index 3a0e6d682..1fa815344 100644 --- a/src/public/app/entities/note_short.js +++ b/src/public/app/entities/note_short.js @@ -308,8 +308,8 @@ class NoteShort { return a.isInHoistedSubTree ? -1 : 1; } else if (a.isSearch !== b.isSearch) { return a.isSearch ? 1 : -1; - } else if (a.isArchived() !== b.isArchived()) { - return a.isArchived() ? 1 : -1; + } else if (a.isArchived !== b.isArchived) { + return a.isArchived ? 1 : -1; } else { return a.notePath.length - b.notePath.length; } diff --git a/src/public/app/services/zoom.js b/src/public/app/services/zoom.js index 1f729db87..e435ac970 100644 --- a/src/public/app/services/zoom.js +++ b/src/public/app/services/zoom.js @@ -15,7 +15,9 @@ class ZoomService extends Component { }); window.addEventListener("wheel", event => { - this.setZoomFactorAndSave(this.getCurrentZoom() + event.deltaY * 0.001); + if (event.ctrlKey) { + this.setZoomFactorAndSave(this.getCurrentZoom() + event.deltaY * 0.001); + } }); } } diff --git a/src/public/app/widgets/note_paths.js b/src/public/app/widgets/note_paths.js index 7bd33f279..d18a664af 100644 --- a/src/public/app/widgets/note_paths.js +++ b/src/public/app/widgets/note_paths.js @@ -100,7 +100,7 @@ export default class NotePathsWidget extends TabAwareWidget { icons.push(``); } - if (notePathRecord.isArchived()) { + if (notePathRecord.isArchived) { $noteLink.addClass("path-archived"); icons.push(``); diff --git a/src/routes/api/attributes.js b/src/routes/api/attributes.js index 132c41c5e..b11131f5a 100644 --- a/src/routes/api/attributes.js +++ b/src/routes/api/attributes.js @@ -47,10 +47,11 @@ function updateNoteAttribute(req) { return {}; } - attribute = new Attribute(); - attribute.noteId = noteId; - attribute.name = body.name; - attribute.type = body.type; + attribute = new Attribute({ + noteId: noteId, + name: body.name, + type: body.type + }); } if (attribute.type === 'label' || body.value.trim()) { diff --git a/src/services/search/services/search.js b/src/services/search/services/search.js index bbf7a924c..2138e7516 100644 --- a/src/services/search/services/search.js +++ b/src/services/search/services/search.js @@ -153,6 +153,8 @@ function findResultsWithQuery(query, searchContext) { const expression = parseQueryToExpression(query, searchContext); + console.log("expression", expression); + if (!expression) { return []; }