From d1e119fe7fc20d0198c1065dd3f8e322c9fa629f Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 24 Jan 2021 11:57:51 +0800 Subject: [PATCH] core: remove pdoc.config (use config.yaml instead) --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/import.syzoj.ts | 29 ++++++++------- packages/hydrooj/src/handler/problem.ts | 3 -- packages/hydrooj/src/interface.ts | 6 +++- packages/hydrooj/src/model/record.ts | 4 +-- packages/hydrooj/src/model/token.ts | 1 + packages/hydrooj/src/upgrade.ts | 37 ++++++++++++++++---- 7 files changed, 53 insertions(+), 29 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 38d44b485..56c30354c 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.15.32", + "version": "2.16.0", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/import.syzoj.ts b/packages/hydrooj/src/handler/import.syzoj.ts index 4788b82a1..2d6278e93 100644 --- a/packages/hydrooj/src/handler/import.syzoj.ts +++ b/packages/hydrooj/src/handler/import.syzoj.ts @@ -6,6 +6,7 @@ import superagent from 'superagent'; import { filter } from 'lodash'; import { PassThrough } from 'stream'; import AdmZip from 'adm-zip'; +import yaml from 'js-yaml'; import { ValidationError, RemoteOnlineJudgeError } from '../error'; import { Logger } from '../logger'; import type { ContentNode } from '../interface'; @@ -115,14 +116,13 @@ class ProblemImportSYZOJHandler extends Handler { await problem.addTestdata(domainId, docId, entry.entryName, entry.getData()); } const filename = p.file_io_input_name ? p.file_io_input_name?.split('.')[0] : null; - await problem.edit(domainId, docId, { - config: { - time: `${p.time_limit}ms`, - memory: `${p.memory_limit}m`, - filename, - type: p.type === 'traditional' ? 'default' : p.type, - }, - }); + const config = { + time: `${p.time_limit}ms`, + memory: `${p.memory_limit}m`, + filename, + type: p.type === 'traditional' ? 'default' : p.type, + }; + await problem.addTestdata(domainId, docId, 'config.yaml', Buffer.from(yaml.dump(config))); } finally { fs.unlinkSync(file); } @@ -188,13 +188,12 @@ class ProblemImportSYZOJHandler extends Handler { await problem.addTestdata(domainId, docId, f.filename, p); } if (judge) { - await problem.edit(domainId, docId, { - config: { - time: `${judge.timeLimit}ms`, - memory: `${judge.memoryLimit}m`, - // TODO other config - }, - }); + const config = { + time: `${judge.timeLimit}ms`, + memory: `${judge.memoryLimit}m`, + // TODO other config + }; + await problem.addTestdata(domainId, docId, 'config.yaml', Buffer.from(yaml.dump(config))); } const a = await superagent.post(`${protocol}://${host === 'loj.ac' ? 'api.loj.ac.cn' : host}/api/problem/downloadProblemFiles`) .send({ diff --git a/packages/hydrooj/src/handler/problem.ts b/packages/hydrooj/src/handler/problem.ts index 9b8396ee0..01e9fa295 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -358,9 +358,6 @@ export class ProblemSettingsHandler extends ProblemManageHandler { [this.pdoc.title, 'problem_detail', { pid }, true], ['problem_settings', null], ]; - if (this.response.body.pdoc.config) { - this.response.body.pdoc.config = yaml.dump(this.response.body.pdoc.config); - } } @param('pid', Types.String, null, parsePid) diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index aa203cf78..2786792b7 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -174,7 +174,6 @@ declare module './model/problem' { category: string[], data: ProblemData[], hidden: boolean, - config: ProblemConfig, acMsg?: string, html?: boolean, @@ -182,6 +181,11 @@ declare module './model/problem' { difficultyAlgo?: number, difficultyAdmin?: number, difficultySetting?: any, + + /** + * @deprecated + */ + config: any, } } export type { Pdoc } from './model/problem'; diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 28a6d1eb4..cf5837341 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -73,12 +73,10 @@ export async function stat(domainId?: string) { export async function judge(domainId: string, rid: ObjectID, priority = 1) { const rdoc = await get(domainId, rid); - let config: RunConfig | ProblemConfig = rdoc.config; + const config: RunConfig | ProblemConfig = rdoc.config || {}; let data = []; if (rdoc.pid) { - const pdoc = await problem.get(domainId, rdoc.pid); data = await storage.list(`problem/${domainId}/${rdoc.pid}/testdata/`, true); - if (!config) config = pdoc?.config || {}; } delete rdoc._id; await task.add({ diff --git a/packages/hydrooj/src/model/token.ts b/packages/hydrooj/src/model/token.ts index 8f0f2c912..38fe0e3b8 100644 --- a/packages/hydrooj/src/model/token.ts +++ b/packages/hydrooj/src/model/token.ts @@ -97,6 +97,7 @@ global.Hydro.model.token = { TYPE_OAUTH, TYPE_REGISTRATION, TYPE_LOSTPASS, + TYPE_EXPORT, add, createOrUpdate, diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 19c431f5f..ee4f13625 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -3,9 +3,11 @@ import { ObjectID, Collection } from 'mongodb'; import AdmZip from 'adm-zip'; import Queue from 'p-queue'; +import yaml from 'js-yaml'; import { Progress } from './ui'; import { Ufdoc } from './interface'; import { Logger } from './logger'; +import { DomainDoc } from './loader'; import { streamToBuffer } from './utils'; import gridfs from './service/gridfs'; import storage from './service/storage'; @@ -19,6 +21,17 @@ import * as system from './model/system'; const logger = new Logger('upgrade'); type UpgradeScript = () => Promise; +async function iterateAllDomain(cb: (ddoc: DomainDoc) => Promise) { + const domains = await domain.getMulti().project({ _id: 1 }).toArray(); + for (const d of domains) await cb(d); +} + +async function iterateAllProblem(cb: (pdoc: problem.Pdoc) => Promise) { + await iterateAllDomain(async (d) => { + await problem.getMulti(d._id, {}).forEach(cb); + }); +} + const scripts: UpgradeScript[] = [ // Init async function _0_1() { @@ -30,8 +43,7 @@ const scripts: UpgradeScript[] = [ // Add history column to ddoc,drdoc,psdoc async function _1_2() { const _FRESH_INSTALL_IGNORE = 1; - const domains = await domain.getMulti().project({ _id: 1 }).toArray(); - for (const d of domains) { + await iterateAllDomain(async (d) => { const bulk = document.coll.initializeUnorderedBulkOp(); await document.getMulti(d._id, document.TYPE_DISCUSSION).forEach((ddoc) => { bulk.find({ _id: ddoc._id }).updateOne({ $set: { history: [] } }); @@ -44,7 +56,7 @@ const scripts: UpgradeScript[] = [ bulk.find({ _id: psdoc._id }).updateOne({ $set: { history: [] } }); }); if (bulk.length) await bulk.execute(); - } + }); return true; }, async function _2_3() { @@ -138,8 +150,7 @@ const scripts: UpgradeScript[] = [ }, async function _4_5() { const _FRESH_INSTALL_IGNORE = 1; - const domains = await domain.getMulti().project({ _id: 1 }).toArray(); - for (const d of domains) { + await iterateAllDomain(async (d) => { const bulk = document.coll.initializeUnorderedBulkOp(); const pdocs = await document.getMulti(d._id, document.TYPE_PROBLEM).project({ domainId: 1, docId: 1 }).toArray(); for (const pdoc of pdocs) { @@ -147,13 +158,27 @@ const scripts: UpgradeScript[] = [ bulk.find({ _id: pdoc._id }).updateOne({ $set: { data } }); } if (bulk.length) await bulk.execute(); - } + }); return true; }, async function _5_6() { // Issue #58 const _FRESH_INSTALL_IGNORE = 1; await domain.edit('system', { owner: 1 }); + return true; + }, + async function _6_7() { + const _FRESH_INSTALL_IGNORE = 1; + await iterateAllProblem(async (pdoc) => { + if (!pdoc.config) return; + const dst = `problem/${pdoc.domainId}/${pdoc.pid}/testdata/config.yaml`; + await storage.get(dst) + .catch(() => { + const cfg = yaml.dump(pdoc.config); + return storage.put(dst, Buffer.from(cfg)); + }); + }); + return true; }, ];