From 0195137c61ca79a1f61007d5eb2fbbcb8c25712f Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 24 Nov 2020 12:43:07 +0800 Subject: [PATCH] =?UTF-8?q?core:=20=E4=BF=AE=E5=A4=8Dstrpid=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=AE=BE=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98?= 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 | 23 +++++++++-------------- packages/hydrooj/src/model/document.ts | 11 +++++++---- packages/hydrooj/src/model/problem.ts | 15 ++++++++------- packages/hydrooj/src/service/bus.ts | 4 ++-- 5 files changed, 27 insertions(+), 28 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index d8257997e..067e3998c 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.13.54", + "version": "2.13.55", "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 4dc695178..fe8ade99b 100644 --- a/packages/hydrooj/src/handler/problem.ts +++ b/packages/hydrooj/src/handler/problem.ts @@ -12,9 +12,7 @@ import { Pdoc, User, Rdoc, PathComponent, } from '../interface'; import paginate from '../lib/paginate'; -import { - checkPid, isTitle, isContent, isPid, -} from '../lib/validator'; +import { isTitle, isContent, isPid } from '../lib/validator'; import { ProblemAdd } from '../lib/ui'; import * as file from '../model/file'; import * as problem from '../model/problem'; @@ -25,7 +23,7 @@ import * as solution from '../model/solution'; import { PERM, PRIV, CONSTANT } from '../model/builtin'; import * as bus from '../service/bus'; import { - Route, Connection, Handler, ConnectionHandler, Types, param, + Route, Connection, Handler, ConnectionHandler, Types, param, post, route, } from '../service/server'; export const parseCategory = (value: string) => flatten(value.split('+').map((e) => e.split(','))).map((e) => e.trim()); @@ -170,7 +168,7 @@ export class ProblemDetailHandler extends ProblemHandler { udoc: User; - @param('pid', Types.String, true, null, parsePid) + @route('pid', Types.String, true, null, parsePid) async _prepare(domainId: string, pid: number | string) { this.response.template = 'problem_detail.html'; this.pdoc = await problem.get(domainId, pid, this.user._id); @@ -437,15 +435,12 @@ export class ProblemEditHandler extends ProblemManageHandler { @param('title', Types.String, isTitle) @param('content', Types.String, isContent) - async post(domainId: string, title: string, content: string) { - const $update: Partial = { title, content }; - if (this.request.body.pid) { - if (this.request.body.pid.toString() === this.pdoc.docId.toString()) $update.pid = this.request.body.pid; - else $update.pid = checkPid(this.request.body.pid); - } - const pdoc = await problem.get(domainId, this.request.params.pid); - await problem.edit(domainId, pdoc.docId, $update); - this.response.redirect = this.url('problem_detail', { pid: this.request.params.pid }); + @post('pid', Types.String, isPid, true) + async post(domainId: string, title: string, content: string, newPid: string = '') { + const $update: Partial = { title, content, pid: newPid }; + let pdoc = await problem.get(domainId, this.request.params.pid); + pdoc = await problem.edit(domainId, pdoc.docId, $update); + this.response.redirect = this.url('problem_detail', { pid: pdoc.pid || pdoc.docId }); } } diff --git a/packages/hydrooj/src/model/document.ts b/packages/hydrooj/src/model/document.ts index 8cc9d6483..00ae1bfed 100644 --- a/packages/hydrooj/src/model/document.ts +++ b/packages/hydrooj/src/model/document.ts @@ -1,7 +1,7 @@ /* eslint-disable object-curly-newline */ import assert from 'assert'; import { - ObjectID, Cursor, FilterQuery, UpdateQuery, + ObjectID, Cursor, FilterQuery, UpdateQuery, OnlyFieldsOfType, } from 'mongodb'; import { Pdoc, Ddoc, Drdoc, Tdoc, TrainingDoc, ProblemStatusDoc, @@ -92,12 +92,15 @@ export async function get(domainId: string, docType: K, } export async function set( - domainId: string, docType: K, docId: DocType[K]['docId'], $set: Partial, + domainId: string, docType: K, docId: DocType[K]['docId'], $set?: Partial, $unset?: OnlyFieldsOfType, ): Promise { - await bus.parallel('document/set', domainId, docType, docId, $set); + await bus.parallel('document/set', domainId, docType, docId, $set, $unset); + const update: UpdateQuery = {}; + if ($set) update.$set = $set; + if ($unset) update.$unset = $unset; const res = await coll.findOneAndUpdate( { domainId, docType, docId }, - { $set }, + update, { returnOriginal: false, upsert: true }, ); return res.value; diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index 647d2b595..5a239c5fe 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -82,12 +82,11 @@ export async function add( tag: string[] = [], category: string[] = [], data: ProblemDataSource = null, hidden = false, ) { const pidCounter = await domain.inc(domainId, 'pidCounter', 1); - return await document.add( - domainId, content, owner, document.TYPE_PROBLEM, pidCounter, null, null, - { - pid, title, data, category, tag, hidden, nSubmit: 0, nAccept: 0, - }, - ) as number; + const args: Partial = { + title, data, category, tag, hidden, nSubmit: 0, nAccept: 0, + }; + if (pid) args.pid = pid; + return await document.add(domainId, content, owner, document.TYPE_PROBLEM, pidCounter, null, null, args); } export async function get( @@ -116,7 +115,9 @@ export function getMultiStatus(domainId: string, query: FilterQuery) { } export function edit(domainId: string, _id: number, $set: Partial): Promise { - return document.set(domainId, document.TYPE_PROBLEM, _id, $set); + const delpid = $set.pid === ''; + if (delpid) delete $set.pid; + return document.set(domainId, document.TYPE_PROBLEM, _id, $set, delpid ? { pid: '' } : undefined); } export function inc(domainId: string, _id: number, field: NumberKeys, n: number): Promise { diff --git a/packages/hydrooj/src/service/bus.ts b/packages/hydrooj/src/service/bus.ts index 6aa9a772b..d5fa09912 100644 --- a/packages/hydrooj/src/service/bus.ts +++ b/packages/hydrooj/src/service/bus.ts @@ -1,6 +1,6 @@ /* eslint-disable no-await-in-loop */ import cluster from 'cluster'; -import { Db, FilterQuery } from 'mongodb'; +import { Db, FilterQuery, OnlyFieldsOfType } from 'mongodb'; import { argv } from 'yargs'; import { Logger } from '../logger'; import { @@ -48,7 +48,7 @@ export interface EventMap { 'document/add': (doc: any) => VoidReturn 'document/set': - (domainId: string, docType: T, docId: DocType[T], $set: any) => VoidReturn + (domainId: string, docType: T, docId: DocType[T], $set: any, $unset: OnlyFieldsOfType) => VoidReturn 'problem/edit': (doc: Pdoc) => VoidReturn 'problem/list': (query: FilterQuery, handler: any) => VoidReturn