mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 15:48:04 +01:00
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:
@@ -137,5 +137,8 @@
|
||||
"contentKeyNotFound": "Key not found for Content <%= type %>",
|
||||
"plusOneGem": "+1 Gem",
|
||||
"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."
|
||||
}
|
||||
|
||||
@@ -116,6 +116,7 @@ import changeClass from './ops/changeClass';
|
||||
import disableClasses from './ops/disableClasses';
|
||||
import purchase from './ops/purchase';
|
||||
import purchaseHourglass from './ops/hourglassPurchase';
|
||||
import readCard from './ops/readCard';
|
||||
|
||||
api.ops = {
|
||||
scoreTask,
|
||||
@@ -133,6 +134,7 @@ api.ops = {
|
||||
disableClasses,
|
||||
purchase,
|
||||
purchaseHourglass,
|
||||
readCard,
|
||||
};
|
||||
|
||||
import handleTwoHanded from './fns/handleTwoHanded';
|
||||
|
||||
@@ -1,10 +1,28 @@
|
||||
module.exports = function(user, req, cb) {
|
||||
var cardType;
|
||||
cardType = req.params.cardType;
|
||||
user.items.special[cardType + "Received"].shift();
|
||||
if (typeof user.markModified === "function") {
|
||||
user.markModified("items.special." + cardType + "Received");
|
||||
import splitWhitespace from '../libs/splitWhitespace';
|
||||
import _ from 'lodash';
|
||||
import i18n from '../i18n';
|
||||
import {
|
||||
BadRequest,
|
||||
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;
|
||||
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')),
|
||||
};
|
||||
};
|
||||
|
||||
38
test/api/v3/integration/user/POST-user_read_card.test.js
Normal file
38
test/api/v3/integration/user/POST-user_read_card.test.js
Normal 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;
|
||||
});
|
||||
});
|
||||
48
test/common/ops/readCard.js
Normal file
48
test/common/ops/readCard.js
Normal 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;
|
||||
});
|
||||
});
|
||||
@@ -677,6 +677,7 @@ api.disableClasses = {
|
||||
};
|
||||
|
||||
/**
|
||||
<<<<<<< HEAD
|
||||
* @api {post} /user/purchase/:type/:key Purchase Gem Items.
|
||||
* @apiVersion 3.0.0
|
||||
* @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;
|
||||
|
||||
Reference in New Issue
Block a user