Add config schema (#2401) by Bruception

* Add config schema

* Change schema

* Fix custom validator

* Relax schema

* add result filters schema

* Remove result filters

* Fix quoteLength schema
This commit is contained in:
Bruce Berrios 2022-02-03 14:26:34 -05:00 committed by GitHub
parent ff0714dcea
commit 83f1253f42
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 112 additions and 3 deletions

View file

@ -1,11 +1,12 @@
const { authenticateRequest } = require("../../middlewares/auth");
const { Router } = require("express");
const ConfigController = require("../controllers/config");
const RateLimit = require("../../middlewares/rate-limit");
const { authenticateRequest } = require("../../middlewares/auth");
const {
asyncHandlerWrapper,
requestValidation,
} = require("../../middlewares/api-utils");
const configSchema = require("../schemas/config-schema");
const ConfigController = require("../controllers/config");
const RateLimit = require("../../middlewares/rate-limit");
const router = Router();
@ -20,6 +21,11 @@ router.post(
"/save",
RateLimit.configUpdate,
authenticateRequest,
requestValidation({
body: {
config: configSchema,
},
}),
asyncHandlerWrapper(ConfigController.saveConfig)
);

View file

@ -0,0 +1,103 @@
const _ = require("lodash");
const joi = require("joi");
const CARET_STYLES = [
"off",
"default",
"underline",
"outline",
"block",
"carrot",
"banana",
];
const CONFIG_SCHEMA = joi.object({
theme: joi.string(),
customTheme: joi.boolean(),
customThemeColors: joi
.array()
.items(joi.string().pattern(/^#[A-Fa-f0-9]{6}$/))
.length(9),
favThemes: joi.array().items(joi.string()),
showKeyTips: joi.boolean(),
showLiveWpm: joi.boolean(),
showTimerProgress: joi.boolean(),
smoothCaret: joi.boolean(),
quickTab: joi.boolean(),
punctuation: joi.boolean(),
numbers: joi.boolean(),
words: joi.number().min(0),
time: joi.number().min(0),
mode: joi.string().valid("time", "words", "quote", "zen", "custom"),
quoteLength: joi.array().items(joi.number()),
language: joi.string(),
fontSize: joi.number().valid(1, 125, 15, 2, 3, 4),
freedomMode: joi.boolean(),
difficulty: joi.string().valid("normal", "expert", "master"),
blindMode: joi.boolean(),
quickEnd: joi.boolean(),
caretStyle: joi.string().valid(...CARET_STYLES),
paceCaretStyle: joi.string().valid(...CARET_STYLES),
flipTestColors: joi.boolean(),
layout: joi.string(),
funbox: joi.string(),
confidenceMode: joi.string().valid("off", "on", "max"),
indicateTypos: joi.boolean(),
timerStyle: joi.string().valid("bar", "text", "mini"),
colorfulMode: joi.boolean(),
randomTheme: joi.string().valid("off", "on", "favorite", "light", "dark"),
timerColor: joi.string().valid("black", "sub", "text", "main"),
timerOpacity: joi.number().valid(0.25, 0.5, 0.75, 1),
stopOnError: joi.string().valid("off", "word", "letter"),
showAllLines: joi.boolean(),
keymapMode: joi.string().valid("off", "static", "react", "next"),
keymapStyle: joi
.string()
.valid("staggered", "alice", "matrix", "split", "split_matrix"),
keymapLegendStyle: joi.string().valid("lowercase", "uppercase", "blank"),
keymapLayout: joi.string().valid(),
fontFamily: joi.string(),
smoothLineScroll: joi.boolean(),
alwaysShowDecimalPlaces: joi.boolean(),
alwaysShowWordsHistory: joi.boolean(),
singleListCommandLine: joi.string().valid("manual", "on"),
capsLockWarning: joi.boolean(),
playSoundOnError: joi.boolean(),
playSoundOnClick: joi.string().valid("off", ..._.range(1, 8).map(_.toString)),
soundVolume: joi.string().valid("0.1", "0.5", "1.0"),
startGraphsAtZero: joi.boolean(),
swapEscAndTab: joi.boolean(),
showOutOfFocusWarning: joi.boolean(),
paceCaret: joi.string().valid("off", "average", "pb", "custom"),
paceCaretCustomSpeed: joi.number().min(0),
repeatedPace: joi.boolean(),
pageWidth: joi.string().valid("100", "125", "150", "200", "max"),
chartAccuracy: joi.boolean(),
chartStyle: joi.string().valid("line", "scatter"),
minWpm: joi.string().valid("off", "custom"),
minWpmCustomSpeed: joi.number().min(0),
highlightMode: joi.string().valid("off", "letter", "word"),
alwaysShowCPM: joi.boolean(),
enableAds: joi.string().valid("off", "on", "max"),
hideExtraLetters: joi.boolean(),
strictSpace: joi.boolean(),
minAcc: joi.string().valid("off", "custom"),
minAccCustom: joi.number().min(0),
showLiveAcc: joi.boolean(),
showLiveBurst: joi.boolean(),
monkey: joi.boolean(),
repeatQuotes: joi.string().valid("off", "typing"),
oppositeShiftMode: joi.string().valid("off", "on", "keymap"),
customBackground: joi.string().uri().allow(""),
customBackgroundSize: joi.string().valid("cover", "contain", "max"),
customBackgroundFilter: joi.array().items(joi.number()),
customLayoutfluid: joi.string(),
monkeyPowerLevel: joi.string().valid("off", "1", "2", "3", "4"),
minBurst: joi.string().valid("off", "fixed", "flex"),
minBurstCustomSpeed: joi.number().min(0),
burstHeatmap: joi.boolean(),
britishEnglish: joi.boolean(),
lazyMode: joi.boolean(),
});
module.exports = CONFIG_SCHEMA;