1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-12 17:26:17 +00:00
Files
Boostnote/browser/main/lib/dataApi/migrateFromV5Storage.js

122 lines
3.3 KiB
JavaScript

const _ = require('lodash')
const keygen = require('browser/lib/keygen')
const resolveStorageData = require('./resolveStorageData')
const consts = require('browser/lib/consts')
const CSON = require('@rokt33r/season')
const path = require('path')
const sander = require('sander')
function migrateFromV5Storage(storageKey, data) {
let targetStorage
try {
const 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) {
const oldArticles = data.articles
const notes = []
data.folders.forEach(function(oldFolder) {
let folderKey = keygen()
while (storage.folders.some(folder => folder.key === folderKey)) {
folderKey = keygen()
}
const newFolder = {
key: folderKey,
name: oldFolder.name,
color: consts.FOLDER_COLORS[Math.floor(Math.random() * 7) % 7]
}
storage.folders.push(newFolder)
const 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') {
const 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,
linesHighlighted: article.linesHighlighted
}
notes.push(newNote)
} else {
const 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,
linesHighlighted: article.linesHighlighted
}
]
}
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