Purchase API Refactoring: Mounts [Hourglass] (#10482)

* AbstractGemItemOperation - BuyQuestWithGemOperation

* fix purchase
This commit is contained in:
negue
2019-09-20 16:52:15 +02:00
committed by Matteo Pagliazzi
parent 4690431384
commit 3aa2e30815
4 changed files with 102 additions and 5 deletions

View File

@@ -194,3 +194,28 @@ export class AbstractGemItemOperation extends AbstractBuyOperation {
};
}
}
export class AbstractHourglassItemOperation extends AbstractBuyOperation {
constructor (user, req, analytics) {
super(user, req, analytics);
}
canUserPurchase (user, item) {
this.item = item;
if (user.purchased.plan.consecutive.trinkets <= 0) {
throw new NotAuthorized(this.i18n('notEnoughHourglasses'));
}
}
subtractCurrency (user) {
user.purchased.plan.consecutive.trinkets--;
}
analyticsData () {
return {
itemKey: this.item.key,
acquireMethod: 'Hourglass',
};
}
}

View File

@@ -13,6 +13,7 @@ import hourglassPurchase from './hourglassPurchase';
import errorMessage from '../../libs/errorMessage';
import {BuyGemOperation} from './buyGem';
import {BuyQuestWithGemOperation} from './buyQuestGem';
import {BuyHourglassMountOperation} from './buyMount';
// @TODO: remove the req option style. Dependency on express structure is an anti-pattern
// We should either have more params or a set structure validated by a Type checker
@@ -72,8 +73,13 @@ module.exports = function buy (user, req = {}, analytics, options = {quantity: 1
case 'bundles':
buyRes = purchaseOp(user, req, analytics);
break;
case 'mounts': {
const buyOp = new BuyHourglassMountOperation(user, req, analytics);
buyRes = buyOp.purchase();
break;
}
case 'pets':
case 'mounts':
buyRes = hourglassPurchase(user, req, analytics);
break;
case 'quest': {

View File

@@ -0,0 +1,59 @@
import content from '../../content/index';
import {
BadRequest,
NotAuthorized,
} from '../../libs/errors';
import {AbstractHourglassItemOperation} from './abstractBuyOperation';
import get from 'lodash/get';
import includes from 'lodash/includes';
import keys from 'lodash/keys';
export class BuyHourglassMountOperation extends AbstractHourglassItemOperation {
constructor (user, req, analytics) {
super(user, req, analytics);
}
multiplePurchaseAllowed () {
return false;
}
extractAndValidateParams (user, req) {
let key = this.key = get(req, 'params.key');
if (!key) throw new BadRequest(this.i18n('missingKeyParam'));
if (!includes(keys(content.timeTravelStable.mounts), key)) {
throw new NotAuthorized(this.i18n('notAllowedHourglass'));
}
if (user.items.mounts[key]) {
throw new NotAuthorized(this.i18n('mountsAlreadyOwned'));
}
this.canUserPurchase(user, {
key,
});
}
executeChanges (user) {
user.items.mounts[this.key] = true;
if (user.markModified) user.markModified('items.mounts');
this.subtractCurrency(user);
let message = this.i18n('hourglassPurchase');
return [
{ items: user.items, purchasedPlanConsecutive: user.purchased.plan.consecutive },
message,
];
}
analyticsData () {
let data = super.analyticsData();
data.itemType = 'mounts';
return data;
}
}