From 73ba8b8b13534174494a03e8243033206a32297b Mon Sep 17 00:00:00 2001 From: ehhc Date: Thu, 10 May 2018 21:36:58 +0200 Subject: [PATCH] Deleting a note should also delete the attachments -> fixes #1900 --- browser/main/lib/dataApi/attachmentManagement.js | 13 +++++++++++++ browser/main/lib/dataApi/deleteNote.js | 5 +++++ tests/dataApi/attachmentManagement.test.js | 14 ++++++++++++++ tests/dataApi/deleteNote-test.js | 10 ++++++++++ 4 files changed, 42 insertions(+) diff --git a/browser/main/lib/dataApi/attachmentManagement.js b/browser/main/lib/dataApi/attachmentManagement.js index c2e7f6d6..ace33464 100644 --- a/browser/main/lib/dataApi/attachmentManagement.js +++ b/browser/main/lib/dataApi/attachmentManagement.js @@ -4,6 +4,7 @@ const path = require('path') const findStorage = require('browser/lib/findStorage') const mdurl = require('mdurl') const escapeStringRegexp = require('escape-string-regexp') +const sander = require('sander') const STORAGE_FOLDER_PLACEHOLDER = ':storage' const DESTINATION_FOLDER = 'attachments' @@ -190,6 +191,17 @@ function removeStorageAndNoteReferences (input, noteKey) { return input.replace(new RegExp(mdurl.encode(path.sep), 'g'), path.sep).replace(new RegExp(STORAGE_FOLDER_PLACEHOLDER + escapeStringRegexp(path.sep) + noteKey, 'g'), DESTINATION_FOLDER) } +/** + * @description Deletes the attachment folder specified by the given storageKey and noteKey + * @param storageKey Key of the storage of the note to be deleted + * @param noteKey Key of the note to be deleted + */ +function deleteAttachmentFolder (storageKey, noteKey) { + const storagePath = findStorage.findStorage(storageKey) + const noteAttachmentPath = path.join(storagePath.path, DESTINATION_FOLDER, noteKey) + sander.rimraf(noteAttachmentPath) +} + module.exports = { copyAttachment, fixLocalURLS, @@ -199,6 +211,7 @@ module.exports = { getAttachmentsInContent, getAbsolutePathsOfAttachmentsInContent, removeStorageAndNoteReferences, + deleteAttachmentFolder, STORAGE_FOLDER_PLACEHOLDER, DESTINATION_FOLDER } diff --git a/browser/main/lib/dataApi/deleteNote.js b/browser/main/lib/dataApi/deleteNote.js index 49498a30..46ec2b55 100644 --- a/browser/main/lib/dataApi/deleteNote.js +++ b/browser/main/lib/dataApi/deleteNote.js @@ -1,6 +1,7 @@ const resolveStorageData = require('./resolveStorageData') const path = require('path') const sander = require('sander') +const attachmentManagement = require('./attachmentManagement') const { findStorage } = require('browser/lib/findStorage') function deleteNote (storageKey, noteKey) { @@ -25,6 +26,10 @@ function deleteNote (storageKey, noteKey) { storageKey } }) + .then(function deleteAttachments (storageInfo) { + attachmentManagement.deleteAttachmentFolder(storageInfo.storageKey, storageInfo.noteKey) + return storageInfo + }) } module.exports = deleteNote diff --git a/tests/dataApi/attachmentManagement.test.js b/tests/dataApi/attachmentManagement.test.js index d58a8eb8..148f6958 100644 --- a/tests/dataApi/attachmentManagement.test.js +++ b/tests/dataApi/attachmentManagement.test.js @@ -7,6 +7,7 @@ const findStorage = require('browser/lib/findStorage') jest.mock('unique-slug') const uniqueSlug = require('unique-slug') const mdurl = require('mdurl') +const sander = require('sander') const systemUnderTest = require('browser/main/lib/dataApi/attachmentManagement') @@ -260,3 +261,16 @@ it('should remove the all ":storage" and noteKey references', function () { const actual = systemUnderTest.removeStorageAndNoteReferences(testInput, noteKey) expect(actual).toEqual(expectedOutput) }) + +it('should delete the correct attachment folder if a note is deleted', function () { + const dummyStorage = {path: 'dummyStoragePath'} + const storageKey = 'storageKey' + const noteKey = 'noteKey' + findStorage.findStorage = jest.fn(() => dummyStorage) + sander.rimraf = jest.fn() + + const expectedPathToBeDeleted = path.join(dummyStorage.path, systemUnderTest.DESTINATION_FOLDER, noteKey) + systemUnderTest.deleteAttachmentFolder(storageKey, noteKey) + expect(findStorage.findStorage).toHaveBeenCalledWith(storageKey) + expect(sander.rimraf).toHaveBeenCalledWith(expectedPathToBeDeleted) +}) diff --git a/tests/dataApi/deleteNote-test.js b/tests/dataApi/deleteNote-test.js index 611022de..ed37854d 100644 --- a/tests/dataApi/deleteNote-test.js +++ b/tests/dataApi/deleteNote-test.js @@ -14,6 +14,8 @@ const sander = require('sander') const os = require('os') const CSON = require('@rokt33r/season') const faker = require('faker') +const fs = require('fs') +const attachmentManagement = require('browser/main/lib/dataApi/attachmentManagement') const storagePath = path.join(os.tmpdir(), 'test/delete-note') @@ -42,6 +44,10 @@ test.serial('Delete a note', (t) => { return Promise.resolve() .then(function doTest () { return createNote(storageKey, input1) + .then(function createAttachmentFolder (data) { + fs.mkdirSync(path.join(storagePath, attachmentManagement.DESTINATION_FOLDER, data.noteKey)) + return data + }) .then(function (data) { return deleteNote(storageKey, data.key) }) @@ -54,6 +60,10 @@ test.serial('Delete a note', (t) => { t.is(err.code, 'ENOENT') } }) + .then(function assertAttachmentFolderDeleted (data) { + const attachmentFolderPath = path.join(storagePath, attachmentManagement.DESTINATION_FOLDER, data.noteKey) + t.assert(fs.existsSync(attachmentFolderPath) === false, 'Attachment folder was not deleted') + }) }) test.after(function after () {