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