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); } } }); } };
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(); } });
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); }
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]); }); } });
Mp.getInstruction = function _Message_prototype_get (instructionName) { var instr = this.getAllInstructions(); return Q.getObject([instructionName], instr); };