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

111 lines
3.2 KiB
JavaScript

const resolveStorageData = require('./resolveStorageData')
const _ = require('lodash')
const path = require('path')
const CSON = require('@rokt33r/season')
const keygen = require('browser/lib/keygen')
const sander = require('sander')
const { findStorage } = require('browser/lib/findStorage')
const attachmentManagement = require('./attachmentManagement')
function moveNote(storageKey, noteKey, newStorageKey, newFolderKey) {
let oldStorage, newStorage
try {
oldStorage = findStorage(storageKey)
newStorage = findStorage(newStorageKey)
if (newStorage == null) throw new Error("Target storage doesn't exist.")
} catch (e) {
return Promise.reject(e)
}
return resolveStorageData(oldStorage).then(function saveNote(_oldStorage) {
oldStorage = _oldStorage
let noteData
const notePath = path.join(oldStorage.path, 'notes', noteKey + '.cson')
try {
noteData = CSON.readFileSync(notePath)
} catch (err) {
console.warn('Failed to find note cson', err)
throw err
}
let newNoteKey
return Promise.resolve()
.then(function resolveNewStorage() {
if (storageKey === newStorageKey) {
newNoteKey = noteKey
return oldStorage
}
return resolveStorageData(newStorage).then(function findNewNoteKey(
_newStorage
) {
newStorage = _newStorage
newNoteKey = keygen(true)
let isUnique = false
while (!isUnique) {
try {
sander.statSync(
path.join(newStorage.path, 'notes', newNoteKey + '.cson')
)
newNoteKey = keygen(true)
} catch (err) {
if (err.code === 'ENOENT') {
isUnique = true
} else {
throw err
}
}
}
return newStorage
})
})
.then(function checkFolderExistsAndPrepareNoteData(newStorage) {
if (_.find(newStorage.folders, { key: newFolderKey }) == null)
throw new Error("Target folder doesn't exist.")
noteData.folder = newFolderKey
noteData.key = newNoteKey
noteData.storage = newStorageKey
noteData.updatedAt = new Date()
noteData.oldContent = noteData.content
return noteData
})
.then(function moveAttachments(noteData) {
if (oldStorage.path === newStorage.path) {
return noteData
}
noteData.content = attachmentManagement.moveAttachments(
oldStorage.path,
newStorage.path,
noteKey,
newNoteKey,
noteData.content
)
return noteData
})
.then(function writeAndReturn(noteData) {
CSON.writeFileSync(
path.join(newStorage.path, 'notes', noteData.key + '.cson'),
_.omit(noteData, ['key', 'storage', 'oldContent'])
)
return noteData
})
.then(function deleteOldNote(data) {
if (storageKey !== newStorageKey) {
try {
sander.unlinkSync(
path.join(oldStorage.path, 'notes', noteKey + '.cson')
)
} catch (err) {
console.warn(err)
}
}
return data
})
})
}
module.exports = moveNote