notea/pages/api/trash.ts
cinwell.li 328d07b045
feat: import and export, close #5 (#43)
* feat: import and export, close #5

* fix: export untitled
2021-05-09 09:41:33 +08:00

61 lines
1.6 KiB
TypeScript

import { api, ApiRequest } from 'libs/server/connect'
import { jsonToMeta } from 'libs/server/meta'
import { useAuth } from 'libs/server/middlewares/auth'
import { useStore } from 'libs/server/middlewares/store'
import { getPathNoteById } from 'libs/server/note-path'
import { NOTE_DELETED } from 'libs/shared/meta'
import { ROOT_ID } from 'libs/shared/tree'
export default api()
.use(useAuth)
.use(useStore)
.post(async (req, res) => {
const { action, data } = req.body as {
action: 'delete' | 'restore'
data: {
id: string
parentId?: string
}
}
switch (action) {
case 'delete':
await deleteNote(req, data.id)
break
case 'restore':
await restoreNote(req, data.id, data.parentId)
break
default:
return res.APIError.NOT_SUPPORTED.throw('action not found')
}
res.status(204).end()
})
async function deleteNote(req: ApiRequest, id: string) {
const notePath = getPathNoteById(id)
await req.state.store.deleteObject(notePath)
await req.state.treeStore.deleteItem(id)
}
async function restoreNote(req: ApiRequest, id: string, parentId = ROOT_ID) {
const notePath = getPathNoteById(id)
const oldMeta = await req.state.store.getObjectMeta(notePath)
let meta = jsonToMeta({
date: new Date().toISOString(),
deleted: NOTE_DELETED.NORMAL.toString(),
})
if (oldMeta) {
meta = { ...oldMeta, ...meta }
}
await req.state.store.copyObject(notePath, notePath, {
meta,
contentType: 'text/markdown',
})
await req.state.treeStore.restoreItem(id, parentId)
}