diff --git a/packages/hydrooj/src/handler/contest.ts b/packages/hydrooj/src/handler/contest.ts index 3d604cd97..34fcb96da 100644 --- a/packages/hydrooj/src/handler/contest.ts +++ b/packages/hydrooj/src/handler/contest.ts @@ -557,7 +557,7 @@ export class ContestManagementHandler extends ContestManagementBaseHandler { } @param('tid', Types.ObjectID) - @post('files', Types.Array) + @post('files', Types.ArrayOf(Types.Name)) async postDeleteFiles(domainId: string, tid: ObjectID, files: string[]) { await Promise.all([ storage.del(files.map((t) => `contest/${domainId}/${tid}/${t}`), this.user._id), diff --git a/packages/hydrooj/src/handler/domain.ts b/packages/hydrooj/src/handler/domain.ts index 1a67e0181..e4ad78cfc 100644 --- a/packages/hydrooj/src/handler/domain.ts +++ b/packages/hydrooj/src/handler/domain.ts @@ -224,7 +224,7 @@ class DomainRoleHandler extends ManageHandler { } @requireSudo - @param('roles', Types.Array) + @param('roles', Types.ArrayOf(Types.Name)) async postDelete(domainId: string, roles: string[]) { if (Set.intersection(roles, ['root', 'default', 'guest']).size > 0) { throw new ValidationError('role', null, 'You cannot delete root, default or guest roles'); diff --git a/packages/hydrooj/src/handler/misc.ts b/packages/hydrooj/src/handler/misc.ts index 4f98311d8..a703593c7 100644 --- a/packages/hydrooj/src/handler/misc.ts +++ b/packages/hydrooj/src/handler/misc.ts @@ -69,7 +69,7 @@ export class FilesHandler extends Handler { this.back(); } - @post('files', Types.Array) + @post('files', Types.ArrayOf(Types.Name)) async postDeleteFiles(domainId: string, files: string[]) { await Promise.all([ storage.del(files.map((t) => `user/${this.user._id}/${t}`), this.user._id), diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index a9aad08d8..9b3cd74e7 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -784,7 +784,7 @@ export class ProblemFilesHandler extends ProblemDetailHandler { this.back(); } - @post('files', Types.Array) + @post('files', Types.ArrayOf(Types.Name)) @post('type', Types.Range(['testdata', 'additional_file']), true) async postDeleteFiles(domainId: string, files: string[], type = 'testdata') { if (this.pdoc.reference) throw new ProblemIsReferencedError('delete files'); diff --git a/packages/hydrooj/src/handler/training.ts b/packages/hydrooj/src/handler/training.ts index dc7c19e1a..0b5ee44d2 100644 --- a/packages/hydrooj/src/handler/training.ts +++ b/packages/hydrooj/src/handler/training.ts @@ -279,7 +279,7 @@ export class TrainingFilesHandler extends Handler { } @param('tid', Types.ObjectID) - @post('files', Types.Array) + @post('files', Types.ArrayOf(Types.Name)) async postDeleteFiles(domainId: string, tid: ObjectID, files: string[]) { await Promise.all([ storage.del(files.map((t) => `contest/${domainId}/${tid}/${t}`), this.user._id), diff --git a/packages/hydrooj/src/service/decorators.ts b/packages/hydrooj/src/service/decorators.ts index 8e07f2c9f..fc0570e6f 100644 --- a/packages/hydrooj/src/service/decorators.ts +++ b/packages/hydrooj/src/service/decorators.ts @@ -12,7 +12,7 @@ import type { Handler } from './server'; type MethodDecorator = (target: any, name: string, obj: any) => any; type InputType = string | number | Record | any[]; type Converter = (value: any) => T; -type Validator = (value: InputType) => boolean; +type Validator = (value: Loose extends true ? any : InputType) => boolean; export interface ParamOption { name: string, source: 'all' | 'get' | 'post' | 'route', @@ -21,7 +21,7 @@ export interface ParamOption { validate?: Validator, } -type Type = [Converter, Validator?, boolean?]; +type Type = [Converter, Validator?, boolean?]; export interface Types { Content: Type; @@ -117,6 +117,7 @@ export const Types: Types = { return false; }, ], + /** @deprecated suggested to use Types.ArrayOf instead. */ Array: [(v) => { if (v instanceof Array) return v; return v ? [v] : []; diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index 5514aa335..297379063 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -167,7 +167,7 @@ export class HandlerCommon { export class Handler extends HandlerCommon { loginMethods: any; noCheckPermView = false; - __param: Record; + __param: Record[]>; back(body?: any) { this.response.body = body || this.response.body || {};