From 3bb5d2aa868dcd6d4849d3582ffa354659ec1bf0 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Fri, 25 Sep 2015 01:52:41 -0400 Subject: [PATCH] accounts refactor part #1 --- src/controllers/accounts.js | 192 +--------------------------- src/controllers/accounts/edit.js | 38 ++++++ src/controllers/accounts/helpers.js | 108 ++++++++++++++++ src/controllers/accounts/profile.js | 89 +++++++++++++ src/routes/accounts.js | 24 ++++ src/routes/index.js | 22 +--- 6 files changed, 267 insertions(+), 206 deletions(-) create mode 100644 src/controllers/accounts/edit.js create mode 100644 src/controllers/accounts/helpers.js create mode 100644 src/controllers/accounts/profile.js create mode 100644 src/routes/accounts.js diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 1d322451f8..9dd7ffe902 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -1,6 +1,6 @@ "use strict"; -var accountsController = {}; + var fs = require('fs'), nconf = require('nconf'), @@ -21,97 +21,12 @@ var fs = require('fs'), helpers = require('./helpers'); -function getUserDataByUserSlug(userslug, callerUID, callback) { - user.getUidByUserslug(userslug, function(err, uid) { - if (err) { - return callback(err); - } - - if (!uid) { - return callback(null, null); - } - - async.parallel({ - userData : function(next) { - user.getUserData(uid, next); - }, - userSettings : function(next) { - user.getSettings(uid, next); - }, - isAdmin : function(next) { - user.isAdministrator(callerUID, next); - }, - ips: function(next) { - user.getIPs(uid, 4, next); - }, - profile_links: function(next) { - plugins.fireHook('filter:user.profileLinks', [], next); - }, - groups: function(next) { - groups.getUserGroups([uid], next); - }, - sso: async.apply(plugins.fireHook, 'filter:auth.list', { - uid: uid, - associations: [] - }) - }, function(err, results) { - if (err || !results.userData) { - return callback(err || new Error('[[error:invalid-uid]]')); - } - - var userData = results.userData; - var userSettings = results.userSettings; - var isAdmin = results.isAdmin; - var self = parseInt(callerUID, 10) === parseInt(userData.uid, 10); - - userData.joindate = utils.toISOString(userData.joindate); - userData.lastonline = userData.lastonline ? utils.toISOString(userData.lastonline) : userData.joindate; - userData.age = userData.birthday ? Math.floor((new Date().getTime() - new Date(userData.birthday).getTime()) / 31536000000) : ''; - if (!(isAdmin || self || (userData.email && userSettings.showemail))) { - userData.email = ''; - } - - userData.emailClass = (self && !userSettings.showemail) ? '' : 'hide'; - - if (!self && !userSettings.showfullname) { - userData.fullname = ''; - } - - if (isAdmin || self) { - userData.ips = results.ips; - } +var accountsController = { + profile: require('./accounts/profile'), + edit: require('./accounts/edit') +}; - userData.uid = userData.uid; - userData.yourid = callerUID; - userData.theirid = userData.uid; - userData.isAdmin = isAdmin; - userData.isSelf = self; - userData.showHidden = self || isAdmin; - userData.groups = Array.isArray(results.groups) && results.groups.length ? results.groups[0] : []; - userData.disableSignatures = meta.config.disableSignatures !== undefined && parseInt(meta.config.disableSignatures, 10) === 1; - userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10); - userData.profile_links = results.profile_links; - userData.sso = results.sso.associations; - userData.status = require('../socket.io').isUserOnline(userData.uid) ? (userData.status || 'online') : 'offline'; - userData.banned = parseInt(userData.banned, 10) === 1; - userData.website = validator.escape(userData.website); - userData.websiteLink = !userData.website.startsWith('http') ? 'http://' + userData.website : userData.website; - userData.websiteName = userData.website.replace(validator.escape('http://'), '').replace(validator.escape('https://'), ''); - userData.followingCount = parseInt(userData.followingCount, 10) || 0; - userData.followerCount = parseInt(userData.followerCount, 10) || 0; - - userData.username = validator.escape(userData.username); - userData.email = validator.escape(userData.email); - userData.fullname = validator.escape(userData.fullname); - userData.location = validator.escape(userData.location); - userData.signature = validator.escape(userData.signature); - userData.aboutme = validator.escape(userData.aboutme || ''); - - callback(null, userData); - }); - }); -} accountsController.getUserByUID = function(req, res, next) { var uid = req.params.uid ? req.params.uid : 0; @@ -131,74 +46,6 @@ accountsController.getUserByUID = function(req, res, next) { }); }; -accountsController.getAccount = function(req, res, next) { - var lowercaseSlug = req.params.userslug.toLowerCase(); - - if (req.params.userslug !== lowercaseSlug) { - if (res.locals.isAPI) { - req.params.userslug = lowercaseSlug; - } else { - return res.redirect(nconf.get('relative_path') + '/user/' + lowercaseSlug); - } - } - - getUserDataByUserSlug(req.params.userslug, req.uid, function (err, userData) { - if (err || !userData) { - return next(err); - } - - if (req.uid !== parseInt(userData.uid, 10)) { - user.incrementUserFieldBy(userData.uid, 'profileviews', 1); - } - - async.parallel({ - isFollowing: function(next) { - user.isFollowing(req.uid, userData.theirid, next); - }, - posts: function(next) { - posts.getPostSummariesFromSet('uid:' + userData.theirid + ':posts', req.uid, 0, 9, next); - }, - signature: function(next) { - posts.parseSignature(userData, req.uid, next); - }, - aboutme: function(next) { - if (userData.aboutme) { - plugins.fireHook('filter:parse.raw', userData.aboutme, next); - } else { - next(); - } - } - }, function(err, results) { - if(err) { - return next(err); - } - - if (parseInt(meta.config['reputation:disabled'], 10) === 1) { - delete userData.reputation; - } - - userData.posts = results.posts.posts.filter(function (p) { - return p && parseInt(p.deleted, 10) !== 1; - }); - - userData.aboutme = results.aboutme; - userData.nextStart = results.posts.nextStart; - userData.isFollowing = results.isFollowing; - userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username}]); - userData.title = userData.username; - if (!userData.profileviews) { - userData.profileviews = 1; - } - - plugins.fireHook('filter:user.account', {userData: userData, uid: req.uid}, function(err, data) { - if (err) { - return next(err); - } - res.render('account/profile', data.userData); - }); - }); - }); -}; accountsController.getFollowing = function(req, res, next) { getFollow('account/following', 'following', req, res, next); @@ -213,7 +60,7 @@ function getFollow(tpl, name, req, res, callback) { async.waterfall([ function(next) { - getUserDataByUserSlug(req.params.userslug, req.uid, next); + accountsController.getBaseUser(req.params.userslug, req.uid, next); }, function(data, next) { userData = data; @@ -379,33 +226,6 @@ accountsController.getBaseUser = function(userslug, callerUID, callback) { }); }; -accountsController.accountEdit = function(req, res, callback) { - var userData; - async.waterfall([ - function(next) { - getUserDataByUserSlug(req.params.userslug, req.uid, next); - }, - function(data, next) { - userData = data; - if (!userData) { - return callback(); - } - db.getObjectField('user:' + userData.uid, 'password', next); - } - ], function(err, password) { - if (err) { - return callback(err); - } - - userData['username:disableEdit'] = parseInt(meta.config['username:disableEdit'], 10) === 1; - - userData.hasPassword = !!password; - userData.title = '[[pages:account/edit, ' + userData.username + ']]'; - userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:edit]]'}]); - res.render('account/edit', userData); - }); -}; - accountsController.accountSettings = function(req, res, callback) { var userData; async.waterfall([ diff --git a/src/controllers/accounts/edit.js b/src/controllers/accounts/edit.js new file mode 100644 index 0000000000..66b8f8ff15 --- /dev/null +++ b/src/controllers/accounts/edit.js @@ -0,0 +1,38 @@ +'use strict'; + +var async = require('async'), + db = require('../../database'), + meta = require('../../meta'), + helpers = require('../helpers'), + accountHelpers = require('./helpers'); + +var editController = {}; + +editController.get = function(req, res, callback) { + var userData; + async.waterfall([ + function(next) { + accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, next); + }, + function(data, next) { + userData = data; + if (!userData) { + return callback(); + } + db.getObjectField('user:' + userData.uid, 'password', next); + } + ], function(err, password) { + if (err) { + return callback(err); + } + + userData['username:disableEdit'] = parseInt(meta.config['username:disableEdit'], 10) === 1; + userData.hasPassword = !!password; + userData.title = '[[pages:account/edit, ' + userData.username + ']]'; + userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:edit]]'}]); + + res.render('account/edit', userData); + }); +}; + +module.exports = editController; \ No newline at end of file diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js new file mode 100644 index 0000000000..e9706834b2 --- /dev/null +++ b/src/controllers/accounts/helpers.js @@ -0,0 +1,108 @@ +'use strict'; + + +var async = require('async'), + validator = require('validator'), + + user = require('../../user'), + groups = require('../../groups'), + plugins =require('../../plugins'), + meta = require('../../meta'), + utils = require('../../../public/src/utils'); + +var helpers = {}; + +helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { + async.waterfall([ + function (next) { + user.getUidByUserslug(userslug, next); + }, + function (uid, next) { + if (!uid) { + callback(null, null); + } + + async.parallel({ + userData : function(next) { + user.getUserData(uid, next); + }, + userSettings : function(next) { + user.getSettings(uid, next); + }, + isAdmin : function(next) { + user.isAdministrator(callerUID, next); + }, + ips: function(next) { + user.getIPs(uid, 4, next); + }, + profile_links: function(next) { + plugins.fireHook('filter:user.profileLinks', [], next); + }, + groups: function(next) { + groups.getUserGroups([uid], next); + }, + sso: function(next) { + plugins.fireHook('filter:auth.list', {uid: uid, associations: []}, next); + } + }, next); + }, + function (results, next) { + if (!results.userData) { + return callback(new Error('[[error:invalid-uid]]')); + } + + var userData = results.userData; + var userSettings = results.userSettings; + var isAdmin = results.isAdmin; + var self = parseInt(callerUID, 10) === parseInt(userData.uid, 10); + + userData.joindate = utils.toISOString(userData.joindate); + userData.lastonline = userData.lastonline ? utils.toISOString(userData.lastonline) : userData.joindate; + userData.age = userData.birthday ? Math.floor((new Date().getTime() - new Date(userData.birthday).getTime()) / 31536000000) : ''; + + if (!(isAdmin || self || (userData.email && userSettings.showemail))) { + userData.email = ''; + } + + userData.emailClass = (self && !userSettings.showemail) ? '' : 'hide'; + + if (!self && !userSettings.showfullname) { + userData.fullname = ''; + } + + if (isAdmin || self) { + userData.ips = results.ips; + } + + userData.uid = userData.uid; + userData.yourid = callerUID; + userData.theirid = userData.uid; + userData.isAdmin = isAdmin; + userData.isSelf = self; + userData.showHidden = self || isAdmin; + userData.groups = Array.isArray(results.groups) && results.groups.length ? results.groups[0] : []; + userData.disableSignatures = meta.config.disableSignatures !== undefined && parseInt(meta.config.disableSignatures, 10) === 1; + userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10); + userData.profile_links = results.profile_links; + userData.sso = results.sso.associations; + userData.status = require('../../socket.io').isUserOnline(userData.uid) ? (userData.status || 'online') : 'offline'; + userData.banned = parseInt(userData.banned, 10) === 1; + userData.website = validator.escape(userData.website); + userData.websiteLink = !userData.website.startsWith('http') ? 'http://' + userData.website : userData.website; + userData.websiteName = userData.website.replace(validator.escape('http://'), '').replace(validator.escape('https://'), ''); + userData.followingCount = parseInt(userData.followingCount, 10) || 0; + userData.followerCount = parseInt(userData.followerCount, 10) || 0; + + userData.username = validator.escape(userData.username); + userData.email = validator.escape(userData.email); + userData.fullname = validator.escape(userData.fullname); + userData.location = validator.escape(userData.location); + userData.signature = validator.escape(userData.signature); + userData.aboutme = validator.escape(userData.aboutme || ''); + + next(null, userData); + } + ], callback); +}; + +module.exports = helpers; \ No newline at end of file diff --git a/src/controllers/accounts/profile.js b/src/controllers/accounts/profile.js new file mode 100644 index 0000000000..e55ee0d157 --- /dev/null +++ b/src/controllers/accounts/profile.js @@ -0,0 +1,89 @@ +'use strict'; + +var nconf = require('nconf'), + async = require('async'), + + user = require('../../user'), + posts = require('../../posts'), + plugins = require('../../plugins'), + meta = require('../../meta'), + accountHelpers = require('./helpers'), + helpers = require('../helpers'); + + +var profileController = {}; + +profileController.get = function(req, res, callback) { + var lowercaseSlug = req.params.userslug.toLowerCase(); + + if (req.params.userslug !== lowercaseSlug) { + if (res.locals.isAPI) { + req.params.userslug = lowercaseSlug; + } else { + return res.redirect(nconf.get('relative_path') + '/user/' + lowercaseSlug); + } + } + + var userData; + async.waterfall([ + function (next) { + accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, next); + }, + function (_userData, next) { + if (!_userData) { + return callback(); + } + userData = _userData; + + if (req.uid !== parseInt(userData.uid, 10)) { + user.incrementUserFieldBy(userData.uid, 'profileviews', 1); + } + + async.parallel({ + isFollowing: function(next) { + user.isFollowing(req.uid, userData.theirid, next); + }, + posts: function(next) { + posts.getPostSummariesFromSet('uid:' + userData.theirid + ':posts', req.uid, 0, 9, next); + }, + signature: function(next) { + posts.parseSignature(userData, req.uid, next); + }, + aboutme: function(next) { + if (userData.aboutme) { + plugins.fireHook('filter:parse.raw', userData.aboutme, next); + } else { + next(); + } + } + }, next); + }, + function (results, next) { + if (parseInt(meta.config['reputation:disabled'], 10) === 1) { + delete userData.reputation; + } + + userData.posts = results.posts.posts.filter(function (p) { + return p && parseInt(p.deleted, 10) !== 1; + }); + + userData.aboutme = results.aboutme; + userData.nextStart = results.posts.nextStart; + userData.isFollowing = results.isFollowing; + userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username}]); + userData.title = userData.username; + if (!userData.profileviews) { + userData.profileviews = 1; + } + + plugins.fireHook('filter:user.account', {userData: userData, uid: req.uid}, next); + } + ], function(err, results) { + if (err) { + return callback(err); + } + res.render('account/profile', results.userData); + }); +}; + +module.exports = profileController; \ No newline at end of file diff --git a/src/routes/accounts.js b/src/routes/accounts.js new file mode 100644 index 0000000000..ecf2e1be99 --- /dev/null +++ b/src/routes/accounts.js @@ -0,0 +1,24 @@ +"use strict"; + +var helpers = require('./helpers'); +var setupPageRoute = helpers.setupPageRoute; + +module.exports = function (app, middleware, controllers) { + var middlewares = [middleware.checkGlobalPrivacySettings]; + var accountMiddlewares = [middleware.checkGlobalPrivacySettings, middleware.checkAccountPermissions]; + + setupPageRoute(app, '/user/:userslug', middleware, middlewares, controllers.accounts.profile.get); + setupPageRoute(app, '/user/:userslug/following', middleware, middlewares, controllers.accounts.getFollowing); + setupPageRoute(app, '/user/:userslug/followers', middleware, middlewares, controllers.accounts.getFollowers); + setupPageRoute(app, '/user/:userslug/posts', middleware, middlewares, controllers.accounts.getPosts); + setupPageRoute(app, '/user/:userslug/topics', middleware, middlewares, controllers.accounts.getTopics); + setupPageRoute(app, '/user/:userslug/groups', middleware, middlewares, controllers.accounts.getGroups); + + setupPageRoute(app, '/user/:userslug/favourites', middleware, accountMiddlewares, controllers.accounts.getFavourites); + setupPageRoute(app, '/user/:userslug/watched', middleware, accountMiddlewares, controllers.accounts.getWatchedTopics); + setupPageRoute(app, '/user/:userslug/edit', middleware, accountMiddlewares, controllers.accounts.edit.get); + setupPageRoute(app, '/user/:userslug/settings', middleware, accountMiddlewares, controllers.accounts.accountSettings); + + setupPageRoute(app, '/notifications', middleware, [middleware.authenticate], controllers.accounts.getNotifications); + setupPageRoute(app, '/chats/:userslug?', middleware, [middleware.redirectToLoginIfGuest], controllers.accounts.getChats); +}; diff --git a/src/routes/index.js b/src/routes/index.js index 6e8ac89fbb..31573544d9 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -8,6 +8,8 @@ var nconf = require('nconf'), plugins = require('../plugins'), express = require('express'), + accountRoutes = require('./accounts'), + metaRoutes = require('./meta'), apiRoutes = require('./api'), adminRoutes = require('./admin'), @@ -55,26 +57,6 @@ function categoryRoutes(app, middleware, controllers) { setupPageRoute(app, '/category/:category_id/:slug?', middleware, [], controllers.categories.get); } -function accountRoutes(app, middleware, controllers) { - var middlewares = [middleware.checkGlobalPrivacySettings]; - var accountMiddlewares = [middleware.checkGlobalPrivacySettings, middleware.checkAccountPermissions]; - - setupPageRoute(app, '/user/:userslug', middleware, middlewares, controllers.accounts.getAccount); - setupPageRoute(app, '/user/:userslug/following', middleware, middlewares, controllers.accounts.getFollowing); - setupPageRoute(app, '/user/:userslug/followers', middleware, middlewares, controllers.accounts.getFollowers); - setupPageRoute(app, '/user/:userslug/posts', middleware, middlewares, controllers.accounts.getPosts); - setupPageRoute(app, '/user/:userslug/topics', middleware, middlewares, controllers.accounts.getTopics); - setupPageRoute(app, '/user/:userslug/groups', middleware, middlewares, controllers.accounts.getGroups); - - setupPageRoute(app, '/user/:userslug/favourites', middleware, accountMiddlewares, controllers.accounts.getFavourites); - setupPageRoute(app, '/user/:userslug/watched', middleware, accountMiddlewares, controllers.accounts.getWatchedTopics); - setupPageRoute(app, '/user/:userslug/edit', middleware, accountMiddlewares, controllers.accounts.accountEdit); - setupPageRoute(app, '/user/:userslug/settings', middleware, accountMiddlewares, controllers.accounts.accountSettings); - - setupPageRoute(app, '/notifications', middleware, [middleware.authenticate], controllers.accounts.getNotifications); - setupPageRoute(app, '/chats/:userslug?', middleware, [middleware.redirectToLoginIfGuest], controllers.accounts.getChats); -} - function userRoutes(app, middleware, controllers) { var middlewares = [middleware.checkGlobalPrivacySettings];