diff --git a/common/locales/en/api-v3.json b/common/locales/en/api-v3.json index ac83dd75f8..3f541da96a 100644 --- a/common/locales/en/api-v3.json +++ b/common/locales/en/api-v3.json @@ -164,5 +164,9 @@ "cannotRevive": "Cannot revive if not dead", "rebirthComplete": "You have been reborn!", "petNotOwned": "You do not own this pet.", - "rerollComplete": "Reroll complete!" + "rerollComplete": "Reroll complete!", + "resetComplete": "Reset has completed", + "regIdRequired": "RegId is required", + "pushDeviceAdded": "Push device added successfully", + "pushDeviceAlreadyAdded": "The user already has the push device" } diff --git a/common/script/index.js b/common/script/index.js index a40a589260..050e29d8ee 100644 --- a/common/script/index.js +++ b/common/script/index.js @@ -119,6 +119,7 @@ import blockUser from './ops/blockUser'; import clearPMs from './ops/clearPMs'; import deletePM from './ops/deletePM'; import reroll from './ops/reroll'; +import addPushDevice from './ops/addPushDevice'; api.ops = { scoreTask, @@ -154,6 +155,7 @@ api.ops = { clearPMs, deletePM, reroll, + addPushDevice, }; import handleTwoHanded from './fns/handleTwoHanded'; diff --git a/common/script/ops/addPushDevice.js b/common/script/ops/addPushDevice.js index d96cf249cf..431a74177b 100644 --- a/common/script/ops/addPushDevice.js +++ b/common/script/ops/addPushDevice.js @@ -1,20 +1,43 @@ import _ from 'lodash'; +import i18n from '../i18n'; +import splitWhitespace from '../libs/splitWhitespace'; +import { + BadRequest, + NotAuthorized, +} from '../libs/errors'; + +module.exports = function addPushDevice (user, req = {}) { + let regId = _.get(req, 'body.regId'); + if (!regId) throw new BadRequest(i18n.t('regIdRequired', req.language)); + + let type = _.get(req, 'body.type'); + if (!type) throw new BadRequest(i18n.t('typeRequired', req.language)); -module.exports = function(user, req, cb) { - var i, item, pd; if (!user.pushDevices) { user.pushDevices = []; } - pd = user.pushDevices; - item = { - regId: req.body.regId, - type: req.body.type + + let pushDevices = user.pushDevices; + + let item = { + regId, + type, }; - i = _.findIndex(pd, { - regId: item.regId + + let indexOfPushDevice = _.findIndex(pushDevices, { + regId: item.regId, }); - if (i === -1) { - pd.push(item); + + if (indexOfPushDevice !== -1) { + throw new NotAuthorized(i18n.t('pushDeviceAlreadyAdded', req.language)); } - return typeof cb === "function" ? cb(null, user.pushDevices) : void 0; + + pushDevices.push(item); + + let response = { + data: _.pick(user, splitWhitespace('pushDevices')), + message: i18n.t('pushDeviceAdded', req.language), + }; + + return response; }; diff --git a/tasks/gulp-eslint.js b/tasks/gulp-eslint.js index df34e18c68..0461636744 100644 --- a/tasks/gulp-eslint.js +++ b/tasks/gulp-eslint.js @@ -10,7 +10,6 @@ const COMMON_FILES = [ './common/script/**/*.js', // @TODO remove these negations as the files are converted over. '!./common/script/content/index.js', - '!./common/script/ops/addPushDevice.js', '!./common/script/ops/reset.js', '!./common/script/fns/crit.js', '!./common/script/fns/randomDrop.js', diff --git a/test/api/v3/integration/user/POST-user_addPushDevice.test.js b/test/api/v3/integration/user/POST-user_addPushDevice.test.js new file mode 100644 index 0000000000..1a3a5d4f03 --- /dev/null +++ b/test/api/v3/integration/user/POST-user_addPushDevice.test.js @@ -0,0 +1,35 @@ +import { + generateUser, + translate as t, +} from '../../../../helpers/api-integration/v3'; + +describe('POST /user/addPushDevice', () => { + let user; + let regId = '10'; + let type = 'someRandomType'; + + beforeEach(async () => { + user = await generateUser(); + }); + + it('returns an error if user already has the push device', async () => { + await user.post('/user/addPushDevice', {type, regId}); + await expect(user.post('/user/addPushDevice', {type, regId})) + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('pushDeviceAlreadyAdded'), + }); + }); + + // More tests in common code unit tests + + it('adds a push device to the user', async () => { + let response = await user.post('/user/addPushDevice', {type, regId}); + await user.sync(); + + expect(response.message).to.equal(t('pushDeviceAdded')); + expect(user.pushDevices[0].type).to.equal(type); + expect(user.pushDevices[0].regId).to.equal(regId); + }); +}); diff --git a/test/common/ops/addPushDevice.js b/test/common/ops/addPushDevice.js new file mode 100644 index 0000000000..854977b71d --- /dev/null +++ b/test/common/ops/addPushDevice.js @@ -0,0 +1,59 @@ +import addPushDevice from '../../../common/script/ops/addPushDevice'; +import i18n from '../../../common/script/i18n'; +import { + generateUser, +} from '../../helpers/common.helper'; +import { + NotAuthorized, + BadRequest, +} from '../../../common/script/libs/errors'; + +describe('shared.ops.addPushDevice', () => { + let user; + let regId = '10'; + let type = 'someRandomType'; + + beforeEach(() => { + user = generateUser(); + user.stats.hp = 0; + }); + + it('returns an error when regId is not provided', (done) => { + try { + addPushDevice(user); + } catch (err) { + expect(err).to.be.an.instanceof(BadRequest); + expect(err.message).to.equal(i18n.t('regIdRequired')); + done(); + } + }); + + it('returns an error when type is not provided', (done) => { + try { + addPushDevice(user, {body: {regId}}); + } catch (err) { + expect(err).to.be.an.instanceof(BadRequest); + expect(err.message).to.equal(i18n.t('typeRequired')); + done(); + } + }); + + it('adds a push device', () => { + let response = addPushDevice(user, {body: {regId, type}}); + + expect(response.message).to.equal(i18n.t('pushDeviceAdded')); + expect(user.pushDevices[0].type).to.equal(type); + expect(user.pushDevices[0].regId).to.equal(regId); + }); + + it('does not a push device twice', (done) => { + try { + addPushDevice(user, {body: {regId, type}}); + addPushDevice(user, {body: {regId, type}}); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('pushDeviceAlreadyAdded')); + done(); + } + }); +}); diff --git a/website/src/controllers/api-v3/user.js b/website/src/controllers/api-v3/user.js index c69c862bb5..2bbe9c52ca 100644 --- a/website/src/controllers/api-v3/user.js +++ b/website/src/controllers/api-v3/user.js @@ -1061,4 +1061,26 @@ api.userReroll = { }, }; +/* +* @api {post} /user/addPushDevice Adds a push device to a user. +* @apiVersion 3.0.0 +* @apiName UserAddPushDevice +* @apiGroup User +* +* @apiSuccess {Object} data `pushDevices` +*/ +api.userAddPushDevice = { + method: 'POST', + middlewares: [authWithHeaders(), cron], + url: '/user/addPushDevice', + async handler (req, res) { + let user = res.locals.user; + + let addPushDeviceResponse = common.ops.addPushDevice(user, req); + await user.save(); + + res.respond(200, addPushDeviceResponse); + }, +}; + module.exports = api;