Exemple #1
0
Users.userFromSession = function (sessionId, callback) {
	if (Users.sessions[sessionId]) {
		var user = Q.getObject([sessionId, 'Users', 'loggedInUser'], Users.sessions) || null;
		callback && callback(user);
	} else {
		Users.Session.SELECT('*').where({
			id: sessionId
		}).execute(function(err, results){
			if (!results || results.length === 0) {
				callback(null);
			} else {
				if (results[0].fields.content === undefined) {
					Q.log(err, results);
					throw new Q.Error("Users.userFromSession session.fields.content is undefined");
				}
				var sess = JSON.parse(results[0].fields.content);
				
				if (!Q.isSet(sess, ['Users', 'loggedInUser'])) {
					callback(null);
				} else {
					Users.sessions[sessionId] = { Users: sess.Users };
					callback(Users.sessions[sessionId].Users.loggedInUser);
				}
			}
		});
	}
};
Exemple #2
0
	server.attached.express.post('/Q/node', function Broadcast_request_handler (req, res, next) {
		
		var parsed = req.body;
		if (!parsed || !parsed['Q/method']) {
			return next();
		}
		switch (parsed['Q/method']) {
			case 'Users/session':
				var sid = parsed.sessionId;
				var content = parsed.content ? JSON.parse(parsed.content) : null;
				if (content !== null) {
					var appId = Q.Config.get(["Users", "facebookApps", "Broadcast", "appId"], null);
					var token = Q.getObject(['fb_'+appId+'_access_token'], content);
					var userId = Q.getObject(['Users', 'loggedInUser', 'id'], content);
					if (userId === undefined) {
						userId = null;
					}
					if (token) {
						fb.createClient(token).getObject('me/friends', {},
						function(err, res, data) {
							if (!err && userId) {
								(new Broadcast.User({
									'userId': userId,
									'friend_count': data.data.length
								})).save(true, function(error){
									if (error) console.log("Insert broadcast user error: ", error);
								});
							} else {
								console.log('Failed to update friends count: ' + err.message);
							}
						});
					}
				}
				return next();
			default:
				return next();
		}
	});
