Files
habitica/website/common/script/ops/buy/buyMount.js
2020-07-01 18:20:18 +02:00

59 lines
1.5 KiB
JavaScript

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';
import { AbstractHourglassItemOperation } from './abstractBuyOperation';
export class BuyHourglassMountOperation extends AbstractHourglassItemOperation { // eslint-disable-line import/prefer-default-export, max-len
multiplePurchaseAllowed () { // eslint-disable-line class-methods-use-this
return false;
}
extractAndValidateParams (user, req) {
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 = {
...user.items.mounts,
[this.key]: true,
};
if (user.markModified) user.markModified('items.mounts');
this.subtractCurrency(user);
const message = this.i18n('hourglassPurchase');
return [
{ items: user.items, purchasedPlanConsecutive: user.purchased.plan.consecutive },
message,
];
}
analyticsData () {
const data = super.analyticsData();
data.itemType = 'mounts';
return data;
}
}