core: update problem.setStatus logic

This commit is contained in:
undefined committed 2021-05-06 12:33:32 +08:00
1 parent 8779f03d80
commit eb164991a1
3 files changed
+20 -3

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "hydrooj", "name": "hydrooj",
"version": "2.24.13", "version": "2.24.14",
"bin": "bin/hydrooj.js", "bin": "bin/hydrooj.js",
"main": "dist/loader.js", "main": "dist/loader.js",
"typings": "dist/loader.d.ts", "typings": "dist/loader.d.ts",
+15
View File
@@ -313,6 +313,20 @@ export async function setIfNotStatus<T extends keyof DocStatusType, K extends ke
return res.value; return res.value;
} }
export async function setStatusIfNotCondition<T extends keyof DocStatusType>(
domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number,
filter: FilterQuery<DocStatusType[T]>, args: Partial<DocStatusType[T]>,
): Promise<DocStatusType[T]> {
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<T extends keyof DocStatusType>( export async function cappedIncStatus<T extends keyof DocStatusType>(
domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number, domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number,
key: NumberKeys<DocStatusType[T]>, value: number, minValue = -1, maxValue = 1, key: NumberKeys<DocStatusType[T]>, value: number, minValue = -1, maxValue = 1,
@@ -442,6 +456,7 @@ global.Hydro.model.document = {
revSetStatus, revSetStatus,
set, set,
setIfNotStatus, setIfNotStatus,
setStatusIfNotCondition,
setStatus, setStatus,
setMultiStatus, setMultiStatus,
setSub, setSub,
+4 -2
View File
@@ -230,9 +230,11 @@ export class ProblemModel {
domainId: string, pid: number, uid: number, domainId: string, pid: number, uid: number,
rid: ObjectID, status: number, score: 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<ProblemStatusDoc> = { rid: { $ne: rid }, score: { $gt: current.score } };
const res = await document.setStatusIfNotCondition(
domainId, document.TYPE_PROBLEM, pid, uid, domainId, document.TYPE_PROBLEM, pid, uid,
'status', status, STATUS.STATUS_ACCEPTED, { rid, score }, filter, { rid, status, score },
); );
return !!res; return !!res;
} }