diff --git a/api/src/core/utils/validation/enum-validator.ts b/api/src/core/utils/validation/enum-validator.ts new file mode 100644 index 000000000..0b870bb79 --- /dev/null +++ b/api/src/core/utils/validation/enum-validator.ts @@ -0,0 +1,17 @@ +export function isValidEnumValue>( + value: unknown, + enumObject: T +): value is T[keyof T] { + if (value == null) { + return false; + } + + return Object.values(enumObject).includes(value as T[keyof T]); +} + +export function validateEnumValue>( + value: unknown, + enumObject: T +): T[keyof T] | undefined { + return isValidEnumValue(value, enumObject) ? (value as T[keyof T]) : undefined; +} diff --git a/api/src/unraid-api/graph/resolvers/info/display/display.service.ts b/api/src/unraid-api/graph/resolvers/info/display/display.service.ts index 6945377bc..9668b55ac 100644 --- a/api/src/unraid-api/graph/resolvers/info/display/display.service.ts +++ b/api/src/unraid-api/graph/resolvers/info/display/display.service.ts @@ -6,6 +6,7 @@ import { type DynamixConfig } from '@app/core/types/ini.js'; import { toBoolean } from '@app/core/utils/casting.js'; import { fileExists } from '@app/core/utils/files/file-exists.js'; import { loadState } from '@app/core/utils/misc/load-state.js'; +import { validateEnumValue } from '@app/core/utils/validation/enum-validator.js'; import { getters } from '@app/store/index.js'; import { ThemeName } from '@app/unraid-api/graph/resolvers/customization/theme.model.js'; import { Display, Temperature } from '@app/unraid-api/graph/resolvers/info/display/display.model.js'; @@ -77,8 +78,8 @@ export class DisplayService { const display: Display = { id: 'info/display', case: caseInfo, - theme: config.theme || ThemeName.white, - unit: config.unit || Temperature.CELSIUS, + theme: config.theme ?? ThemeName.white, + unit: config.unit ?? Temperature.CELSIUS, scale: config.scale ?? false, tabs: config.tabs ?? true, resize: config.resize ?? true, @@ -145,10 +146,11 @@ export class DisplayService { } const { theme, unit, ...display } = state.display; + return { ...display, - theme: theme as ThemeName, - unit: unit as Temperature, + theme: validateEnumValue(theme, ThemeName), + unit: validateEnumValue(unit, Temperature), scale: toBoolean(display.scale), tabs: toBoolean(display.tabs), resize: toBoolean(display.resize),