Skip to content

Commit ffe3b68

Browse files
committed
deleteFolder
1 parent ff123be commit ffe3b68

2 files changed

Lines changed: 120 additions & 0 deletions

File tree

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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

tests/dataApi/deleteFolder.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const test = require('ava')
2+
const deleteFolder = require('browser/main/lib/dataApi/deleteFolder')
3+
4+
global.document = require('jsdom').jsdom('<body></body>')
5+
global.window = document.defaultView
6+
global.navigator = window.navigator
7+
8+
const Storage = require('dom-storage')
9+
const localStorage = window.localStorage = global.localStorage = new Storage(null, { strict: true })
10+
const path = require('path')
11+
const _ = require('lodash')
12+
const TestDummy = require('../fixtures/TestDummy')
13+
const sander = require('sander')
14+
const os = require('os')
15+
const CSON = require('season')
16+
17+
const storagePath = path.join(os.tmpdir(), 'test/delete-folder')
18+
19+
test.beforeEach((t) => {
20+
t.context.storage = TestDummy.dummyStorage(storagePath)
21+
localStorage.setItem('storages', JSON.stringify([t.context.storage.cache]))
22+
})
23+
24+
test.serial('Create a folder', (t) => {
25+
const stoargeKey = t.context.storage.cache.key
26+
const folderKey = t.context.storage.json.folders[0].key
27+
28+
return Promise.resolve()
29+
.then(function doTest () {
30+
return deleteFolder(stoargeKey, folderKey)
31+
})
32+
.then(function assert (data) {
33+
t.true(_.find(data.storage.folders, {key: folderKey}) == null)
34+
let jsonData = CSON.readFileSync(path.join(data.storage.path, 'boostnote.json'))
35+
36+
t.true(_.find(jsonData.folders, {key: folderKey}) == null)
37+
let notePaths = sander.readdirSync(data.storage.path, 'notes')
38+
t.is(notePaths.length, t.context.storage.notes.filter((note) => note.folder !== folderKey).length)
39+
})
40+
})
41+
42+
test.after.always(function after () {
43+
localStorage.clear()
44+
sander.rimrafSync(storagePath)
45+
})

0 commit comments

Comments
 (0)