From 80d2137cbb7873fec7b8262b9c8056b21e51dfe2 Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 17 Mar 2025 07:48:40 +0800 Subject: [PATCH] bug fixes --- README.md | 1 + build/publish.ts | 5 +++-- packages/hydrooj/src/model/record.ts | 12 ++++++++---- packages/hydrooj/src/service/api.ts | 10 +++++----- packages/scoreboard-xcpcio/index.ts | 14 +------------- packages/vjudge/src/index.ts | 2 +- 6 files changed, 19 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 2ea11e9d8..3da11a298 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,7 @@ Hydro 用户群:1085853538 - ui: 更新系统设置页面样式 - import-qduoj: 修复 spj=null - core: 修复文件复制 +- core: 支持存储并显示提交记录重测历史 ### Breaking API Changes diff --git a/build/publish.ts b/build/publish.ts index 323cabf80..9a1eb01d7 100644 --- a/build/publish.ts +++ b/build/publish.ts @@ -36,11 +36,11 @@ if (CI && (!tag || GITHUB_EVENT_NAME !== 'push')) { if (tag === 'dev') { try { const result = await packageJson(meta.name, { version: meta.version }); - if (typeof result?.version === meta.version) return progress++; // no change on dev version + if (result?.version === meta.version) return progress++; // no change on dev version } catch (e) { // expected } - } + } else if (prerelease(meta.version)) return progress++; // Refuse to publish prerelease as 'latest' tag if (!meta.private && /^[0-9.]+$/.test(meta.version)) { try { const { version } = await packageJson(meta.name, { version: tag }); @@ -57,6 +57,7 @@ if (CI && (!tag || GITHUB_EVENT_NAME !== 'push')) { console.error(e); } spinner.text = `Loading workspaces (${++progress}/${folders.length})`; + return progress; })); spinner.succeed(); diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 4953ea02c..2d3196f2f 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -234,7 +234,7 @@ export default class RecordModel { } static async reset(domainId: string, rid: MaybeArray, isRejudge: boolean) { - const rids = rid instanceof Array ? rid : [rid]; + const rids = Array.isArray(rid) ? rid : [rid]; const upd: any = { score: 0, status: STATUS.STATUS_WAITING, @@ -281,7 +281,7 @@ export default class RecordModel { } } -export function apply(ctx: Context) { +export async function apply(ctx: Context) { // Mark problem as deleted ctx.on('problem/delete', (domainId, docId) => Promise.all([ RecordModel.coll.deleteMany({ domainId, pid: docId }), @@ -305,7 +305,7 @@ export function apply(ctx: Context) { }, { upsert: true }); } }); - ctx.on('ready', () => Promise.all([ + await Promise.all([ db.ensureIndexes( RecordModel.coll, { key: { domainId: 1, pid: 1 }, name: 'delete' }, @@ -322,6 +322,10 @@ export function apply(ctx: Context) { { key: { domainId: 1, pid: 1, uid: 1, memory: 1 }, name: 'memory' }, { key: { domainId: 1, pid: 1, uid: 1, length: 1 }, name: 'length' }, ), - ]) as any); + db.ensureIndexes( + RecordModel.collHistory, + { key: { rid: 1, _id: -1 }, name: 'basic' }, + ), + ]); } global.Hydro.model.record = RecordModel; diff --git a/packages/hydrooj/src/service/api.ts b/packages/hydrooj/src/service/api.ts index d6f033e9d..a6fd23840 100644 --- a/packages/hydrooj/src/service/api.ts +++ b/packages/hydrooj/src/service/api.ts @@ -7,13 +7,13 @@ import { Context, Service } from '../context'; import { PERM, PRIV } from '../model/builtin'; import { Handler } from './server'; -const types: Record> = {}; -const unions: Record = {}; -const descriptions: Record> = {}; +const types: Record> = Object.create(null); +const unions: Record = Object.create(null); +const descriptions: Record> = Object.create(null); const handlers: Record> = { - Query: {}, + Query: Object.create(null), }; -let root: Record = {}; +let root: Record = Object.create(null); interface ApiContext extends ApiHandler { [key: string]: any; diff --git a/packages/scoreboard-xcpcio/index.ts b/packages/scoreboard-xcpcio/index.ts index a999af122..762ee9836 100644 --- a/packages/scoreboard-xcpcio/index.ts +++ b/packages/scoreboard-xcpcio/index.ts @@ -1,22 +1,11 @@ import path from 'path'; import { - ContestModel, Context, fs, Handler, ObjectId, PERM, Schema, STATUS, Types, UserModel, + ContestModel, Context, fs, ObjectId, PERM, Schema, STATUS, Types, UserModel, } from 'hydrooj'; const file = fs.readFileSync(path.join(__dirname, 'public/assets/board.html'), 'utf8'); const indexJs = file.match(/index-([A-Za-z0-9_-]+)\.js"/)?.[1]; const indexCss = file.match(/index-([A-Za-z0-9_-]+)\.css"/)?.[1]; - -class XcpcioHandler extends Handler { - async get() { - this.response.body = { - js: indexJs, - css: indexCss, - }; - this.response.template = 'xcpcio_board.html'; - } -} - const status = { [STATUS.STATUS_WRONG_ANSWER]: 'WRONG_ANSWER', [STATUS.STATUS_ACCEPTED]: 'CORRECT', @@ -35,7 +24,6 @@ const status = { }; export async function apply(ctx: Context) { - ctx.Route('board_xcpcio', '/board', XcpcioHandler); ctx.inject(['scoreboard'], ({ scoreboard }) => { scoreboard.addView('xcpcio', 'XCPCIO', { tdoc: 'tdoc', diff --git a/packages/vjudge/src/index.ts b/packages/vjudge/src/index.ts index 32bee1d2b..8e79a92a4 100644 --- a/packages/vjudge/src/index.ts +++ b/packages/vjudge/src/index.ts @@ -185,7 +185,7 @@ class VJudgeService extends Service { super(ctx, 'vjudge'); } - accounts: RemoteAccount[]; + accounts: RemoteAccount[] = []; private providers: Record = {}; private pool: Record = {}; async [Service.setup]() {