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

View File

@@ -30,7 +30,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
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
var mongoDbOldInstance;
@@ -103,7 +103,7 @@ function processChallenges (afterId) {
console.log(`Migrating members of ${oldChallenges.length} challenges.`);
return Q.all(promises);
return Bluebird.all(promises);
})
.then(function () {
processedChallenges += oldChallenges.length;
@@ -119,7 +119,7 @@ function processChallenges (afterId) {
}
// Connect to the databases
Q.all([
Bluebird.all([
MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW),
])

View File

@@ -29,7 +29,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
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
var Coupon = require('../../website/src/models/coupon').model;
@@ -112,7 +112,7 @@ function processCoupons (afterId) {
}
// Connect to the databases
Q.all([
Bluebird.all([
MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW),
])

View File

@@ -29,7 +29,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
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
var EmailUnsubscription = require('../../website/src/models/emailUnsubscription').model;
@@ -113,7 +113,7 @@ function processUnsubscriptions (afterId) {
}
// Connect to the databases
Q.all([
Bluebird.all([
MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW),
])

View File

@@ -37,7 +37,7 @@ var MONGODB_NEW = nconf.get('MONGODB_NEW');
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
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.`);
promises.push(batchInsertGroups.execute());
return Q.all(promises);
return Bluebird.all(promises);
})
.then(function () {
processedGroups += oldGroups.length;
@@ -182,7 +182,7 @@ function processGroups (afterId) {
}
// Connect to the databases
Q.all([
Bluebird.all([
MongoClient.connect(MONGODB_OLD),
MongoClient.connect(MONGODB_NEW),
])

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -8,7 +8,7 @@ import {
find,
map,
} from 'lodash';
import Q from 'q';
import Bluebird from 'bluebird';
describe('DELETE /user', () => {
let user;
@@ -30,7 +30,7 @@ describe('DELETE /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);
}));
});

View File

@@ -2,7 +2,9 @@ import {
generateUser,
} from '../../../../helpers/api-v3-integration.helper';
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', () => {
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 {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).to.contain.all.keys(['tasks', 'flags', 'tasksOrder', 'auth']);

View File

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

View File

@@ -2,10 +2,25 @@
import request from 'request';
import nconf from 'nconf';
import nodemailer from 'nodemailer';
import Q from 'q';
import Bluebird from 'bluebird';
import requireAgain from 'require-again';
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 () {
return {
_id: 'random _id',
@@ -37,7 +52,7 @@ describe('emails', () => {
describe('sendEmail', () => {
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({
sendMail: sendMailSpy,
@@ -49,7 +64,7 @@ describe('emails', () => {
});
it('logs errors', (done) => {
let deferred = Q.defer();
let deferred = defer();
let sendMailSpy = sandbox.stub().returns(deferred.promise);
sandbox.stub(nodemailer, 'createTransport').returns({

View File

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

View File

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

View File

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

View File

@@ -1,10 +1,12 @@
/* eslint-disable no-undef */
/* eslint-disable global-require */
/* eslint-disable no-process-env */
import Bluebird from 'bluebird';
//------------------------------
// Global modules
//------------------------------
global._ = require('lodash');
global.chai = require('chai');
chai.use(require('sinon-chai'));
@@ -12,10 +14,10 @@ chai.use(require('chai-as-promised'));
global.expect = chai.expect;
global.sinon = require('sinon');
global.sandbox = sinon.sandbox.create();
global.Promise = Bluebird;
import nconf from 'nconf';
import mongoose from 'mongoose';
import Q from 'q';
//------------------------------
// 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
require('../../website/src/libs/api-v3/setupNconf')('./config.json');
// Use Q promises instead of mpromise in mongoose
mongoose.Promise = Q.Promise;
mongoose.Promise = Bluebird;
mongoose.connect(nconf.get('NODE_DB_URI'));
} else { // When running tests and the server in the same process
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"));
var expect = chai.expect;
var Q = require('q');
var Bluebird = require('bluebird');
var Group = require('../../../website/src/models/group').model;
var groupsController = require('../../../website/src/controllers/api-v2/groups');
@@ -301,7 +301,7 @@ describe('Groups Controller', function() {
});
afterEach(function() {
Q.all.restore();
Promise.all.restore();
});
context('error conditions', function() {
@@ -342,7 +342,7 @@ describe('Groups Controller', function() {
});
it('sends 500 if group cannot save', function() {
Q.all.returns({
Promise.all.returns({
done: sinon.stub().callsArgWith(1, {err: 'save error'})
});
var nextSpy = sinon.spy();

View File

@@ -21,7 +21,7 @@ var csvStringify = require('csv-stringify');
var utils = require('../../libs/api-v2/utils');
var api = module.exports;
var pushNotify = require('./pushNotifications');
import Q from 'q';
import Bluebird from 'bluebird';
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
await Q.all(resChals.map((chal, index) => {
return Q.all([
await Bluebird.all(resChals.map((chal, index) => {
return Bluebird.all([
User.findById(chal.leader).select(nameFields).exec(),
Group.findById(chal.group).select(basicGroupFields).exec(),
]).then(populatedData => {
@@ -207,7 +207,7 @@ api.create = async function(req, res, next){
return newTask.save();
});
let results = await Q.all([challenge.save({
let results = await Bluebird.all([challenge.save({
validateBeforeSave: false, // already validated
}), group.save()].concat(chalTasks));
let savedChal = results[0];
@@ -346,7 +346,7 @@ api.join = async function(req, res, next){
challenge.memberCount += 1;
// 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({
cb (err, transformedChal) {
@@ -377,7 +377,7 @@ api.leave = async function(req, res, next){
challenge.memberCount -= 1;
// 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({
cb (err, transformedChal) {
@@ -416,7 +416,7 @@ api.unlink = async function(req, res, next) {
} else { // remove
if (task.type !== 'todo' || !task.completed) { // eslint-disable-line no-lonely-if
removeFromArray(user.tasksOrder[`${task.type}s`], tid);
await Q.all([user.save(), task.remove()]);
await Bluebird.all([user.save(), task.remove()]);
} else {
await task.remove();
}

View File

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

View File

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

View File

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

View File

@@ -15,7 +15,7 @@ import {
NotAuthorized,
} from '../../libs/api-v3/errors';
import * as Tasks from '../../models/task';
import Q from 'q';
import Bluebird from 'bluebird';
import csvStringify from '../../libs/api-v3/csvStringify';
let api = {};
@@ -87,7 +87,7 @@ api.createChallenge = {
let challengeValidationErrors = challenge.validateSync();
if (challengeValidationErrors) throw challengeValidationErrors;
let results = await Q.all([challenge.save({
let results = await Bluebird.all([challenge.save({
validateBeforeSave: false, // already validate
}), group.save()]);
let savedChal = results[0];
@@ -141,7 +141,7 @@ api.joinChallenge = {
challenge.memberCount += 1;
// 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();
response.group = { // we already have the group data
@@ -190,7 +190,7 @@ api.leaveChallenge = {
challenge.memberCount -= 1;
// 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, {});
},
};
@@ -226,8 +226,8 @@ api.getUserChallenges = {
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
await Q.all(resChals.map((chal, index) => {
return Q.all([
await Bluebird.all(resChals.map((chal, index) => {
return Bluebird.all([
User.findById(chal.leader).select(nameFields).exec(),
Group.findById(chal.group).select(basicGroupFields).exec(),
]).then(populatedData => {
@@ -274,7 +274,7 @@ api.getGroupChallenges = {
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
await Q.all(resChals.map((chal, index) => {
await Bluebird.all(resChals.map((chal, index) => {
return User.findById(chal.leader).select(nameFields).exec().then(populatedLeader => {
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
// 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})
.select(nameFields)
.sort({_id: 1})

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
import { authWithHeaders } from '../../middlewares/api-v3/auth';
import Q from 'q';
import Bluebird from 'bluebird';
import _ from 'lodash';
import {
INVITES_LIMIT,
@@ -55,7 +55,7 @@ api.createGroup = {
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];
// 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);
response.leader = (await User.findById(response.leader).select(nameFields).exec()).toJSON({minimize: true});
@@ -475,7 +475,7 @@ api.removeGroupMember = {
let message = req.query.message;
if (message) _sendMessageToRemoved(group, member, message);
await Q.all([
await Bluebird.all([
member.save(),
group.save(),
]);
@@ -653,13 +653,13 @@ api.inviteToGroup = {
if (uuids) {
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);
}
if (emails) {
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);
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -12,7 +12,7 @@ import Pageres from 'pageres';
import AWS from 'aws-sdk';
import nconf from 'nconf';
import got from 'got';
import Q from 'q';
import Bluebird from 'bluebird';
import locals from '../../middlewares/api-v3/locals';
let S3 = new AWS.S3({
@@ -222,7 +222,16 @@ api.exportUserAvatarPng = {
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);
},
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
import mongoose from 'mongoose';
import Q from 'q';
import Bluebird from 'bluebird';
import validator from 'validator';
import baseModel from '../libs/api-v3/baseModel';
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
Tasks.Task.find({
userId: {$exists: false},
@@ -149,7 +149,7 @@ schema.methods.syncToUser = async function syncChallengeToUser (user) {
});
toSave.push(user.save());
return Q.all(toSave);
return Bluebird.all(toSave);
};
async function _fetchMembersIds (challengeId) {
@@ -189,7 +189,7 @@ schema.methods.addTasks = async function challengeAddTasks (tasks) {
// Update the user
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');
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(),
];
Q.all(backgroundTasks);
Bluebird.all(backgroundTasks);
};
// 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);
if (options.limitPopulation) membersQuery.limit(15);
Q.all([
Bluebird.all([
membersQuery.exec(),
self.getTasks(),
])

View File

@@ -12,7 +12,7 @@ import { InternalServerError } from '../libs/api-v3/errors';
import * as firebase from '../libs/api-v2/firebase';
import baseModel from '../libs/api-v3/baseModel';
import { sendTxn as sendTxnEmail } from '../libs/api-v3/email';
import Q from 'q';
import Bluebird from 'bluebird';
import nconf from 'nconf';
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
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 Q.all(userUpdates);
return Bluebird.all(userUpdates);
};
// 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 => {
return chal.unlinkTasks(user, keep);
});
await Q.all(challengesToRemoveUserFrom);
await Bluebird.all(challengesToRemoveUserFrom);
let promises = [];
@@ -670,7 +670,7 @@ schema.methods.leave = async function leaveGroup (user, keep = 'keep-all') {
firebase.removeUserFromGroup(group._id, user._id);
return Q.all(promises);
return Bluebird.all(promises);
};
// API v2 compatibility methods
@@ -714,7 +714,7 @@ schema.methods.getTransformedData = function getTransformedData (options) {
let membersQuery = User.find(queryMembers).select(selectDataMembers);
if (options.limitPopulation) membersQuery.limit(15);
Q.all([
Bluebird.all([
membersQuery.exec(),
User.find(queryInvites).select(populateInvites).exec(),
Challenge.find({group: obj._id}).select(populateMembers).exec(),

View File

@@ -4,7 +4,7 @@ import _ from 'lodash';
import validator from 'validator';
import moment from 'moment';
import * as Tasks from './task';
import Q from 'q';
import Bluebird from 'bluebird';
import { schema as TagSchema } from './tag';
import baseModel from '../libs/api-v3/baseModel';
import {
@@ -593,7 +593,7 @@ function _populateDefaultTasks (user, taskTypes) {
tasksToCreate.push(...tasksOfType);
});
return Q.all(tasksToCreate)
return Bluebird.all(tasksToCreate)
.then((tasksCreated) => {
_.each(tasksCreated, (task) => {
user.tasksOrder[`${task.type}s`].push(task._id);
@@ -720,7 +720,7 @@ schema.methods.sendMessage = async function sendMessage (userToReceiveMessage, m
sender.markModified('inbox.messages');
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)

View File

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