socket.io/user.js refactor
parent
53411f809b
commit
e0c6acd163
@ -0,0 +1,84 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var async = require('async');
|
||||||
|
var winston = require('winston');
|
||||||
|
|
||||||
|
var user = require('../../user');
|
||||||
|
|
||||||
|
module.exports = function(SocketUser) {
|
||||||
|
|
||||||
|
SocketUser.changePicture = function(socket, data, callback) {
|
||||||
|
if (!socket.uid) {
|
||||||
|
return callback('[[error:invalid-uid]]');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return callback(new Error('[[error:invalid-data]]'));
|
||||||
|
}
|
||||||
|
|
||||||
|
var type = data.type;
|
||||||
|
|
||||||
|
if (type === 'gravatar') {
|
||||||
|
type = 'gravatarpicture';
|
||||||
|
} else if (type === 'uploaded') {
|
||||||
|
type = 'uploadedpicture';
|
||||||
|
} else {
|
||||||
|
return callback(new Error('[[error:invalid-image-type, ' + ['gravatar', 'uploadedpicture'].join(', ') + ']]'));
|
||||||
|
}
|
||||||
|
|
||||||
|
async.waterfall([
|
||||||
|
function (next) {
|
||||||
|
SocketUser.isAdminOrSelf(socket, data.uid, next);
|
||||||
|
},
|
||||||
|
function (next) {
|
||||||
|
user.getUserField(data.uid, type, next);
|
||||||
|
},
|
||||||
|
function (picture, next) {
|
||||||
|
user.setUserField(data.uid, 'picture', picture, next);
|
||||||
|
}
|
||||||
|
], callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
SocketUser.uploadProfileImageFromUrl = function(socket, data, callback) {
|
||||||
|
if (!socket.uid || !data.url || !data.uid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SocketUser.isAdminOrSelf(socket, data.uid, function(err) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
user.uploadFromUrl(data.uid, data.url, function(err, uploadedImage) {
|
||||||
|
callback(err, uploadedImage ? uploadedImage.url : null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
SocketUser.removeUploadedPicture = function(socket, data, callback) {
|
||||||
|
if (!socket.uid || !data.uid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
async.waterfall([
|
||||||
|
function (next) {
|
||||||
|
SocketUser.isAdminOrSelf(socket, data.uid, next);
|
||||||
|
},
|
||||||
|
function (next) {
|
||||||
|
user.getUserField(data.uid, 'uploadedpicture', next);
|
||||||
|
},
|
||||||
|
function(uploadedPicture, next) {
|
||||||
|
if (!uploadedPicture.startsWith('http')) {
|
||||||
|
require('fs').unlink(uploadedPicture, function(err) {
|
||||||
|
if (err) {
|
||||||
|
winston.error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
user.setUserField(data.uid, 'uploadedpicture', '', next);
|
||||||
|
},
|
||||||
|
function(next) {
|
||||||
|
user.getUserField(data.uid, 'picture', next);
|
||||||
|
}
|
||||||
|
], callback);
|
||||||
|
};
|
||||||
|
};
|
@ -0,0 +1,94 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var user = require('../../user');
|
||||||
|
var meta = require('../../meta');
|
||||||
|
var events = require('../../events');
|
||||||
|
|
||||||
|
module.exports = function(SocketUser) {
|
||||||
|
|
||||||
|
SocketUser.changePassword = function(socket, data, callback) {
|
||||||
|
if (!data || !data.uid || data.newPassword.length < meta.config.minimumPasswordLength) {
|
||||||
|
return callback(new Error('[[error:invalid-data]]'));
|
||||||
|
}
|
||||||
|
if (!socket.uid) {
|
||||||
|
return callback('[[error:invalid-uid]]');
|
||||||
|
}
|
||||||
|
|
||||||
|
user.changePassword(socket.uid, data, function(err) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
events.log({
|
||||||
|
type: 'password-change',
|
||||||
|
uid: socket.uid,
|
||||||
|
targetUid: data.uid,
|
||||||
|
ip: socket.ip
|
||||||
|
});
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
SocketUser.updateProfile = function(socket, data, callback) {
|
||||||
|
function update(oldUserData) {
|
||||||
|
function done(err, userData) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (userData.email !== oldUserData.email) {
|
||||||
|
events.log({
|
||||||
|
type: 'email-change',
|
||||||
|
uid: socket.uid,
|
||||||
|
targetUid: data.uid,
|
||||||
|
ip: socket.ip,
|
||||||
|
oldEmail: oldUserData.email,
|
||||||
|
newEmail: userData.email
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (userData.username !== oldUserData.username) {
|
||||||
|
events.log({
|
||||||
|
type: 'username-change',
|
||||||
|
uid: socket.uid,
|
||||||
|
targetUid: data.uid,
|
||||||
|
ip: socket.ip,
|
||||||
|
oldUsername: oldUserData.username,
|
||||||
|
newUsername: userData.username
|
||||||
|
});
|
||||||
|
}
|
||||||
|
callback(null, userData);
|
||||||
|
}
|
||||||
|
|
||||||
|
SocketUser.isAdminOrSelf(socket, data.uid, function(err) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
user.updateProfile(data.uid, data, done);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!socket.uid) {
|
||||||
|
return callback('[[error:invalid-uid]]');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data || !data.uid) {
|
||||||
|
return callback(new Error('[[error:invalid-data]]'));
|
||||||
|
}
|
||||||
|
|
||||||
|
user.getUserFields(data.uid, ['email', 'username'], function(err, oldUserData) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseInt(meta.config['username:disableEdit'], 10) === 1) {
|
||||||
|
data.username = oldUserData.username;
|
||||||
|
}
|
||||||
|
|
||||||
|
update(oldUserData, callback);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
};
|
@ -0,0 +1,71 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var async = require('async');
|
||||||
|
|
||||||
|
var db = require('../../database');
|
||||||
|
var user = require('../../user');
|
||||||
|
var meta = require('../../meta');
|
||||||
|
|
||||||
|
module.exports = function(SocketUser) {
|
||||||
|
SocketUser.search = function(socket, data, callback) {
|
||||||
|
if (!data) {
|
||||||
|
return callback(new Error('[[error:invalid-data]]'));
|
||||||
|
}
|
||||||
|
if (!socket.uid && parseInt(meta.config.allowGuestUserSearching, 10) !== 1) {
|
||||||
|
return callback(new Error('[[error:not-logged-in]]'));
|
||||||
|
}
|
||||||
|
user.search({
|
||||||
|
query: data.query,
|
||||||
|
page: data.page,
|
||||||
|
searchBy: data.searchBy,
|
||||||
|
sortBy: data.sortBy,
|
||||||
|
onlineOnly: data.onlineOnly,
|
||||||
|
uid: socket.uid
|
||||||
|
}, callback);
|
||||||
|
};
|
||||||
|
|
||||||
|
SocketUser.loadSearchPage = function(socket, data, callback) {
|
||||||
|
function done(err, result) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
var pageCount = Math.ceil(result.count / resultsPerPage);
|
||||||
|
var userData = {
|
||||||
|
matchCount: result.users.length,
|
||||||
|
timing: (process.elapsedTimeSince(startTime) / 1000).toFixed(2),
|
||||||
|
users: result.users,
|
||||||
|
pagination: pagination.create(data.page, pageCount),
|
||||||
|
pageCount: pageCount
|
||||||
|
};
|
||||||
|
|
||||||
|
callback(null, userData);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data || !data.page) {
|
||||||
|
return callback(new Error('[[error:invalid-data]]'));
|
||||||
|
}
|
||||||
|
var startTime = process.hrtime();
|
||||||
|
var controllers = require('../../controllers/users');
|
||||||
|
var pagination = require('../../pagination');
|
||||||
|
|
||||||
|
var resultsPerPage = parseInt(meta.config.userSearchResultsPerPage, 10) || 20;
|
||||||
|
var start = Math.max(0, data.page - 1) * resultsPerPage;
|
||||||
|
var stop = start + resultsPerPage - 1;
|
||||||
|
if (data.onlineOnly) {
|
||||||
|
async.parallel({
|
||||||
|
users: function(next) {
|
||||||
|
user.getUsersFromSet('users:online', socket.uid, 0, 49, next);
|
||||||
|
},
|
||||||
|
count: function(next) {
|
||||||
|
var now = Date.now();
|
||||||
|
db.sortedSetCount('users:online', now - 300000, now, next);
|
||||||
|
}
|
||||||
|
}, done);
|
||||||
|
} else {
|
||||||
|
controllers.getUsersAndCount('users:joindate', socket.uid, start, stop, done);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
};
|
@ -0,0 +1,45 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var user = require('../../user');
|
||||||
|
var websockets = require('../index');
|
||||||
|
|
||||||
|
module.exports = function(SocketUser) {
|
||||||
|
SocketUser.checkStatus = function(socket, uid, callback) {
|
||||||
|
if (!socket.uid) {
|
||||||
|
return callback('[[error:invalid-uid]]');
|
||||||
|
}
|
||||||
|
var online = websockets.isUserOnline(uid);
|
||||||
|
if (!online) {
|
||||||
|
return callback(null, 'offline');
|
||||||
|
}
|
||||||
|
user.getUserField(uid, 'status', function(err, status) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
status = status || 'online';
|
||||||
|
callback(null, status);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
SocketUser.setStatus = function(socket, status, callback) {
|
||||||
|
if (!socket.uid) {
|
||||||
|
return callback(new Error('[[error:invalid-uid]]'));
|
||||||
|
}
|
||||||
|
|
||||||
|
var allowedStatus = ['online', 'offline', 'dnd', 'away'];
|
||||||
|
if (allowedStatus.indexOf(status) === -1) {
|
||||||
|
return callback(new Error('[[error:invalid-user-status]]'));
|
||||||
|
}
|
||||||
|
user.setUserField(socket.uid, 'status', status, function(err) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
var data = {
|
||||||
|
uid: socket.uid,
|
||||||
|
status: status
|
||||||
|
};
|
||||||
|
websockets.server.sockets.emit('event:user_status_change', data);
|
||||||
|
callback(null, data);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
Loading…
Reference in New Issue