From 357c4a382d868f84bb46ca7af69586de73069b98 Mon Sep 17 00:00:00 2001 From: Dick Choi Date: Mon, 29 Aug 2016 10:05:56 +0900 Subject: [PATCH] migrateFromV5Storage --- .../main/lib/dataApi/migrateFromV5Storage.js | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 browser/main/lib/dataApi/migrateFromV5Storage.js diff --git a/browser/main/lib/dataApi/migrateFromV5Storage.js b/browser/main/lib/dataApi/migrateFromV5Storage.js new file mode 100644 index 00000000..d13a5e28 --- /dev/null +++ b/browser/main/lib/dataApi/migrateFromV5Storage.js @@ -0,0 +1,110 @@ +const _ = require('lodash') +const keygen = require('browser/lib/keygen') +const resolveStorageData = require('./resolveStorageData') +const consts = require('browser/lib/consts') +const CSON = require('season') +const path = require('path') +const sander = require('sander') + +function migrateFromV5Storage (storageKey, data) { + let targetStorage + try { + let cachedStorageList = JSON.parse(localStorage.getItem('storages')) + if (!_.isArray(cachedStorageList)) throw new Error('Target storage doesn\'t exist.') + + targetStorage = _.find(cachedStorageList, {key: storageKey}) + if (targetStorage == null) throw new Error('Target storage doesn\'t exist.') + } catch (e) { + return Promise.reject(e) + } + return resolveStorageData(targetStorage) + .then(function (storage) { + return importAll(storage, data) + }) +} + +function importAll (storage, data) { + let oldArticles = data.articles + let notes = [] + data.folders + .forEach(function (oldFolder) { + let folderKey = keygen() + while (storage.folders.some((folder) => folder.key === folderKey)) { + folderKey = keygen() + } + let newFolder = { + key: folderKey, + name: oldFolder.name, + color: consts.FOLDER_COLORS[Math.floor(Math.random() * 7) % 7] + } + + storage.folders.push(newFolder) + + let articles = oldArticles.filter((article) => article.FolderKey === oldFolder.key) + articles.forEach((article) => { + let noteKey = keygen() + let isUnique = false + while (!isUnique) { + try { + sander.statSync(path.join(storage.path, 'notes', noteKey + '.cson')) + noteKey = keygen() + } catch (err) { + if (err.code === 'ENOENT') { + isUnique = true + } else { + console.error('Failed to read `notes` directory.') + throw err + } + } + } + + if (article.mode === 'markdown') { + let newNote = { + tags: article.tags, + createdAt: article.createdAt, + updatedAt: article.updatedAt, + folder: folderKey, + storage: storage.key, + type: 'MARKDOWN_NOTE', + isStarred: false, + title: article.title, + content: '# ' + article.title + '\n\n' + article.content, + key: noteKey + } + notes.push(newNote) + } else { + let newNote = { + tags: article.tags, + createdAt: article.createdAt, + updatedAt: article.updatedAt, + folder: folderKey, + storage: storage.key, + type: 'SNIPPET_NOTE', + isStarred: false, + title: article.title, + description: article.title, + key: noteKey, + snippets: [{ + name: article.mode, + mode: article.mode, + content: article.content + }] + } + notes.push(newNote) + } + }) + }) + + notes.forEach(function (note) { + CSON.writeFileSync(path.join(storage.path, 'notes', note.key + '.cson'), _.omit(note, ['storage', 'key'])) + }) + + CSON.writeFileSync(path.join(storage.path, 'boostnote.json'), _.pick(storage, ['version', 'folders'])) + + return { + storage, + notes + } +} + +module.exports = migrateFromV5Storage