core: fix problem.updateStatus ac override

This commit is contained in:
undefined committed 2025-06-12 16:43:26 +08:00
1 parent 860b46347a
commit 6b691a2641
4 files changed
+18 -8

No files matched your search

+5 -5
View File
@@ -317,14 +317,14 @@ export async function setMultiStatus<K extends keyof DocStatusType>(
); );
} }
export async function setStatusIfNotCondition<T extends keyof DocStatusType>( export async function setStatusIfCondition<T extends keyof DocStatusType>(
domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number, domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number,
filter: Filter<DocStatusType[T]>, args: Partial<DocStatusType[T]> = {}, filter: Filter<DocStatusType[T]>, args: Partial<DocStatusType[T]> = {},
returnDocument: 'before' | 'after' = 'after', returnDocument: 'before' | 'after' = 'after',
): Promise<DocStatusType[T]> { ): Promise<DocStatusType[T]> {
try { try {
return await collStatus.findOneAndUpdate( return await collStatus.findOneAndUpdate(
{ domainId, docType, docId, uid, $nor: [filter] }, { domainId, docType, docId, uid, ...filter },
{ $set: args }, { $set: args },
{ upsert: true, returnDocument }, { upsert: true, returnDocument },
); );
@@ -338,8 +338,8 @@ export async function setIfNotStatus<T extends keyof DocStatusType, K extends ke
key: K, value: DocStatusType[T][K], ifNot: DocStatusType[T][K], args: Partial<DocStatusType[T]>, key: K, value: DocStatusType[T][K], ifNot: DocStatusType[T][K], args: Partial<DocStatusType[T]>,
returnDocument: 'before' | 'after' = 'after', returnDocument: 'before' | 'after' = 'after',
): Promise<DocStatusType[T]> { ): Promise<DocStatusType[T]> {
return await setStatusIfNotCondition( return await setStatusIfCondition(
domainId, docType, docId, uid, { [key]: ifNot } as any, domainId, docType, docId, uid, { [key]: { $ne: ifNot } } as any,
{ [key]: value, ...args }, returnDocument, { [key]: value, ...args }, returnDocument,
); );
} }
@@ -474,7 +474,7 @@ global.Hydro.model.document = {
revSetStatus, revSetStatus,
set, set,
setIfNotStatus, setIfNotStatus,
setStatusIfNotCondition, setStatusIfCondition,
setStatus, setStatus,
setMultiStatus, setMultiStatus,
setSub, setSub,
+3 -3
View File
@@ -420,10 +420,10 @@ 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 filter: Filter<ProblemStatusDoc> = { rid: { $ne: rid }, status: STATUS.STATUS_ACCEPTED }; const condition = status === STATUS.STATUS_ACCEPTED ? {} : { status: { $ne: STATUS.STATUS_ACCEPTED } };
const res = await document.setStatusIfNotCondition( const res = await document.setStatusIfCondition(
domainId, document.TYPE_PROBLEM, pid, uid, domainId, document.TYPE_PROBLEM, pid, uid,
filter, { rid, status, score }, condition, { rid, status, score },
); );
return !!res; return !!res;
} }
+9
View File
@@ -15,6 +15,7 @@ import { ArgMethod, buildProjection, Time } from '../utils';
import { STATUS } from './builtin'; import { STATUS } from './builtin';
import DomainModel from './domain'; import DomainModel from './domain';
import problem from './problem'; import problem from './problem';
import * as SystemModel from './system';
import task from './task'; import task from './task';
export default class RecordModel { export default class RecordModel {
@@ -291,6 +292,14 @@ export async function apply(ctx: Context) {
ctx.on('domain/delete', (domainId) => RecordModel.coll.deleteMany({ domainId })); ctx.on('domain/delete', (domainId) => RecordModel.coll.deleteMany({ domainId }));
ctx.on('record/judge', async (rdoc, updated) => { ctx.on('record/judge', async (rdoc, updated) => {
if (rdoc.status === STATUS.STATUS_ACCEPTED && updated) { if (rdoc.status === STATUS.STATUS_ACCEPTED && updated) {
if (SystemModel.get('record.statMode') === 'unique') {
await RecordModel.collStat.deleteMany({
_id: { $ne: rdoc._id },
uid: rdoc.uid,
pid: rdoc.pid,
domainId: rdoc.domainId,
});
}
await RecordModel.collStat.updateOne({ await RecordModel.collStat.updateOne({
_id: rdoc._id, _id: rdoc._id,
}, { }, {
+1
View File
@@ -334,6 +334,7 @@ SystemSetting(
Setting('setting_basic', 'discussion.nodes', builtin.DEFAULT_NODES, 'yaml', 'discussion.nodes', 'Discussion Nodes'), Setting('setting_basic', 'discussion.nodes', builtin.DEFAULT_NODES, 'yaml', 'discussion.nodes', 'Discussion Nodes'),
Setting('setting_basic', 'problem.categories', builtin.CATEGORIES, 'yaml', 'problem.categories', 'Problem Categories'), Setting('setting_basic', 'problem.categories', builtin.CATEGORIES, 'yaml', 'problem.categories', 'Problem Categories'),
Setting('setting_basic', 'training.enrolled-users', true, 'boolean', 'training.enrolled-users', 'Show enrolled users for training'), Setting('setting_basic', 'training.enrolled-users', true, 'boolean', 'training.enrolled-users', 'Show enrolled users for training'),
Setting('setting_basic', 'record.statMode', 'unique', 'text', 'record.statMode', 'Record stat mode'),
Setting('setting_basic', 'pagination.problem', 100, 'number', 'pagination.problem', 'Problems per page'), Setting('setting_basic', 'pagination.problem', 100, 'number', 'pagination.problem', 'Problems per page'),
Setting('setting_basic', 'pagination.contest', 20, 'number', 'pagination.contest', 'Contests per page'), Setting('setting_basic', 'pagination.contest', 20, 'number', 'pagination.contest', 'Contests per page'),
Setting('setting_basic', 'pagination.discussion', 50, 'number', 'pagination.discussion', 'Discussions per page'), Setting('setting_basic', 'pagination.discussion', 50, 'number', 'pagination.discussion', 'Discussions per page'),