From cf068211ffe68b5929d92322719d99b9ea5f4f9d Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 13 Nov 2023 23:53:14 +0100 Subject: [PATCH] change the way frontend detects content change which works even if no new blob is created, fixes #4434 --- package-lock.json | 116 ++++++++++---------- package.json | 16 +-- src/becca/entities/abstract_becca_entity.js | 4 +- src/public/app/entities/fnote.js | 3 + src/public/app/services/froca.js | 5 +- src/public/app/services/froca_updater.js | 24 ++-- src/public/app/services/load_results.js | 6 +- src/routes/api/tree.js | 3 +- src/services/ws.js | 2 - 9 files changed, 90 insertions(+), 89 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96f14c029f..ac80dc79db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@excalidraw/excalidraw": "0.16.1", "archiver": "6.0.1", "async-mutex": "0.4.0", - "axios": "1.6.0", + "axios": "1.6.1", "better-sqlite3": "8.4.0", "chokidar": "3.5.3", "cls-hooked": "4.2.2", @@ -35,7 +35,7 @@ "express-rate-limit": "7.1.4", "express-session": "1.17.3", "fs-extra": "11.1.1", - "helmet": "7.0.0", + "helmet": "7.1.0", "html": "1.0.0", "html2plaintext": "2.1.4", "http-proxy-agent": "7.0.0", @@ -47,8 +47,8 @@ "jimp": "0.22.10", "joplin-turndown-plugin-gfm": "1.0.12", "jsdom": "22.1.0", - "katex": "^0.16.9", - "marked": "9.1.5", + "katex": "0.16.9", + "marked": "9.1.6", "mime-types": "2.1.35", "multer": "1.4.5-lts.1", "node-abi": "3.51.0", @@ -81,7 +81,7 @@ }, "devDependencies": { "cross-env": "7.0.3", - "electron": "25.9.3", + "electron": "25.9.4", "electron-builder": "24.6.4", "electron-packager": "17.1.2", "electron-rebuild": "3.2.9", @@ -96,11 +96,11 @@ "jasmine": "5.1.0", "jsdoc": "4.0.2", "jsonc-eslint-parser": "2.4.0", - "lint-staged": "15.0.2", + "lint-staged": "15.1.0", "lorem-ipsum": "2.0.8", "nodemon": "3.0.1", - "prettier": "3.0.3", - "rcedit": "4.0.0", + "prettier": "3.1.0", + "rcedit": "4.0.1", "webpack": "5.89.0", "webpack-cli": "5.1.4" }, @@ -2475,9 +2475,9 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -4366,9 +4366,9 @@ } }, "node_modules/electron": { - "version": "25.9.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.3.tgz", - "integrity": "sha512-dacaHg/PuwVcFRgPDCM5j7UDzqGJWOsbBRdS5wPKLNS/ejPeccIjuNUT1cqcrpvCJKAFW8swHWg9kdizNSEDHQ==", + "version": "25.9.4", + "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.4.tgz", + "integrity": "sha512-5pDU8a7o7ZIPTZHAqjflGMq764Favdsc271KXrAT3oWvFTHs5Ve9+IOt5EUVPrwvC2qRWKpCIEM47WzwkTlENQ==", "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", @@ -6926,9 +6926,9 @@ } }, "node_modules/helmet": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.0.0.tgz", - "integrity": "sha512-MsIgYmdBh460ZZ8cJC81q4XJknjG567wzEmv46WOBblDb6TUd3z8/GhgmsM9pn8g2B80tAJ4m5/d3Bi1KrSUBQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", "engines": { "node": ">=16.0.0" } @@ -8413,9 +8413,9 @@ } }, "node_modules/lint-staged": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", - "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", + "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", "dev": true, "dependencies": { "chalk": "5.3.0", @@ -8427,7 +8427,7 @@ "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.3" + "yaml": "2.3.4" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -9086,9 +9086,9 @@ } }, "node_modules/marked": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.5.tgz", - "integrity": "sha512-14QG3shv8Kg/xc0Yh6TNkMj90wXH9mmldi5941I2OevfJ/FQAFLEwtwU2/FfgSAOMlWHrEukWSGQf8MiVYNG2A==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", "bin": { "marked": "bin/marked.js" }, @@ -10475,9 +10475,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -10730,9 +10730,9 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/rcedit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.0.tgz", - "integrity": "sha512-OIPwu2e0b2WF4urFMcdiYUZGjmwh5pa52Mt847MK7ovxHkjpiPaI4Ov2atjeKTNFo4Tas0G31Qm7K21t87hp+g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.1.tgz", + "integrity": "sha512-bZdaQi34krFWhrDn+O53ccBDw0MkAT2Vhu75SqhtvhQu4OPyFM4RoVheyYiVQYdjhUi6EJMVWQ0tR6bCIYVkUg==", "dev": true, "dependencies": { "cross-spawn-windows-exe": "^1.1.0" @@ -13549,9 +13549,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" @@ -15522,9 +15522,9 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -16964,9 +16964,9 @@ } }, "electron": { - "version": "25.9.3", - "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.3.tgz", - "integrity": "sha512-dacaHg/PuwVcFRgPDCM5j7UDzqGJWOsbBRdS5wPKLNS/ejPeccIjuNUT1cqcrpvCJKAFW8swHWg9kdizNSEDHQ==", + "version": "25.9.4", + "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.4.tgz", + "integrity": "sha512-5pDU8a7o7ZIPTZHAqjflGMq764Favdsc271KXrAT3oWvFTHs5Ve9+IOt5EUVPrwvC2qRWKpCIEM47WzwkTlENQ==", "requires": { "@electron/get": "^2.0.0", "@types/node": "^18.11.18", @@ -18878,9 +18878,9 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "helmet": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.0.0.tgz", - "integrity": "sha512-MsIgYmdBh460ZZ8cJC81q4XJknjG567wzEmv46WOBblDb6TUd3z8/GhgmsM9pn8g2B80tAJ4m5/d3Bi1KrSUBQ==" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==" }, "hosted-git-info": { "version": "2.8.9", @@ -19960,9 +19960,9 @@ } }, "lint-staged": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", - "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", + "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", "dev": true, "requires": { "chalk": "5.3.0", @@ -19974,7 +19974,7 @@ "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.3" + "yaml": "2.3.4" }, "dependencies": { "chalk": { @@ -20431,9 +20431,9 @@ "requires": {} }, "marked": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.5.tgz", - "integrity": "sha512-14QG3shv8Kg/xc0Yh6TNkMj90wXH9mmldi5941I2OevfJ/FQAFLEwtwU2/FfgSAOMlWHrEukWSGQf8MiVYNG2A==" + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==" }, "matcher": { "version": "3.0.0", @@ -21478,9 +21478,9 @@ "dev": true }, "prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true }, "prettier-linter-helpers": { @@ -21663,9 +21663,9 @@ } }, "rcedit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.0.tgz", - "integrity": "sha512-OIPwu2e0b2WF4urFMcdiYUZGjmwh5pa52Mt847MK7ovxHkjpiPaI4Ov2atjeKTNFo4Tas0G31Qm7K21t87hp+g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.1.tgz", + "integrity": "sha512-bZdaQi34krFWhrDn+O53ccBDw0MkAT2Vhu75SqhtvhQu4OPyFM4RoVheyYiVQYdjhUi6EJMVWQ0tR6bCIYVkUg==", "dev": true, "requires": { "cross-spawn-windows-exe": "^1.1.0" @@ -23772,9 +23772,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index f486bacbfe..bc6796e072 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@excalidraw/excalidraw": "0.16.1", "archiver": "6.0.1", "async-mutex": "0.4.0", - "axios": "1.6.0", + "axios": "1.6.1", "better-sqlite3": "8.4.0", "chokidar": "3.5.3", "cls-hooked": "4.2.2", @@ -61,7 +61,7 @@ "express-rate-limit": "7.1.4", "express-session": "1.17.3", "fs-extra": "11.1.1", - "helmet": "7.0.0", + "helmet": "7.1.0", "html": "1.0.0", "html2plaintext": "2.1.4", "http-proxy-agent": "7.0.0", @@ -73,8 +73,8 @@ "jimp": "0.22.10", "joplin-turndown-plugin-gfm": "1.0.12", "jsdom": "22.1.0", - "katex": "^0.16.9", - "marked": "9.1.5", + "katex": "0.16.9", + "marked": "9.1.6", "mime-types": "2.1.35", "multer": "1.4.5-lts.1", "node-abi": "3.51.0", @@ -104,7 +104,7 @@ }, "devDependencies": { "cross-env": "7.0.3", - "electron": "25.9.3", + "electron": "25.9.4", "electron-builder": "24.6.4", "electron-packager": "17.1.2", "electron-rebuild": "3.2.9", @@ -119,11 +119,11 @@ "jasmine": "5.1.0", "jsdoc": "4.0.2", "jsonc-eslint-parser": "2.4.0", - "lint-staged": "15.0.2", + "lint-staged": "15.1.0", "lorem-ipsum": "2.0.8", "nodemon": "3.0.1", - "prettier": "3.0.3", - "rcedit": "4.0.0", + "prettier": "3.1.0", + "rcedit": "4.0.1", "webpack": "5.89.0", "webpack-cli": "5.1.4" }, diff --git a/src/becca/entities/abstract_becca_entity.js b/src/becca/entities/abstract_becca_entity.js index 9448ebb50a..037f935d61 100644 --- a/src/becca/entities/abstract_becca_entity.js +++ b/src/becca/entities/abstract_becca_entity.js @@ -180,7 +180,7 @@ class AbstractBeccaEntity { sql.execute("DELETE FROM blobs WHERE blobId = ?", [oldBlobId]); // blobs are not marked as erased in entity_changes, they are just purged completely - // this is because technically every keystroke can create a new blob and there would be just too many + // this is because technically every keystroke can create a new blob, and there would be just too many sql.execute("DELETE FROM entity_changes WHERE entityName = 'blobs' AND entityId = ?", [oldBlobId]); } @@ -230,7 +230,7 @@ class AbstractBeccaEntity { isErased: false, utcDateChanged: pojo.utcDateModified, isSynced: true, - // overriding componentId will cause frontend to think the change is coming from a different component + // overriding componentId will cause the frontend to think the change is coming from a different component // and thus reload componentId: opts.forceFrontendReload ? utils.randomString(10) : null }); diff --git a/src/public/app/entities/fnote.js b/src/public/app/entities/fnote.js index 6e1dbf38cc..46befda8ed 100644 --- a/src/public/app/entities/fnote.js +++ b/src/public/app/entities/fnote.js @@ -93,6 +93,9 @@ class FNote { * @type {string} */ this.mime = row.mime; + + // the main use case to keep this is to detect content change which should trigger refresh + this.blobId = row.blobId; } addParent(parentNoteId, branchId, sort = true) { diff --git a/src/public/app/services/froca.js b/src/public/app/services/froca.js index 3b3e4158c5..17ddeccd6b 100644 --- a/src/public/app/services/froca.js +++ b/src/public/app/services/froca.js @@ -369,12 +369,15 @@ class Froca { /** @returns {Promise} */ async getBlob(entityType, entityId) { + // I'm not sure why we're not using blobIds directly, it would save us this composite key ... + // perhaps one benefit is that we're always requesting the latest blob, not relying on perhaps faulty/slow + // websocket update? const key = `${entityType}-${entityId}`; if (!this.blobPromises[key]) { this.blobPromises[key] = server.get(`${entityType}/${entityId}/blob`) .then(row => new FBlob(row)) - .catch(e => console.error(`Cannot get blob for ${entityType} '${entityId}'`)); + .catch(e => console.error(`Cannot get blob for ${entityType} '${entityId}'`, e)); // we don't want to keep large payloads forever in memory, so we clean that up quite quickly // this cache is more meant to share the data between different components within one business transaction (e.g. loading of the note into the tab context and all the components) diff --git a/src/public/app/services/froca_updater.js b/src/public/app/services/froca_updater.js index 14f1b86ad5..54050f84fc 100644 --- a/src/public/app/services/froca_updater.js +++ b/src/public/app/services/froca_updater.js @@ -20,18 +20,6 @@ async function processEntityChanges(entityChanges) { processAttributeChange(loadResults, ec); } else if (ec.entityName === 'note_reordering') { processNoteReordering(loadResults, ec); - } else if (ec.entityName === 'blobs') { - if (!ec.isErased) { - for (const affectedNoteId of ec.noteIds) { - for (const key of Object.keys(froca.blobPromises)) { - if (key.includes(affectedNoteId)) { - delete froca.blobPromises[key]; - } - } - } - - loadResults.addNoteContent(ec.noteIds, ec.componentId); - } } else if (ec.entityName === 'revisions') { loadResults.addRevision(ec.entityId, ec.noteId, ec.componentId); } else if (ec.entityName === 'options') { @@ -44,7 +32,7 @@ async function processEntityChanges(entityChanges) { loadResults.addOption(ec.entity.name); } else if (ec.entityName === 'attachments') { processAttachment(loadResults, ec); - } else if (ec.entityName === 'etapi_tokens') { + } else if (ec.entityName === 'blobs' || ec.entityName === 'etapi_tokens') { // NOOP } else { @@ -114,6 +102,16 @@ function processNoteChange(loadResults, ec) { delete froca.notes[ec.entityId]; } else { + if (note.blobId !== ec.entity.blobId) { + for (const key of Object.keys(froca.blobPromises)) { + if (key.includes(note.noteId)) { + delete froca.blobPromises[key]; + } + } + + loadResults.addNoteContent(note.noteId, ec.componentId); + } + note.update(ec.entity); } } diff --git a/src/public/app/services/load_results.js b/src/public/app/services/load_results.js index 58352cec93..22f6bca94d 100644 --- a/src/public/app/services/load_results.js +++ b/src/public/app/services/load_results.js @@ -95,10 +95,8 @@ export default class LoadResults { return componentIds && componentIds.find(sId => sId !== componentId) !== undefined; } - addNoteContent(noteIds, componentId) { - for (const noteId of noteIds || []) { - this.contentNoteIdToComponentId.push({noteId, componentId}); - } + addNoteContent(noteId, componentId) { + this.contentNoteIdToComponentId.push({noteId, componentId}); } isNoteContentReloaded(noteId, componentId) { diff --git a/src/routes/api/tree.js b/src/routes/api/tree.js index 111d882e35..a3992cedc9 100644 --- a/src/routes/api/tree.js +++ b/src/routes/api/tree.js @@ -58,7 +58,8 @@ function getNotesAndBranchesAndAttributes(noteIds) { title: note.getTitleOrProtected(), isProtected: note.isProtected, type: note.type, - mime: note.mime + mime: note.mime, + blobId: note.blobId }); } diff --git a/src/services/ws.js b/src/services/ws.js index f5144dcb7a..e8405585e8 100644 --- a/src/services/ws.js +++ b/src/services/ws.js @@ -147,8 +147,6 @@ function fillInAdditionalProperties(entityChange) { if (!entityChange.entity) { entityChange.entity = sql.getRow(`SELECT * FROM options WHERE name = ?`, [entityChange.entityId]); } - } else if (entityChange.entityName === 'blobs') { - entityChange.noteIds = sql.getColumn("SELECT noteId FROM notes WHERE blobId = ? AND isDeleted = 0", [entityChange.entityId]); } else if (entityChange.entityName === 'attachments') { entityChange.entity = sql.getRow(`SELECT attachments.*, LENGTH(blobs.content) AS contentLength FROM attachments