diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index 143b7ee3d3..38d931ff9f 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -901,7 +901,7 @@ paths: delta: 1 responses: '200': - description: Topic successfully upvoted + description: Post successfully upvoted content: application/json: schema: @@ -930,6 +930,43 @@ paths: response: type: object properties: {} + /posts/{pid}/bookmark: + put: + tags: + - posts + summary: Bookmark a post + description: This operation bookmarks a post. + responses: + '200': + description: Post successfully bookmarked + content: + application/json: + schema: + type: object + properties: + status: + $ref: '#/components/schemas/Status' + response: + type: object + properties: {} + delete: + tags: + - posts + summary: Unbookmark a post + description: This operation unbookmarks a post. + responses: + '200': + description: Post successfully unbookmarked + content: + application/json: + schema: + type: object + properties: + status: + $ref: '#/components/schemas/Status' + response: + type: object + properties: {} components: schemas: Status: diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 9fb56d9735..f59871ecfa 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -336,17 +336,9 @@ define('forum/topic/postTools', [ } function bookmarkPost(button, pid) { - var method = button.attr('data-bookmarked') === 'false' ? 'posts.bookmark' : 'posts.unbookmark'; - - socket.emit(method, { - pid: pid, - room_id: 'topic_' + ajaxify.data.tid, - }, function (err) { - if (err) { - app.alertError(err.message); - } - }); + var method = button.attr('data-bookmarked') === 'false' ? 'put' : 'del'; + api[method](`/posts/${pid}/bookmark`, undefined, undefined, err => app.alertError(err.status.message)); return false; } diff --git a/src/controllers/write/posts.js b/src/controllers/write/posts.js index 0acaf5e315..07d5e9c1db 100644 --- a/src/controllers/write/posts.js +++ b/src/controllers/write/posts.js @@ -171,6 +171,24 @@ Posts.unvote = async (req, res) => { helpers.formatApiResponse(200, res); }; +Posts.bookmark = async (req, res) => { + const tid = await posts.getPostField(req.params.pid, 'tid'); + const data = { pid: req.params.pid, room_id: `topic_${tid}` }; + const socketMock = { uid: req.user.uid }; + + await socketPostHelpers.postCommand(socketMock, 'bookmark', 'bookmarked', '', data); + helpers.formatApiResponse(200, res); +}; + +Posts.unbookmark = async (req, res) => { + const tid = await posts.getPostField(req.params.pid, 'tid'); + const data = { pid: req.params.pid, room_id: `topic_${tid}` }; + const socketMock = { uid: req.user.uid }; + + await socketPostHelpers.postCommand(socketMock, 'unbookmark', 'bookmarked', '', data); + helpers.formatApiResponse(200, res); +}; + async function isMainAndLastPost(pid) { const [isMain, topicData] = await Promise.all([ posts.isMain(pid), diff --git a/src/routes/write/posts.js b/src/routes/write/posts.js index b28153881a..668e11f6dd 100644 --- a/src/routes/write/posts.js +++ b/src/routes/write/posts.js @@ -19,17 +19,8 @@ module.exports = function () { setupApiRoute(router, '/:pid/vote', middleware, [...middlewares, middleware.checkRequired.bind(null, ['delta']), middleware.assertPost], 'put', controllers.write.posts.vote); setupApiRoute(router, '/:pid/vote', middleware, [...middlewares, middleware.assertPost], 'delete', controllers.write.posts.unvote); - // app.route('/:pid/bookmark') - // .post(apiMiddleware.requireUser, function(req, res) { - // posts.bookmark(req.params.pid, req.user.uid, function (err) { - // errorHandler.handle(err, res); - // }); - // }) - // .delete(apiMiddleware.requireUser, apiMiddleware.validatePid, function (req, res) { - // posts.unbookmark(req.params.pid, req.user.uid, function (err) { - // errorHandler.handle(err, res); - // }); - // }); + setupApiRoute(router, '/:pid/bookmark', middleware, [...middlewares, middleware.assertPost], 'put', controllers.write.posts.bookmark); + setupApiRoute(router, '/:pid/bookmark', middleware, [...middlewares, middleware.assertPost], 'delete', controllers.write.posts.unbookmark); return router; }; diff --git a/src/socket.io/posts/bookmarks.js b/src/socket.io/posts/bookmarks.js index fa73ed43d6..ca049f165a 100644 --- a/src/socket.io/posts/bookmarks.js +++ b/src/socket.io/posts/bookmarks.js @@ -2,13 +2,16 @@ const helpers = require('./helpers'); +const sockets = require('..'); module.exports = function (SocketPosts) { SocketPosts.bookmark = async function (socket, data) { + sockets.warnDeprecated(socket, 'PUT /api/v1/posts/:pid/bookmark'); return await helpers.postCommand(socket, 'bookmark', 'bookmarked', '', data); }; SocketPosts.unbookmark = async function (socket, data) { + sockets.warnDeprecated(socket, 'DELETE /api/v1/posts/:pid/bookmark'); return await helpers.postCommand(socket, 'unbookmark', 'bookmarked', '', data); }; };