ユーザーにチャットユーザーをサブスクライブさせ、ユーザーはソケットを介してオンラインまたはオフラインにすることができます。
ユーザーの 1 人は管理者の役割を持っており、HTTP 要求 User.update を通じてユーザーを強制的にオンラインまたはオフラインにすることができます。また、購読者に警告するために User.publishUpdate を追加しました。
問題は、マネージャーがユーザーをオフラインからオンライン状態にすると、更新したユーザー自身を期待して他のユーザーにユーザーがオンラインであるように見え、セイルで autoWatch を有効にすると問題が消えることです。
ここにソケットコード:
var query= {authType: 'google'}; //TODO this is temp, currently the staff will see only staff users, until we fix the performance issue
if (user.dealershipCompany) {
query = {
or: [{
authType: 'google',
dealershipCompany: null
}, {
authType: 'local',
dealershipCompany: user.dealershipCompany
}]
};
}
sails.log.info('Chat Users Query:\n', query);
User.find(query).exec(function (err, chatUsers) {
if (err) {
return callback(err, {
projectedUser: null,
porjectedChatUsers: null
});
} else {
// remove the logged in users to avoid self messaging
_.remove(chatUsers, {
id: userId
});
}
// Subscribe the connected socket to changes in the online state of chatUsers
User.subscribe(req.socket, chatUsers, 'update');
});
ここでユーザー更新:
update: function (req, res) {
var id = req.param('id');
User.findOne(id).exec(function (err, user) {
if (err)
res.serverError(err)
else if (user) {
var firstName = req.param('firstName') || user.firstName;
var lastName = req.param('lastName') || user.lastName;
var role = req.param('role') || user.role;
var email = req.param('email') || user.email;
var online = req.param('online') || user.online;
user.firstName = firstName;
user.lastName = lastName;
user.email = email;
user.role = role;
user.online = online;
user.save(function (err, updatedUser) {
if (err)
res.serverError(err);
User.publishUpdate(updatedUser.id, {
online: updatedUser.online
}, req);
res.ok(updatedUser);
});
}
else {
res.notFound({error: 'User with id: ' + id + ' Could not be found'});
}
});
},