Exemple #3
0
function slice_partitions(partition, j, hashed, adjust) {
	if (!adjust) adjust = false;
	if (partition.length <= 1) return partition;
	var hj = hashed[j], result = [], temp = hashed.slice(0), i, point;
	
	if (Q.typeOf(hj) === 'array') {
		for (i=0; i<hj.length; i++) {
			temp[j] = hj[i];
			result = result.concat(slice_partitions(partition, j, temp, adjust));
		}
		return result;
	}
	var min = hj, max = hj;
	if (hj instanceof Db.Range) {
		min = hj.min;
		max = hj.max;
		if (min === null) {
			throw new Q.Exception("Db.Query.Mysql slice_partitions: The minimum of the range should be set.");
		}
	}
	var current, next = null;
	var lower = 0, upper = partition.length-1;
	var lower_found = false, upper_found = false;
	
	for (i=0; i<partition.length; i++) {
		point = partition[i];
		upper_found = upper_found && next;
		current = point[j];
		if (!adjust && max != null && current > max) break;
		if ((next = (Q.getObject([i+1, j], partition) || null)) === current) continue;
		if (adjust && current > next) lower_found = !(next = null);
		if (!lower_found && next && min >= next) lower = i+1;
		if (!upper_found) {
			if (!next || max < next) {
				upper = i;
				if (!adjust) break;
				else upper_found = true;
			}
		}
	}
	if (!Q.isEmpty(hashed[j+1]))
		return slice_partitions(partition.slice(lower, upper+1), j+1, hashed, hj instanceof Db.Range || adjust);
	else
		return partition.slice(lower, upper+1);
}
Exemple #4
0
	Users.fetch(toUserId, function (err) {
		var to = Q.Config.get(
			['Streams', 'rules', 'deliver', deliver.to],
			['devices', 'email', 'mobile']
		);
		var uf = this.fields;
		var p1 = new Q.Pipe();
		var streamUrl = stream.url(message.fields.ordinal);
		var o = {
			fields: fields,
			subject: subject,
			deliver: deliver,
			stream: stream,
			streamUrl: streamUrl,
			message: message,
			url: message.getInstruction("url") || streamUrl,
			icon: stream.iconUrl(80),
			user: this,
			avatar: avatar,
			callback: callback
		};
		var result = [];

		/**
		 * @event "Streams/deliver/:messageType"
		 * @param {Object} options for the notification delivery
		 * @param {Function} callback to call when options has been transformed
		 */
		var name = 'Streams/deliver/'+message.fields.type;
		var handler = Q.getObject(name, Q.handlers, '/');
		if (!Q.isEmpty(handler)) {
			Q.handle(handler, message, [o, _afterTransform]);
		} else {
			_afterTransform();
		}

		function _afterTransform() {
			var w1 = [];
			var e, m, d;
			if (e = deliver.emailAddress || deliver.email) {
				_email(e, p1.fill('email'));
				w1.push('email');
			}
			if (m = deliver.mobileNumber || deliver.mobile) {
				_mobile(m, p1.fill('mobile'));
				w1.push('mobile');
			}
			if (d = deliver.deviceId || deliver.device) {
				_device(d, p1.fill('device'));
				w1.push('device');
			}
			p1.add(w1, function () {
				_next(0);
			}).run();
		}
		function _next(i) {
			var destinations = to[i];
			if (!destinations) {
				return callback(new Error("Streams.Message.prototype.deliver: no destinations"));
			}
			if (typeof destinations === 'string') {
				destinations = [destinations];
			}
			var platforms = Q.Config.get('Users', 'apps', 'platforms', []);
			var p2 = new Q.Pipe();
			var waitFor = [];
			Q.each(destinations, function (i, d) {
				var emailAddress = (d.indexOf('email') >= 0 && uf.emailAddress)
					|| (d === 'email+pending' && uf.emailAddressPending);
				var mobileNumber = (d.indexOf('mobile') >= 0 && uf.mobileNumber)
					|| (d === 'mobile+pending' && uf.mobileNumberPending);
				// Give the app an opportunity to modify the fields or anything else
				Streams_Message.emit('deliver/before', o);
				if (emailAddress) {
					_email(emailAddress, p2.fill('email'));
					waitFor.push('email');
				}
				if (mobileNumber) {
					_mobile(mobileNumber, p2.fill('mobile'));
					waitFor.push('mobile');
				}
				if (d === 'devices') {
					_device(null, p2.fill(d));
					waitFor.push(d);
				}
				if (platforms.indexOf(d) >= 0) {
					_platform(p2.fill(d));
					waitFor.push(d);
				}
			});
			p2.add(waitFor, function (params) {
				var success = false;
				for (var k in params) {
					if (params[k][0]) {
						continue;
					}
					if (k === 'email' && params[k][1] === 'log') {
						// email was not sent
						continue;
					}
					if (k === 'mobile' && params[k][1] === 'log') {
						// mobile sms was not sent
						continue;
					}
					if (k === 'devices' && params[k][1].length === 0) {
						// no devices were reached
						continue;
					}
					if (platforms.indexOf(k) >= 0 && !params[k][1]) {
						// no platform apps were reached
						continue;
					}
					success = true;
				}
				if (success) {
					callback(null, result, params);
				} else {
					_next(i+1);
				}
			}).run();
		}
		function _email(emailAddress, callback) {
			o.destination = 'email';
			o.emailAddress = emailAddress;
			Streams_Message.emit('deliver/before', o);  // app may modify some fields
			var viewPath = messageType+'/email.handlebars';
			if (Q.Handlebars.template(viewPath) === null) {
				viewPath = 'Streams/message/email.handlebars';
			}
			Users.Email.sendMessage(
				emailAddress, o.subject, viewPath, o.fields, {
					html: true, 
					language: uf.preferredLanguage
				}, callback
			);
			result.push({'email': emailAddress});
		}
		function _mobile(mobileNumber, callback) {
			o.destination = 'mobile';
			o.mobileNumber = mobileNumber;
			Streams_Message.emit('deliver/before', o); // app may modify some fields
			var viewPath = messageType+'/mobile.handlebars';
			if (Q.Handlebars.template(viewPath) === null) {
				viewPath = 'Streams/message/mobile.handlebars';
			}
			Users.Mobile.sendMessage(mobileNumber, viewPath, o.fields, {language: uf.preferredLanguage}, callback);
			result.push({'mobile': mobileNumber});
		}
		function _device(deviceId, callback) {
			o.destination = 'devices';
			o.deviceId = deviceId;
			Streams_Message.emit('deliver/before', o); // app may modify some fields
			var viewPath = messageType+'/device.handlebars';
			if (!Q.Handlebars.template(viewPath)) {
				viewPath = 'Streams/message/device.handlebars';
			}

			Users.pushNotifications(
				toUserId, 
				{
					alert: { title: o.subject },
					payload: message.getAllInstructions(),
					url: o.url,
					icon: o.icon
				},
				callback, 
				{view: viewPath, fields: o.fields, language: uf.preferredLanguage},
				function (device) {
					if (deviceId && device.deviceId !== deviceId) {
					return false;
				}
			});
			result.push({'devices': deviceId || true});
		}
		function _platform(platform, callback) {
			var appId = Users.appInfo(platform).appId;
			Users.ExternalFrom.SELECT('*').WHERE({
				userId: toUserId,
				platform: platform,
				appId: appId
			}).execute(function (err, externals) {
				if (err) {
					return callback(err);
				}
				var e = externals[0];
				var notification = {
					alert: o.subject,
					href: o.url,
					ref: message.fields.type
				};
				if (e) {
					e.pushNotification(notification);
				}
				Q.handle(callback, Users, [null, e, notification]);
			});
		}
	});
Exemple #5
0
Mp.getInstruction = function _Message_prototype_get (instructionName) {
	var instr = this.getAllInstructions();
	return Q.getObject([instructionName], instr);
};