mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-17 17:36:08 +08:00
core: update problem.setStatus logic
This commit is contained in:
1 parent
8779f03d80
commit
eb164991a1
3 files changed
+20
-3
No files matched your search
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user