From 401e8636bd4e9e7e589e266985b9ae985b213cc6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 17 Nov 2023 11:37:51 -0500 Subject: [PATCH] refactor(socket.io): deprecate SocketModules.chats.loadPinnedMessages in favour of api.chats.getPinnedMessages" --- public/openapi/write.yaml | 2 + .../write/chats/roomId/messages/pinned.yaml | 39 +++++++++++++++++++ public/src/client/chats/pinned-messages.js | 7 +--- src/api/chats.js | 10 +++++ src/controllers/write/chats.js | 6 +++ src/routes/write/chats.js | 1 + src/socket.io/modules.js | 12 +++--- 7 files changed, 65 insertions(+), 12 deletions(-) create mode 100644 public/openapi/write/chats/roomId/messages/pinned.yaml diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index 94b90186b3..630e541c59 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -210,6 +210,8 @@ paths: $ref: 'write/chats/roomId/owners/uid.yaml' /chats/{roomId}/messages: $ref: 'write/chats/roomId/messages.yaml' + /chats/{roomId}/messages/pinned: + $ref: 'write/chats/roomId/messages/pinned.yaml' /chats/{roomId}/messages/{mid}: $ref: 'write/chats/roomId/messages/mid.yaml' /chats/{roomId}/messages/{mid}/pin: diff --git a/public/openapi/write/chats/roomId/messages/pinned.yaml b/public/openapi/write/chats/roomId/messages/pinned.yaml new file mode 100644 index 0000000000..683b29b290 --- /dev/null +++ b/public/openapi/write/chats/roomId/messages/pinned.yaml @@ -0,0 +1,39 @@ +get: + tags: + - chats + summary: get pinned messages + description: > + This operation retrieves a list of pinned messages for a given chat room. + This call will always return a maximum of 50 items, of which the result set can be offset based on the passed-in `start` parameter. + parameters: + - in: path + name: roomId + schema: + type: number + required: true + description: a valid chat room id + example: 1 + - in: path + name: start + schema: + type: number + required: true + description: index to start returning results from + example: 0 + responses: + '200': + description: Pinned messages successfully retrieved + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + messages: + type: array + items: + $ref: ../../../../components/schemas/Chats.yaml#/MessageObject \ No newline at end of file diff --git a/public/src/client/chats/pinned-messages.js b/public/src/client/chats/pinned-messages.js index 931dcb9508..87d0dc6d0c 100644 --- a/public/src/client/chats/pinned-messages.js +++ b/public/src/client/chats/pinned-messages.js @@ -58,11 +58,8 @@ define('forum/chats/pinned-messages', ['api', 'alerts'], function (api, alerts) } async function loadData(start) { - const data = await socket.emit('modules.chats.loadPinnedMessages', { - roomId: ajaxify.data.roomId, - start: start, - }); - return data; + const { messages } = await api.get(`/chats/${ajaxify.data.roomId}/messages/pinned`, { start }); + return messages; } pinnedMessages.pin = function (mid, roomId) { diff --git a/src/api/chats.js b/src/api/chats.js index 6336aa9e2b..ec6e1d5c32 100644 --- a/src/api/chats.js +++ b/src/api/chats.js @@ -320,6 +320,16 @@ chatsAPI.listMessages = async (caller, { uid, roomId, start, direction = null }) return { messages }; }; +chatsAPI.getPinnedMessages = async (caller, { start, roomId }) => { + start = parseInt(start, 10) || 0; + const isInRoom = await messaging.isUserInRoom(caller.uid, roomId); + if (!isInRoom) { + throw new Error('[[error:no-privileges]]'); + } + const messages = await messaging.getPinnedMessages(roomId, caller.uid, start, start + 49); + return { messages }; +}; + chatsAPI.getMessage = async (caller, { mid, roomId }) => { const messages = await messaging.getMessagesData([mid], caller.uid, roomId, false); return messages.pop(); diff --git a/src/controllers/write/chats.js b/src/controllers/write/chats.js index f7602ebf7b..baf397f9de 100644 --- a/src/controllers/write/chats.js +++ b/src/controllers/write/chats.js @@ -152,6 +152,12 @@ Chats.messages.list = async (req, res) => { helpers.formatApiResponse(200, res, { messages }); }; +Chats.messages.getPinned = async (req, res) => { + const { start } = req.query; + + helpers.formatApiResponse(200, res, await api.chats.getPinnedMessages(req, { start, ...req.params })); +}; + Chats.messages.get = async (req, res) => { const { mid, roomId } = req.params; diff --git a/src/routes/write/chats.js b/src/routes/write/chats.js index 9f5c4c088e..bbd464d369 100644 --- a/src/routes/write/chats.js +++ b/src/routes/write/chats.js @@ -36,6 +36,7 @@ module.exports = function () { setupApiRoute(router, 'delete', '/:roomId/owners/:uid', [...middlewares, middleware.assert.room, middleware.assert.user], controllers.write.chats.toggleOwner); setupApiRoute(router, 'get', '/:roomId/messages', [...middlewares, middleware.assert.room], controllers.write.chats.messages.list); + setupApiRoute(router, 'get', '/:roomId/messages/pinned', [...middlewares, middleware.assert.room], controllers.write.chats.messages.getPinned); setupApiRoute(router, 'get', '/:roomId/messages/:mid', [...middlewares, middleware.assert.room, middleware.assert.message], controllers.write.chats.messages.get); setupApiRoute(router, 'put', '/:roomId/messages/:mid', [...middlewares, middleware.assert.room, middleware.assert.message], controllers.write.chats.messages.edit); setupApiRoute(router, 'post', '/:roomId/messages/:mid', [...middlewares, middleware.assert.room, middleware.assert.message], controllers.write.chats.messages.restore); diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index edbd1eeae9..a3f90fd81e 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -202,16 +202,14 @@ SocketModules.chats.searchMessages = async (socket, data) => { }; SocketModules.chats.loadPinnedMessages = async (socket, data) => { + sockets.warnDeprecated(socket, 'GET /api/v3/chats/:roomId/messages/pinned'); + if (!data || !data.roomId || !utils.isNumber(data.start)) { throw new Error('[[error:invalid-data]]'); } - const isInRoom = await Messaging.isUserInRoom(socket.uid, data.roomId); - if (!isInRoom) { - throw new Error('[[error:no-privileges]]'); - } - const start = parseInt(data.start, 10) || 0; - const pinnedMsgs = await Messaging.getPinnedMessages(data.roomId, socket.uid, start, start + 49); - return pinnedMsgs; + + const { messages } = await api.chats.getPinnedMessages(socket, data); + return messages; }; SocketModules.chats.typing = async (socket, data) => {