From c4b4e79b286afe9b326494021f75f38cae5cd31b Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 9 Nov 2023 15:18:55 -0500 Subject: [PATCH] refactor(socket.io): deprecate SocketModules.chats.getRaw in favour of api.chats.getRawMessage --- public/openapi/write.yaml | 2 ++ .../write/chats/roomId/messages/mid/raw.yaml | 35 +++++++++++++++++++ public/src/client/chats/messages.js | 2 +- src/api/chats.js | 15 ++++++++ src/controllers/write/chats.js | 4 +++ src/routes/write/chats.js | 2 ++ src/socket.io/modules.js | 19 +++++----- 7 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 public/openapi/write/chats/roomId/messages/mid/raw.yaml diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index 91a736cd0f..75f7d18e20 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -200,6 +200,8 @@ paths: $ref: 'write/chats/roomId/messages/mid.yaml' /chats/{roomId}/messages/{mid}/pin: $ref: 'write/chats/roomId/messages/mid/pin.yaml' + /chats/{roomId}/messages/{mid}/raw: + $ref: 'write/chats/roomId/messages/mid/raw.yaml' /flags/: $ref: 'write/flags.yaml' /flags/{flagId}: diff --git a/public/openapi/write/chats/roomId/messages/mid/raw.yaml b/public/openapi/write/chats/roomId/messages/mid/raw.yaml new file mode 100644 index 0000000000..3ee611672b --- /dev/null +++ b/public/openapi/write/chats/roomId/messages/mid/raw.yaml @@ -0,0 +1,35 @@ +get: + tags: + - chats + summary: get raw message content + description: This operation retrieves a message's raw markdown (or otherwise) content. + parameters: + - in: path + name: roomId + schema: + type: string + required: true + description: a valid chat room id + example: 1 + - in: path + name: mid + schema: + type: string + required: true + description: a valid chat message id + example: 1 + responses: + '200': + description: Chat message raw content retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + content: + type: string \ No newline at end of file diff --git a/public/src/client/chats/messages.js b/public/src/client/chats/messages.js index 2322ed8955..f1339c7562 100644 --- a/public/src/client/chats/messages.js +++ b/public/src/client/chats/messages.js @@ -196,7 +196,7 @@ define('forum/chats/messages', [ }; messages.prepEdit = async function (msgEl, mid, roomId) { - const raw = await socket.emit('modules.chats.getRaw', { mid: mid, roomId: roomId }); + const { content: raw } = await api.get(`/chats/${roomId}/messages/${mid}/raw`); const editEl = await app.parseAndTranslate('partials/chats/edit-message', { rawContent: raw, }); diff --git a/src/api/chats.js b/src/api/chats.js index 2ea2b26760..5afe28b38c 100644 --- a/src/api/chats.js +++ b/src/api/chats.js @@ -277,6 +277,21 @@ chatsAPI.getMessage = async (caller, { mid, roomId }) => { return messages.pop(); }; +chatsAPI.getRawMessage = async (caller, { mid, roomId }) => { + const [isAdmin, canViewMessage, inRoom] = await Promise.all([ + user.isAdministrator(caller.uid), + messaging.canViewMessage(mid, roomId, caller.uid), + messaging.isUserInRoom(caller.uid, roomId), + ]); + + if (!isAdmin && (!inRoom || !canViewMessage)) { + throw new Error('[[error:not-allowed]]'); + } + + const content = await messaging.getMessageField(mid, 'content'); + return { content }; +}; + chatsAPI.editMessage = async (caller, { mid, roomId, message }) => { await messaging.canEdit(mid, caller.uid); await messaging.editMessage(caller.uid, mid, roomId, message); diff --git a/src/controllers/write/chats.js b/src/controllers/write/chats.js index 5dd86be325..1932e32d99 100644 --- a/src/controllers/write/chats.js +++ b/src/controllers/write/chats.js @@ -124,6 +124,10 @@ Chats.messages.get = async (req, res) => { helpers.formatApiResponse(200, res, await api.chats.getMessage(req, { mid, roomId })); }; +Chats.messages.getRaw = async (req, res) => { + helpers.formatApiResponse(200, res, await api.chats.getRawMessage(req, { ...req.params })); +}; + Chats.messages.edit = async (req, res) => { const { mid, roomId } = req.params; const { message } = req.body; diff --git a/src/routes/write/chats.js b/src/routes/write/chats.js index 8bcaef83b4..336e90b043 100644 --- a/src/routes/write/chats.js +++ b/src/routes/write/chats.js @@ -32,6 +32,8 @@ module.exports = function () { setupApiRoute(router, 'post', '/:roomId/messages/:mid', [...middlewares, middleware.assert.room, middleware.assert.message], controllers.write.chats.messages.restore); setupApiRoute(router, 'delete', '/:roomId/messages/:mid', [...middlewares, middleware.assert.room, middleware.assert.message], controllers.write.chats.messages.delete); + setupApiRoute(router, 'get', '/:roomId/messages/:mid/raw', [...middlewares, middleware.assert.room], controllers.write.chats.messages.getRaw); + setupApiRoute(router, 'put', '/:roomId/messages/:mid/pin', [...middlewares, middleware.assert.room, middleware.assert.message], controllers.write.chats.messages.pin); setupApiRoute(router, 'delete', '/:roomId/messages/:mid/pin', [...middlewares, middleware.assert.room, middleware.assert.message], controllers.write.chats.messages.unpin); diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index c58c137961..cd69031340 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -11,6 +11,9 @@ const plugins = require('../plugins'); const privileges = require('../privileges'); const groups = require('../groups'); +const api = require('../api'); +const sockets = require('.'); + const SocketModules = module.exports; SocketModules.chats = {}; @@ -19,21 +22,19 @@ SocketModules.settings = {}; /* Chat */ SocketModules.chats.getRaw = async function (socket, data) { + sockets.warnDeprecated(socket, 'GET /api/v3/chats/:roomId/messages/:mid/raw'); + if (!data || !data.hasOwnProperty('mid')) { throw new Error('[[error:invalid-data]]'); } const roomId = await Messaging.getMessageField(data.mid, 'roomId'); - const [isAdmin, canViewMessage, inRoom] = await Promise.all([ - user.isAdministrator(socket.uid), - Messaging.canViewMessage(data.mid, roomId, socket.uid), - Messaging.isUserInRoom(socket.uid, roomId), - ]); - if (!isAdmin && (!inRoom || !canViewMessage)) { - throw new Error('[[error:not-allowed]]'); - } + const { content } = await api.chats.getRawMessage(socket, { + mid: data.mid, + roomId, + }); - return await Messaging.getMessageField(data.mid, 'content'); + return content; }; SocketModules.chats.isDnD = async function (socket, uid) {