diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index f36acff64..e53b0c190 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -41,9 +41,9 @@ "lru-cache": "^10.4.3", "mime-types": "^2.1.35", "moment-timezone": "^0.5.47", - "mongodb": "^5.9.2", + "mongodb": "^6.15.0", "mongodb-uri": "^0.9.7", - "nanoid": "^5.1.4", + "nanoid": "^5.1.5", "nodemailer": "^6.10.0", "notp": "^2.0.3", "p-queue": "^8.1.0", diff --git a/packages/hydrooj/src/model/blacklist.ts b/packages/hydrooj/src/model/blacklist.ts index e02502cca..613284cee 100644 --- a/packages/hydrooj/src/model/blacklist.ts +++ b/packages/hydrooj/src/model/blacklist.ts @@ -13,12 +13,11 @@ class BlackListModel { else if (typeof expire === 'number') expireAt = moment().add(expire, 'months').toDate(); else if (expire instanceof Date) expireAt = expire; else expireAt = new Date(new Date().getTime() + 365 * 24 * 60 * 60 * 1000); - const res = await coll.findOneAndUpdate( + return await coll.findOneAndUpdate( { _id: id }, { $set: { expireAt } }, { upsert: true, returnDocument: 'after' }, ); - return res.value; } @ArgMethod diff --git a/packages/hydrooj/src/model/document.ts b/packages/hydrooj/src/model/document.ts index e052bd8c9..83f47e6ab 100644 --- a/packages/hydrooj/src/model/document.ts +++ b/packages/hydrooj/src/model/document.ts @@ -109,12 +109,11 @@ export async function set( if ($set) update.$set = $set; if ($unset) update.$unset = $unset; if ($push) update.$push = $push; - const res = await coll.findOneAndUpdate( + return await coll.findOneAndUpdate( { domainId, docType, docId }, update, { returnDocument: 'after', upsert: true }, ); - return res.value; } export function deleteOne( @@ -150,24 +149,22 @@ export async function inc( domainId: string, docType: K, docId: DocType[K]['docId'], key: NumberKeys, value: number, ) { - const res = await coll.findOneAndUpdate( + return await coll.findOneAndUpdate( { domainId, docType, docId }, { $inc: { [key]: value } }, { returnDocument: 'after' }, ); - return res.value; } export async function incAndSet( domainId: string, docType: K, docId: DocType[K]['docId'], key: NumberKeys, value: number, args: Partial, ) { - const res = await coll.findOneAndUpdate( + return await coll.findOneAndUpdate( { domainId, docType, docId }, { $inc: { [key]: value }, $set: args }, { returnDocument: 'after' }, ); - return res.value; } export function count( @@ -211,13 +208,12 @@ export async function pull, ): Promise { - const res = await coll.findOneAndUpdate( + return await coll.findOneAndUpdate( { domainId, docType, docId }, // @ts-ignore { $pull: { [setKey]: { $in: contents } } }, { returnDocument: 'after' }, ); - return res.value; } export async function deleteSub>( @@ -225,13 +221,12 @@ export async function deleteSub, ): Promise { subId = (subId instanceof Array) ? subId : [subId]; - const res = await coll.findOneAndUpdate( + return await coll.findOneAndUpdate( { domainId, docType, docId }, // @ts-ignore { $pull: { [key]: { _id: { $in: subId } } } }, { returnDocument: 'after' }, ); - return res.value; } export async function getSub>( @@ -257,7 +252,7 @@ export async function setSub { const $set: Record = {}; for (const k in args) $set[`${key}.$.${k}`] = args[k]; - const res = await coll.findOneAndUpdate( + return await coll.findOneAndUpdate( { domainId, docType, @@ -267,20 +262,18 @@ export async function setSub>( domainId: string, docType: T, docId: DocType[T]['docId'], setKey: K, content: string, ) { - const res = await coll.findOneAndUpdate( + return await coll.findOneAndUpdate( { domainId, docType, docId }, // @ts-ignore { $addToSet: { [setKey]: content } }, { returnDocument: 'after' }, ); - return res.value; } export async function getStatus( @@ -305,7 +298,7 @@ export async function setStatus( domainId: string, docType: K, docId: DocStatusType[K]['docId'], uid: number, args: UpdateFilter['$set'], returnDocument: 'before' | 'after' = 'after', ): Promise { - const res = await collStatus.findOneAndUpdate( + return await collStatus.findOneAndUpdate( { domainId, docType, docId, uid }, { $set: args, $inc: { counter: 1 } }, { @@ -315,7 +308,6 @@ export async function setStatus( ...(returnDocument === 'before' ? { readConcern: { level: 'majority' }, readPreference: 'primary' } : {}), }, ); - return res.value; } export async function setMultiStatus( @@ -333,12 +325,11 @@ export async function setStatusIfNotCondition( returnDocument: 'before' | 'after' = 'after', ): Promise { try { - const res = await collStatus.findOneAndUpdate( + return await collStatus.findOneAndUpdate( { domainId, docType, docId, uid, $nor: [filter] }, { $set: args }, { upsert: true, returnDocument }, ); - return res.value; } catch (e) { return false; } @@ -364,24 +355,22 @@ export async function cappedIncStatus( const $not = value > 0 ? { $gte: maxValue } : { $lte: minValue }; const operation = { $inc: { [key]: value } } as UpdateFilter; if (Object.keys(setPayload).length) operation.$set = setPayload; - const res = await collStatus.findOneAndUpdate( + return await collStatus.findOneAndUpdate( { domainId, docType, docId, uid, [key]: { $not } }, operation, { upsert: true, returnDocument: 'after' }, ); - return res.value; } export async function incStatus( domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number, key: NumberKeys, value: number, ): Promise { - const res = await collStatus.findOneAndUpdate( + return await collStatus.findOneAndUpdate( { domainId, docType, docId, uid }, { $inc: { [key]: value } }, { upsert: true, returnDocument: 'after' }, ); - return res.value; } export async function revPushStatus( @@ -393,7 +382,7 @@ export async function revPushStatus( { $set: { [`${key}.$`]: value }, $inc: { rev: 1 } }, { returnDocument: 'after' }, ); - if (!res.value) { + if (!res) { res = await collStatus.findOneAndUpdate( { domainId, docType, docId, uid }, // @ts-ignore @@ -401,18 +390,17 @@ export async function revPushStatus( { upsert: true, returnDocument: 'after' }, ); } - return res.value; + return res; } export async function revInitStatus( domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number, ): Promise { - const res = await collStatus.findOneAndUpdate( + return await collStatus.findOneAndUpdate( { domainId, docType, docId, uid }, { $inc: { rev: 1 } }, { upsert: true, returnDocument: 'after' }, ); - return res.value; } export async function revSetStatus( @@ -421,8 +409,7 @@ export async function revSetStatus( ): Promise { const filter = { domainId, docType, docId, uid, rev }; const update = { $set: args, $inc: { rev: 1 } }; - const res = await collStatus.findOneAndUpdate(filter, update, { returnDocument: 'after' }); - return res.value; + return await collStatus.findOneAndUpdate(filter, update, { returnDocument: 'after' }); } export async function apply(ctx: Context) { diff --git a/packages/hydrooj/src/model/domain.ts b/packages/hydrooj/src/model/domain.ts index 48c493c2b..bca9fa9e3 100644 --- a/packages/hydrooj/src/model/domain.ts +++ b/packages/hydrooj/src/model/domain.ts @@ -101,23 +101,23 @@ class DomainModel { domainId = domainId.toLowerCase(); await bus.parallel('domain/before-update', domainId, $set); const result = await coll.findOneAndUpdate({ lower: domainId }, { $set }, { returnDocument: 'after' }); - if (result.value) { - await bus.parallel('domain/update', domainId, $set, result.value); + if (result) { + await bus.parallel('domain/update', domainId, $set, result); bus.broadcast('domain/delete-cache', domainId); } - return result.value; + return result; } @ArgMethod static async inc(domainId: string, field: NumberKeys, n: number): Promise { domainId = domainId.toLowerCase(); - const res = await coll.findOneAndUpdate( + const value = await coll.findOneAndUpdate( { _id: domainId }, { $inc: { [field]: n } as any }, { returnDocument: 'after' }, ); bus.broadcast('domain/delete-cache', domainId); - return res.value?.[field]; + return value?.[field]; } @ArgMethod @@ -136,7 +136,7 @@ class DomainModel { static async setUserRole(domainId: string, uid: MaybeArray, role: string, autojoin = false) { const update = { $set: { role, ...(autojoin ? { join: true } : {}) } }; if (!(uid instanceof Array)) { - const res = await collUser.findOneAndUpdate({ domainId, uid }, update, { upsert: true, returnDocument: 'after' }); + const res = await collUser.findOneAndUpdate({ domainId, uid }, update, { upsert: true, returnDocument: 'after', includeResultMetadata: true }); const udoc = await UserModel.getById(domainId, uid); deleteUserCache(udoc); return res; diff --git a/packages/hydrooj/src/model/message.ts b/packages/hydrooj/src/model/message.ts index e93f6d4fa..df96a1e86 100644 --- a/packages/hydrooj/src/model/message.ts +++ b/packages/hydrooj/src/model/message.ts @@ -55,12 +55,11 @@ class MessageModel { } static async setFlag(messageId: ObjectId, flag: number) { - const result = await MessageModel.coll.findOneAndUpdate( + return await MessageModel.coll.findOneAndUpdate( { _id: messageId }, { $bit: { flag: { xor: flag } } }, { returnDocument: 'after' }, ); - return result.value || null; } static async del(_id: ObjectId) { diff --git a/packages/hydrooj/src/model/oauth.ts b/packages/hydrooj/src/model/oauth.ts index 93ddb4964..34225aa8e 100644 --- a/packages/hydrooj/src/model/oauth.ts +++ b/packages/hydrooj/src/model/oauth.ts @@ -15,7 +15,7 @@ class OauthModel { { $set: { uid } }, { upsert: true, returnDocument: 'after' }, ); - return res.value?.uid; + return res?.uid; } } diff --git a/packages/hydrooj/src/model/opcount.ts b/packages/hydrooj/src/model/opcount.ts index 983e53d71..53f229e21 100644 --- a/packages/hydrooj/src/model/opcount.ts +++ b/packages/hydrooj/src/model/opcount.ts @@ -13,7 +13,7 @@ export async function inc(op: string, ident: string, periodSecs: number, maxOper expireAt, opcount: { $lt: maxOperations }, }, { $inc: { opcount: 1 } }, { upsert: true, returnDocument: 'after' }); - return res.value.opcount; + return res.opcount; } catch (e) { if (e.message.includes('duplicate')) throw new OpcountExceededError(op, periodSecs, maxOperations); throw e; diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 2d3196f2f..c12451625 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -209,12 +209,11 @@ export default class RecordModel { return null; } if (Object.keys($update).length) { - const res = await RecordModel.coll.findOneAndUpdate( + return await RecordModel.coll.findOneAndUpdate( { _id, domainId }, $update, { returnDocument: 'after' }, ); - return res.value || null; } return await RecordModel.coll.findOne({ _id }, { readPreference: 'primary' }); } diff --git a/packages/hydrooj/src/model/schedule.ts b/packages/hydrooj/src/model/schedule.ts index dbe070d32..107ab09b0 100644 --- a/packages/hydrooj/src/model/schedule.ts +++ b/packages/hydrooj/src/model/schedule.ts @@ -15,13 +15,13 @@ async function getFirst(query: Filter) { const q = { ...query }; q.executeAfter ||= { $lt: new Date() }; const res = await coll.findOneAndDelete(q); - if (res.value) { - logger.debug('%o', res.value); - if (res.value.interval) { - const executeAfter = moment(res.value.executeAfter).add(...res.value.interval).toDate(); - await coll.insertOne({ ...res.value, executeAfter }); + if (res) { + logger.debug('%o', res); + if (res.interval) { + const executeAfter = moment(res.executeAfter).add(...res.interval).toDate(); + await coll.insertOne({ ...res, executeAfter }); } - return res.value; + return res; } return null; } diff --git a/packages/hydrooj/src/model/storage.ts b/packages/hydrooj/src/model/storage.ts index 18c7fc6be..a583fe8db 100644 --- a/packages/hydrooj/src/model/storage.ts +++ b/packages/hydrooj/src/model/storage.ts @@ -35,7 +35,7 @@ export class StorageModel { } static async get(path: string, savePath?: string) { - const { value } = await StorageModel.coll.findOneAndUpdate( + const value = await StorageModel.coll.findOneAndUpdate( { path, autoDelete: null }, { $set: { lastUsage: new Date() } }, { returnDocument: 'after' }, @@ -101,7 +101,7 @@ export class StorageModel { } static async getMeta(path: string) { - const { value } = await StorageModel.coll.findOneAndUpdate( + const value = await StorageModel.coll.findOneAndUpdate( { path, autoDelete: null }, { $set: { lastUsage: new Date() } }, { returnDocument: 'after' }, @@ -120,7 +120,7 @@ export class StorageModel { { path: target, autoDelete: null }, { $set: { lastUsage: new Date() } }, ); - return await storage.signDownloadLink(res.value?.link || res.value?._id || target, filename, noExpire, useAlternativeEndpointFor); + return await storage.signDownloadLink(res?.link || res?._id || target, filename, noExpire, useAlternativeEndpointFor); } static async move(src: string, dst: string) { @@ -128,7 +128,7 @@ export class StorageModel { { path: src, autoDelete: null }, { $set: { path: dst } }, ); - return !!res.value; + return !!res; } static async exists(path: string) { @@ -137,7 +137,7 @@ export class StorageModel { } static async copy(src: string, dst: string) { - const { value } = await StorageModel.coll.findOneAndUpdate( + const value = await StorageModel.coll.findOneAndUpdate( { path: src, autoDelete: null }, { $set: { lastUsage: new Date() } }, { returnDocument: 'after' }, @@ -170,9 +170,9 @@ async function cleanFiles() { } if (system.get('server.keepFiles')) return; let res = await StorageModel.coll.findOneAndDelete({ autoDelete: { $lte: new Date() } }); - while (res.value) { + while (res) { // eslint-disable-next-line no-await-in-loop - if (!res.value.link) await storage.del(res.value._id); + if (!res.link) await storage.del(res._id); // eslint-disable-next-line no-await-in-loop res = await StorageModel.coll.findOneAndDelete({ autoDelete: { $lte: new Date() } }); } diff --git a/packages/hydrooj/src/model/system.ts b/packages/hydrooj/src/model/system.ts index 8eaaa6be9..735c2e955 100644 --- a/packages/hydrooj/src/model/system.ts +++ b/packages/hydrooj/src/model/system.ts @@ -45,8 +45,8 @@ export async function set(_id: string, value: any, broadcast = true) { { $set: { value } }, { upsert: true, returnDocument: 'after' }, ); - cache[_id] = res.value.value; - return res.value.value; + cache[_id] = res.value; + return res.value; } export async function inc>(_id: K) { @@ -55,8 +55,8 @@ export async function inc>(_id: K) { { $inc: { value: 1 } as any }, { upsert: true, returnDocument: 'after' }, ); - cache[_id] = res.value.value; - return res.value.value; + cache[_id] = res.value; + return res.value; } export async function runConfig() { diff --git a/packages/hydrooj/src/model/task.ts b/packages/hydrooj/src/model/task.ts index 1ab22c4c5..57df43213 100644 --- a/packages/hydrooj/src/model/task.ts +++ b/packages/hydrooj/src/model/task.ts @@ -19,9 +19,9 @@ async function getFirst(query: Filter) { try { const q = { ...query }; const res = await coll.findOneAndDelete(q, { sort: { priority: -1 } }); - if (res.value) { - logger.debug('%o', res.value); - return res.value; + if (res) { + logger.debug('%o', res); + return res; } return null; } catch (e) { @@ -182,9 +182,9 @@ export async function apply(ctx: Context) { logger.error(e); continue; } - if (argv.options.showEvent) logger.info('Event: %o', res.value); + if (argv.options.showEvent) logger.info('Event: %o', res); // eslint-disable-next-line no-await-in-loop - await (res.value ? handleEvent(res.value) : sleep(500)); + await (res ? handleEvent(res) : sleep(500)); } }); await db.ensureIndexes(collEvent, { name: 'expire', key: { expire: 1 }, expireAfterSeconds: 0 }); diff --git a/packages/hydrooj/src/model/token.ts b/packages/hydrooj/src/model/token.ts index 9dd9b8841..6223ca193 100644 --- a/packages/hydrooj/src/model/token.ts +++ b/packages/hydrooj/src/model/token.ts @@ -67,7 +67,7 @@ class TokenModel { }, { returnDocument: 'after' }, ); - return res.value; + return res; } @ArgMethod diff --git a/packages/hydrooj/src/model/user.ts b/packages/hydrooj/src/model/user.ts index fc31585d2..6f39bc238 100644 --- a/packages/hydrooj/src/model/user.ts +++ b/packages/hydrooj/src/model/user.ts @@ -268,7 +268,7 @@ class UserModel { deleteUserCache(udoc); } const res = await coll.findOneAndUpdate({ _id: uid }, op, { returnDocument: 'after' }); - deleteUserCache(res.value); + deleteUserCache(res); return res; } @@ -290,8 +290,8 @@ class UserModel { { $set: { salt, hash: await pwhash(password, salt), hashType: 'hydro' } }, { returnDocument: 'after' }, ); - deleteUserCache(res.value); - return res.value; + deleteUserCache(res); + return res; } @ArgMethod @@ -427,8 +427,8 @@ class UserModel { { $set: { priv } }, { returnDocument: 'after' }, ); - deleteUserCache(res.value); - return res.value; + deleteUserCache(res); + return res; } @ArgMethod diff --git a/packages/hydrooj/src/service/worker.ts b/packages/hydrooj/src/service/worker.ts index cffad83d0..192e522b4 100644 --- a/packages/hydrooj/src/service/worker.ts +++ b/packages/hydrooj/src/service/worker.ts @@ -29,13 +29,13 @@ export class WorkerService extends Service { subType: { $in: Object.keys(this.handlers) }, }; const res = await this.coll.findOneAndDelete(q); - if (res.value) { - this.ctx.logger.debug('%o', res.value); - if (res.value.interval) { - const executeAfter = moment(res.value.executeAfter).add(...res.value.interval).toDate(); - await this.coll.insertOne({ ...res.value, executeAfter }); + if (res) { + this.ctx.logger.debug('%o', res); + if (res.interval) { + const executeAfter = moment(res.executeAfter).add(...res.interval).toDate(); + await this.coll.insertOne({ ...res, executeAfter }); } - return res.value; + return res; } return null; } diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 0d138687b..38139ebd1 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -7,7 +7,7 @@ "license": "AGPL-3.0-or-later", "dependencies": { "mariadb": "^3.4.0", - "mongodb": "^5.9.2", + "mongodb": "^6.15.0", "turndown": "^7.2.0", "xml2js": "^0.6.2" }, diff --git a/packages/utils/package.json b/packages/utils/package.json index c53beb552..06d5aa8a2 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -13,7 +13,7 @@ "fs-extra": "^11.3.0", "js-yaml": "^4.1.0", "moment-timezone": "^0.5.47", - "mongodb": "^5.9.2", + "mongodb": "^6.15.0", "reggol": "^2.1.0", "search-query-parser": "^1.6.0", "systeminformation": "^5.25.11"