From ffe3b689c41756dd0978c516fff45c954e51c584 Mon Sep 17 00:00:00 2001 From: Dick Choi Date: Sat, 27 Aug 2016 20:50:34 +0900 Subject: [PATCH] deleteFolder --- browser/main/lib/dataApi/deleteFolder.js | 75 ++++++++++++++++++++++++ tests/dataApi/deleteFolder.js | 45 ++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 browser/main/lib/dataApi/deleteFolder.js create mode 100644 tests/dataApi/deleteFolder.js diff --git a/browser/main/lib/dataApi/deleteFolder.js b/browser/main/lib/dataApi/deleteFolder.js new file mode 100644 index 00000000..0cc20dcc --- /dev/null +++ b/browser/main/lib/dataApi/deleteFolder.js @@ -0,0 +1,75 @@ +const _ = require('lodash') +const path = require('path') +const resolveStorageData = require('./resolveStorageData') +const resolveStorageNotes = require('./resolveStorageNotes') +const CSON = require('season') +const sander = require('sander') + +/** + * @param {String} storageKey + * @param {String} folderKey + * + * @return {Object} + * ``` + * { + * storage: Object, + * folder: folderKey + * } + * ``` + */ +function deleteFolder (storageKey, folderKey) { + let rawStorages + let targetStorage + try { + rawStorages = JSON.parse(localStorage.getItem('storages')) + if (!_.isArray(rawStorages)) throw new Error('Target storage doesn\'t exist.') + + targetStorage = _.find(rawStorages, {key: storageKey}) + if (targetStorage == null) throw new Error('Target storage doesn\'t exist.') + } catch (e) { + return Promise.reject(e) + } + + return resolveStorageData(targetStorage) + .then(function assignNotes (storage) { + return resolveStorageNotes(storage) + .then((notes) => { + return { + storage, + notes + } + }) + }) + .then(function deleteFolderAndNotes (data) { + let { storage, notes } = data + storage.folders = storage.folders + .filter(function excludeTargetFolder (folder) { + return folder.key !== folderKey + }) + + let targetNotes = notes.filter(function filterTargetNotes (note) { + return note.folder === folderKey + }) + + let deleteAllNotes = targetNotes + .map(function deleteNote (note) { + const notePath = path.join(storage.path, 'notes', note.key + '.cson') + return sander.unlink(notePath) + .catch(function (err) { + console.warn('Failed to delete', notePath, err) + }) + }) + return Promise.all(deleteAllNotes) + .then(() => storage) + }) + .then(function (storage) { + CSON.writeFileSync(path.join(storage.path, 'boostnote.json'), _.pick(storage, ['folders', 'version'])) + + return { + storage, + folder: folderKey + } + }) +} + +module.exports = deleteFolder diff --git a/tests/dataApi/deleteFolder.js b/tests/dataApi/deleteFolder.js new file mode 100644 index 00000000..459ff8bb --- /dev/null +++ b/tests/dataApi/deleteFolder.js @@ -0,0 +1,45 @@ +const test = require('ava') +const deleteFolder = require('browser/main/lib/dataApi/deleteFolder') + +global.document = require('jsdom').jsdom('') +global.window = document.defaultView +global.navigator = window.navigator + +const Storage = require('dom-storage') +const localStorage = window.localStorage = global.localStorage = new Storage(null, { strict: true }) +const path = require('path') +const _ = require('lodash') +const TestDummy = require('../fixtures/TestDummy') +const sander = require('sander') +const os = require('os') +const CSON = require('season') + +const storagePath = path.join(os.tmpdir(), 'test/delete-folder') + +test.beforeEach((t) => { + t.context.storage = TestDummy.dummyStorage(storagePath) + localStorage.setItem('storages', JSON.stringify([t.context.storage.cache])) +}) + +test.serial('Create a folder', (t) => { + const stoargeKey = t.context.storage.cache.key + const folderKey = t.context.storage.json.folders[0].key + + return Promise.resolve() + .then(function doTest () { + return deleteFolder(stoargeKey, folderKey) + }) + .then(function assert (data) { + t.true(_.find(data.storage.folders, {key: folderKey}) == null) + let jsonData = CSON.readFileSync(path.join(data.storage.path, 'boostnote.json')) + + t.true(_.find(jsonData.folders, {key: folderKey}) == null) + let notePaths = sander.readdirSync(data.storage.path, 'notes') + t.is(notePaths.length, t.context.storage.notes.filter((note) => note.folder !== folderKey).length) + }) +}) + +test.after.always(function after () { + localStorage.clear() + sander.rimrafSync(storagePath) +})