switch from Q to Bluebird

This commit is contained in:
Matteo Pagliazzi
2016-05-11 14:34:01 +02:00
parent 299ed624f5
commit cee7700a50
43 changed files with 230 additions and 201 deletions

View File

@@ -30,7 +30,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
var MongoClient = MongoDB.MongoClient; var MongoClient = MongoDB.MongoClient;
mongoose.Promise = Q.Promise; // otherwise mongoose models won't work mongoose.Promise = Bluebird.all; // otherwise mongoose models won't work
// Load new models // Load new models
var NewChallenge = require('../../website/src/models/challenge').model; var NewChallenge = require('../../website/src/models/challenge').model;
@@ -165,7 +165,7 @@ function processChallenges (afterId) {
console.log(`Saving ${oldChallenges.length} challenges and ${processedTasks} tasks.`); console.log(`Saving ${oldChallenges.length} challenges and ${processedTasks} tasks.`);
return Q.all([ return Bluebird.all([
batchInsertChallenges.execute(), batchInsertChallenges.execute(),
batchInsertTasks.execute(), batchInsertTasks.execute(),
]); ]);
@@ -187,7 +187,7 @@ function processChallenges (afterId) {
} }
// Connect to the databases // Connect to the databases
Q.all([ Bluebird.all([
MongoClient.connect(MONGODB_OLD), MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW), MongoClient.connect(MONGODB_NEW),
]) ])

View File

@@ -30,7 +30,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
var MongoClient = MongoDB.MongoClient; var MongoClient = MongoDB.MongoClient;
mongoose.Promise = Q.Promise; // otherwise mongoose models won't work mongoose.Promise = Bluebird.all; // otherwise mongoose models won't work
// To be defined later when MongoClient connects // To be defined later when MongoClient connects
var mongoDbOldInstance; var mongoDbOldInstance;
@@ -103,7 +103,7 @@ function processChallenges (afterId) {
console.log(`Migrating members of ${oldChallenges.length} challenges.`); console.log(`Migrating members of ${oldChallenges.length} challenges.`);
return Q.all(promises); return Bluebird.all(promises);
}) })
.then(function () { .then(function () {
processedChallenges += oldChallenges.length; processedChallenges += oldChallenges.length;
@@ -119,7 +119,7 @@ function processChallenges (afterId) {
} }
// Connect to the databases // Connect to the databases
Q.all([ Bluebird.all([
MongoClient.connect(MONGODB_OLD), MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW), MongoClient.connect(MONGODB_NEW),
]) ])

View File

@@ -29,7 +29,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
var MongoClient = MongoDB.MongoClient; var MongoClient = MongoDB.MongoClient;
mongoose.Promise = Q.Promise; // otherwise mongoose models won't work mongoose.Promise = Bluebird.all; // otherwise mongoose models won't work
// Load new models // Load new models
var Coupon = require('../../website/src/models/coupon').model; var Coupon = require('../../website/src/models/coupon').model;
@@ -112,7 +112,7 @@ function processCoupons (afterId) {
} }
// Connect to the databases // Connect to the databases
Q.all([ Bluebird.all([
MongoClient.connect(MONGODB_OLD), MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW), MongoClient.connect(MONGODB_NEW),
]) ])

View File

@@ -29,7 +29,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
var MongoClient = MongoDB.MongoClient; var MongoClient = MongoDB.MongoClient;
mongoose.Promise = Q.Promise; // otherwise mongoose models won't work mongoose.Promise = Bluebird.all; // otherwise mongoose models won't work
// Load new models // Load new models
var EmailUnsubscription = require('../../website/src/models/emailUnsubscription').model; var EmailUnsubscription = require('../../website/src/models/emailUnsubscription').model;
@@ -113,7 +113,7 @@ function processUnsubscriptions (afterId) {
} }
// Connect to the databases // Connect to the databases
Q.all([ Bluebird.all([
MongoClient.connect(MONGODB_OLD), MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW), MongoClient.connect(MONGODB_NEW),
]) ])

View File

