Merge branch 'api-v3-ops-read-card' of https://github.com/TheHollidayInn/habitrpg into TheHollidayInn-api-v3-ops-read-card

This commit is contained in:
Matteo Pagliazzi
2016-04-01 16:30:48 +02:00
6 changed files with 140 additions and 8 deletions

View File

@@ -137,5 +137,8 @@
"contentKeyNotFound": "Key not found for Content <%= type %>", "contentKeyNotFound": "Key not found for Content <%= type %>",
"plusOneGem": "+1 Gem", "plusOneGem": "+1 Gem",
"purchased": "You purchsed a <%= key %> <%= type %>", "purchased": "You purchsed a <%= key %> <%= type %>",
"notAllowedHourglass": "Pet/Mount not available for purchase with Mystic Hourglass." "notAllowedHourglass": "Pet/Mount not available for purchase with Mystic Hourglass.",
"readCard": "<%= cardType %> has been read",
"cardTypeRequired": "Card type required",
"cardTypeNotAllowed": "Unkown card type."
} }

View File

@@ -116,6 +116,7 @@ import changeClass from './ops/changeClass';
import disableClasses from './ops/disableClasses'; import disableClasses from './ops/disableClasses';
import purchase from './ops/purchase'; import purchase from './ops/purchase';
import purchaseHourglass from './ops/hourglassPurchase'; import purchaseHourglass from './ops/hourglassPurchase';
import readCard from './ops/readCard';
api.ops = { api.ops = {
scoreTask, scoreTask,
@@ -133,6 +134,7 @@ api.ops = {
disableClasses, disableClasses,
purchase, purchase,
purchaseHourglass, purchaseHourglass,
readCard,
}; };
import handleTwoHanded from './fns/handleTwoHanded'; import handleTwoHanded from './fns/handleTwoHanded';

View File

@@ -1,10 +1,28 @@
module.exports = function(user, req, cb) { import splitWhitespace from '../libs/splitWhitespace';
var cardType; import _ from 'lodash';
cardType = req.params.cardType; import i18n from '../i18n';
user.items.special[cardType + "Received"].shift(); import {
if (typeof user.markModified === "function") { BadRequest,
user.markModified("items.special." + cardType + "Received"); NotAuthorized,
} from '../libs/errors';
import content from '../content/index';
module.exports = function readCard (user, req = {}) {
let cardType = _.get(req.params, 'cardType');
if (!cardType) {
throw new BadRequest(i18n.t('cardTypeRequired', req.language));
} }
if (_.keys(content.cardTypes).indexOf(cardType) === -1) {
throw new NotAuthorized(i18n.t('cardTypeNotAllowed', req.language));
}
user.items.special[`${cardType}Received`].shift();
user.flags.cardReceived = false; user.flags.cardReceived = false;
return typeof cb === "function" ? cb(null, 'items.special flags.cardReceived') : void 0;
return {
message: i18n.t('readCard', {cardType}, req.language),
data: _.pick(user, splitWhitespace('items.special flags.cardReceived')),
};
}; };

View File

@@ -0,0 +1,38 @@
import {
generateUser,
translate as t,
} from '../../../../helpers/api-integration/v3';
describe('POST /user/read-card/:cardType', () => {
let user;
let cardType = 'greeting';
beforeEach(async () => {
user = await generateUser();
});
it('returns an error when unknown cardType is provded', async () => {
await expect(user.post('/user/read-card/randomCardType'))
.to.eventually.be.rejected.and.to.eql({
code: 401,
error: 'NotAuthorized',
message: t('cardTypeNotAllowed'),
});
});
// More tests in common code unit tests
it('reads a card', async () => {
await user.update({
'items.special.greetingReceived': [true],
'flags.cardReceived': true,
});
let response = await user.post(`/user/read-card/${cardType}`);
await user.sync();
expect(response.message).to.equal(t('readCard', {cardType}));
expect(user.items.special[`${cardType}Received`]).to.be.empty;
expect(user.flags.cardReceived).to.be.false;
});
});

View File

@@ -0,0 +1,48 @@
import readCard from '../../../common/script/ops/readCard';
import i18n from '../../../common/script/i18n';
import {
generateUser,
} from '../../helpers/common.helper';
import {
BadRequest,
NotAuthorized,
} from '../../../common/script/libs/errors';
describe('shared.ops.readCard', () => {
let user;
let cardType = 'greeting';
beforeEach(() => {
user = generateUser();
user.items.special[`${cardType}Received`] = [true];
user.flags.cardReceived = true;
});
it('returns an error when cardType is not provided', (done) => {
try {
readCard(user);
} catch (err) {
expect(err).to.be.an.instanceof(BadRequest);
expect(err.message).to.equal(i18n.t('cardTypeRequired'));
done();
}
});
it('returns an error when unknown cardType is provided', (done) => {
try {
readCard(user, {params: {cardType: 'randomCardType'}});
} catch (err) {
expect(err).to.be.an.instanceof(NotAuthorized);
expect(err.message).to.equal(i18n.t('cardTypeNotAllowed'));
done();
}
});
it('reads a card', () => {
let response = readCard(user, {params: {cardType: 'greeting'}});
expect(response.message).to.equal(i18n.t('readCard', {cardType}));
expect(user.items.special[`${cardType}Received`]).to.be.empty;
expect(user.flags.cardReceived).to.be.false;
});
});

View File

@@ -677,6 +677,7 @@ api.disableClasses = {
}; };
/** /**
<<<<<<< HEAD
* @api {post} /user/purchase/:type/:key Purchase Gem Items. * @api {post} /user/purchase/:type/:key Purchase Gem Items.
* @apiVersion 3.0.0 * @apiVersion 3.0.0
* @apiName UserPurchase * @apiName UserPurchase
@@ -722,4 +723,26 @@ api.userPurchaseHourglass = {
}, },
}; };
/**
* @api {post} /user/read-card/:cardType Reads a card.
* @apiVersion 3.0.0
* @apiName UserReadCard
* @apiGroup User
*
* @apiParam {string} cardType Type of card to read
*
* @apiSuccess {Object} data `items.special flags.cardReceived`
*/
api.readCard = {
method: 'POST',
middlewares: [authWithHeaders(), cron],
url: '/user/read-card/:cardType',
async handler (req, res) {
let user = res.locals.user;
let readCardResponse = common.ops.readCard(user, req);
await user.save();
res.respond(200, readCardResponse);
},
};
module.exports = api; module.exports = api;