From 8f2a0014b30af5cf6715dda8971f6a542ff6309e Mon Sep 17 00:00:00 2001 From: Baris Usakli Date: Mon, 8 Jul 2013 14:14:18 -0400 Subject: [PATCH] closes #70 --- public/css/category.less | 11 +- public/src/forum/accountedit.js | 29 +----- src/routes/user.js | 13 --- src/user.js | 176 +++++++++++++++++++++----------- src/websockets.js | 4 + 5 files changed, 128 insertions(+), 105 deletions(-) diff --git a/public/css/category.less b/public/css/category.less index 2024c6d9e2..26da0f2b4c 100644 --- a/public/css/category.less +++ b/public/css/category.less @@ -149,7 +149,7 @@ height: 50px; line-height: 16px; margin-left: 1px; - padding: 5px; + padding: 5px 5px 5px 0px; li { line-height: 16px; @@ -159,20 +159,15 @@ } p { display: block; - float: left; - width: 70%; - margin-left: 10px; + padding-left:5px; overflow: hidden; height: 32px; } span { display: block; - float: left; - width: 70%; - margin-left: 10px; overflow: hidden; height: 16px; - margin-top: -10px; + padding-left:5px; color: #666; } } diff --git a/public/src/forum/accountedit.js b/public/src/forum/accountedit.js index 5899ac81b9..53918a36cd 100644 --- a/public/src/forum/accountedit.js +++ b/public/src/forum/accountedit.js @@ -106,33 +106,10 @@ $(document).ready(function() { website:$('#inputWebsite').val(), birthday:$('#inputBirthday').val(), location:$('#inputLocation').val(), - signature:$('#inputSignature').val(), - _csrf:$('#csrf_token').val() + signature:$('#inputSignature').val() }; - - $.post('/users/doedit', - userData, - function(data) { - if(data.error) { - app.alert({ - 'alert_id': 'user_profile_updated', - type: 'error', - title: 'Profile Update Error', - message: data.error, - timeout: 2000 - }); - return; - } - - app.alert({ - 'alert_id': 'user_profile_updated', - type: 'success', - title: 'Profile Updated', - message: 'Your profile has been updated successfully', - timeout: 2000 - }); - } - ); + + socket.emit('api:user.updateProfile', userData); return false; }); diff --git a/src/routes/user.js b/src/routes/user.js index f01b332ab8..7aa8990032 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -73,19 +73,6 @@ var user = require('./../user.js'), }); }); - app.post('/users/doedit', function(req, res){ - if(!req.user) - return res.redirect('/403'); - - if(req.user.uid != req.body.uid) { - return res.redirect('/'); - } - - user.updateProfile(req.user.uid, req.body, function(data) { - res.send(data); - }); - }); - app.post('/users/uploadpicture', function(req, res) { if(!req.user) return res.redirect('/403'); diff --git a/src/user.js b/src/user.js index b5a488ef15..28e29280d9 100644 --- a/src/user.js +++ b/src/user.js @@ -28,57 +28,64 @@ var utils = require('./../public/src/utils.js'), callback(null, 0); return; } - - RDB.incr('global:next_user_id', function(err, uid) { - RDB.handle(err); - - var gravatar = User.createGravatarURLFromEmail(email); - - RDB.hmset('user:'+uid, { - 'uid': uid, - 'username' : username, - 'userslug' : userslug, - 'fullname': '', - 'location':'', - 'birthday':'', - 'website':'', - 'email' : email, - 'signature':'', - 'joindate' : Date.now(), - 'picture': gravatar, - 'gravatarpicture' : gravatar, - 'uploadedpicture': '', - 'reputation': 0, - 'postcount': 0, - 'lastposttime': 0, - 'administrator': (uid == 1) ? 1 : 0 - }); - - RDB.set('username:' + username + ':uid', uid); - RDB.set('email:' + email +':uid', uid); - RDB.set('userslug:'+ userslug +':uid', uid); - - if(email) { - User.sendConfirmationEmail(email); + + User.isEmailAvailable(email, function(available) { + if(!available) { + callback(null, 0); + return; } - RDB.incr('usercount', function(err, count) { + RDB.incr('global:next_user_id', function(err, uid) { RDB.handle(err); - io.sockets.emit('user.count', {count: count}); - }); + var gravatar = User.createGravatarURLFromEmail(email); + + RDB.hmset('user:'+uid, { + 'uid': uid, + 'username' : username, + 'userslug' : userslug, + 'fullname': '', + 'location':'', + 'birthday':'', + 'website':'', + 'email' : email, + 'signature':'', + 'joindate' : Date.now(), + 'picture': gravatar, + 'gravatarpicture' : gravatar, + 'uploadedpicture': '', + 'reputation': 0, + 'postcount': 0, + 'lastposttime': 0, + 'administrator': (uid == 1) ? 1 : 0 + }); + + RDB.set('username:' + username + ':uid', uid); + RDB.set('email:' + email +':uid', uid); + RDB.set('userslug:'+ userslug +':uid', uid); - RDB.lpush('userlist', uid); - - io.sockets.emit('user.latest', {userslug: userslug, username: username}); + if(email) { + User.sendConfirmationEmail(email); + } - if (password) { - User.hashPassword(password, function(hash) { - User.setUserField(uid, 'password', hash); + RDB.incr('usercount', function(err, count) { + RDB.handle(err); + + io.sockets.emit('user.count', {count: count}); }); - } - callback(null, uid); + RDB.lpush('userlist', uid); + + io.sockets.emit('user.latest', {userslug: userslug, username: username}); + + if (password) { + User.hashPassword(password, function(hash) { + User.setUserField(uid, 'password', hash); + }); + } + + callback(null, uid); + }); }); }); }; @@ -174,31 +181,84 @@ var utils = require('./../public/src/utils.js'), }); } - User.updateProfile = function(uid, data, callback) { + User.updateProfile = function(socket, uid, data) { var fields = ['email', 'fullname', 'website', 'location', 'birthday', 'signature']; - if(data['signature'] !== undefined && data['signature'].length > 150) { - callback({error:'Signature can\'t be longer than 150 characters!'}); - return; + function isSignatureValid(next) { + if(data['signature'] !== undefined && data['signature'].length > 150) { + next({error:'Signature can\'t be longer than 150 characters!'}, false); + } else { + next(null, true); + } + } + + function isEmailAvailable(next) { + if(data['email'] !== undefined) { + User.getUserField(uid, 'email', function(email) { + if(email !== data['email']) { + User.isEmailAvailable(data['email'], function(available) { + if(!available) { + next({error:'Email not available!'}, false); + } + }); + } else { + next(null, true); + } + }); + } else { + next(null, true); + } } + + async.series([isSignatureValid, isEmailAvailable], function(err, results) { + if(err) { + socket.emit('event:alert', { + title: 'Error', + message: err.error, + type: 'error', + timeout: 2000 + }); + } else { + updateFields(); + } + }); - for(var i = 0, key, ii = fields.length; i < ii; ++i) { - key = fields[i]; + function updateFields() { + for(var i = 0, key, ii = fields.length; i < ii; ++i) { + key = fields[i]; - if(data[key] !== undefined) { - if(key === 'email') { - User.setUserField(uid, 'gravatarpicture', User.createGravatarURLFromEmail(data[key])); - RDB.set('email:' + data['email'] +':uid', uid); - } else if(key === 'signature') { - data[key] = utils.strip_tags(data[key]); - } + if(data[key] !== undefined) { + if(key === 'email') { + User.setUserField(uid, 'gravatarpicture', User.createGravatarURLFromEmail(data[key])); + RDB.set('email:' + data['email'] +':uid', uid); + } else if(key === 'signature') { + data[key] = utils.strip_tags(data[key]); + } - User.setUserField(uid, key, data[key]); + User.setUserField(uid, key, data[key]); + } } + + socket.emit('event:alert', { + title: 'Success', + message: 'Your profile has been updated successfully!', + type: 'success', + timeout: 2000 + }); } + } - callback({}); + User.isEmailAvailable = function(email, callback) { + RDB.exists('email:' + email + ':uid' , function(err, exists) { + if(!err) { + callback(exists !== 1); + return; + } else { + console.log(err); + callback(false); + } + }); } User.changePassword = function(socket, uid, data, callback) { diff --git a/src/websockets.js b/src/websockets.js index 981b8e77c0..8fc114f38c 100644 --- a/src/websockets.js +++ b/src/websockets.js @@ -197,6 +197,10 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), } }); }); + + socket.on('api:user.updateProfile', function(data) { + user.updateProfile(socket, uid, data); + }); socket.on('api:topics.post', function(data) { topics.post(socket, uid, data.title, data.content, data.category_id);