'use strict'; var async = require('async'), db = require('./../database'); module.exports = function(User) { User.follow = function(uid, followuid, callback) { toggleFollow('follow', uid, followuid, callback); }; User.unfollow = function(uid, unfollowuid, callback) { toggleFollow('unfollow', uid, unfollowuid, callback); }; function toggleFollow(type, uid, theiruid, callback) { if (!parseInt(uid, 10) || !parseInt(theiruid, 10)) { return callback(new Error('[[error:invalid-uid]]')); } if (parseInt(uid, 10) === parseInt(theiruid, 10)) { return callback(new Error('[[error:you-cant-follow-yourself]]')); } var command = type === 'follow' ? 'setAdd' : 'setRemove'; db[command]('following:' + uid, theiruid, function(err) { if(err) { return callback(err); } db[command]('followers:' + theiruid, uid, callback); }); } User.getFollowing = function(uid, callback) { getFollow(uid, 'following:' + uid, callback); }; User.getFollowers = function(uid, callback) { getFollow(uid, 'followers:' + uid, callback); }; function getFollow(uid, set, callback) { if (!parseInt(uid, 10)) { return callback(null, []); } db.getSetMembers(set, function(err, uids) { if (err) { return callback(err); } User.getUsers(uids, callback); }); } User.getFollowingCount = function(uid, callback) { if (!parseInt(uid, 10)) { return callback(null, 0); } db.setCount('following:' + uid, callback); }; User.getFollowerCount = function(uid, callback) { if (!parseInt(uid, 10)) { return callback(null, 0); } db.setCount('followers:' + uid, callback); }; User.getFollowStats = function (uid, callback) { async.parallel({ followingCount: function(next) { User.getFollowingCount(uid, next); }, followerCount : function(next) { User.getFollowerCount(uid, next); } }, callback); }; User.isFollowing = function(uid, theirid, callback) { if (!parseInt(uid, 10) || !parseInt(theirid, 10)) { return callback(null, false); } db.isSetMember('following:' + uid, theirid, callback); }; };