all files / src/ events.js

12.5% Statements 7/56
0% Branches 0/16
3.23% Functions 1/31
12.5% Lines 7/56
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129                                                                                                                                                                                                                                                   
 
'use strict';
 
var async = require('async'),
 
	db =  require('./database'),
	batch = require('./batch'),
	user = require('./user'),
	utils = require('../public/src/utils');
 
 
(function(events) {
	events.log = function(data, callback) {
		callback = callback || function() {};
 
		async.waterfall([
			function(next) {
				db.incrObjectField('global', 'nextEid', next);
			},
			function(eid, next) {
				data.timestamp = Date.now();
				data.eid = eid;
 
				async.parallel([
					function(next) {
						db.sortedSetAdd('events:time', data.timestamp, eid, next);
					},
					function(next) {
						db.setObject('event:' + eid, data, next);
					}
				], next);
			}
		], function(err, result) {
			callback(err);
		});
	};
 
	events.getEvents = function(start, stop, callback) {
		async.waterfall([
			function(next) {
				db.getSortedSetRevRange('events:time', start, stop, next);
			},
			function(eids, next) {
				var keys = eids.map(function(eid) {
					return 'event:' + eid;
				});
				db.getObjects(keys, next);
			},
			function(eventsData, next) {
				eventsData.forEach(function(event) {
					var e = utils.merge(event);
					e.eid = e.uid = e.type = e.ip = undefined;
					event.jsonString = JSON.stringify(e, null, 4);
					event.timestampISO = new Date(parseInt(event.timestamp, 10)).toUTCString();
				});
				addUserData(eventsData, 'uid', 'user', next);
			},
			function(eventsData, next) {
				addUserData(eventsData, 'targetUid', 'targetUser', next);
			}
		], callback);
	};
 
	function addUserData(eventsData, field, objectName, callback) {
		var uids = eventsData.map(function(event) {
			return event && event[field];
		}).filter(function(uid, index, array) {
			return uid && array.indexOf(uid) === index;
		});
 
		if (!uids.length) {
			return callback(null, eventsData);
		}
 
		async.parallel({
			isAdmin: function(next) {
				user.isAdministrator(uids, next);
			},
			userData: function(next) {
				user.getUsersFields(uids, ['username', 'userslug', 'picture'], next);
			}
		}, function(err, results) {
			if (err) {
				return callback(err);
			}
 
			var userData = results.userData;
 
			var map = {};
			userData.forEach(function(user, index) {
				user.isAdmin = results.isAdmin[index];
				map[user.uid] = user;
			});
 
			eventsData.forEach(function(event) {
				if (map[event[field]]) {
					event[objectName] = map[event[field]];
				}
			});
			callback(null, eventsData);
		});
	}
 
	events.deleteEvents = function(eids, callback) {
		callback = callback || function() {};
		async.parallel([
			function(next) {
				var keys = eids.map(function(eid) {
					return 'event:' + eid;
				});
				db.deleteAll(keys, next);
			},
			function(next) {
				db.sortedSetRemove('events:time', eids, next);
			}
		], callback);
	};
 
	events.deleteAll = function(callback) {
		callback = callback || function() {};
 
		batch.processSortedSet('events:time', function(eids, next) {
			events.deleteEvents(eids, callback);
		}, {alwaysStartAt: 0}, callback);
	};
 
 
}(module.exports));