From cee7700a50cdc26875cb635cb7910acd5c6cb96b Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Wed, 11 May 2016 14:34:01 +0200 Subject: [PATCH] switch from Q to Bluebird --- migrations/api_v3/challenges.js | 6 +-- migrations/api_v3/challengesMembers.js | 6 +-- migrations/api_v3/coupons.js | 4 +- migrations/api_v3/emailUnsubscriptions.js | 4 +- migrations/api_v3/groups.js | 6 +-- migrations/api_v3/users.js | 6 +-- package.json | 7 ++- tasks/gulp-tests.js | 6 +-- tasks/taskHelper.js | 43 +++++++++---------- test/api-legacy/api-helper.js | 4 +- test/api/v2/user/DELETE-user.test.js | 4 +- .../GET-export_userdata.xml.test.js | 6 ++- .../v3/integration/user/DELETE-user.test.js | 4 +- test/api/v3/unit/libs/email.test.js | 21 +++++++-- test/api/v3/unit/middlewares/language.test.js | 4 +- .../api-integration/v2/object-generators.js | 10 ++--- .../api-integration/v3/object-generators.js | 8 ++-- test/helpers/globals.helper.js | 8 ++-- test/server_side/controllers/groups.test.js | 6 +-- website/src/controllers/api-v2/challenges.js | 14 +++--- website/src/controllers/api-v2/groups.js | 22 +++++----- website/src/controllers/api-v2/user.js | 12 +++--- website/src/controllers/api-v3/auth.js | 20 ++++----- website/src/controllers/api-v3/challenges.js | 16 +++---- website/src/controllers/api-v3/chat.js | 4 +- website/src/controllers/api-v3/content.js | 10 ++--- website/src/controllers/api-v3/groups.js | 12 +++--- website/src/controllers/api-v3/members.js | 4 +- website/src/controllers/api-v3/quests.js | 16 +++---- website/src/controllers/api-v3/tasks.js | 10 ++--- website/src/controllers/api-v3/user.js | 18 ++++---- .../src/controllers/top-level/dataexport.js | 13 +++++- .../controllers/top-level/payments/paypal.js | 16 +++---- website/src/index.js | 2 + website/src/libs/api-v3/amazonPayments.js | 18 ++++---- website/src/libs/api-v3/analyticsService.js | 14 +++--- website/src/libs/api-v3/csvStringify.js | 4 +- website/src/libs/api-v3/setupMongoose.js | 4 +- website/src/middlewares/api-v3/cron.js | 4 +- website/src/models/challenge.js | 14 +++--- website/src/models/group.js | 12 +++--- website/src/models/user.js | 6 +-- website/src/server.js | 3 ++ 43 files changed, 230 insertions(+), 201 deletions(-) diff --git a/migrations/api_v3/challenges.js b/migrations/api_v3/challenges.js index 727492c04a..b2ba22f730 100644 --- a/migrations/api_v3/challenges.js +++ b/migrations/api_v3/challenges.js @@ -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), ]) diff --git a/migrations/api_v3/challengesMembers.js b/migrations/api_v3/challengesMembers.js index b529e836e2..d42b4d1e69 100644 --- a/migrations/api_v3/challengesMembers.js +++ b/migrations/api_v3/challengesMembers.js @@ -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), ]) diff --git a/migrations/api_v3/coupons.js b/migrations/api_v3/coupons.js index 8fb2676014..9500416c8a 100644 --- a/migrations/api_v3/coupons.js +++ b/migrations/api_v3/coupons.js @@ -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), ]) diff --git a/migrations/api_v3/emailUnsubscriptions.js b/migrations/api_v3/emailUnsubscriptions.js index 9ee65cade2..14c42623d6 100644 --- a/migrations/api_v3/emailUnsubscriptions.js +++ b/migrations/api_v3/emailUnsubscriptions.js @@ -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), ]) diff --git a/migrations/api_v3/groups.js b/migrations/api_v3/groups.js index b87c0fa8df..5a6365ebd6 100644 --- a/migrations/api_v3/groups.js +++ b/migrations/api_v3/groups.js @@ -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), ]) diff --git a/migrations/api_v3/users.js b/migrations/api_v3/users.js index 13db28e768..c67b4b5a14 100644 --- a/migrations/api_v3/users.js +++ b/migrations/api_v3/users.js @@ -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), ]) diff --git a/package.json b/package.json index b546accd2a..787504f828 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/tasks/gulp-tests.js b/tasks/gulp-tests.js index 8d2d49876a..48d4e744c6 100644 --- a/tasks/gulp-tests.js +++ b/tasks/gulp-tests.js @@ -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(() => { diff --git a/tasks/taskHelper.js b/tasks/taskHelper.js index 408978efd4..b83faf6af2 100644 --- a/tasks/taskHelper.js +++ b/tasks/taskHelper.js @@ -1,9 +1,9 @@ -import { exec } from 'child_process'; -import psTree from 'ps-tree'; -import nconf from 'nconf'; -import net from 'net'; -import Q from 'q'; -import { post } from 'superagent'; +import { exec } from 'child_process'; +import psTree from 'ps-tree'; +import nconf from 'nconf'; +import net from 'net'; +import Bluebird from 'bluebird'; +import { post } from 'superagent'; import { sync as glob } from 'glob'; import Mocha from 'mocha'; import { resolve } from 'path'; @@ -43,25 +43,24 @@ 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) { - let socket, timeout, interval; - let deferred = Q.defer(); +export function awaitPort (port, max=60) { + return new Bluebird((reject, resolve) => { + let socket, timeout, interval; - timeout = setTimeout(() => { - clearInterval(interval); - deferred.reject(`Timed out after ${max} seconds`); - }, max * 1000); - - interval = setInterval(() => { - socket = net.connect({port: port}, () => { + timeout = setTimeout(() => { clearInterval(interval); - clearTimeout(timeout); - socket.destroy(); - deferred.resolve(); - }).on('error', () => { socket.destroy }); - }, 1000); + reject(`Timed out after ${max} seconds`); + }, max * 1000); - return deferred.promise + interval = setInterval(() => { + socket = net.connect({port: port}, () => { + clearInterval(interval); + clearTimeout(timeout); + socket.destroy(); + resolve(); + }).on('error', () => { socket.destroy }); + }, 1000); + }); }; /* diff --git a/test/api-legacy/api-helper.js b/test/api-legacy/api-helper.js index 9ade0a2aa2..e6b9b53d23 100644 --- a/test/api-legacy/api-helper.js +++ b/test/api-legacy/api-helper.js @@ -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"); diff --git a/test/api/v2/user/DELETE-user.test.js b/test/api/v2/user/DELETE-user.test.js index 981349a9e1..8d28a07b78 100644 --- a/test/api/v2/user/DELETE-user.test.js +++ b/test/api/v2/user/DELETE-user.test.js @@ -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); })); }); diff --git a/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js b/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js index 61b84cd0ba..58bf4e6135 100644 --- a/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js +++ b/test/api/v3/integration/dataexport/GET-export_userdata.xml.test.js @@ -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']); diff --git a/test/api/v3/integration/user/DELETE-user.test.js b/test/api/v3/integration/user/DELETE-user.test.js index 6a631676e8..2a284add53 100644 --- a/test/api/v3/integration/user/DELETE-user.test.js +++ b/test/api/v3/integration/user/DELETE-user.test.js @@ -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); })); }); diff --git a/test/api/v3/unit/libs/email.test.js b/test/api/v3/unit/libs/email.test.js index 91878f1f57..e475e33753 100644 --- a/test/api/v3/unit/libs/email.test.js +++ b/test/api/v3/unit/libs/email.test.js @@ -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({ diff --git a/test/api/v3/unit/middlewares/language.test.js b/test/api/v3/unit/middlewares/language.test.js index 30feadd10c..2316f0b540 100644 --- a/test/api/v3/unit/middlewares/language.test.js +++ b/test/api/v3/unit/middlewares/language.test.js @@ -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', }, diff --git a/test/helpers/api-integration/v2/object-generators.js b/test/helpers/api-integration/v2/object-generators.js index 96013ffabe..3cd3c7d1d7 100644 --- a/test/helpers/api-integration/v2/object-generators.js +++ b/test/helpers/api-integration/v2/object-generators.js @@ -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, diff --git a/test/helpers/api-integration/v3/object-generators.js b/test/helpers/api-integration/v3/object-generators.js index 0d9921159b..3717d27a11 100644 --- a/test/helpers/api-integration/v3/object-generators.js +++ b/test/helpers/api-integration/v3/object-generators.js @@ -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, diff --git a/test/helpers/globals.helper.js b/test/helpers/globals.helper.js index 9e92a85de9..eaaf8b7bfc 100644 --- a/test/helpers/globals.helper.js +++ b/test/helpers/globals.helper.js @@ -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'); diff --git a/test/server_side/controllers/groups.test.js b/test/server_side/controllers/groups.test.js index 8479959946..664a5b8d11 100644 --- a/test/server_side/controllers/groups.test.js +++ b/test/server_side/controllers/groups.test.js @@ -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(); diff --git a/website/src/controllers/api-v2/challenges.js b/website/src/controllers/api-v2/challenges.js index aff7b53a80..93beccbd48 100644 --- a/website/src/controllers/api-v2/challenges.js +++ b/website/src/controllers/api-v2/challenges.js @@ -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(); } diff --git a/website/src/controllers/api-v2/groups.js b/website/src/controllers/api-v2/groups.js index 9e0715efc5..b405eb0a65 100644 --- a/website/src/controllers/api-v2/groups.js +++ b/website/src/controllers/api-v2/groups.js @@ -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) { diff --git a/website/src/controllers/api-v2/user.js b/website/src/controllers/api-v2/user.js index a9696e0cc0..30e33246ce 100644 --- a/website/src/controllers/api-v2/user.js +++ b/website/src/controllers/api-v2/user.js @@ -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 => { diff --git a/website/src/controllers/api-v3/auth.js b/website/src/controllers/api-v3/auth.js index 8616f889f0..ce3990bb71 100644 --- a/website/src/controllers/api-v3/auth.js +++ b/website/src/controllers/api-v3/auth.js @@ -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(); - - passport._strategies.facebook.userProfile(accessToken, (err, profile) => { - if (err) { - deferred.rejec(); - } else { - deferred.resolve(profile); - } + return new Bluebird((resolve, reject) => { + passport._strategies.facebook.userProfile(accessToken, (err, profile) => { + if (err) { + reject(err); + } else { + resolve(profile); + } + }); }); - - return deferred.promise; } // Called as a callback by Facebook (or other social providers). Internal route diff --git a/website/src/controllers/api-v3/challenges.js b/website/src/controllers/api-v3/challenges.js index bb21ced189..1e50a4d439 100644 --- a/website/src/controllers/api-v3/challenges.js +++ b/website/src/controllers/api-v3/challenges.js @@ -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}) diff --git a/website/src/controllers/api-v3/chat.js b/website/src/controllers/api-v3/chat.js index d074cb4c7b..7be628f0df 100644 --- a/website/src/controllers/api-v3/chat.js +++ b/website/src/controllers/api-v3/chat.js @@ -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 { diff --git a/website/src/controllers/api-v3/content.js b/website/src/controllers/api-v3/content.js index b9d7495a97..7522a59096 100644 --- a/website/src/controllers/api-v3/content.js +++ b/website/src/controllers/api-v3/content.js @@ -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 = {}; diff --git a/website/src/controllers/api-v3/groups.js b/website/src/controllers/api-v3/groups.js index 60d92e6ade..8a8e9eee05 100644 --- a/website/src/controllers/api-v3/groups.js +++ b/website/src/controllers/api-v3/groups.js @@ -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); } diff --git a/website/src/controllers/api-v3/members.js b/website/src/controllers/api-v3/members.js index e8e6149ac4..e1bc0bf60a 100644 --- a/website/src/controllers/api-v3/members.js +++ b/website/src/controllers/api-v3/members.js @@ -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, diff --git a/website/src/controllers/api-v3/quests.js b/website/src/controllers/api-v3/quests.js index 05b3020f86..0e639def36 100644 --- a/website/src/controllers/api-v3/quests.js +++ b/website/src/controllers/api-v3/quests.js @@ -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(), ]); diff --git a/website/src/controllers/api-v3/tasks.js b/website/src/controllers/api-v3/tasks.js index 18aadca0d1..6ccf246d5d 100644 --- a/website/src/controllers/api-v3/tasks.js +++ b/website/src/controllers/api-v3/tasks.js @@ -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(); } diff --git a/website/src/controllers/api-v3/user.js b/website/src/controllers/api-v3/user.js index a1e34ad435..c45d8781d1 100644 --- a/website/src/controllers/api-v3/user.js +++ b/website/src/controllers/api-v3/user.js @@ -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); }, diff --git a/website/src/controllers/top-level/dataexport.js b/website/src/controllers/top-level/dataexport.js index 5cbcd39fa7..10519807e3 100644 --- a/website/src/controllers/top-level/dataexport.js +++ b/website/src/controllers/top-level/dataexport.js @@ -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); }, }; diff --git a/website/src/controllers/top-level/payments/paypal.js b/website/src/controllers/top-level/payments/paypal.js index a940511c64..1c3e85dec3 100644 --- a/website/src/controllers/top-level/payments/paypal.js +++ b/website/src/controllers/top-level/payments/paypal.js @@ -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 = {}; diff --git a/website/src/index.js b/website/src/index.js index 1b133ca781..6af0647d0b 100644 --- a/website/src/index.js +++ b/website/src/index.js @@ -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'); diff --git a/website/src/libs/api-v3/amazonPayments.js b/website/src/libs/api-v3/amazonPayments.js index 338a6acd08..4d3a3756b8 100644 --- a/website/src/libs/api-v3/amazonPayments.js +++ b/website/src/libs/api-v3/amazonPayments.js @@ -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) => { diff --git a/website/src/libs/api-v3/analyticsService.js b/website/src/libs/api-v3/analyticsService.js index 4979327b48..b810ac1858 100644 --- a/website/src/libs/api-v3/analyticsService.js +++ b/website/src/libs/api-v3/analyticsService.js @@ -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), ]); diff --git a/website/src/libs/api-v3/csvStringify.js b/website/src/libs/api-v3/csvStringify.js index da87ca33f2..39fb7c16c8 100644 --- a/website/src/libs/api-v3/csvStringify.js +++ b/website/src/libs/api-v3/csvStringify.js @@ -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); diff --git a/website/src/libs/api-v3/setupMongoose.js b/website/src/libs/api-v3/setupMongoose.js index 303180679c..ae1659d527 100644 --- a/website/src/libs/api-v3/setupMongoose.js +++ b/website/src/libs/api-v3/setupMongoose.js @@ -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 } }, diff --git a/website/src/middlewares/api-v3/cron.js b/website/src/middlewares/api-v3/cron.js index 8473db23af..bca680b908 100644 --- a/website/src/middlewares/api-v3/cron.js +++ b/website/src/middlewares/api-v3/cron.js @@ -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; diff --git a/website/src/models/challenge.js b/website/src/models/challenge.js index ee0f7209a1..be61b0f00d 100644 --- a/website/src/models/challenge.js +++ b/website/src/models/challenge.js @@ -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(), ]) diff --git a/website/src/models/group.js b/website/src/models/group.js index 17398e4909..e98dfc1567 100644 --- a/website/src/models/group.js +++ b/website/src/models/group.js @@ -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(), diff --git a/website/src/models/user.js b/website/src/models/user.js index 11d36e1e44..9b153c6156 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -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) diff --git a/website/src/server.js b/website/src/server.js index 21fa6e2f5c..f86e6c63b7 100644 --- a/website/src/server.js +++ b/website/src/server.js @@ -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();