diff --git a/backend/UserConfig.ts b/backend/UserConfig.ts index bad2876..d8d1e8a 100644 --- a/backend/UserConfig.ts +++ b/backend/UserConfig.ts @@ -1,7 +1,47 @@ +import fs from 'fs-extra'; +import { UserConfiguration, UserConfigTypeChecker } from 'ass'; + +/** + * Returns a boolean if the provided value is a number + */ +const numChecker = (val: string) => { + try { parseInt(val); return true; } + catch (err) { return false; } +} + +/** + * User-config property type checker functions + */ +const Checkers: UserConfigTypeChecker = { + uploadsDir: (val) => { + try { fs.accessSync(val); return true; } + catch (err) { return false; } + }, + idType: (val) => { + const options = ['random', 'original', 'gfycat', 'timestamp', 'zws']; + return options.includes(val); + }, + idSize: numChecker, + gfySize: numChecker, + maximumFileSize: numChecker, +} export class UserConfig { private config: UserConfiguration; public getConfig = () => this.config; constructor(config?: UserConfiguration) { + if (config != null) this.config = this.parseConfig(config); + } + + private parseConfig(config: UserConfiguration) { + if (!Checkers.uploadsDir(config.uploadsDir)) throw new Error(`Unable to access uploads directory: ${config.uploadsDir}`); + if (!Checkers.idType(config.idType)) throw new Error(`Invalid ID type: ${config.idType}`); + if (!Checkers.idSize(config.idSize)) throw new Error(`Invalid ID size: ${config.idSize}`); + if (!Checkers.gfySize(config.gfySize)) throw new Error(`Invalid Gfy size: ${config.gfySize}`); + if (!Checkers.maximumFileSize(config.maximumFileSize)) throw new Error(`Invalid maximum file size: ${config.maximumFileSize}`); + + // All is fine, carry on! + return config; + } } diff --git a/backend/tsconfig.json b/backend/tsconfig.json index e2e7770..d62defe 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -5,7 +5,8 @@ "lib": [ "ES2022", ], - "moduleResolution": "Node" + "moduleResolution": "Node", + "strictPropertyInitialization": false }, "include": [ "./**/*.ts", diff --git a/common/types.d.ts b/common/types.d.ts index 22a1147..820e3c9 100644 --- a/common/types.d.ts +++ b/common/types.d.ts @@ -19,6 +19,14 @@ declare module 'ass' { gfySize: number; maximumFileSize: number; } + + interface UserConfigTypeChecker { + uploadsDir: (val: any) => boolean; + idType: (val: any) => boolean; + idSize: (val: any) => boolean; + gfySize: (val: any) => boolean; + maximumFileSize: (val: any) => boolean; + } } //#region Dummy modules