diff --git a/framework/framework/validator.ts b/framework/framework/validator.ts index 66510940d..07664834b 100644 --- a/framework/framework/validator.ts +++ b/framework/framework/validator.ts @@ -61,7 +61,7 @@ export interface Types { CommaSeperatedArray: Type; Set: Type>; Any: Type; - ArrayOf: >(type: T) => (T extends Type ? Type : never); + ArrayOf: >(type: T, isOptional?: boolean) => (T extends Type ? Type : never); AnyOf: >(...type: T[]) => (T extends Type ? Type : never); } @@ -175,15 +175,21 @@ export const Types = { (v) => emojiRegex().test(v.toString()), ], Any: [(v) => v, null], - ArrayOf: (type) => [ + ArrayOf: (type, isOptional = false) => [ (v) => { const arr = v instanceof Array ? v : [v]; - return arr.map((i) => type[0](i)); + return arr.map((i) => { + if (isOptional && [undefined, null, ''].includes(i)) return undefined; + return type[0](i); + }); }, (v) => { if (!type[1]) return true; const arr = v instanceof Array ? v : [v]; - return arr.every((i) => type[1](i)); + return arr.every((i) => { + if ([undefined, null, ''].includes(i)) return isOptional; + return type[1](i); + }); }, ] as any, AnyOf: (...types) => [ @@ -195,10 +201,4 @@ export const Types = { try { const { ObjectId } = require('mongodb'); Types.ObjectId = [((v) => new ObjectId(v)) as any, ObjectId.isValid]; -} catch (e) { - -} - -// @ts-ignore -Types.ObjectID = Types.ObjectId; -// backward compatibility +} catch (e) { } diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index dc3fa7a2a..f2fcfdbf9 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -483,7 +483,7 @@ export class ProblemSubmitHandler extends ProblemDetailHandler { @param('lang', Types.Name) @param('code', Types.String, true) @param('pretest', Types.Boolean) - @param('input', Types.ArrayOf(Types.String), true) + @param('input', Types.ArrayOf(Types.String, true), true) @param('tid', Types.ObjectId, true) async post(domainId: string, lang: string, code: string, pretest = false, input: string[] = [], tid?: ObjectId) { const config = this.pdoc.config; @@ -499,6 +499,7 @@ export class ProblemSubmitHandler extends ProblemDetailHandler { throw new ProblemNotAllowPretestError('type'); } if (!input.length) throw new ValidationError('input'); + input = input.map((i) => i || ''); } await this.limitRate('add_record', 60, system.get('limit.submission_user'), '{{user}}'); await this.limitRate('add_record', 60, pretest ? system.get('limit.pretest') : system.get('limit.submission'));