mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-13 09:46:22 +00:00
95 lines
3.0 KiB
JavaScript
95 lines
3.0 KiB
JavaScript
const path = require('path')
|
|
const sander = require('sander')
|
|
const keygen = require('browser/lib/keygen')
|
|
const _ = require('lodash')
|
|
const CSON = require('@rokt33r/season')
|
|
|
|
function migrateFromV5Storage(storagePath) {
|
|
var boostnoteJSONPath = path.join(storagePath, 'boostnote.json')
|
|
return Promise.resolve()
|
|
.then(function readBoostnoteJSON() {
|
|
return sander.readFile(boostnoteJSONPath, {
|
|
encoding: 'utf-8'
|
|
})
|
|
})
|
|
.then(function verifyVersion(rawData) {
|
|
var boostnoteJSONData = JSON.parse(rawData)
|
|
if (boostnoteJSONData.version === '1.0')
|
|
throw new Error('Target storage seems to be transformed already.')
|
|
if (!_.isArray(boostnoteJSONData.folders))
|
|
throw new Error('the value of folders is not an array.')
|
|
|
|
return boostnoteJSONData
|
|
})
|
|
.then(function setVersion(boostnoteJSONData) {
|
|
boostnoteJSONData.version = '1.0'
|
|
return sander
|
|
.writeFile(boostnoteJSONPath, JSON.stringify(boostnoteJSONData))
|
|
.then(() => boostnoteJSONData)
|
|
})
|
|
.then(function fetchNotes(boostnoteJSONData) {
|
|
var fetchNotesFromEachFolder = boostnoteJSONData.folders.map(function(
|
|
folder
|
|
) {
|
|
const folderDataJSONPath = path.join(
|
|
storagePath,
|
|
folder.key,
|
|
'data.json'
|
|
)
|
|
return sander
|
|
.readFile(folderDataJSONPath, {
|
|
encoding: 'utf-8'
|
|
})
|
|
.then(function(rawData) {
|
|
var data = JSON.parse(rawData)
|
|
if (!_.isArray(data.notes))
|
|
throw new Error('value of notes is not an array.')
|
|
return data.notes.map(function setFolderToNote(note) {
|
|
note.folder = folder.key
|
|
return note
|
|
})
|
|
})
|
|
.catch(function failedToReadDataJSON(err) {
|
|
console.warn('Failed to fetch notes from ', folderDataJSONPath, err)
|
|
return []
|
|
})
|
|
})
|
|
|
|
return Promise.all(fetchNotesFromEachFolder)
|
|
.then(function flatten(folderNotes) {
|
|
return folderNotes.reduce(function concatNotes(sum, notes) {
|
|
return sum.concat(notes)
|
|
}, [])
|
|
})
|
|
.then(function saveNotes(notes) {
|
|
notes.forEach(function renewKey(note) {
|
|
var newKey = keygen()
|
|
while (notes.some(_note => _note.key === newKey)) {
|
|
newKey = keygen()
|
|
}
|
|
note.key = newKey
|
|
})
|
|
|
|
const noteDirPath = path.join(storagePath, 'notes')
|
|
notes.map(function saveNote(note) {
|
|
CSON.writeFileSync(path.join(noteDirPath, note.key) + '.cson', note)
|
|
})
|
|
return true
|
|
})
|
|
.then(function deleteFolderDir(check) {
|
|
if (check) {
|
|
boostnoteJSONData.folders.forEach(folder => {
|
|
sander.rimrafSync(path.join(storagePath, folder.key))
|
|
})
|
|
}
|
|
return check
|
|
})
|
|
})
|
|
.catch(function handleError(err) {
|
|
console.warn(err)
|
|
return false
|
|
})
|
|
}
|
|
|
|
module.exports = migrateFromV5Storage
|