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