mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-13 01:36:22 +00:00
140 lines
4.0 KiB
JavaScript
140 lines
4.0 KiB
JavaScript
const resolveStorageData = require('./resolveStorageData')
|
|
const _ = require('lodash')
|
|
const path = require('path')
|
|
const CSON = require('@rokt33r/season')
|
|
const { findStorage } = require('browser/lib/findStorage')
|
|
|
|
function validateInput (input) {
|
|
const validatedInput = {}
|
|
|
|
if (input.tags != null) {
|
|
if (!_.isArray(input.tags)) validatedInput.tags = []
|
|
validatedInput.tags = input.tags
|
|
.filter((tag) => _.isString(tag) && tag.trim().length > 0)
|
|
}
|
|
|
|
if (input.title != null) {
|
|
if (!_.isString(input.title)) validatedInput.title = ''
|
|
else validatedInput.title = input.title
|
|
}
|
|
|
|
if (input.isStarred != null) {
|
|
validatedInput.isStarred = !!input.isStarred
|
|
}
|
|
|
|
if (input.isTrashed != null) {
|
|
validatedInput.isTrashed = !!input.isTrashed
|
|
}
|
|
|
|
if (input.isPinned !== undefined) {
|
|
validatedInput.isPinned = !!input.isPinned
|
|
}
|
|
|
|
if (!_.isNil(input.blog)) {
|
|
validatedInput.blog = input.blog
|
|
}
|
|
validatedInput.type = input.type
|
|
switch (input.type) {
|
|
case 'MARKDOWN_NOTE':
|
|
if (input.content != null) {
|
|
if (!_.isString(input.content)) validatedInput.content = ''
|
|
else validatedInput.content = input.content
|
|
|
|
if (!_.isArray(input.linesHighlighted)) validatedInput.linesHighlighted = []
|
|
else validatedInput.linesHighlighted = input.linesHighlighted
|
|
}
|
|
return validatedInput
|
|
case 'SNIPPET_NOTE':
|
|
if (input.description != null) {
|
|
if (!_.isString(input.description)) validatedInput.description = ''
|
|
else validatedInput.description = input.description
|
|
}
|
|
if (input.snippets != null) {
|
|
if (!_.isArray(input.snippets)) {
|
|
validatedInput.snippets = [{
|
|
name: '',
|
|
mode: 'text',
|
|
content: '',
|
|
linesHighlighted: []
|
|
}]
|
|
} else {
|
|
validatedInput.snippets = input.snippets
|
|
}
|
|
validatedInput.snippets
|
|
.filter((snippet) => {
|
|
if (!_.isString(snippet.name)) return false
|
|
if (!_.isString(snippet.mode)) return false
|
|
if (!_.isString(snippet.content)) return false
|
|
return true
|
|
})
|
|
}
|
|
return validatedInput
|
|
default:
|
|
throw new Error('Invalid type: only MARKDOWN_NOTE and SNIPPET_NOTE are available.')
|
|
}
|
|
}
|
|
|
|
function updateNote (storageKey, noteKey, input) {
|
|
let targetStorage
|
|
try {
|
|
if (input == null) throw new Error('No input found.')
|
|
input = validateInput(input)
|
|
|
|
targetStorage = findStorage(storageKey)
|
|
} catch (e) {
|
|
return Promise.reject(e)
|
|
}
|
|
|
|
return resolveStorageData(targetStorage)
|
|
.then(function saveNote (storage) {
|
|
let noteData
|
|
const notePath = path.join(storage.path, 'notes', noteKey + '.cson')
|
|
try {
|
|
noteData = CSON.readFileSync(notePath)
|
|
} catch (err) {
|
|
console.warn('Failed to find note cson', err)
|
|
noteData = input.type === 'SNIPPET_NOTE'
|
|
? {
|
|
type: 'SNIPPET_NOTE',
|
|
description: [],
|
|
snippets: [{
|
|
name: '',
|
|
mode: 'text',
|
|
content: '',
|
|
linesHighlighted: []
|
|
}]
|
|
}
|
|
: {
|
|
type: 'MARKDOWN_NOTE',
|
|
content: '',
|
|
linesHighlighted: []
|
|
}
|
|
noteData.title = ''
|
|
if (storage.folders.length === 0) throw new Error('Failed to restore note: No folder exists.')
|
|
noteData.folder = storage.folders[0].key
|
|
noteData.createdAt = new Date()
|
|
noteData.updatedAt = new Date()
|
|
noteData.isStarred = false
|
|
noteData.isTrashed = false
|
|
noteData.tags = []
|
|
noteData.isPinned = false
|
|
}
|
|
|
|
if (noteData.type === 'SNIPPET_NOTE') {
|
|
noteData.title
|
|
}
|
|
|
|
Object.assign(noteData, input, {
|
|
key: noteKey,
|
|
updatedAt: new Date(),
|
|
storage: storageKey
|
|
})
|
|
|
|
CSON.writeFileSync(path.join(storage.path, 'notes', noteKey + '.cson'), _.omit(noteData, ['key', 'storage']))
|
|
|
|
return noteData
|
|
})
|
|
}
|
|
|
|
module.exports = updateNote
|