From a4d7dc4b04330000c06b3778a546019e39bc8fa1 Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 8 Mar 2021 14:32:11 +0800 Subject: [PATCH] add some type magic --- build/build.js | 2 +- packages/hydrooj/src/interface.ts | 12 ++++++------ packages/hydrooj/src/model/contest.ts | 21 +++++++++++---------- packages/hydrooj/src/script/rating.ts | 8 ++++---- packages/hydrooj/src/service/monitor.ts | 2 +- packages/hydrooj/src/upgrade.ts | 1 - 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/build/build.js b/build/build.js index 974c4dcd6..23c6979c8 100644 --- a/build/build.js +++ b/build/build.js @@ -62,7 +62,7 @@ for (const package of packages) { if (!fs.statSync(path.resolve(basedir, 'src', file)).isFile()) continue; const name = file.split('.')[0]; if (['handler', 'service', 'lib', 'model', 'script'].includes(name)) { - fs.writeFileSync(path.resolve(basedir, name + '.js'), `module.exports = require('./dist/${name}');\n`) + fs.writeFileSync(path.resolve(basedir, name + '.js'), `module.exports = require('./dist/${name}');\n`); } } } diff --git a/packages/hydrooj/src/interface.ts b/packages/hydrooj/src/interface.ts index 0d6755f41..f7ce0cb86 100644 --- a/packages/hydrooj/src/interface.ts +++ b/packages/hydrooj/src/interface.ts @@ -269,9 +269,9 @@ export interface TrainingNode { pids: number[], } -export interface Tdoc extends Document { +export interface Tdoc extends Document { docId: ObjectID, - docType: document['TYPE_CONTEST'] | document['TYPE_HOMEWORK'] | document['TYPE_TRAINING'], + docType: docType & number, beginAt: Date, endAt: Date, attend: number, @@ -399,12 +399,12 @@ export interface ContestRule { TEXT: string, check: (args: any) => any, statusSort: any, - showScoreboard: (tdoc: Tdoc, now: Date) => boolean, - showRecord: (tdoc: Tdoc, now: Date) => boolean, - stat: (tdoc: Tdoc, journal: any[]) => ContestStat, + showScoreboard: (tdoc: Tdoc<30 | 60>, now: Date) => boolean, + showRecord: (tdoc: Tdoc<30 | 60>, now: Date) => boolean, + stat: (tdoc: Tdoc<30 | 60>, journal: any[]) => ContestStat, scoreboard: ( isExport: boolean, _: (s: string) => string, - tdoc: Tdoc, rankedTsdocs: any[], udict: Udict, pdict: Pdict + tdoc: Tdoc<30 | 60>, rankedTsdocs: any[], udict: Udict, pdict: Pdict ) => ScoreboardRow[], rank: (tsdocs: any[]) => any[], } diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index 36b19cb52..246b52884 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -385,9 +385,10 @@ export async function edit( return await document.set(domainId, type, tid, $set); } -export async function get( - domainId: string, tid: ObjectID, type: Type | -1 = document.TYPE_CONTEST, -) { +export async function get(domainId: string, tid: ObjectID, type: -1): Promise>; +export async function get(domainId: string, tid: ObjectID, type: T): Promise>; +export async function get(domainId: string, tid: ObjectID): Promise>; +export async function get(domainId: string, tid: ObjectID, type: Type | -1 = document.TYPE_CONTEST) { let tdoc: Tdoc; if (type === -1) { tdoc = await document.get(domainId, document.TYPE_CONTEST, tid); @@ -413,14 +414,14 @@ export async function updateStatus( export function getStatus( domainId: string, tid: ObjectID, uid: number, - type = document.TYPE_CONTEST, + type: 30 | 60 = document.TYPE_CONTEST, ) { return document.getStatus(domainId, type, tid, uid); } export async function getListStatus( domainId: string, uid: number, tids: ObjectID[], - type = document.TYPE_CONTEST, + type: 30 | 60 = document.TYPE_CONTEST, ) { const r = {}; // eslint-disable-next-line no-await-in-loop @@ -441,7 +442,7 @@ export async function attend( return {}; } -export function getMultiStatus(domainId: string, query: any, docType = document.TYPE_CONTEST) { +export function getMultiStatus(domainId: string, query: any, docType: 30 | 60 = document.TYPE_CONTEST) { return document.getMultiStatus(domainId, docType, query); } @@ -480,13 +481,13 @@ export const ContestHandlerMixin = (c) => class extends c { return this.user.hasPerm(PERM.PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD); } - canShowRecord(tdoc: Tdoc, allowPermOverride = true) { + canShowRecord(tdoc: Tdoc<30 | 60>, allowPermOverride = true) { if (RULES[tdoc.rule].showRecord(tdoc, new Date())) return true; if (allowPermOverride && this.canViewHiddenScoreboard()) return true; return false; } - canShowScoreboard(tdoc: Tdoc, allowPermOverride = true) { + canShowScoreboard(tdoc: Tdoc<30 | 60>, allowPermOverride = true) { if (RULES[tdoc.rule].showScoreboard(tdoc, new Date())) return true; if (allowPermOverride && this.canViewHiddenScoreboard()) return true; return false; @@ -495,7 +496,7 @@ export const ContestHandlerMixin = (c) => class extends c { async getScoreboard( domainId: string, tid: ObjectID, isExport = false, docType: 30 | 60 = document.TYPE_CONTEST, - ): Promise<[Tdoc, ScoreboardRow[], Udict]> { + ): Promise<[Tdoc<30 | 60>, ScoreboardRow[], Udict]> { const { tdoc, udict, pdict, rankedTsdocs, } = await this.getRawStatus(domainId, tid, docType); @@ -549,7 +550,7 @@ export async function getAndListStatus( domainId: string, tid: ObjectID, docType: Type | -1 = document.TYPE_CONTEST, ): Promise<[Tdoc, any[]]> { // TODO(iceboy): projection, pagination. - const tdoc = await get(domainId, tid, docType); + const tdoc = await get(domainId, tid, docType as any); const tsdocs = await document.getMultiStatus(domainId, docType, { docId: tid }) .sort(RULES[tdoc.rule].statusSort).toArray(); return [tdoc, tsdocs]; diff --git a/packages/hydrooj/src/script/rating.ts b/packages/hydrooj/src/script/rating.ts index cfca5131f..c701b0799 100644 --- a/packages/hydrooj/src/script/rating.ts +++ b/packages/hydrooj/src/script/rating.ts @@ -50,13 +50,13 @@ async function runProblem(...arg: any[]) { } } -async function runContest(tdoc: Tdoc, udict: ND, report: Function): Promise; +async function runContest(tdoc: Tdoc<30 | 60>, udict: ND, report: Function): Promise; async function runContest( domainId: string, tid: ObjectID, udict: ND, report: Function ): Promise; async function runContest(...arg: any[]) { const start = new Date().getTime(); - const tdoc: Tdoc = (typeof arg[0] === 'string') + const tdoc: Tdoc<30 | 60> = (typeof arg[0] === 'string') ? await contest.get(arg[0], arg[1], -1) : arg[0]; const udict: ND = (typeof arg[0] === 'string') ? arg[2] : arg[1]; @@ -127,8 +127,8 @@ async function runInDomain(domainId: string, isSub: boolean, report: Function) { for (const dudoc of dudocs) { deltaudict[dudoc.uid] = dudoc.rpdelta || 0; } - const contests = await contest.getMulti(domainId, { rated: true }) - .sort('endAt', -1).toArray(); + const contests: Tdoc<30 | 60>[] = await contest.getMulti(domainId, { rated: true }) + .sort('endAt', -1).toArray() as any; await report({ message: `Found ${contests.length} contests in ${domainId}` }); for (const i in contests) { const tdoc = contests[i]; diff --git a/packages/hydrooj/src/service/monitor.ts b/packages/hydrooj/src/service/monitor.ts index 1922eabb3..f892f210c 100644 --- a/packages/hydrooj/src/service/monitor.ts +++ b/packages/hydrooj/src/service/monitor.ts @@ -11,7 +11,7 @@ const coll = db.collection('status'); const logger = new Logger('monitor'); function crypt(str: string) { - const cipher = crypto.createCipheriv('des-ecb', 'hydro-oj', ''); + const cipher = crypto.createCipheriv('des-ecb', 'hydro-oj', ''); // lgtm [js/hardcoded-credentials] let encrypted = cipher.update(str, 'utf8', 'hex'); encrypted += cipher.final('hex'); return encrypted; diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 2c9fb53b1..a40b9197e 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -86,7 +86,6 @@ const scripts: UpgradeScript[] = [ logger.error('Cannot upgrade. Please change storage config.'); return false; } - const coll: Collection = db.collection('file'); logger.info('Changing storage engine. This may take a long time.'); // Problem file and User file let savedProgress = system.get('upgrade.file.progress.domain');