From 960e925e40fea3f599857de5e12c80e58df5422f Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 15 Oct 2020 17:09:39 -0400 Subject: [PATCH] refactor: change password/user follow to use api lib --- src/api/users.js | 43 ++++++++++++++++++++++++++++++++++ src/controllers/write/users.js | 39 +++--------------------------- src/socket.io/user.js | 37 +++-------------------------- src/socket.io/user/profile.js | 16 +------------ 4 files changed, 50 insertions(+), 85 deletions(-) diff --git a/src/api/users.js b/src/api/users.js index 054f59ef3584..aeea9c820305 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -5,6 +5,8 @@ const groups = require('../groups'); const meta = require('../meta'); const flags = require('../flags'); const privileges = require('../privileges'); +const notifications = require('../notifications'); +const plugins = require('../plugins'); const events = require('../events'); const usersAPI = module.exports; @@ -74,6 +76,47 @@ usersAPI.deleteMany = async function (caller, data) { } }; +usersAPI.changePassword = async function (caller, data) { + await user.changePassword(caller.uid, Object.assign(data, { ip: caller.ip })); + await events.log({ + type: 'password-change', + uid: caller.uid, + targetUid: data.uid, + ip: caller.ip, + }); +}; + +usersAPI.follow = async function (caller, data) { + await user.follow(caller.uid, data.uid); + plugins.fireHook('action:user.follow', { + fromUid: caller.uid, + toUid: data.uid, + }); + + const userData = await user.getUserFields(caller.uid, ['username', 'userslug']); + const notifObj = await notifications.create({ + type: 'follow', + bodyShort: '[[notifications:user_started_following_you, ' + userData.username + ']]', + nid: 'follow:' + data.uid + ':uid:' + caller.uid, + from: caller.uid, + path: '/uid/' + data.uid + '/followers', + mergeId: 'notifications:user_started_following_you', + }); + if (!notifObj) { + return; + } + notifObj.user = userData; + await notifications.push(notifObj, [data.uid]); +}; + +usersAPI.unfollow = async function (caller, data) { + await user.unfollow(caller.uid, data.uid); + plugins.fireHook('action:user.unfollow', { + fromUid: caller.uid, + toUid: data.uid, + }); +}; + async function processDeletion(uid, caller) { const isTargetAdmin = await user.isAdministrator(uid); const isSelf = parseInt(uid, 10) === caller.uid; diff --git a/src/controllers/write/users.js b/src/controllers/write/users.js index 35306472c340..c74b82349787 100644 --- a/src/controllers/write/users.js +++ b/src/controllers/write/users.js @@ -4,7 +4,6 @@ const api = require('../../api'); const user = require('../../user'); const plugins = require('../../plugins'); const privileges = require('../../privileges'); -const notifications = require('../../notifications'); const flags = require('../../flags'); const meta = require('../../meta'); const events = require('../../events'); @@ -38,49 +37,17 @@ Users.deleteMany = async (req, res) => { }; Users.changePassword = async (req, res) => { - req.body.uid = req.params.uid; - await user.changePassword(req.user.uid, Object.assign(req.body, { ip: req.ip })); - await events.log({ - type: 'password-change', - uid: req.user.uid, - targetUid: req.params.uid, - ip: req.ip, - }); - + await api.users.changePassword(req, { ...req.body, uid: req.params.uid }); helpers.formatApiResponse(200, res); }; Users.follow = async (req, res) => { - await user.follow(req.user.uid, req.params.uid); - plugins.fireHook('action:user.follow', { - fromUid: req.user.uid, - toUid: req.params.uid, - }); - - const userData = await user.getUserFields(req.user.uid, ['username', 'userslug']); - const notifObj = await notifications.create({ - type: 'follow', - bodyShort: '[[notifications:user_started_following_you, ' + userData.username + ']]', - nid: 'follow:' + req.params.uid + ':uid:' + req.user.uid, - from: req.user.uid, - path: '/uid/' + req.params.uid + '/followers', - mergeId: 'notifications:user_started_following_you', - }); - if (!notifObj) { - return; - } - notifObj.user = userData; - await notifications.push(notifObj, [req.params.uid]); - + await api.users.follow(req, req.params); helpers.formatApiResponse(200, res); }; Users.unfollow = async (req, res) => { - await user.unfollow(req.user.uid, req.params.uid); - plugins.fireHook('action:user.unfollow', { - fromUid: req.user.uid, - toUid: req.params.uid, - }); + await api.users.unfollow(req, req.params); helpers.formatApiResponse(200, res); }; diff --git a/src/socket.io/user.js b/src/socket.io/user.js index 721d8694674f..9080e342569a 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -5,9 +5,9 @@ const async = require('async'); const util = require('util'); const sleep = util.promisify(setTimeout); +const api = require('../api'); const user = require('../user'); const topics = require('../topics'); -const notifications = require('../notifications'); const messaging = require('../messaging'); const plugins = require('../plugins'); const meta = require('../meta'); @@ -159,45 +159,14 @@ SocketUser.isFollowing = async function (socket, data) { SocketUser.follow = async function (socket, data) { sockets.warnDeprecated(socket, 'POST /api/v3/users/follow'); - - if (!socket.uid || !data) { - throw new Error('[[error:invalid-data]]'); - } - - await toggleFollow('follow', socket.uid, data.uid); - const userData = await user.getUserFields(socket.uid, ['username', 'userslug']); - const notifObj = await notifications.create({ - type: 'follow', - bodyShort: '[[notifications:user_started_following_you, ' + userData.username + ']]', - nid: 'follow:' + data.uid + ':uid:' + socket.uid, - from: socket.uid, - path: '/uid/' + data.uid + '/followers', - mergeId: 'notifications:user_started_following_you', - }); - if (!notifObj) { - return; - } - notifObj.user = userData; - await notifications.push(notifObj, [data.uid]); + await api.users.follow(socket, data); }; SocketUser.unfollow = async function (socket, data) { sockets.warnDeprecated(socket, 'DELETE /api/v3/users/unfollow'); - - if (!socket.uid || !data) { - throw new Error('[[error:invalid-data]]'); - } - await toggleFollow('unfollow', socket.uid, data.uid); + await api.users.unfollow(socket, data); }; -async function toggleFollow(method, uid, theiruid) { - await user[method](uid, theiruid); - plugins.fireHook('action:user.' + method, { - fromUid: uid, - toUid: theiruid, - }); -} - SocketUser.saveSettings = async function (socket, data) { if (!socket.uid || !data || !data.settings) { throw new Error('[[error:invalid-data]]'); diff --git a/src/socket.io/user/profile.js b/src/socket.io/user/profile.js index 0345faf21518..463d509e71e9 100644 --- a/src/socket.io/user/profile.js +++ b/src/socket.io/user/profile.js @@ -78,21 +78,7 @@ module.exports = function (SocketUser) { SocketUser.changePassword = async function (socket, data) { sockets.warnDeprecated(socket, 'PUT /api/v3/users/:uid/password'); - - if (!socket.uid) { - throw new Error('[[error:invalid-uid]]'); - } - - if (!data || !data.uid) { - throw new Error('[[error:invalid-data]]'); - } - await user.changePassword(socket.uid, Object.assign(data, { ip: socket.ip })); - await events.log({ - type: 'password-change', - uid: socket.uid, - targetUid: data.uid, - ip: socket.ip, - }); + await api.users.changePassword(socket, data); }; SocketUser.updateProfile = async function (socket, data) {