habitica-self-host/website/common/script/ops/buy/buyMount.js

57 lines
1.4 KiB
JavaScript
Raw Normal View History

2019-10-08 14:57:10 +00:00
import get from 'lodash/get';
import includes from 'lodash/includes';
import keys from 'lodash/keys';
import content from '../../content/index';
import {
BadRequest,
NotAuthorized,
} from '../../libs/errors';
2019-10-08 14:57:10 +00:00
import { AbstractHourglassItemOperation } from './abstractBuyOperation';
2019-10-09 14:51:17 +00:00
export class BuyHourglassMountOperation extends AbstractHourglassItemOperation { // eslint-disable-line import/prefer-default-export, max-len
2019-10-09 18:08:36 +00:00
multiplePurchaseAllowed () { // eslint-disable-line class-methods-use-this
return false;
}
extractAndValidateParams (user, req) {
2019-10-09 14:51:17 +00:00
this.key = get(req, 'params.key');
const { key } = this;
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);
2019-10-08 14:57:10 +00:00
const message = this.i18n('hourglassPurchase');
return [
{ items: user.items, purchasedPlanConsecutive: user.purchased.plan.consecutive },
message,
];
}
analyticsData () {
2019-10-08 14:57:10 +00:00
const data = super.analyticsData();
data.itemType = 'mounts';
return data;
}
}