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",
"version": "2.24.13",
"version": "2.24.14",
"bin": "bin/hydrooj.js",
"main": "dist/loader.js",
"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;
}
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>(
domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number,
key: NumberKeys<DocStatusType[T]>, value: number, minValue = -1, maxValue = 1,
@@ -442,6 +456,7 @@ global.Hydro.model.document = {
revSetStatus,
set,
setIfNotStatus,
setStatusIfNotCondition,
setStatus,
setMultiStatus,
setSub,
+4 -2
View File
@@ -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<ProblemStatusDoc> = { 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;
}