From 0bff54d56818381fe6e83c40fcb172362a0ae19a Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 16 Apr 2025 13:13:26 +0800 Subject: [PATCH] core: homework: fix penaltyRules validate --- packages/hydrooj/src/handler/homework.ts | 11 +++++++++-- packages/hydrooj/src/model/problem.ts | 1 + packages/hydrooj/src/upgrade.ts | 3 +++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/hydrooj/src/handler/homework.ts b/packages/hydrooj/src/handler/homework.ts index 95a5c96f7..22fa78ee1 100644 --- a/packages/hydrooj/src/handler/homework.ts +++ b/packages/hydrooj/src/handler/homework.ts @@ -20,8 +20,15 @@ import { } from '../service/server'; import { ContestCodeHandler, ContestFileDownloadHandler, ContestScoreboardHandler } from './contest'; -const validatePenaltyRules = (input: string) => yaml.load(input); -const convertPenaltyRules = validatePenaltyRules; +const validatePenaltyRules = (input: string) => { + try { + yaml.load(input); + return true; + } catch (e) { + return false; + } +}; +const convertPenaltyRules = (input: string) => yaml.load(input); class HomeworkMainHandler extends Handler { @param('group', Types.Name, true) diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index 5673701f5..ce91df227 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -145,6 +145,7 @@ export class ProblemModel { tag: string[] = [], meta: ProblemCreateOptions = {}, ) { const [doc] = await ProblemModel.getMulti(domainId, {}) + .withReadPreference('primary') .sort({ docId: -1 }).limit(1).project({ docId: 1 }) .toArray(); const result = await ProblemModel.addWithId( diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 0fb5df59c..3b7a40ead 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -550,6 +550,9 @@ export const coreScripts: MigrationScript[] = [ } } await iterateAllProblem(['domainId', 'docId', 'tag'], async (pdoc) => { + if (pdoc.tag && ['string', 'number'].includes(typeof pdoc.tag)) { + return { tag: [pdoc.tag.toString().trim()].filter((i) => i) }; + } if (pdoc.tag?.some((i) => typeof i !== 'string')) { return { tag: pdoc.tag.filter((i) => i).map((i) => i.toString()) }; }