|
| 1 | +const _ = require('lodash') |
| 2 | +const path = require('path') |
| 3 | +const resolveStorageData = require('./resolveStorageData') |
| 4 | +const resolveStorageNotes = require('./resolveStorageNotes') |
| 5 | +const CSON = require('season') |
| 6 | +const sander = require('sander') |
| 7 | + |
| 8 | +/** |
| 9 | + * @param {String} storageKey |
| 10 | + * @param {String} folderKey |
| 11 | + * |
| 12 | + * @return {Object} |
| 13 | + * ``` |
| 14 | + * { |
| 15 | + * storage: Object, |
| 16 | + * folder: folderKey |
| 17 | + * } |
| 18 | + * ``` |
| 19 | + */ |
| 20 | +function deleteFolder (storageKey, folderKey) { |
| 21 | + let rawStorages |
| 22 | + let targetStorage |
| 23 | + try { |
| 24 | + rawStorages = JSON.parse(localStorage.getItem('storages')) |
| 25 | + if (!_.isArray(rawStorages)) throw new Error('Target storage doesn\'t exist.') |
| 26 | + |
| 27 | + targetStorage = _.find(rawStorages, {key: storageKey}) |
| 28 | + if (targetStorage == null) throw new Error('Target storage doesn\'t exist.') |
| 29 | + } catch (e) { |
| 30 | + return Promise.reject(e) |
| 31 | + } |
| 32 | + |
| 33 | + return resolveStorageData(targetStorage) |
| 34 | + .then(function assignNotes (storage) { |
| 35 | + return resolveStorageNotes(storage) |
| 36 | + .then((notes) => { |
| 37 | + return { |
| 38 | + storage, |
| 39 | + notes |
| 40 | + } |
| 41 | + }) |
| 42 | + }) |
| 43 | + .then(function deleteFolderAndNotes (data) { |
| 44 | + let { storage, notes } = data |
| 45 | + storage.folders = storage.folders |
| 46 | + .filter(function excludeTargetFolder (folder) { |
| 47 | + return folder.key !== folderKey |
| 48 | + }) |
| 49 | + |
| 50 | + let targetNotes = notes.filter(function filterTargetNotes (note) { |
| 51 | + return note.folder === folderKey |
| 52 | + }) |
| 53 | + |
| 54 | + let deleteAllNotes = targetNotes |
| 55 | + .map(function deleteNote (note) { |
| 56 | + const notePath = path.join(storage.path, 'notes', note.key + '.cson') |
| 57 | + return sander.unlink(notePath) |
| 58 | + .catch(function (err) { |
| 59 | + console.warn('Failed to delete', notePath, err) |
| 60 | + }) |
| 61 | + }) |
| 62 | + return Promise.all(deleteAllNotes) |
| 63 | + .then(() => storage) |
| 64 | + }) |
| 65 | + .then(function (storage) { |
| 66 | + CSON.writeFileSync(path.join(storage.path, 'boostnote.json'), _.pick(storage, ['folders', 'version'])) |
| 67 | + |
| 68 | + return { |
| 69 | + storage, |
| 70 | + folder: folderKey |
| 71 | + } |
| 72 | + }) |
| 73 | +} |
| 74 | + |
| 75 | +module.exports = deleteFolder |
0 commit comments