From 3040f17702e4d760f7e21078cf133babadf33730 Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 27 Mar 2021 14:18:23 +0800 Subject: [PATCH] =?UTF-8?q?core:=20=E6=B7=BB=E5=8A=A0handler/create?= =?UTF-8?q?=E5=92=8Chandler/init=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/problem.ts | 2 +- packages/hydrooj/src/loader.ts | 4 ++++ packages/hydrooj/src/service/bus.ts | 3 +++ packages/hydrooj/src/service/server.ts | 5 +++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 347e0550a..e10055135 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.20.40", + "version": "2.20.41", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 5ca88aa48..0239b017d 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -379,7 +379,7 @@ export class ProblemFilesHandler extends ProblemDetailHandler { async postUploadFile(domainId: string, filename: string, type = 'testdata') { if (!this.request.files.file) throw new ValidationError('file'); if (this.pdoc.owner !== this.user._id) this.checkPerm(PERM.PERM_EDIT_PROBLEM); - if (filename === 'testdata.zip') { + if (filename.endsWith('.zip')) { const zip = new AdmZip(this.request.files.file.path); const entries = zip.getEntries(); for (const entry of entries) { diff --git a/packages/hydrooj/src/loader.ts b/packages/hydrooj/src/loader.ts index c195c0401..4499fe5f4 100644 --- a/packages/hydrooj/src/loader.ts +++ b/packages/hydrooj/src/loader.ts @@ -4,6 +4,10 @@ import 'reflect-metadata'; /* eslint-disable import/no-dynamic-require */ /* eslint-disable no-await-in-loop */ /* eslint-disable no-eval */ + +const versionNum = +process.version.replace(/v/gim, '').split('.')[0]; +if (versionNum < 14) throw new Error('NodeJS >=v14 required'); + if (!global.Hydro) { global.Hydro = { stat: { reqCount: 0 }, diff --git a/packages/hydrooj/src/service/bus.ts b/packages/hydrooj/src/service/bus.ts index bcf8bb957..ce7408a67 100644 --- a/packages/hydrooj/src/service/bus.ts +++ b/packages/hydrooj/src/service/bus.ts @@ -4,6 +4,7 @@ import type { Db, FilterQuery, ObjectID, OnlyFieldsOfType, } from 'mongodb'; import { argv } from 'yargs'; +import type { Handler } from './server'; import { Logger } from '../logger'; import type { Mdoc, Pdoc, Rdoc, TrainingDoc, User, @@ -60,6 +61,8 @@ export interface EventMap { $set: any, $unset: OnlyFieldsOfType ) => VoidReturn + 'handler/create': (thisArg: Handler) => VoidReturn + 'handler/init': (thisArg: Handler) => VoidReturn 'handler/solution/get': (thisArg: ProblemSolutionHandler) => VoidReturn 'discussion/before-add': ( diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index bbc95c7ee..19a537f63 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -18,6 +18,7 @@ import sockjs from 'sockjs'; import type { SetOption } from 'cookies'; import serialize, { SerializeJSOptions } from 'serialize-javascript'; import { argv } from 'yargs'; +import * as bus from './bus'; import { errorMessage, lrucache } from '../utils'; import { User, DomainDoc } from '../interface'; import { Logger } from '../logger'; @@ -616,6 +617,8 @@ async function handle(ctx, HandlerClass, checker) { .replace(/_([a-z])/gm, (s) => s[1].toUpperCase()); } + await bus.serial('handler/create', h); + await h.init(args); if (checker) checker.call(h); if (method === 'post') { @@ -630,6 +633,8 @@ async function handle(ctx, HandlerClass, checker) { throw new MethodNotAllowedError(method); } + await bus.serial('handler/init', h); + if (h._prepare) await h._prepare(args); if (h.prepare) await h.prepare(args);