@@ -37,7 +37,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
var MongoClient = MongoDB.MongoClient; var MongoClient = MongoDB.MongoClient;
mongoose.Promise = Q.Promise; // otherwise mongoose models won't work mongoose.Promise = Bluebird.all; // otherwise mongoose models won't work
// Load new models // Load new models
var NewGroup = require('../../website/src/models/group').model; var NewGroup = require('../../website/src/models/group').model;
@@ -166,7 +166,7 @@ function processGroups (afterId) {
console.log(`Saving ${oldGroups.length} groups and migrating members to users collection.`); console.log(`Saving ${oldGroups.length} groups and migrating members to users collection.`);
promises.push(batchInsertGroups.execute()); promises.push(batchInsertGroups.execute());
return Q.all(promises); return Bluebird.all(promises);
}) })
.then(function () { .then(function () {
processedGroups += oldGroups.length; processedGroups += oldGroups.length;
@@ -182,7 +182,7 @@ function processGroups (afterId) {
} }
// Connect to the databases // Connect to the databases
Q.all([ Bluebird.all([
MongoClient.connect(MONGODB_OLD), MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW), MongoClient.connect(MONGODB_NEW),
]) ])

View File

@@ -33,7 +33,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
var taskDefaults = common.taskDefaults; var taskDefaults = common.taskDefaults;
var MongoClient = MongoDB.MongoClient; var MongoClient = MongoDB.MongoClient;
mongoose.Promise = Q.Promise; // otherwise mongoose models won't work mongoose.Promise = Bluebird.all; // otherwise mongoose models won't work
// Load new models // Load new models
var NewUser = require('../../website/src/models/user').model; var NewUser = require('../../website/src/models/user').model;
@@ -196,7 +196,7 @@ function processUsers (afterId) {
console.log(`Saving ${oldUsers.length} users and ${processedTasks} tasks.`); console.log(`Saving ${oldUsers.length} users and ${processedTasks} tasks.`);
return Q.all([ return Bluebird.all([
batchInsertUsers.execute(), batchInsertUsers.execute(),
batchInsertTasks.execute(), batchInsertTasks.execute(),
]); ]);
@@ -218,7 +218,7 @@ function processUsers (afterId) {
} }
// Connect to the databases // Connect to the databases
Q.all([ Bluebird.all([
MongoClient.connect(MONGODB_OLD), MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW), MongoClient.connect(MONGODB_NEW),
]) ])

View File

@@ -16,6 +16,7 @@
"babel-preset-es2015": "^6.6.0", "babel-preset-es2015": "^6.6.0",
"babel-register": "^6.6.0", "babel-register": "^6.6.0",
"babelify": "^7.2.0", "babelify": "^7.2.0",
"bluebird": "^3.3.5",
"body-parser": "^1.15.0", "body-parser": "^1.15.0",
"bower": "~1.3.12", "bower": "~1.3.12",
"browserify": "~12.0.1", "browserify": "~12.0.1",
@@ -67,7 +68,6 @@
"morgan": "^1.7.0", "morgan": "^1.7.0",
"nconf": "~0.8.2", "nconf": "~0.8.2",
"newrelic": "^1.27.2", "newrelic": "^1.27.2",
"uuid": "^2.0.1",
"nib": "^1.1.0", "nib": "^1.1.0",
"nodemailer": "^2.3.2", "nodemailer": "^2.3.2",
"object-path": "^0.9.2", "object-path": "^0.9.2",
@@ -79,7 +79,6 @@
"pretty-data": "^0.40.0", "pretty-data": "^0.40.0",
"ps-tree": "^1.0.0", "ps-tree": "^1.0.0",
"push-notify": "^1.1.1", "push-notify": "^1.1.1",
"q": "^1.4.1",
"request": "~2.72.0", "request": "~2.72.0",
"rimraf": "^2.4.3", "rimraf": "^2.4.3",
"run-sequence": "^1.1.4", "run-sequence": "^1.1.4",
@@ -89,11 +88,11 @@
"superagent": "^1.8.3", "superagent": "^1.8.3",
"swagger-node-express": "lefnire/swagger-node-express#habitrpg", "swagger-node-express": "lefnire/swagger-node-express#habitrpg",
"universal-analytics": "~0.3.2", "universal-analytics": "~0.3.2",
"uuid": "^2.0.1",
"validator": "^4.9.0", "validator": "^4.9.0",
"vinyl-buffer": "^1.0.0", "vinyl-buffer": "^1.0.0",
"vinyl-source-stream": "^1.1.0", "vinyl-source-stream": "^1.1.0",
"winston": "^2.1.0", "winston": "^2.1.0"
"uuid": "^2.0.1"
}, },
"private": true, "private": true,
"engines": { "engines": {

View File

@@ -9,7 +9,7 @@ import mongoose from 'mongoose';
import { exec } from 'child_process'; import { exec } from 'child_process';
import psTree from 'ps-tree'; import psTree from 'ps-tree';
import gulp from 'gulp'; import gulp from 'gulp';
import Q from 'q'; import Bluebird from 'bluebird';
import runSequence from 'run-sequence'; import runSequence from 'run-sequence';
import os from 'os'; import os from 'os';
import nconf from 'nconf'; import nconf from 'nconf';
@@ -265,7 +265,7 @@ gulp.task('test:e2e', ['test:prepare', 'test:prepare:server'], (cb) => {
].map(exec); ].map(exec);
support.push(server); support.push(server);
Q.all([ Bluebird.all([
awaitPort(TEST_SERVER_PORT), awaitPort(TEST_SERVER_PORT),
awaitPort(4444) awaitPort(4444)
]).then(() => { ]).then(() => {
@@ -286,7 +286,7 @@ gulp.task('test:e2e:safe', ['test:prepare', 'test:prepare:server'], (cb) => {
'npm run test:e2e:webdriver', 'npm run test:e2e:webdriver',
].map(exec); ].map(exec);
Q.all([ Bluebird.all([
awaitPort(TEST_SERVER_PORT), awaitPort(TEST_SERVER_PORT),
awaitPort(4444) awaitPort(4444)
]).then(() => { ]).then(() => {

View File

@@ -2,7 +2,7 @@ import { exec } from 'child_process';
import psTree from 'ps-tree'; import psTree from 'ps-tree';
import nconf from 'nconf'; import nconf from 'nconf';
import net from 'net'; import net from 'net';
import Q from 'q'; import Bluebird from 'bluebird';
import { post } from 'superagent'; import { post } from 'superagent';
import { sync as glob } from 'glob'; import { sync as glob } from 'glob';
import Mocha from 'mocha'; import Mocha from 'mocha';
@@ -44,12 +44,12 @@ export function kill(proc) {
* before failing. * before failing.
*/ */
export function awaitPort (port, max=60) { export function awaitPort (port, max=60) {
return new Bluebird((reject, resolve) => {
let socket, timeout, interval; let socket, timeout, interval;
let deferred = Q.defer();
timeout = setTimeout(() => { timeout = setTimeout(() => {
clearInterval(interval); clearInterval(interval);
deferred.reject(`Timed out after ${max} seconds`); reject(`Timed out after ${max} seconds`);
}, max * 1000); }, max * 1000);
interval = setInterval(() => { interval = setInterval(() => {
@@ -57,11 +57,10 @@ export function awaitPort(port, max=60) {
clearInterval(interval); clearInterval(interval);
clearTimeout(timeout); clearTimeout(timeout);
socket.destroy(); socket.destroy();
deferred.resolve(); resolve();
}).on('error', () => { socket.destroy }); }).on('error', () => { socket.destroy });
}, 1000); }, 1000);
});
return deferred.promise
}; };
/* /*

View File

@@ -6,8 +6,8 @@ superagentDefaults = require("superagent-defaults");
global.request = superagentDefaults(); global.request = superagentDefaults();
global.mongoose = require("mongoose"); global.mongoose = require("mongoose");
var Q = require('q'); var Bluebird = require('bluebird');
mongoose.Promise = Q.Promise; mongoose.Promise = Bluebird;
global.moment = require("moment"); global.moment = require("moment");

View File

@@ -8,7 +8,7 @@ import {
find, find,
map, map,
} from 'lodash'; } from 'lodash';
import Q from 'q'; import Bluebird from 'bluebird';
describe('DELETE /user', () => { describe('DELETE /user', () => {
let user; let user;
@@ -30,7 +30,7 @@ describe('DELETE /user', () => {
await user.del('/user'); await user.del('/user');
await Q.all(map(ids, id => { await Bluebird.all(map(ids, id => {
return expect(checkExistence('tasks', id)).to.eventually.eql(false); return expect(checkExistence('tasks', id)).to.eventually.eql(false);
})); }));
}); });

View File

@@ -2,7 +2,9 @@ import {
generateUser, generateUser,
} from '../../../../helpers/api-v3-integration.helper'; } from '../../../../helpers/api-v3-integration.helper';
import xml2js from 'xml2js'; import xml2js from 'xml2js';
import Q from 'q'; import Bluebird from 'bluebird';
let parseStringAsync = Bluebird.promisify(xml2js.parseString, {context: xml2js});
describe('GET /export/userdata.xml', () => { describe('GET /export/userdata.xml', () => {
it('should return a valid XML file with user data', async () => { it('should return a valid XML file with user data', async () => {
@@ -22,7 +24,7 @@ describe('GET /export/userdata.xml', () => {
]); ]);
let response = await user.get('/export/userdata.xml'); let response = await user.get('/export/userdata.xml');
let {user: res} = await Q.npost(xml2js, 'parseString', [response, {explicitArray: false}]); let {user: res} = await parseStringAsync(response, {explicitArray: false});
expect(res._id).to.equal(user._id); expect(res._id).to.equal(user._id);
expect(res).to.contain.all.keys(['tasks', 'flags', 'tasksOrder', 'auth']); expect(res).to.contain.all.keys(['tasks', 'flags', 'tasksOrder', 'auth']);

View File

@@ -10,7 +10,7 @@ import {
each, each,
map, map,
} from 'lodash'; } from 'lodash';
import Q from 'q'; import Bluebird from 'bluebird';
describe('DELETE /user', () => { describe('DELETE /user', () => {
let user; let user;
@@ -55,7 +55,7 @@ describe('DELETE /user', () => {
password, password,
}); });
await Q.all(map(ids, id => { await Bluebird.all(map(ids, id => {
return expect(checkExistence('tasks', id)).to.eventually.eql(false); return expect(checkExistence('tasks', id)).to.eventually.eql(false);
})); }));
}); });

View File

@@ -2,10 +2,25 @@
import request from 'request'; import request from 'request';
import nconf from 'nconf'; import nconf from 'nconf';
import nodemailer from 'nodemailer'; import nodemailer from 'nodemailer';
import Q from 'q'; import Bluebird from 'bluebird';
import requireAgain from 'require-again'; import requireAgain from 'require-again';
import logger from '../../../../../website/src/libs/api-v3/logger'; import logger from '../../../../../website/src/libs/api-v3/logger';
function defer () {
let resolve;
let reject;
let promise = new Bluebird(() => {
resolve = arguments[0];
reject = arguments[1];
});
return {
resolve,
reject,
promise,
};
}
function getUser () { function getUser () {
return { return {
_id: 'random _id', _id: 'random _id',
@@ -37,7 +52,7 @@ describe('emails', () => {
describe('sendEmail', () => { describe('sendEmail', () => {
it('can send an email using the default transport', () => { it('can send an email using the default transport', () => {
let sendMailSpy = sandbox.stub().returns(Q.defer().promise); let sendMailSpy = sandbox.stub().returns(defer().promise);
sandbox.stub(nodemailer, 'createTransport').returns({ sandbox.stub(nodemailer, 'createTransport').returns({
sendMail: sendMailSpy, sendMail: sendMailSpy,
@@ -49,7 +64,7 @@ describe('emails', () => {
}); });
it('logs errors', (done) => { it('logs errors', (done) => {
let deferred = Q.defer(); let deferred = defer();
let sendMailSpy = sandbox.stub().returns(deferred.promise); let sendMailSpy = sandbox.stub().returns(deferred.promise);
sandbox.stub(nodemailer, 'createTransport').returns({ sandbox.stub(nodemailer, 'createTransport').returns({

View File

@@ -8,7 +8,7 @@ import {
attachTranslateFunction, attachTranslateFunction,
} from '../../../../../website/src/middlewares/api-v3/language'; } from '../../../../../website/src/middlewares/api-v3/language';
import common from '../../../../../common'; import common from '../../../../../common';
import Q from 'q'; import Bluebird from 'bluebird';
import { model as User } from '../../../../../website/src/models/user'; import { model as User } from '../../../../../website/src/models/user';
const i18n = common.i18n; const i18n = common.i18n;
@@ -162,7 +162,7 @@ describe('language middleware', () => {
return this; return this;
}, },
exec () { exec () {
return Q.resolve({ return Bluebird.resolve({
preferences: { preferences: {
language: 'it', language: 'it',
}, },

View File

@@ -2,7 +2,7 @@ import {
times, times,
map, map,
} from 'lodash'; } from 'lodash';
import Q from 'q'; import Bluebird from 'bluebird';
import { v4 as generateUUID } from 'uuid'; import { v4 as generateUUID } from 'uuid';
import { ApiUser, ApiGroup, ApiChallenge } from '../api-classes'; import { ApiUser, ApiGroup, ApiChallenge } from '../api-classes';
import { requester } from '../requester'; import { requester } from '../requester';
@@ -57,7 +57,7 @@ export async function generateGroup (leader, details = {}, update = {}) {
guild: { guilds: [group._id] }, guild: { guilds: [group._id] },
}; };
await Q.all( await Bluebird.all(
map(members, (member) => { map(members, (member) => {
return member.update(groupMembershipTypes[group.type]); return member.update(groupMembershipTypes[group.type]);
}) })
@@ -96,7 +96,7 @@ export async function createAndPopulateGroup (settings = {}) {
guild: { guilds: [group._id] }, guild: { guilds: [group._id] },
}; };
let members = await Q.all( let members = await Bluebird.all(
times(numberOfMembers, () => { times(numberOfMembers, () => {
return generateUser(groupMembershipTypes[group.type]); return generateUser(groupMembershipTypes[group.type]);
}) })
@@ -104,7 +104,7 @@ export async function createAndPopulateGroup (settings = {}) {
await group.update({ memberCount: numberOfMembers + 1}); await group.update({ memberCount: numberOfMembers + 1});
let invitees = await Q.all( let invitees = await Bluebird.all(
times(numberOfInvites, () => { times(numberOfInvites, () => {
return generateUser(); return generateUser();
}) })
@@ -116,7 +116,7 @@ export async function createAndPopulateGroup (settings = {}) {
}); });
}); });
await Q.all(invitationPromises); await Bluebird.all(invitationPromises);
return { return {
groupLeader, groupLeader,

View File

@@ -1,7 +1,7 @@
import { import {
times, times,
} from 'lodash'; } from 'lodash';
import Q from 'q'; import Bluebird from 'bluebird';
import { v4 as generateUUID } from 'uuid'; import { v4 as generateUUID } from 'uuid';
import { ApiUser, ApiGroup, ApiChallenge } from '../api-classes'; import { ApiUser, ApiGroup, ApiChallenge } from '../api-classes';
import { requester } from '../requester'; import { requester } from '../requester';
@@ -106,7 +106,7 @@ export async function createAndPopulateGroup (settings = {}) {
guild: { guilds: [group._id] }, guild: { guilds: [group._id] },
}; };
let members = await Q.all( let members = await Bluebird.all(
times(numberOfMembers, () => { times(numberOfMembers, () => {
return generateUser(groupMembershipTypes[group.type]); return generateUser(groupMembershipTypes[group.type]);
}) })
@@ -114,7 +114,7 @@ export async function createAndPopulateGroup (settings = {}) {
await group.update({ memberCount: numberOfMembers + 1}); await group.update({ memberCount: numberOfMembers + 1});
let invitees = await Q.all( let invitees = await Bluebird.all(
times(numberOfInvites, () => { times(numberOfInvites, () => {
return generateUser(); return generateUser();
}) })
@@ -126,7 +126,7 @@ export async function createAndPopulateGroup (settings = {}) {
}); });
}); });
await Q.all(invitationPromises); await Bluebird.all(invitationPromises);
return { return {
groupLeader, groupLeader,

View File

@@ -1,10 +1,12 @@
/* eslint-disable no-undef */ /* eslint-disable no-undef */
/* eslint-disable global-require */ /* eslint-disable global-require */
/* eslint-disable no-process-env */ /* eslint-disable no-process-env */
import Bluebird from 'bluebird';
//------------------------------ //------------------------------
// Global modules // Global modules
//------------------------------ //------------------------------
global._ = require('lodash'); global._ = require('lodash');
global.chai = require('chai'); global.chai = require('chai');
chai.use(require('sinon-chai')); chai.use(require('sinon-chai'));
@@ -12,10 +14,10 @@ chai.use(require('chai-as-promised'));
global.expect = chai.expect; global.expect = chai.expect;
global.sinon = require('sinon'); global.sinon = require('sinon');
global.sandbox = sinon.sandbox.create(); global.sandbox = sinon.sandbox.create();
global.Promise = Bluebird;
import nconf from 'nconf'; import nconf from 'nconf';
import mongoose from 'mongoose'; import mongoose from 'mongoose';
import Q from 'q';
//------------------------------ //------------------------------
// Load nconf for unit tests // Load nconf for unit tests
@@ -23,7 +25,7 @@ import Q from 'q';
if (process.env.LOAD_SERVER === '0') { // when the server is in a different process we simply connect to mongoose if (process.env.LOAD_SERVER === '0') { // when the server is in a different process we simply connect to mongoose
require('../../website/src/libs/api-v3/setupNconf')('./config.json'); require('../../website/src/libs/api-v3/setupNconf')('./config.json');
// Use Q promises instead of mpromise in mongoose // Use Q promises instead of mpromise in mongoose
mongoose.Promise = Q.Promise; mongoose.Promise = Bluebird;
mongoose.connect(nconf.get('NODE_DB_URI')); mongoose.connect(nconf.get('NODE_DB_URI'));
} else { // When running tests and the server in the same process } else { // When running tests and the server in the same process
require('../../website/src/libs/api-v3/setupNconf')('./config.json.example'); require('../../website/src/libs/api-v3/setupNconf')('./config.json.example');

View File

@@ -3,7 +3,7 @@ var chai = require("chai");
chai.use(require("sinon-chai")); chai.use(require("sinon-chai"));
var expect = chai.expect; var expect = chai.expect;
var Q = require('q'); var Bluebird = require('bluebird');
var Group = require('../../../website/src/models/group').model; var Group = require('../../../website/src/models/group').model;
var groupsController = require('../../../website/src/controllers/api-v2/groups'); var groupsController = require('../../../website/src/controllers/api-v2/groups');
@@ -301,7 +301,7 @@ describe('Groups Controller', function() {
}); });
afterEach(function() { afterEach(function() {
Q.all.restore(); Promise.all.restore();
}); });
context('error conditions', function() { context('error conditions', function() {
@@ -342,7 +342,7 @@ describe('Groups Controller', function() {
}); });
it('sends 500 if group cannot save', function() { it('sends 500 if group cannot save', function() {
Q.all.returns({ Promise.all.returns({
done: sinon.stub().callsArgWith(1, {err: 'save error'}) done: sinon.stub().callsArgWith(1, {err: 'save error'})
}); });
var nextSpy = sinon.spy(); var nextSpy = sinon.spy();

View File

@@ -21,7 +21,7 @@ var csvStringify = require('csv-stringify');
var utils = require('../../libs/api-v2/utils'); var utils = require('../../libs/api-v2/utils');
var api = module.exports; var api = module.exports;
var pushNotify = require('./pushNotifications'); var pushNotify = require('./pushNotifications');
import Q from 'q'; import Bluebird from 'bluebird';
import v3MembersController from '../api-v3/members'; import v3MembersController from '../api-v3/members';
/* /*
------------------------------------------------------------------------ ------------------------------------------------------------------------
@@ -56,8 +56,8 @@ api.list = async function(req, res, next) {
}); });
// TODO Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 // TODO Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833
await Q.all(resChals.map((chal, index) => { await Bluebird.all(resChals.map((chal, index) => {
return Q.all([ return Bluebird.all([
User.findById(chal.leader).select(nameFields).exec(), User.findById(chal.leader).select(nameFields).exec(),
Group.findById(chal.group).select(basicGroupFields).exec(), Group.findById(chal.group).select(basicGroupFields).exec(),
]).then(populatedData => { ]).then(populatedData => {
@@ -207,7 +207,7 @@ api.create = async function(req, res, next){
return newTask.save(); return newTask.save();
}); });
let results = await Q.all([challenge.save({ let results = await Bluebird.all([challenge.save({
validateBeforeSave: false, // already validated validateBeforeSave: false, // already validated
}), group.save()].concat(chalTasks)); }), group.save()].concat(chalTasks));
let savedChal = results[0]; let savedChal = results[0];
@@ -346,7 +346,7 @@ api.join = async function(req, res, next){
challenge.memberCount += 1; challenge.memberCount += 1;
// Add all challenge's tasks to user's tasks and save the challenge // Add all challenge's tasks to user's tasks and save the challenge
await Q.all([challenge.syncToUser(user), challenge.save()]); await Bluebird.all([challenge.syncToUser(user), challenge.save()]);
challenge.getTransformedData({ challenge.getTransformedData({
cb (err, transformedChal) { cb (err, transformedChal) {
@@ -377,7 +377,7 @@ api.leave = async function(req, res, next){
challenge.memberCount -= 1; challenge.memberCount -= 1;
// Unlink challenge's tasks from user's tasks and save the challenge // Unlink challenge's tasks from user's tasks and save the challenge
await Q.all([challenge.unlinkTasks(user, keep), challenge.save()]); await Bluebird.all([challenge.unlinkTasks(user, keep), challenge.save()]);
challenge.getTransformedData({ challenge.getTransformedData({
cb (err, transformedChal) { cb (err, transformedChal) {
@@ -416,7 +416,7 @@ api.unlink = async function(req, res, next) {
} else { // remove } else { // remove
if (task.type !== 'todo' || !task.completed) { // eslint-disable-line no-lonely-if if (task.type !== 'todo' || !task.completed) { // eslint-disable-line no-lonely-if
removeFromArray(user.tasksOrder[`${task.type}s`], tid); removeFromArray(user.tasksOrder[`${task.type}s`], tid);
await Q.all([user.save(), task.remove()]); await Bluebird.all([user.save(), task.remove()]);
} else { } else {
await task.remove(); await task.remove();
} }

View File

@@ -1013,7 +1013,7 @@ api.questAccept = function(req, res, next) {
if (canStartQuestAutomatically(group)) { if (canStartQuestAutomatically(group)) {
group.startQuest(user).then(() => { group.startQuest(user).then(() => {
return Q.all([group.save(), user.save()]) return Bluebird.all([group.save(), user.save()])
}) })
.then(results => { .then(results => {
results[0].getTransformedData({ results[0].getTransformedData({
@@ -1027,7 +1027,7 @@ api.questAccept = function(req, res, next) {
.catch(next); .catch(next);
} else { } else {
Q.all([group.save(), user.save()]) Bluebird.all([group.save(), user.save()])
.then(results => { .then(results => {
results[0].getTransformedData({ results[0].getTransformedData({
cb (err, groupTransformed) { cb (err, groupTransformed) {
@@ -1049,7 +1049,7 @@ api.questAccept = function(req, res, next) {
if (canStartQuestAutomatically(group)) { if (canStartQuestAutomatically(group)) {
group.startQuest(user).then(() => { group.startQuest(user).then(() => {
return Q.all([group.save(), user.save()]) return Bluebird.all([group.save(), user.save()])
}) })
.then(results => { .then(results => {
results[0].getTransformedData({ results[0].getTransformedData({
@@ -1063,7 +1063,7 @@ api.questAccept = function(req, res, next) {
.catch(next); .catch(next);
} else { } else {
Q.all([group.save(), user.save()]) Bluebird.all([group.save(), user.save()])
.then(results => { .then(results => {
results[0].getTransformedData({ results[0].getTransformedData({
cb (err, groupTransformed) { cb (err, groupTransformed) {
@@ -1090,7 +1090,7 @@ api.questReject = function(req, res, next) {
if (canStartQuestAutomatically(group)) { if (canStartQuestAutomatically(group)) {
group.startQuest(user).then(() => { group.startQuest(user).then(() => {
return Q.all([group.save(), user.save()]) return Bluebird.all([group.save(), user.save()])
}) })
.then(results => { .then(results => {
results[0].getTransformedData({ results[0].getTransformedData({
@@ -1104,7 +1104,7 @@ api.questReject = function(req, res, next) {
.catch(next); .catch(next);
} else { } else {
Q.all([group.save(), user.save()]) Bluebird.all([group.save(), user.save()])
.then(results => { .then(results => {
results[0].getTransformedData({ results[0].getTransformedData({
cb (err, groupTransformed) { cb (err, groupTransformed) {
@@ -1124,7 +1124,7 @@ api.questCancel = function(req, res, next){
group.quest = Group.cleanGroupQuest(); group.quest = Group.cleanGroupQuest();
group.markModified('quest'); group.markModified('quest');
Q.all([ Bluebird.all([
group.save(), group.save(),
User.update( User.update(
{'party._id': group._id}, {'party._id': group._id},
@@ -1167,7 +1167,7 @@ api.questAbort = function(req, res, next){
group.quest = Group.cleanGroupQuest(); group.quest = Group.cleanGroupQuest();
group.markModified('quest'); group.markModified('quest');
Q.all([group.save(), memberUpdates, questLeaderUpdate]) Bluebird.all([group.save(), memberUpdates, questLeaderUpdate])
.then(results => { .then(results => {
results[0].getTransformedData({ results[0].getTransformedData({
cb (err, groupTransformed) { cb (err, groupTransformed) {
@@ -1203,10 +1203,10 @@ api.questLeave = function(req, res, next) {
user.party.quest = Group.cleanQuestProgress(); user.party.quest = Group.cleanQuestProgress();
user.markModified('party.quest'); user.markModified('party.quest');
var groupSavePromise = Q.nbind(group.save, group); var groupSavePromise = Bluebird.promisify(group.save, {context: group});
var userSavePromise = Q.nbind(user.save, user); var userSavePromise = Bluebird.promisify(user.save, {context: user});
Q.all([groupSavePromise(), userSavePromise()]) Bluebird.all([groupSavePromise(), userSavePromise()])
.done(function(values) { .done(function(values) {
return res.sendStatus(204); return res.sendStatus(204);
}, function(error) { }, function(error) {

View File

@@ -12,7 +12,7 @@ import {
} from '../../libs/api-v3/errors'; } from '../../libs/api-v3/errors';
import { model as Tag } from '../../models/tag'; import { model as Tag } from '../../models/tag';
import * as Tasks from '../../models/task'; import * as Tasks from '../../models/task';
import Q from 'q'; import Bluebird from 'bluebird';
import {removeFromArray} from './../../libs/api-v3/collectionManipulators'; import {removeFromArray} from './../../libs/api-v3/collectionManipulators';
var utils = require('./../../libs/api-v2/utils'); var utils = require('./../../libs/api-v2/utils');
var analytics = utils.analytics; var analytics = utils.analytics;
@@ -434,7 +434,7 @@ api.delete = function(req, res, next) {
Group.getGroups({user, types, groupFields}) Group.getGroups({user, types, groupFields})
.then(groups => { .then(groups => {
return Q.all(groups.map((group) => { return Bluebird.all(groups.map((group) => {
return group.leave(user, 'remove-all'); return group.leave(user, 'remove-all');
})); }));
}) })
@@ -651,7 +651,7 @@ api.cast = async function(req, res, next) {
let toSave = tasks.filter(t => t.isModified()); let toSave = tasks.filter(t => t.isModified());
let isUserModified = user.isModified(); let isUserModified = user.isModified();
toSave.unshift(user.save()); toSave.unshift(user.save());
let saved = await Q.all(toSave); let saved = await Bluebird.all(toSave);
} else if (targetType === 'party' || targetType === 'user') { } else if (targetType === 'party' || targetType === 'user') {
let party = await Group.getGroup({groupId: 'party', user}); let party = await Group.getGroup({groupId: 'party', user});
// arrays of users when targetType is 'party' otherwise single users // arrays of users when targetType is 'party' otherwise single users
@@ -665,7 +665,7 @@ api.cast = async function(req, res, next) {
} }
spell.cast(user, partyMembers, req); spell.cast(user, partyMembers, req);
await Q.all(partyMembers.map(m => m.save())); await Bluebird.all(partyMembers.map(m => m.save()));
} else { } else {
if (!party && (!targetId || user._id === targetId)) { if (!party && (!targetId || user._id === targetId)) {
partyMembers = user; partyMembers = user;
@@ -678,7 +678,7 @@ api.cast = async function(req, res, next) {
if (partyMembers === user) { if (partyMembers === user) {
await partyMembers.save(); await partyMembers.save();
} else { } else {
await Q.all([ await Bluebird.all([
await partyMembers.save(), await partyMembers.save(),
await user.save(), await user.save(),
]); ]);
@@ -869,7 +869,7 @@ api.addTask = function(req, res, next) {
let validationErrors = task.validateSync(); let validationErrors = task.validateSync();
if (validationErrors) return next(validationErrors); if (validationErrors) return next(validationErrors);
Q.all([ Bluebird.all([
user.save(), user.save(),
task.save({validateBeforeSave: false}) // already done ^ task.save({validateBeforeSave: false}) // already done ^
]).then(results => { ]).then(results => {

View File

@@ -10,7 +10,7 @@ import {
BadRequest, BadRequest,
NotFound, NotFound,
} from '../../libs/api-v3/errors'; } from '../../libs/api-v3/errors';
import Q from 'q'; import Bluebird from 'bluebird';
import * as passwordUtils from '../../libs/api-v3/password'; import * as passwordUtils from '../../libs/api-v3/password';
import logger from '../../libs/api-v3/logger'; import logger from '../../libs/api-v3/logger';
import { model as User } from '../../models/user'; import { model as User } from '../../models/user';
@@ -215,17 +215,15 @@ api.loginLocal = {
}; };
function _passportFbProfile (accessToken) { function _passportFbProfile (accessToken) {
let deferred = Q.defer(); return new Bluebird((resolve, reject) => {
passport._strategies.facebook.userProfile(accessToken, (err, profile) => { passport._strategies.facebook.userProfile(accessToken, (err, profile) => {
if (err) { if (err) {
deferred.rejec(); reject(err);
} else { } else {
deferred.resolve(profile); resolve(profile);
} }
}); });
});
return deferred.promise;
} }
// Called as a callback by Facebook (or other social providers). Internal route // Called as a callback by Facebook (or other social providers). Internal route

View File

@@ -15,7 +15,7 @@ import {
NotAuthorized, NotAuthorized,
} from '../../libs/api-v3/errors'; } from '../../libs/api-v3/errors';
import * as Tasks from '../../models/task'; import * as Tasks from '../../models/task';
import Q from 'q'; import Bluebird from 'bluebird';
import csvStringify from '../../libs/api-v3/csvStringify'; import csvStringify from '../../libs/api-v3/csvStringify';
let api = {}; let api = {};
@@ -87,7 +87,7 @@ api.createChallenge = {
let challengeValidationErrors = challenge.validateSync(); let challengeValidationErrors = challenge.validateSync();
if (challengeValidationErrors) throw challengeValidationErrors; if (challengeValidationErrors) throw challengeValidationErrors;
let results = await Q.all([challenge.save({ let results = await Bluebird.all([challenge.save({
validateBeforeSave: false, // already validate validateBeforeSave: false, // already validate
}), group.save()]); }), group.save()]);
let savedChal = results[0]; let savedChal = results[0];
@@ -141,7 +141,7 @@ api.joinChallenge = {
challenge.memberCount += 1; challenge.memberCount += 1;
// Add all challenge's tasks to user's tasks and save the challenge // Add all challenge's tasks to user's tasks and save the challenge
let results = await Q.all([challenge.syncToUser(user), challenge.save()]); let results = await Bluebird.all([challenge.syncToUser(user), challenge.save()]);
let response = results[1].toJSON(); let response = results[1].toJSON();
response.group = { // we already have the group data response.group = { // we already have the group data
@@ -190,7 +190,7 @@ api.leaveChallenge = {
challenge.memberCount -= 1; challenge.memberCount -= 1;
// Unlink challenge's tasks from user's tasks and save the challenge // Unlink challenge's tasks from user's tasks and save the challenge
await Q.all([challenge.unlinkTasks(user, keep), challenge.save()]); await Bluebird.all([challenge.unlinkTasks(user, keep), challenge.save()]);
res.respond(200, {}); res.respond(200, {});
}, },
}; };
@@ -226,8 +226,8 @@ api.getUserChallenges = {
let resChals = challenges.map(challenge => challenge.toJSON()); let resChals = challenges.map(challenge => challenge.toJSON());
// Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833
await Q.all(resChals.map((chal, index) => { await Bluebird.all(resChals.map((chal, index) => {
return Q.all([ return Bluebird.all([
User.findById(chal.leader).select(nameFields).exec(), User.findById(chal.leader).select(nameFields).exec(),
Group.findById(chal.group).select(basicGroupFields).exec(), Group.findById(chal.group).select(basicGroupFields).exec(),
]).then(populatedData => { ]).then(populatedData => {
@@ -274,7 +274,7 @@ api.getGroupChallenges = {
let resChals = challenges.map(challenge => challenge.toJSON()); let resChals = challenges.map(challenge => challenge.toJSON());
// Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833
await Q.all(resChals.map((chal, index) => { await Bluebird.all(resChals.map((chal, index) => {
return User.findById(chal.leader).select(nameFields).exec().then(populatedLeader => { return User.findById(chal.leader).select(nameFields).exec().then(populatedLeader => {
resChals[index].leader = populatedLeader ? populatedLeader.toJSON({minimize: true}) : null; resChals[index].leader = populatedLeader ? populatedLeader.toJSON({minimize: true}) : null;
}); });
@@ -358,7 +358,7 @@ api.exportChallengeCsv = {
// In v2 this used the aggregation framework to run some computation on MongoDB but then iterated through all // In v2 this used the aggregation framework to run some computation on MongoDB but then iterated through all
// results on the server so the perf difference isn't that big (hopefully) // results on the server so the perf difference isn't that big (hopefully)
let [members, tasks] = await Q.all([ let [members, tasks] = await Bluebird.all([
User.find({challenges: challengeId}) User.find({challenges: challengeId})
.select(nameFields) .select(nameFields)
.sort({_id: 1}) .sort({_id: 1})

View File

@@ -12,7 +12,7 @@ import _ from 'lodash';
import { removeFromArray } from '../../libs/api-v3/collectionManipulators'; import { removeFromArray } from '../../libs/api-v3/collectionManipulators';
import { sendTxn } from '../../libs/api-v3/email'; import { sendTxn } from '../../libs/api-v3/email';
import nconf from 'nconf'; import nconf from 'nconf';
import Q from 'q'; import Bluebird from 'bluebird';
const FLAG_REPORT_EMAILS = nconf.get('FLAG_REPORT_EMAIL').split(',').map((email) => { const FLAG_REPORT_EMAILS = nconf.get('FLAG_REPORT_EMAIL').split(',').map((email) => {
return { email, canSend: true }; return { email, canSend: true };
@@ -95,7 +95,7 @@ api.postChat = {
toSave.push(user.save()); toSave.push(user.save());
} }
let [savedGroup] = await Q.all(toSave); let [savedGroup] = await Bluebird.all(toSave);
if (chatUpdated) { if (chatUpdated) {
res.respond(200, {chat: Group.toJSONCleanChat(savedGroup, user).chat}); res.respond(200, {chat: Group.toJSONCleanChat(savedGroup, user).chat});
} else { } else {

View File

@@ -1,17 +1,17 @@
import common from '../../../../common'; import common from '../../../../common';
import _ from 'lodash'; import _ from 'lodash';
import { langCodes } from '../../libs/api-v3/i18n'; import { langCodes } from '../../libs/api-v3/i18n';
import Q from 'q'; import Bluebird from 'bluebird';
import fsCallback from 'fs'; import fsCallback from 'fs';
import path from 'path'; import path from 'path';
import logger from '../../libs/api-v3/logger'; import logger from '../../libs/api-v3/logger';
// Transform fs methods that accept callbacks in ones that return promises // Transform fs methods that accept callbacks in ones that return promises
const fs = { const fs = {
readFile: Q.denodeify(fsCallback.readFile), readFile: Bluebird.promisify(fsCallback.readFile, {context: fsCallback}),
writeFile: Q.denodeify(fsCallback.writeFile), writeFile: Bluebird.promisify(fsCallback.writeFile, {context: fsCallback}),
stat: Q.denodeify(fsCallback.stat), stat: Bluebird.promisify(fsCallback.stat, {context: fsCallback}),
mkdir: Q.denodeify(fsCallback.mkdir), mkdir: Bluebird.promisify(fsCallback.mkdir, {context: fsCallback}),
}; };
let api = {}; let api = {};

View File

@@ -1,5 +1,5 @@
import { authWithHeaders } from '../../middlewares/api-v3/auth'; import { authWithHeaders } from '../../middlewares/api-v3/auth';
import Q from 'q'; import Bluebird from 'bluebird';
import _ from 'lodash'; import _ from 'lodash';
import { import {
INVITES_LIMIT, INVITES_LIMIT,
@@ -55,7 +55,7 @@ api.createGroup = {
user.party._id = group._id; user.party._id = group._id;
} }
let results = await Q.all([user.save(), group.save()]); let results = await Bluebird.all([user.save(), group.save()]);
let savedGroup = results[1]; let savedGroup = results[1];
// Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833
@@ -274,7 +274,7 @@ api.joinGroup = {
} }
} }
await Q.all(promises); await Bluebird.all(promises);
let response = Group.toJSONCleanChat(promises[0], user); let response = Group.toJSONCleanChat(promises[0], user);
response.leader = (await User.findById(response.leader).select(nameFields).exec()).toJSON({minimize: true}); response.leader = (await User.findById(response.leader).select(nameFields).exec()).toJSON({minimize: true});
@@ -475,7 +475,7 @@ api.removeGroupMember = {
let message = req.query.message; let message = req.query.message;
if (message) _sendMessageToRemoved(group, member, message); if (message) _sendMessageToRemoved(group, member, message);
await Q.all([ await Bluebird.all([
member.save(), member.save(),
group.save(), group.save(),
]); ]);
@@ -653,13 +653,13 @@ api.inviteToGroup = {
if (uuids) { if (uuids) {
let uuidInvites = uuids.map((uuid) => _inviteByUUID(uuid, group, user, req, res)); let uuidInvites = uuids.map((uuid) => _inviteByUUID(uuid, group, user, req, res));
let uuidResults = await Q.all(uuidInvites); let uuidResults = await Bluebird.all(uuidInvites);
results.push(...uuidResults); results.push(...uuidResults);
} }
if (emails) { if (emails) {
let emailInvites = emails.map((invite) => _inviteByEmail(invite, group, user, req, res)); let emailInvites = emails.map((invite) => _inviteByEmail(invite, group, user, req, res));
let emailResults = await Q.all(emailInvites); let emailResults = await Bluebird.all(emailInvites);
results.push(...emailResults); results.push(...emailResults);
} }

View File

@@ -15,7 +15,7 @@ import {
getUserInfo, getUserInfo,
sendTxn as sendTxnEmail, sendTxn as sendTxnEmail,
} from '../../libs/api-v3/email'; } from '../../libs/api-v3/email';
import Q from 'q'; import Bluebird from 'bluebird';
import sendPushNotification from '../../libs/api-v3/pushNotifications'; import sendPushNotification from '../../libs/api-v3/pushNotifications';
let api = {}; let api = {};
@@ -330,7 +330,7 @@ api.transferGems = {
receiver.balance += amount; receiver.balance += amount;
sender.balance -= amount; sender.balance -= amount;
let promises = [receiver.save(), sender.save()]; let promises = [receiver.save(), sender.save()];
await Q.all(promises); await Bluebird.all(promises);
let message = res.t('privateMessageGiftIntro', { let message = res.t('privateMessageGiftIntro', {
receiverName: receiver.profile.name, receiverName: receiver.profile.name,

View File

@@ -1,5 +1,5 @@
import _ from 'lodash'; import _ from 'lodash';
import Q from 'q'; import Bluebird from 'bluebird';
import { authWithHeaders } from '../../middlewares/api-v3/auth'; import { authWithHeaders } from '../../middlewares/api-v3/auth';
import analytics from '../../libs/api-v3/analyticsService'; import analytics from '../../libs/api-v3/analyticsService';
import { import {
@@ -95,7 +95,7 @@ api.inviteToQuest = {
await group.startQuest(user); await group.startQuest(user);
} }
let [savedGroup] = await Q.all([ let [savedGroup] = await Bluebird.all([
group.save(), group.save(),
user.save(), user.save(),
]); ]);
@@ -170,7 +170,7 @@ api.acceptQuest = {
await group.startQuest(user); await group.startQuest(user);
} }
let [savedGroup] = await Q.all([ let [savedGroup] = await Bluebird.all([
group.save(), group.save(),
user.save(), user.save(),
]); ]);
@@ -229,7 +229,7 @@ api.rejectQuest = {
await group.startQuest(user); await group.startQuest(user);
} }
let [savedGroup] = await Q.all([ let [savedGroup] = await Bluebird.all([
group.save(), group.save(),
user.save(), user.save(),
]); ]);
@@ -282,7 +282,7 @@ api.forceStart = {
await group.startQuest(user); await group.startQuest(user);
let [savedGroup] = await Q.all([ let [savedGroup] = await Bluebird.all([
group.save(), group.save(),
user.save(), user.save(),
]); ]);
@@ -336,7 +336,7 @@ api.cancelQuest = {
group.quest = Group.cleanGroupQuest(); group.quest = Group.cleanGroupQuest();
group.markModified('quest'); group.markModified('quest');
let [savedGroup] = await Q.all([ let [savedGroup] = await Bluebird.all([
group.save(), group.save(),
User.update( User.update(
{'party._id': groupId}, {'party._id': groupId},
@@ -397,7 +397,7 @@ api.abortQuest = {
group.quest = Group.cleanGroupQuest(); group.quest = Group.cleanGroupQuest();
group.markModified('quest'); group.markModified('quest');
let [groupSaved] = await Q.all([group.save(), memberUpdates, questLeaderUpdate]); let [groupSaved] = await Bluebird.all([group.save(), memberUpdates, questLeaderUpdate]);
res.respond(200, groupSaved.quest); res.respond(200, groupSaved.quest);
}, },
@@ -440,7 +440,7 @@ api.leaveQuest = {
user.party.quest = Group.cleanQuestProgress(); user.party.quest = Group.cleanQuestProgress();
user.markModified('party.quest'); user.markModified('party.quest');
let [savedGroup] = await Q.all([ let [savedGroup] = await Bluebird.all([
group.save(), group.save(),
user.save(), user.save(),
]); ]);

View File

@@ -10,7 +10,7 @@ import {
BadRequest, BadRequest,
} from '../../libs/api-v3/errors'; } from '../../libs/api-v3/errors';
import common from '../../../../common'; import common from '../../../../common';
import Q from 'q'; import Bluebird from 'bluebird';
import _ from 'lodash'; import _ from 'lodash';
import logger from '../../libs/api-v3/logger'; import logger from '../../libs/api-v3/logger';
@@ -48,7 +48,7 @@ async function _createTasks (req, res, user, challenge) {
toSave.unshift((challenge || user).save()); toSave.unshift((challenge || user).save());
let tasks = await Q.all(toSave); let tasks = await Bluebird.all(toSave);
tasks.splice(0, 1); // Remove user or challenge tasks.splice(0, 1); // Remove user or challenge
return tasks; return tasks;
} }
@@ -393,7 +393,7 @@ api.scoreTask = {
} }
} }
let results = await Q.all([ let results = await Bluebird.all([
user.save(), user.save(),
task.save(), task.save(),
]); ]);
@@ -789,7 +789,7 @@ api.unlinkTask = {
} else { // remove } else { // remove
if (task.type !== 'todo' || !task.completed) { // eslint-disable-line no-lonely-if if (task.type !== 'todo' || !task.completed) { // eslint-disable-line no-lonely-if
removeFromArray(user.tasksOrder[`${task.type}s`], taskId); removeFromArray(user.tasksOrder[`${task.type}s`], taskId);
await Q.all([user.save(), task.remove()]); await Bluebird.all([user.save(), task.remove()]);
} else { } else {
await task.remove(); await task.remove();
} }
@@ -870,7 +870,7 @@ api.deleteTask = {
if (task.type !== 'todo' || !task.completed) { if (task.type !== 'todo' || !task.completed) {
removeFromArray((challenge || user).tasksOrder[`${task.type}s`], taskId); removeFromArray((challenge || user).tasksOrder[`${task.type}s`], taskId);
await Q.all([(challenge || user).save(), task.remove()]); await Bluebird.all([(challenge || user).save(), task.remove()]);
} else { } else {
await task.remove(); await task.remove();
} }

View File

@@ -11,7 +11,7 @@ import {
model as Group, model as Group,
} from '../../models/group'; } from '../../models/group';
import { model as User } from '../../models/user'; import { model as User } from '../../models/user';
import Q from 'q'; import Bluebird from 'bluebird';
import _ from 'lodash'; import _ from 'lodash';
import * as firebase from '../../libs/api-v3/firebase'; import * as firebase from '../../libs/api-v3/firebase';
import * as passwordUtils from '../../libs/api-v3/password'; import * as passwordUtils from '../../libs/api-v3/password';
@@ -218,7 +218,7 @@ api.deleteUser = {
return group.leave(user, 'remove-all'); return group.leave(user, 'remove-all');
}); });
await Q.all(groupLeavePromises); await Bluebird.all(groupLeavePromises);
await Tasks.Task.remove({ await Tasks.Task.remove({
userId: user._id, userId: user._id,
@@ -351,7 +351,7 @@ api.castSpell = {
spell.cast(user, task, req); spell.cast(user, task, req);
if (user.isModified()) { if (user.isModified()) {
await Q.all([ await Bluebird.all([
user.save(), user.save(),
task.save(), task.save(),
]); ]);
@@ -380,7 +380,7 @@ api.castSpell = {
let isUserModified = user.isModified(); let isUserModified = user.isModified();
if (isUserModified) toSave.unshift(user.save()); if (isUserModified) toSave.unshift(user.save());
let saved = await Q.all(toSave); let saved = await Bluebird.all(toSave);
let response = { let response = {
tasks: isUserModified ? _.rest(saved) : saved, tasks: isUserModified ? _.rest(saved) : saved,
@@ -400,7 +400,7 @@ api.castSpell = {
} }
spell.cast(user, partyMembers, req); spell.cast(user, partyMembers, req);
await Q.all(partyMembers.map(m => m.save())); await Bluebird.all(partyMembers.map(m => m.save()));
} else { } else {
if (!party && (!targetId || user._id === targetId)) { if (!party && (!targetId || user._id === targetId)) {
partyMembers = user; partyMembers = user;
@@ -413,7 +413,7 @@ api.castSpell = {
if (!partyMembers) throw new NotFound(res.t('userWithIDNotFound', {userId: targetId})); if (!partyMembers) throw new NotFound(res.t('userWithIDNotFound', {userId: targetId}));
spell.cast(user, partyMembers, req); spell.cast(user, partyMembers, req);
if (user.isModified()) { if (user.isModified()) {
await Q.all([ await Bluebird.all([
user.save(), user.save(),
partyMembers.save(), partyMembers.save(),
]); ]);
@@ -1105,7 +1105,7 @@ api.userRebirth = {
await user.save(); await user.save();
await Q.all(tasks.map(task => task.save())); await Bluebird.all(tasks.map(task => task.save()));
res.respond(200, ...rebirthRes); res.respond(200, ...rebirthRes);
}, },
@@ -1201,7 +1201,7 @@ api.userReroll = {
let promises = tasks.map(task => task.save()); let promises = tasks.map(task => task.save());
promises.push(user.save()); promises.push(user.save());
await Q.all(promises); await Bluebird.all(promises);
res.respond(200, ...rerollRes); res.respond(200, ...rerollRes);
}, },
@@ -1254,7 +1254,7 @@ api.userReset = {
let resetRes = common.ops.reset(user, tasks); let resetRes = common.ops.reset(user, tasks);
await Q.all([Tasks.Task.remove({_id: {$in: resetRes[0].tasksToRemove}, userId: user._id}), user.save()]); await Bluebird.all([Tasks.Task.remove({_id: {$in: resetRes[0].tasksToRemove}, userId: user._id}), user.save()]);
res.respond(200, ...resetRes); res.respond(200, ...resetRes);
}, },

View File

@@ -12,7 +12,7 @@ import Pageres from 'pageres';
import AWS from 'aws-sdk'; import AWS from 'aws-sdk';
import nconf from 'nconf'; import nconf from 'nconf';
import got from 'got'; import got from 'got';
import Q from 'q'; import Bluebird from 'bluebird';
import locals from '../../middlewares/api-v3/locals'; import locals from '../../middlewares/api-v3/locals';
let S3 = new AWS.S3({ let S3 = new AWS.S3({
@@ -222,7 +222,16 @@ api.exportUserAvatarPng = {
Body: stream, Body: stream,
}); });
let s3res = await Q.ninvoke(s3upload, 'send'); let s3res = await new Bluebird((resolve, reject) => {
s3upload.send((err, s3uploadRes) => {
if (err) {
reject(err);
} else {
resolve(s3uploadRes);
}
});
});
res.redirect(s3res.Location); res.redirect(s3res.Location);
}, },
}; };

View File

@@ -8,7 +8,7 @@ import ipn from 'paypal-ipn';
import paypal from 'paypal-rest-sdk'; import paypal from 'paypal-rest-sdk';
import shared from '../../../../../common'; import shared from '../../../../../common';
import cc from 'coupon-code'; import cc from 'coupon-code';
import Q from 'q'; import Bluebird from 'bluebird';
import { model as Coupon } from '../../../models/coupon'; import { model as Coupon } from '../../../models/coupon';
import { model as User } from '../../../models/user'; import { model as User } from '../../../models/user';
import { import {
@@ -36,14 +36,14 @@ paypal.configure({
}); });
// TODO better handling of errors // TODO better handling of errors
const paypalPaymentCreate = Q.nbind(paypal.payment.create, paypal.payment); const paypalPaymentCreate = Bluebird.promisify(paypal.payment.create, {context: paypal.payment});
const paypalPaymentExecute = Q.nbind(paypal.payment.execute, paypal.payment); const paypalPaymentExecute = Bluebird.promisify(paypal.payment.execute, {context: paypal.payment});
const paypalBillingAgreementCreate = Q.nbind(paypal.billingAgreement.create, paypal.billingAgreement); const paypalBillingAgreementCreate = Bluebird.promisify(paypal.billingAgreement.create, {context: paypal.billingAgreement});
const paypalBillingAgreementExecute = Q.nbind(paypal.billingAgreement.execute, paypal.billingAgreement); const paypalBillingAgreementExecute = Bluebird.promisify(paypal.billingAgreement.execute, {context: paypal.billingAgreement});
const paypalBillingAgreementGet = Q.nbind(paypal.billingAgreement.get, paypal.billingAgreement); const paypalBillingAgreementGet = Bluebird.promisify(paypal.billingAgreement.get, {context: paypal.billingAgreement});
const paypalBillingAgreementCancel = Q.nbind(paypal.billingAgreement.cancel, paypal.billingAgreement); const paypalBillingAgreementCancel = Bluebird.promisify(paypal.billingAgreement.cancel, {context: paypal.billingAgreement});
const ipnVerifyAsync = Q.nbind(ipn.verify, ipn); const ipnVerifyAsync = Bluebird.promisify(ipn.verify, {context: ipn});
let api = {}; let api = {};

View File

@@ -10,6 +10,8 @@ if (process.env.NODE_ENV !== 'production') {
// The BabelJS polyfill is needed in production too // The BabelJS polyfill is needed in production too
require('babel-polyfill'); require('babel-polyfill');
global.Promise = require('bluebird');
// Only do the minimal amount of work before forking just in case of a dyno restart // Only do the minimal amount of work before forking just in case of a dyno restart
const cluster = require('cluster'); const cluster = require('cluster');
const nconf = require('nconf'); const nconf = require('nconf');

View File

@@ -1,7 +1,7 @@
import amazonPayments from 'amazon-payments'; import amazonPayments from 'amazon-payments';
import nconf from 'nconf'; import nconf from 'nconf';
import common from '../../../../common'; import common from '../../../../common';
import Q from 'q'; import Bluebird from 'bluebird';
import { import {
BadRequest, BadRequest,
} from './errors'; } from './errors';
@@ -19,14 +19,14 @@ let amzPayment = amazonPayments.connect({
clientId: nconf.get('AMAZON_PAYMENTS:CLIENT_ID'), clientId: nconf.get('AMAZON_PAYMENTS:CLIENT_ID'),
}); });
let getTokenInfo = Q.nbind(amzPayment.api.getTokenInfo, amzPayment.api); let getTokenInfo = Bluebird.promisify(amzPayment.api.getTokenInfo, {context: amzPayment.api});
let createOrderReferenceId = Q.nbind(amzPayment.offAmazonPayments.createOrderReferenceForId, amzPayment.offAmazonPayments); let createOrderReferenceId = Bluebird.promisify(amzPayment.offAmazonPayments.createOrderReferenceForId, {context: amzPayment.offAmazonPayments});
let setOrderReferenceDetails = Q.nbind(amzPayment.offAmazonPayments.setOrderReferenceDetails, amzPayment.offAmazonPayments); let setOrderReferenceDetails = Bluebird.promisify(amzPayment.offAmazonPayments.setOrderReferenceDetails, {context: amzPayment.offAmazonPayments});
let confirmOrderReference = Q.nbind(amzPayment.offAmazonPayments.confirmOrderReference, amzPayment.offAmazonPayments); let confirmOrderReference = Bluebird.promisify(amzPayment.offAmazonPayments.confirmOrderReference, {context: amzPayment.offAmazonPayments});
let closeOrderReference = Q.nbind(amzPayment.offAmazonPayments.closeOrderReference, amzPayment.offAmazonPayments); let closeOrderReference = Bluebird.promisify(amzPayment.offAmazonPayments.closeOrderReference, {context: amzPayment.offAmazonPayments});
let setBillingAgreementDetails = Q.nbind(amzPayment.offAmazonPayments.setBillingAgreementDetails, amzPayment.offAmazonPayments); let setBillingAgreementDetails = Bluebird.promisify(amzPayment.offAmazonPayments.setBillingAgreementDetails, {context: amzPayment.offAmazonPayments});
let confirmBillingAgreement = Q.nbind(amzPayment.offAmazonPayments.confirmBillingAgreement, amzPayment.offAmazonPayments); let confirmBillingAgreement = Bluebird.promisify(amzPayment.offAmazonPayments.confirmBillingAgreement, {context: amzPayment.offAmazonPayments});
let closeBillingAgreement = Q.nbind(amzPayment.offAmazonPayments.closeBillingAgreement, amzPayment.offAmazonPayments); let closeBillingAgreement = Bluebird.promisify(amzPayment.offAmazonPayments.closeBillingAgreement, {context: amzPayment.offAmazonPayments});
let authorizeOnBillingAgreement = (inputSet) => { let authorizeOnBillingAgreement = (inputSet) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {

View File

@@ -1,7 +1,7 @@
/* eslint-disable camelcase */ /* eslint-disable camelcase */
import nconf from 'nconf'; import nconf from 'nconf';
import Amplitude from 'amplitude'; import Amplitude from 'amplitude';
import Q from 'q'; import Bluebird from 'bluebird';
import googleAnalytics from 'universal-analytics'; import googleAnalytics from 'universal-analytics';
import { import {
each, each,
@@ -109,7 +109,7 @@ let _sendDataToAmplitude = (eventType, data) => {
amplitudeData.event_type = eventType; amplitudeData.event_type = eventType;
return Q.promise((resolve, reject) => { return new Bluebird((resolve, reject) => {
amplitude.track(amplitudeData) amplitude.track(amplitudeData)
.then(resolve) .then(resolve)
.catch(reject); .catch(reject);
@@ -160,7 +160,7 @@ let _sendDataToGoogle = (eventType, data) => {
eventData.ev = value; eventData.ev = value;
} }
return Q.promise((resolve, reject) => { return new Bluebird((resolve, reject) => {
ga.event(eventData, (err) => { ga.event(eventData, (err) => {
if (err) return reject(err); if (err) return reject(err);
resolve(); resolve();
@@ -174,7 +174,7 @@ let _sendPurchaseDataToAmplitude = (data) => {
amplitudeData.event_type = 'purchase'; amplitudeData.event_type = 'purchase';
amplitudeData.revenue = data.purchaseValue; amplitudeData.revenue = data.purchaseValue;
return Q.promise((resolve, reject) => { return new Bluebird((resolve, reject) => {
amplitude.track(amplitudeData) amplitude.track(amplitudeData)
.then(resolve) .then(resolve)
.catch(reject); .catch(reject);
@@ -199,7 +199,7 @@ let _sendPurchaseDataToGoogle = (data) => {
ev: price, ev: price,
}; };
return Q.promise((resolve) => { return new Bluebird((resolve) => {
ga.event(eventData).send(); ga.event(eventData).send();
ga.transaction(data.uuid, price) ga.transaction(data.uuid, price)
@@ -211,14 +211,14 @@ let _sendPurchaseDataToGoogle = (data) => {
}; };
function track (eventType, data) { function track (eventType, data) {
return Q.all([ return Bluebird.all([
_sendDataToAmplitude(eventType, data), _sendDataToAmplitude(eventType, data),
_sendDataToGoogle(eventType, data), _sendDataToGoogle(eventType, data),
]); ]);
} }
function trackPurchase (data) { function trackPurchase (data) {
return Q.all([ return Bluebird.all([
_sendPurchaseDataToAmplitude(data), _sendPurchaseDataToAmplitude(data),
_sendPurchaseDataToGoogle(data), _sendPurchaseDataToGoogle(data),
]); ]);

View File

@@ -1,8 +1,8 @@
import csvStringify from 'csv-stringify'; import csvStringify from 'csv-stringify';
import Q from 'q'; import Bluebird from 'bluebird';
module.exports = (input) => { module.exports = (input) => {
return Q.promise((resolve, reject) => { return new Bluebird((resolve, reject) => {
csvStringify(input, (err, output) => { csvStringify(input, (err, output) => {
if (err) return reject(err); if (err) return reject(err);
return resolve(output); return resolve(output);

View File

@@ -2,12 +2,12 @@ import nconf from 'nconf';
import logger from './logger'; import logger from './logger';
import autoinc from 'mongoose-id-autoinc'; import autoinc from 'mongoose-id-autoinc';
import mongoose from 'mongoose'; import mongoose from 'mongoose';
import Q from 'q'; import Bluebird from 'bluebird';
const IS_PROD = nconf.get('IS_PROD'); const IS_PROD = nconf.get('IS_PROD');
// Use Q promises instead of mpromise in mongoose // Use Q promises instead of mpromise in mongoose
mongoose.Promise = Q.Promise; mongoose.Promise = Bluebird;
let mongooseOptions = !IS_PROD ? {} : { let mongooseOptions = !IS_PROD ? {} : {
replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } }, replset: { socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 } },

View File

@@ -2,7 +2,7 @@ import _ from 'lodash';
import moment from 'moment'; import moment from 'moment';
import common from '../../../../common'; import common from '../../../../common';
import * as Tasks from '../../models/task'; import * as Tasks from '../../models/task';
import Q from 'q'; import Bluebird from 'bluebird';
import { model as Group } from '../../models/group'; import { model as Group } from '../../models/group';
import { model as User } from '../../models/user'; import { model as User } from '../../models/user';
import { cron } from '../../libs/api-v3/cron'; import { cron } from '../../libs/api-v3/cron';
@@ -139,7 +139,7 @@ module.exports = function cronMiddleware (req, res, next) {
toSave.push(task.save()); toSave.push(task.save());
}); });
Q.all(toSave) Bluebird.all(toSave)
.then(saved => { .then(saved => {
user = res.locals.user = saved[0]; user = res.locals.user = saved[0];
if (!quest) return; if (!quest) return;

View File

@@ -1,5 +1,5 @@
import mongoose from 'mongoose'; import mongoose from 'mongoose';
import Q from 'q'; import Bluebird from 'bluebird';
import validator from 'validator'; import validator from 'validator';
import baseModel from '../libs/api-v3/baseModel'; import baseModel from '../libs/api-v3/baseModel';
import _ from 'lodash'; import _ from 'lodash';
@@ -105,7 +105,7 @@ schema.methods.syncToUser = async function syncChallengeToUser (user) {
}); });
} }
let [challengeTasks, userTasks] = await Q.all([ let [challengeTasks, userTasks] = await Bluebird.all([
// Find original challenge tasks // Find original challenge tasks
Tasks.Task.find({ Tasks.Task.find({
userId: {$exists: false}, userId: {$exists: false},
@@ -149,7 +149,7 @@ schema.methods.syncToUser = async function syncChallengeToUser (user) {
}); });
toSave.push(user.save()); toSave.push(user.save());
return Q.all(toSave); return Bluebird.all(toSave);
}; };
async function _fetchMembersIds (challengeId) { async function _fetchMembersIds (challengeId) {
@@ -189,7 +189,7 @@ schema.methods.addTasks = async function challengeAddTasks (tasks) {
// Update the user // Update the user
toSave.unshift(User.update({_id: memberId}, updateTasksOrderQ).exec()); toSave.unshift(User.update({_id: memberId}, updateTasksOrderQ).exec());
await Q.all(toSave); // eslint-disable-line babel/no-await-in-loop await Bluebird.all(toSave); // eslint-disable-line babel/no-await-in-loop
} }
}; };
@@ -254,7 +254,7 @@ schema.methods.unlinkTasks = async function challengeUnlinkTasks (user, keep) {
}); });
user.markModified('tasksOrder'); user.markModified('tasksOrder');
taskPromises.push(user.save()); taskPromises.push(user.save());
return Q.all(taskPromises); return Bluebird.all(taskPromises);
} }
}; };
@@ -314,7 +314,7 @@ schema.methods.closeChal = async function closeChal (broken = {}) {
}, {multi: true}).exec(), }, {multi: true}).exec(),
]; ];
Q.all(backgroundTasks); Bluebird.all(backgroundTasks);
}; };
// Methods to adapt the new schema to API v2 responses (mostly tasks inside the challenge model) // Methods to adapt the new schema to API v2 responses (mostly tasks inside the challenge model)
@@ -406,7 +406,7 @@ schema.methods.getTransformedData = function getTransformedData (options) {
let membersQuery = User.find(queryMembers).select(selectDataMembers); let membersQuery = User.find(queryMembers).select(selectDataMembers);
if (options.limitPopulation) membersQuery.limit(15); if (options.limitPopulation) membersQuery.limit(15);
Q.all([ Bluebird.all([
membersQuery.exec(), membersQuery.exec(),
self.getTasks(), self.getTasks(),
]) ])

View File

@@ -12,7 +12,7 @@ import { InternalServerError } from '../libs/api-v3/errors';
import * as firebase from '../libs/api-v2/firebase'; import * as firebase from '../libs/api-v2/firebase';
import baseModel from '../libs/api-v3/baseModel'; import baseModel from '../libs/api-v3/baseModel';
import { sendTxn as sendTxnEmail } from '../libs/api-v3/email'; import { sendTxn as sendTxnEmail } from '../libs/api-v3/email';
import Q from 'q'; import Bluebird from 'bluebird';
import nconf from 'nconf'; import nconf from 'nconf';
import sendPushNotification from '../libs/api-v3/pushNotifications'; import sendPushNotification from '../libs/api-v3/pushNotifications';
@@ -189,7 +189,7 @@ schema.statics.getGroups = async function getGroups (options = {}) {
} }
}); });
let groupsArray = _.reduce(await Q.all(queries), (previousValue, currentValue) => { let groupsArray = _.reduce(await Bluebird.all(queries), (previousValue, currentValue) => {
if (_.isEmpty(currentValue)) return previousValue; // don't add anything to the results if the query returned null or an empty array if (_.isEmpty(currentValue)) return previousValue; // don't add anything to the results if the query returned null or an empty array
return previousValue.concat(Array.isArray(currentValue) ? currentValue : [currentValue]); // otherwise concat the new results to the previousValue return previousValue.concat(Array.isArray(currentValue) ? currentValue : [currentValue]); // otherwise concat the new results to the previousValue
}, []); }, []);
@@ -228,7 +228,7 @@ schema.methods.removeGroupInvitations = async function removeGroupInvitations ()
return user.save(); return user.save();
}); });
return Q.all(userUpdates); return Bluebird.all(userUpdates);
}; };
// Return true if user is a member of the group // Return true if user is a member of the group
@@ -638,7 +638,7 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all') {
let challengesToRemoveUserFrom = challenges.map(chal => { let challengesToRemoveUserFrom = challenges.map(chal => {
return chal.unlinkTasks(user, keep); return chal.unlinkTasks(user, keep);
}); });
await Q.all(challengesToRemoveUserFrom); await Bluebird.all(challengesToRemoveUserFrom);
let promises = []; let promises = [];
@@ -670,7 +670,7 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all') {
firebase.removeUserFromGroup(group._id, user._id); firebase.removeUserFromGroup(group._id, user._id);
return Q.all(promises); return Bluebird.all(promises);
}; };
// API v2 compatibility methods // API v2 compatibility methods
@@ -714,7 +714,7 @@ schema.methods.getTransformedData = function getTransformedData (options) {
let membersQuery = User.find(queryMembers).select(selectDataMembers); let membersQuery = User.find(queryMembers).select(selectDataMembers);
if (options.limitPopulation) membersQuery.limit(15); if (options.limitPopulation) membersQuery.limit(15);
Q.all([ Bluebird.all([
membersQuery.exec(), membersQuery.exec(),
User.find(queryInvites).select(populateInvites).exec(), User.find(queryInvites).select(populateInvites).exec(),
Challenge.find({group: obj._id}).select(populateMembers).exec(), Challenge.find({group: obj._id}).select(populateMembers).exec(),

View File

@@ -4,7 +4,7 @@ import _ from 'lodash';
import validator from 'validator'; import validator from 'validator';
import moment from 'moment'; import moment from 'moment';
import * as Tasks from './task'; import * as Tasks from './task';
import Q from 'q'; import Bluebird from 'bluebird';
import { schema as TagSchema } from './tag'; import { schema as TagSchema } from './tag';
import baseModel from '../libs/api-v3/baseModel'; import baseModel from '../libs/api-v3/baseModel';
import { import {
@@ -593,7 +593,7 @@ function _populateDefaultTasks (user, taskTypes) {
tasksToCreate.push(...tasksOfType); tasksToCreate.push(...tasksOfType);
}); });
return Q.all(tasksToCreate) return Bluebird.all(tasksToCreate)
.then((tasksCreated) => { .then((tasksCreated) => {
_.each(tasksCreated, (task) => { _.each(tasksCreated, (task) => {
user.tasksOrder[`${task.type}s`].push(task._id); user.tasksOrder[`${task.type}s`].push(task._id);
@@ -720,7 +720,7 @@ schema.methods.sendMessage = async function sendMessage (userToReceiveMessage, m
sender.markModified('inbox.messages'); sender.markModified('inbox.messages');
let promises = [userToReceiveMessage.save(), sender.save()]; let promises = [userToReceiveMessage.save(), sender.save()];
await Q.all(promises); await Bluebird.all(promises);
}; };
// Methods to adapt the new schema to API v2 responses (mostly tasks inside the user model) // Methods to adapt the new schema to API v2 responses (mostly tasks inside the user model)

View File

@@ -3,6 +3,9 @@ import logger from './libs/api-v3/logger';
import express from 'express'; import express from 'express';
import http from 'http'; import http from 'http';
import attachMiddlewares from './middlewares/api-v3/index'; import attachMiddlewares from './middlewares/api-v3/index';
import Bluebird from 'bluebird';
global.Promise = Bluebird;
const server = http.createServer(); const server = http.createServer();
const app = express(); const app = express();