fix(stats): enforce sensible maxima in db

This commit is contained in:
Sabe Jones
2023-10-17 22:31:43 +00:00
parent 832acb1617
commit 4974712d6c
4 changed files with 26 additions and 5 deletions

View File

@@ -148,7 +148,7 @@ import svgGold from '@/assets/svg/gold.svg';
import level from '@/assets/svg/level.svg'; import level from '@/assets/svg/level.svg';
import streakIcon from '@/assets/svg/streak.svg'; import streakIcon from '@/assets/svg/streak.svg';
import { mapState } from '@/libs/store'; import { mapState } from '@/libs/store';
import { MAX_LEVEL_HARD_CAP } from '../../../../../common/script/constants'; import { MAX_LEVEL_HARD_CAP, MAX_FIELD_HARD_CAP } from '../../../../../common/script/constants';
export default { export default {
components: { SaveCancelButtons }, components: { SaveCancelButtons },
@@ -231,10 +231,6 @@ export default {
return; return;
} }
if (this.restoreValues.lvl > MAX_LEVEL_HARD_CAP) {
this.restoreValues.lvl = MAX_LEVEL_HARD_CAP;
}
const userChangedLevel = this.restoreValues.lvl !== this.user.stats.lvl; const userChangedLevel = this.restoreValues.lvl !== this.user.stats.lvl;
const userDidNotChangeExp = this.restoreValues.exp === this.user.stats.exp; const userDidNotChangeExp = this.restoreValues.exp === this.user.stats.exp;
if (userChangedLevel && userDidNotChangeExp) { if (userChangedLevel && userDidNotChangeExp) {
@@ -265,6 +261,9 @@ export default {
) { ) {
this.restoreValues[stat] = this.user.stats[stat]; this.restoreValues[stat] = this.user.stats[stat];
valid = false; valid = false;
} else if (this.restoreValues[stat] > MAX_FIELD_HARD_CAP) {
this.restoreValues[stat] = MAX_FIELD_HARD_CAP;
valid = false;
} }
} }
@@ -274,6 +273,9 @@ export default {
|| inputLevel < 1) { || inputLevel < 1) {
this.restoreValues.lvl = this.user.stats.lvl; this.restoreValues.lvl = this.user.stats.lvl;
valid = false; valid = false;
} else if (inputLevel > MAX_LEVEL_HARD_CAP) {
this.restoreValues.lvl = MAX_LEVEL_HARD_CAP;
valid = false;
} }
const inputStreak = Number(this.restoreValues.streak); const inputStreak = Number(this.restoreValues.streak);

View File

@@ -2,6 +2,7 @@ export const MAX_HEALTH = 50;
export const MAX_LEVEL = 100; export const MAX_LEVEL = 100;
export const MAX_STAT_POINTS = MAX_LEVEL; export const MAX_STAT_POINTS = MAX_LEVEL;
export const MAX_LEVEL_HARD_CAP = 9999; export const MAX_LEVEL_HARD_CAP = 9999;
export const MAX_FIELD_HARD_CAP = 99999999;
export const ATTRIBUTES = ['str', 'int', 'con', 'per']; export const ATTRIBUTES = ['str', 'int', 'con', 'per'];
export const MAX_INCENTIVES = 500; export const MAX_INCENTIVES = 500;

View File

@@ -11,6 +11,7 @@ import {
MAX_INCENTIVES, MAX_INCENTIVES,
MAX_LEVEL, MAX_LEVEL,
MAX_LEVEL_HARD_CAP, MAX_LEVEL_HARD_CAP,
MAX_FIELD_HARD_CAP,
MAX_STAT_POINTS, MAX_STAT_POINTS,
MAX_SUMMARY_SIZE_FOR_CHALLENGES, MAX_SUMMARY_SIZE_FOR_CHALLENGES,
MAX_SUMMARY_SIZE_FOR_GUILDS, MAX_SUMMARY_SIZE_FOR_GUILDS,
@@ -124,6 +125,7 @@ api.constants = {
MAX_MESSAGE_LENGTH, MAX_MESSAGE_LENGTH,
MAX_GIFT_MESSAGE_LENGTH, MAX_GIFT_MESSAGE_LENGTH,
MAX_LEVEL_HARD_CAP, MAX_LEVEL_HARD_CAP,
MAX_FIELD_HARD_CAP,
}; };
// TODO Move these under api.constants // TODO Move these under api.constants
api.maxLevel = MAX_LEVEL; api.maxLevel = MAX_LEVEL;

View File

@@ -362,6 +362,8 @@ schema.pre('save', true, function preSaveUser (next, done) {
} }
} }
// Enforce min/max values without displaying schema errors to end user
if (this.isDirectSelected('preferences')) { if (this.isDirectSelected('preferences')) {
if ( if (
_.isNaN(this.preferences.dayStart) _.isNaN(this.preferences.dayStart)
@@ -372,6 +374,20 @@ schema.pre('save', true, function preSaveUser (next, done) {
} }
} }
if (this.isSelected('stats')) {
const statMaximum = common.constants.MAX_FIELD_HARD_CAP;
const levelMaximum = common.constants.MAX_LEVEL_HARD_CAP;
_.each(['hp', 'mp', 'exp', 'gp'], stat => {
if (this.stats[stat] > statMaximum) {
this.stats[stat] = statMaximum;
}
});
if (this.stats.lvl > levelMaximum) {
this.stats.lvl = levelMaximum;
}
}
// our own version incrementer // our own version incrementer
if (this.isDirectSelected('_v')) { if (this.isDirectSelected('_v')) {
if (_.isNaN(this._v) || !_.isNumber(this._v)) this._v = 0; if (_.isNaN(this._v) || !_.isNumber(this._v)) this._v = 0;