mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-18 15:17:25 +01:00
prevent selling negative items (#10061)
This commit is contained in:
@@ -75,6 +75,16 @@ describe('shared.ops.sell', () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns an error when the requested amount is negative', (done) => {
|
||||||
|
try {
|
||||||
|
sell(user, {params: { type, key }, query: {amount: -42} });
|
||||||
|
} catch (err) {
|
||||||
|
expect(err).to.be.an.instanceof(BadRequest);
|
||||||
|
expect(err.message).to.equal(i18n.t('positiveAmountRequired', {type}));
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('reduces item count from user', () => {
|
it('reduces item count from user', () => {
|
||||||
sell(user, {params: { type, key } });
|
sell(user, {params: { type, key } });
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
b.how-many-to-sell {{ $t('howManyToSell') }}
|
b.how-many-to-sell {{ $t('howManyToSell') }}
|
||||||
|
|
||||||
div
|
div
|
||||||
b-input.itemsToSell(type="number", v-model="selectedAmountToSell", :max="itemCount", min="1")
|
b-input.itemsToSell(type="number", v-model="selectedAmountToSell", :max="itemCount", min="1", @keyup.native="preventNegative($event)")
|
||||||
|
|
||||||
span.svg-icon.inline.icon-32(aria-hidden="true", v-html="icons.gold")
|
span.svg-icon.inline.icon-32(aria-hidden="true", v-html="icons.gold")
|
||||||
span.value {{ item.value }}
|
span.value {{ item.value }}
|
||||||
@@ -141,6 +141,13 @@
|
|||||||
|
|
||||||
this.selectedAmountToSell = 1;
|
this.selectedAmountToSell = 1;
|
||||||
},
|
},
|
||||||
|
preventNegative ($event) {
|
||||||
|
let value = $event.target.value;
|
||||||
|
|
||||||
|
if (isNaN($event.target.valueAsNumber) || Number(value) < 0) {
|
||||||
|
this.selectedAmountToSell = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
sellItems () {
|
sellItems () {
|
||||||
this.$store.dispatch('shops:sellItems', {
|
this.$store.dispatch('shops:sellItems', {
|
||||||
type: this.itemType,
|
type: this.itemType,
|
||||||
|
|||||||
@@ -92,6 +92,7 @@
|
|||||||
"invalidTypeEquip": "\"type\" must be one of 'equipped', 'pet', 'mount', 'costume'.",
|
"invalidTypeEquip": "\"type\" must be one of 'equipped', 'pet', 'mount', 'costume'.",
|
||||||
"mustPurchaseToSet": "Must purchase <%= val %> to set it on <%= key %>.",
|
"mustPurchaseToSet": "Must purchase <%= val %> to set it on <%= key %>.",
|
||||||
"typeRequired": "Type is required",
|
"typeRequired": "Type is required",
|
||||||
|
"positiveAmountRequired": "Positive amount is required",
|
||||||
"keyRequired": "Key is required",
|
"keyRequired": "Key is required",
|
||||||
"notAccteptedType": "Type must be in [eggs, hatchingPotions, premiumHatchingPotions, food, quests, gear]",
|
"notAccteptedType": "Type must be in [eggs, hatchingPotions, premiumHatchingPotions, food, quests, gear]",
|
||||||
"contentKeyNotFound": "Key not found for Content <%= type %>",
|
"contentKeyNotFound": "Key not found for Content <%= type %>",
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ module.exports = function sell (user, req = {}) {
|
|||||||
let type = get(req.params, 'type');
|
let type = get(req.params, 'type');
|
||||||
let amount = get(req.query, 'amount', 1);
|
let amount = get(req.query, 'amount', 1);
|
||||||
|
|
||||||
|
if (amount < 0) {
|
||||||
|
throw new BadRequest(i18n.t('positiveAmountRequired', req.language));
|
||||||
|
}
|
||||||
|
|
||||||
if (!type) {
|
if (!type) {
|
||||||
throw new BadRequest(i18n.t('typeRequired', req.language));
|
throw new BadRequest(i18n.t('typeRequired', req.language));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user