| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var async = require('async'), | 
					
						
							|  |  |  | 	winston = require('winston'), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 18:11:57 -04:00
										 |  |  | 	db = require('../database'), | 
					
						
							|  |  |  | 	user = require('../user'), | 
					
						
							|  |  |  | 	meta = require('../meta'), | 
					
						
							|  |  |  | 	notifications = require('../notifications'), | 
					
						
							|  |  |  | 	categories = require('../categories'), | 
					
						
							| 
									
										
										
										
											2014-05-15 10:38:02 -04:00
										 |  |  | 	privileges = require('../privileges'); | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | module.exports = function(Topics) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Topics.getTotalUnread = function(uid, callback) { | 
					
						
							|  |  |  | 		Topics.getUnreadTids(uid, 0, 20, function(err, tids) { | 
					
						
							|  |  |  | 			callback(err, tids ? tids.length : 0); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Topics.getUnreadTids = function(uid, start, stop, callback) { | 
					
						
							|  |  |  | 		var unreadTids = [], | 
					
						
							|  |  |  | 			done = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		uid = parseInt(uid, 10); | 
					
						
							| 
									
										
										
										
											2014-08-09 16:15:22 -04:00
										 |  |  | 		if (uid === 0) { | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 			return callback(null, unreadTids); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 18:11:57 -04:00
										 |  |  | 		var count = 0; | 
					
						
							|  |  |  | 		if (stop === -1) { | 
					
						
							|  |  |  | 			count = Infinity; | 
					
						
							|  |  |  | 		}  else { | 
					
						
							|  |  |  | 			count = stop - start + 1; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 		async.whilst(function() { | 
					
						
							| 
									
										
										
										
											2014-08-15 18:11:57 -04:00
										 |  |  | 			return unreadTids.length < count && !done; | 
					
						
							| 
									
										
										
										
											2014-08-09 16:15:22 -04:00
										 |  |  | 		}, function(next) { | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 			Topics.getLatestTids(start, stop, 'month', function(err, tids) { | 
					
						
							|  |  |  | 				if (err) { | 
					
						
							| 
									
										
										
										
											2014-08-09 16:15:22 -04:00
										 |  |  | 					return next(err); | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (tids && !tids.length) { | 
					
						
							|  |  |  | 					done = true; | 
					
						
							| 
									
										
										
										
											2014-08-09 16:15:22 -04:00
										 |  |  | 					return next(); | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				Topics.hasReadTopics(tids, uid, function(err, read) { | 
					
						
							| 
									
										
										
										
											2014-08-09 16:15:22 -04:00
										 |  |  | 					if (err) { | 
					
						
							|  |  |  | 						return next(err); | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-07-29 21:51:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 17:44:13 -04:00
										 |  |  | 					var newtids = tids.filter(function(tid, index) { | 
					
						
							| 
									
										
										
										
											2014-06-28 01:03:26 -04:00
										 |  |  | 						return !read[index]; | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 					}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 18:11:57 -04:00
										 |  |  | 					privileges.topics.filter('read', newtids, uid, function(err, newtids) { | 
					
						
							|  |  |  | 						if (err) { | 
					
						
							|  |  |  | 							return next(err); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						unreadTids.push.apply(unreadTids, newtids); | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 18:11:57 -04:00
										 |  |  | 						start = stop + 1; | 
					
						
							|  |  |  | 						stop = start + 19; | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-15 18:11:57 -04:00
										 |  |  | 						next(); | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}, function(err) { | 
					
						
							| 
									
										
										
										
											2014-08-15 18:11:57 -04:00
										 |  |  | 			callback(err, unreadTids.slice(0, count)); | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Topics.getUnreadTopics = function(uid, start, stop, callback) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var unreadTopics = { | 
					
						
							|  |  |  | 			no_topics_message: '', | 
					
						
							| 
									
										
										
										
											2014-04-07 17:09:55 -04:00
										 |  |  | 			show_markread_button: 'hidden', | 
					
						
							|  |  |  | 			showSelect: true, | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 			nextStart : 0, | 
					
						
							|  |  |  | 			topics: [] | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-24 21:53:14 -04:00
										 |  |  | 		function sendUnreadTopics(tids) { | 
					
						
							|  |  |  | 			Topics.getTopicsByTids(tids, uid, function(err, topicData) { | 
					
						
							|  |  |  | 				if (err) { | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-24 21:53:14 -04:00
										 |  |  | 				if (!Array.isArray(topicData) || !topicData.length) { | 
					
						
							|  |  |  | 					return callback(null, unreadTopics); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 				db.sortedSetRevRank('topics:recent', topicData[topicData.length - 1].tid, function(err, rank) { | 
					
						
							|  |  |  | 					if(err) { | 
					
						
							|  |  |  | 						return callback(err); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					unreadTopics.topics = topicData; | 
					
						
							|  |  |  | 					unreadTopics.nextStart = parseInt(rank, 10) + 1; | 
					
						
							|  |  |  | 					unreadTopics.no_topics_message = (!topicData || topicData.length === 0) ? '' : 'hidden'; | 
					
						
							| 
									
										
										
										
											2014-04-07 17:09:55 -04:00
										 |  |  | 					unreadTopics.show_markread_button = topicData.length === 0 ? 'hidden' : ''; | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					callback(null, unreadTopics); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Topics.getUnreadTids(uid, start, stop, function(err, unreadTids) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (unreadTids.length) { | 
					
						
							|  |  |  | 				sendUnreadTopics(unreadTids); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				callback(null, unreadTopics); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Topics.pushUnreadCount = function(uids, callback) { | 
					
						
							|  |  |  | 		var	websockets = require('./../socket.io'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!uids) { | 
					
						
							|  |  |  | 			uids = websockets.getConnectedClients(); | 
					
						
							|  |  |  | 		} else if (!Array.isArray(uids)) { | 
					
						
							|  |  |  | 			uids = [uids]; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		uids = uids.filter(function(value) { | 
					
						
							|  |  |  | 			return parseInt(value, 10) !== 0; | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		async.each(uids, function(uid, next) { | 
					
						
							|  |  |  | 			Topics.getTotalUnread(uid, function(err, count) { | 
					
						
							|  |  |  | 				websockets.in('uid_' + uid).emit('event:unread.updateCount', null, count); | 
					
						
							|  |  |  | 				next(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}, function(err) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				winston.error(err.message); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (callback) { | 
					
						
							|  |  |  | 				callback(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Topics.markAsUnreadForAll = function(tid, callback) { | 
					
						
							|  |  |  | 		db.delete('tid:' + tid + ':read_by_uid', function(err) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			Topics.markCategoryUnreadForAll(tid, callback); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-07 17:09:55 -04:00
										 |  |  | 	Topics.markTidsRead = function(uid, tids, callback) { | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 		if(!tids || !tids.length) { | 
					
						
							|  |  |  | 			return callback(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		async.each(tids, function (tid, next) { | 
					
						
							|  |  |  | 			Topics.markAsRead(tid, uid, next); | 
					
						
							|  |  |  | 		}, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Topics.markAsRead = function(tid, uid, callback) { | 
					
						
							|  |  |  | 		db.setAdd('tid:' + tid + ':read_by_uid', uid, function(err) { | 
					
						
							| 
									
										
										
										
											2014-03-21 17:48:32 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-21 17:48:32 -04:00
										 |  |  | 			Topics.getTopicField(tid, 'cid', function(err, cid) { | 
					
						
							|  |  |  | 				if (err) { | 
					
						
							|  |  |  | 					return callback(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				categories.markAsRead(cid, uid, callback); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-03-21 17:48:32 -04:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-21 17:48:32 -04:00
										 |  |  | 	Topics.markTopicNotificationsRead = function(tid, uid) { | 
					
						
							| 
									
										
										
										
											2014-07-28 15:52:33 -04:00
										 |  |  | 		user.notifications.getUnreadByField(uid, 'tid', tid, function(err, nids) { | 
					
						
							|  |  |  | 			notifications.markReadMultiple(nids, uid, function() { | 
					
						
							| 
									
										
										
										
											2014-03-21 15:40:37 -04:00
										 |  |  | 				user.notifications.pushCount(uid); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Topics.markCategoryUnreadForAll = function(tid, callback) { | 
					
						
							|  |  |  | 		Topics.getTopicField(tid, 'cid', function(err, cid) { | 
					
						
							|  |  |  | 			if(err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			categories.markAsUnreadForAll(cid, callback); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Topics.hasReadTopics = function(tids, uid, callback) { | 
					
						
							|  |  |  | 		if(!parseInt(uid, 10)) { | 
					
						
							|  |  |  | 			return callback(null, tids.map(function() { | 
					
						
							|  |  |  | 				return false; | 
					
						
							|  |  |  | 			})); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var sets = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for (var i = 0, ii = tids.length; i < ii; i++) { | 
					
						
							|  |  |  | 			sets.push('tid:' + tids[i] + ':read_by_uid'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.isMemberOfSets(sets, uid, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Topics.hasReadTopic = function(tid, uid, callback) { | 
					
						
							|  |  |  | 		if(!parseInt(uid, 10)) { | 
					
						
							|  |  |  | 			return callback(null, false); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		db.isSetMember('tid:' + tid + ':read_by_uid', uid, callback); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-10 20:31:57 +01:00
										 |  |  | }; |