From eb164991a1ffc7acc363a3d157c0578ee192bbcf Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 6 May 2021 12:33:32 +0800 Subject: [PATCH] core: update problem.setStatus logic --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/model/document.ts | 15 +++++++++++++++ packages/hydrooj/src/model/problem.ts | 6 ++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 02a712673..472a42656 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.24.13", + "version": "2.24.14", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/model/document.ts b/packages/hydrooj/src/model/document.ts index 2c484ee53..130e26b4b 100644 --- a/packages/hydrooj/src/model/document.ts +++ b/packages/hydrooj/src/model/document.ts @@ -313,6 +313,20 @@ export async function setIfNotStatus( + domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number, + filter: FilterQuery, args: Partial, +): Promise { + const match = await collStatus.findOne({ domainId, docType, docId, uid, ...filter }); + if (match) return null; + const res = await collStatus.findOneAndUpdate( + { domainId, docType, docId, uid }, + { $set: args }, + { upsert: true, returnOriginal: false }, + ); + return res.value; +} + export async function cappedIncStatus( domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number, key: NumberKeys, value: number, minValue = -1, maxValue = 1, @@ -442,6 +456,7 @@ global.Hydro.model.document = { revSetStatus, set, setIfNotStatus, + setStatusIfNotCondition, setStatus, setMultiStatus, setSub, diff --git a/packages/hydrooj/src/model/problem.ts b/packages/hydrooj/src/model/problem.ts index 6eef718fb..79fc0aa26 100644 --- a/packages/hydrooj/src/model/problem.ts +++ b/packages/hydrooj/src/model/problem.ts @@ -230,9 +230,11 @@ export class ProblemModel { domainId: string, pid: number, uid: number, rid: ObjectID, status: number, score: number, ) { - const res = await document.setIfNotStatus( + const current = await document.getStatus(domainId, document.TYPE_PROBLEM, pid, uid); + const filter: FilterQuery = { rid: { $ne: rid }, score: { $gt: current.score } }; + const res = await document.setStatusIfNotCondition( domainId, document.TYPE_PROBLEM, pid, uid, - 'status', status, STATUS.STATUS_ACCEPTED, { rid, score }, + filter, { rid, status, score }, ); return !!res; }