From 0d3c94e6bb6f0718b91cac3903d890d2d602afda Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 13 Nov 2023 16:10:40 -0500 Subject: [PATCH] refactor(socket.io): deprecate SocketModules.chats.hasPrivateChat in favour of api.users.getPrivateRoomId --- public/openapi/write.yaml | 2 ++ public/openapi/write/users/uid/chat.yaml | 27 ++++++++++++++++++++++++ public/src/client/account/header.js | 2 +- src/api/users.js | 10 +++++++++ src/controllers/write/users.js | 4 ++++ src/routes/write/users.js | 2 ++ src/socket.io/modules.js | 7 +++++- 7 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 public/openapi/write/users/uid/chat.yaml diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index 385a75bb75..f8c37430af 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -68,6 +68,8 @@ paths: $ref: 'write/users/uid/status.yaml' /users/{uid}/status/{status}: $ref: 'write/users/uid/status/status.yaml' + /users/{uid}/chat: + $ref: 'write/users/uid/chat.yaml' /users/{uid}/settings: $ref: 'write/users/uid/settings.yaml' /users/{uid}/password: diff --git a/public/openapi/write/users/uid/chat.yaml b/public/openapi/write/users/uid/chat.yaml new file mode 100644 index 0000000000..8b95f6ffbe --- /dev/null +++ b/public/openapi/write/users/uid/chat.yaml @@ -0,0 +1,27 @@ +get: + tags: + - users + summary: get chat room + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user to query + example: 2 + responses: + '200': + description: successfully retrieved private chat room with user + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + roomId: + type: number \ No newline at end of file diff --git a/public/src/client/account/header.js b/public/src/client/account/header.js index 338c5ac8cb..9aae8d6a8f 100644 --- a/public/src/client/account/header.js +++ b/public/src/client/account/header.js @@ -32,7 +32,7 @@ define('forum/account/header', [ components.get('account/unfollow').on('click', () => toggleFollow('unfollow')); components.get('account/chat').on('click', async function () { - const roomId = await socket.emit('modules.chats.hasPrivateChat', ajaxify.data.uid); + const { roomId } = await api.get(`/users/${ajaxify.data.uid}/chat`); const chat = await app.require('chat'); if (roomId) { chat.openChat(roomId); diff --git a/src/api/users.js b/src/api/users.js index d9eacb2cea..ea0ce2f6b2 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -11,6 +11,7 @@ const db = require('../database'); const user = require('../user'); const groups = require('../groups'); const meta = require('../meta'); +const messaging = require('../messaging'); const flags = require('../flags'); const privileges = require('../privileges'); const notifications = require('../notifications'); @@ -147,6 +148,15 @@ usersAPI.getStatus = async (caller, { uid }) => { return { status }; }; +usersAPI.getPrivateRoomId = async (caller, { uid }) => { + let roomId = await messaging.hasPrivateChat(caller.uid, uid); + roomId = parseInt(roomId, 10); + + return { + roomId: roomId > 0 ? roomId : null, + }; +}; + usersAPI.changePassword = async function (caller, data) { await user.changePassword(caller.uid, Object.assign(data, { ip: caller.ip })); await events.log({ diff --git a/src/controllers/write/users.js b/src/controllers/write/users.js index a977a1442a..715be0f48c 100644 --- a/src/controllers/write/users.js +++ b/src/controllers/write/users.js @@ -77,6 +77,10 @@ Users.checkStatus = async (req, res) => { helpers.formatApiResponse(current === status ? 200 : 404, res); }; +Users.getPrivateRoomId = async (req, res) => { + helpers.formatApiResponse(200, res, await api.users.getPrivateRoomId(req, { ...req.params })); +}; + Users.updateSettings = async (req, res) => { const settings = await api.users.updateSettings(req, { ...req.body, uid: req.params.uid }); helpers.formatApiResponse(200, res, settings); diff --git a/src/routes/write/users.js b/src/routes/write/users.js index 633fae200b..139ed483c3 100644 --- a/src/routes/write/users.js +++ b/src/routes/write/users.js @@ -29,6 +29,8 @@ function authenticatedRoutes() { setupApiRoute(router, 'get', '/:uid/status', [], controllers.write.users.getStatus); setupApiRoute(router, 'head', '/:uid/status/:status', [], controllers.write.users.checkStatus); + setupApiRoute(router, 'get', '/:uid/chat', [...middlewares], controllers.write.users.getPrivateRoomId); + setupApiRoute(router, 'put', '/:uid/settings', [...middlewares, middleware.checkRequired.bind(null, ['settings'])], controllers.write.users.updateSettings); setupApiRoute(router, 'put', '/:uid/password', [...middlewares, middleware.checkRequired.bind(null, ['newPassword']), middleware.assert.user], controllers.write.users.changePassword); diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index 705895c8b7..f1d8ff9ebe 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -71,10 +71,15 @@ SocketModules.chats.getRecentChats = async function (socket, data) { }; SocketModules.chats.hasPrivateChat = async function (socket, uid) { + sockets.warnDeprecated(socket, 'GET /api/v3/users/:uid/chat'); + if (socket.uid <= 0 || uid <= 0) { throw new Error('[[error:invalid-data]]'); } - return await Messaging.hasPrivateChat(socket.uid, uid); + + // despite the `has` prefix, this method actually did return the roomId. + const { roomId } = await api.users.getPrivateRoomId(socket, { uid }); + return roomId; }; SocketModules.chats.getIP = async function (socket, mid) {