Skip to content

Commit 24de5a5

Browse files
authored
Merge pull request #1559 from hackmdio/feature/update-delete-note-api
Update and delete note api
2 parents 04c22c7 + ab0ac83 commit 24de5a5

File tree

4 files changed

+174
-69
lines changed

4 files changed

+174
-69
lines changed

lib/note/index.js

Lines changed: 102 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22

33
const config = require('../config')
44
const logger = require('../logger')
5-
const { Note, User } = require('../models')
5+
const { Note, User, Revision } = require('../models')
66

77
const { newCheckViewPermission, errorForbidden, responseCodiMD, errorNotFound, errorInternalError } = require('../response')
8-
const { updateHistory } = require('../history')
8+
const { updateHistory, historyDelete } = require('../history')
99
const { actionPublish, actionSlide, actionInfo, actionDownload, actionPDF, actionGist, actionRevision, actionPandoc } = require('./noteActions')
10+
const realtime = require('../realtime/realtime')
1011

1112
async function getNoteById (noteId, { includeUser } = { includeUser: false }) {
1213
const id = await Note.parseNoteIdAsync(noteId)
@@ -232,7 +233,106 @@ function listMyNotes (req, res) {
232233
}
233234
}
234235

236+
const deleteNote = async (req, res) => {
237+
if (req.isAuthenticated()) {
238+
const noteId = await Note.parseNoteIdAsync(req.params.noteId)
239+
try {
240+
const destroyed = await Note.destroy({
241+
where: {
242+
id: noteId,
243+
ownerId: req.user.id
244+
}
245+
})
246+
if (!destroyed) {
247+
logger.error('Delete note failed: Make sure the noteId and ownerId are correct.')
248+
return errorNotFound(req, res)
249+
}
250+
251+
historyDelete(req, res)
252+
253+
if (realtime.isNoteExistsInPool(noteId)) {
254+
const note = realtime.getNoteFromNotePool(noteId)
255+
realtime.disconnectSocketOnNote(note)
256+
}
257+
258+
res.send({
259+
status: 'ok'
260+
})
261+
} catch (err) {
262+
logger.error('Delete note failed: Internal Error.')
263+
return errorInternalError(req, res)
264+
}
265+
} else {
266+
return errorForbidden(req, res)
267+
}
268+
}
269+
270+
const updateNote = async (req, res) => {
271+
if (req.isAuthenticated()) {
272+
const noteId = await Note.parseNoteIdAsync(req.params.noteId)
273+
try {
274+
const note = await Note.findOne({
275+
where: {
276+
id: noteId
277+
}
278+
})
279+
if (!note) {
280+
logger.error('Update note failed: Can\'t find the note.')
281+
return errorNotFound(req, res)
282+
}
283+
284+
if (realtime.isNoteExistsInPool(noteId)) {
285+
logger.error('Update note failed: There are online users opening this note.')
286+
return res.status('403').json({ status: 'error', message: 'Update API can only be used when no users is online' })
287+
}
288+
289+
const now = Date.now()
290+
const content = req.body.content
291+
const updated = await note.update({
292+
title: Note.parseNoteTitle(content),
293+
content: content,
294+
lastchangeAt: now,
295+
authorship: [
296+
[
297+
req.user.id,
298+
0,
299+
content.length,
300+
now,
301+
now
302+
]
303+
]
304+
})
305+
306+
if (!updated) {
307+
logger.error('Update note failed: Write note content error.')
308+
return errorInternalError(req, res)
309+
}
310+
311+
updateHistory(req.user.id, note.id, content)
312+
313+
Revision.saveNoteRevision(note, (err, revision) => {
314+
if (err) {
315+
logger.error(err)
316+
return errorInternalError(req, res)
317+
}
318+
if (!revision) return errorNotFound(req, res)
319+
res.send({
320+
status: 'ok'
321+
})
322+
})
323+
} catch (err) {
324+
logger.error(err)
325+
logger.error('Update note failed: Internal Error.')
326+
return errorInternalError(req, res)
327+
}
328+
} else {
329+
return errorForbidden(req, res)
330+
}
331+
}
332+
235333
exports.showNote = showNote
236334
exports.showPublishNote = showPublishNote
237335
exports.noteActions = noteActions
238336
exports.listMyNotes = listMyNotes
337+
exports.deleteNote = deleteNote
338+
exports.updateNote = updateNote

lib/routes.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const historyController = require('./history')
1212
const userController = require('./user')
1313
const noteController = require('./note')
1414
const response = require('./response')
15+
const bodyParser = require('body-parser')
1516
const appRouter = Router()
1617

1718
// register route
@@ -72,6 +73,10 @@ appRouter.get('/p/:shortid', response.showPublishSlide)
7273
appRouter.get('/p/:shortid/:action', response.publishSlideActions)
7374
// gey my note list
7475
appRouter.get('/api/notes/myNotes', noteController.listMyNotes)
76+
// delete note by id
77+
appRouter.delete('/api/notes/:noteId', noteController.deleteNote)
78+
// update note content by id
79+
appRouter.put('/api/notes/:noteId', bodyParser.json(), noteController.updateNote)
7580
// get note by id
7681
appRouter.get('/:noteId', wrap(noteController.showNote))
7782
// note actions

0 commit comments

Comments
 (0)