diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index 75f7d18e20..385a75bb75 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -64,6 +64,10 @@ paths: $ref: 'write/users/uid/content.yaml' /users/{uid}/account: $ref: 'write/users/uid/account.yaml' + /users/{uid}/status: + $ref: 'write/users/uid/status.yaml' + /users/{uid}/status/{status}: + $ref: 'write/users/uid/status/status.yaml' /users/{uid}/settings: $ref: 'write/users/uid/settings.yaml' /users/{uid}/password: diff --git a/public/openapi/write/users/uid/status.yaml b/public/openapi/write/users/uid/status.yaml new file mode 100644 index 0000000000..6cd5bdd5fd --- /dev/null +++ b/public/openapi/write/users/uid/status.yaml @@ -0,0 +1,28 @@ +get: + tags: + - users + summary: get user status + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user whose status to check + example: 2 + responses: + '200': + description: successfully retrieved user status + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + status: + type: string + enum: ['online', 'offline', 'dnd', 'away'] \ No newline at end of file diff --git a/public/openapi/write/users/uid/status/status.yaml b/public/openapi/write/users/uid/status/status.yaml new file mode 100644 index 0000000000..fa216c6dbe --- /dev/null +++ b/public/openapi/write/users/uid/status/status.yaml @@ -0,0 +1,24 @@ +head: + tags: + - users + summary: verify user status + parameters: + - in: path + name: uid + schema: + type: integer + required: true + description: uid of the user whose status to check + example: 2 + - in: path + name: status + schema: + type: string + required: true + description: status of the user to confirm + example: 'online' + responses: + '200': + description: user status is the value in path + '404': + description: user status is not the value in path \ No newline at end of file diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index de090c7365..9802c7ae3f 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -64,11 +64,9 @@ define('chat', [ if (parseInt(touid, 10) === parseInt(app.user.uid, 10)) { return alerts.error('[[error:cant-chat-with-yourself]]'); } - socket.emit('modules.chats.isDnD', touid, function (err, isDnD) { - if (err) { - return alerts.error(err); - } - if (!isDnD) { + + api.get(`/users/${touid}/status`).then(({ status }) => { + if (status !== 'dnd') { return createChat(); } @@ -77,7 +75,7 @@ define('chat', [ createChat(); } }); - }); + }).catch(alerts.error); }; module.loadChatsDropdown = function (chatsListEl) { diff --git a/src/api/users.js b/src/api/users.js index f7c4edc2d2..d9eacb2cea 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -142,6 +142,11 @@ usersAPI.updateSettings = async function (caller, data) { return await user.saveSettings(data.uid, payload); }; +usersAPI.getStatus = async (caller, { uid }) => { + const status = await db.getObjectField(`user:${uid}`, 'status'); + return { status }; +}; + 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 6dbcb1b01e..a977a1442a 100644 --- a/src/controllers/write/users.js +++ b/src/controllers/write/users.js @@ -66,6 +66,17 @@ Users.changePicture = async (req, res) => { helpers.formatApiResponse(200, res); }; +Users.getStatus = async (req, res) => { + helpers.formatApiResponse(200, res, await api.users.getStatus(req, { ...req.params })); +}; + +Users.checkStatus = async (req, res) => { + const { uid, status } = req.params; + const { status: current } = await api.users.getStatus(req, { uid }); + + helpers.formatApiResponse(current === status ? 200 : 404, res); +}; + 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 23d8d75ddd..633fae200b 100644 --- a/src/routes/write/users.js +++ b/src/routes/write/users.js @@ -26,6 +26,9 @@ function authenticatedRoutes() { setupApiRoute(router, 'delete', '/:uid/content', [...middlewares, middleware.assert.user], controllers.write.users.deleteContent); setupApiRoute(router, 'delete', '/:uid/account', [...middlewares, middleware.assert.user], controllers.write.users.deleteAccount); + setupApiRoute(router, 'get', '/:uid/status', [], controllers.write.users.getStatus); + setupApiRoute(router, 'head', '/:uid/status/:status', [], controllers.write.users.checkStatus); + 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 cd69031340..fa4e93dbe6 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -38,7 +38,9 @@ SocketModules.chats.getRaw = async function (socket, data) { }; SocketModules.chats.isDnD = async function (socket, uid) { - const status = await db.getObjectField(`user:${uid}`, 'status'); + sockets.warnDeprecated(socket, 'GET /api/v3/users/:uid/status OR HEAD /api/v3/users/:uid/status/:status'); + + const { status } = await api.users.getStatus(socket, { uid }); return status === 'dnd'; };