core: use mongodb@6

This commit is contained in:
undefined committed 2025-03-21 06:28:56 +08:00
1 parent 0bd15caee6
commit b6f1a9c627
17 files changed
+64 -80

No files matched your search

+2 -2
View File
@@ -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",
+1 -2
View File
@@ -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
+15 -28
View File
@@ -109,12 +109,11 @@ export async function set<K extends keyof DocType>(
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<K extends keyof DocType>(
@@ -150,24 +149,22 @@ export async function inc<K extends keyof DocType>(
domainId: string, docType: K, docId: DocType[K]['docId'],
key: NumberKeys<DocType[K]>, 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<K extends keyof DocType>(
domainId: string, docType: K, docId: DocType[K]['docId'],
key: NumberKeys<DocType[K]>, value: number, args: Partial<DocType[K]>,
) {
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<K extends keyof DocType>(
@@ -211,13 +208,12 @@ export async function pull<K extends keyof DocType, T extends ArrayKeys<DocType[
domainId: string, docType: K, docId: DocType[K]['docId'],
setKey: T, contents: Filter<DocType[K][T][0]>,
): Promise<DocType[K]> {
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<T extends keyof DocType, K extends ArrayKeys<DocType[T]>>(
@@ -225,13 +221,12 @@ export async function deleteSub<T extends keyof DocType, K extends ArrayKeys<Doc
key: K, subId: MaybeArray<DocType[T][K][0]['_id']>,
): Promise<DocType[T]> {
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<T extends keyof DocType, K extends ArrayKeys<DocType[T]>>(
@@ -257,7 +252,7 @@ export async function setSub<T extends keyof DocType, K extends NormalArrayKeys<
): Promise<DocType[T]> {
const $set: Record<string, any> = {};
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<T extends keyof DocType, K extends NormalArrayKeys<
{ $set },
{ returnDocument: 'after' },
);
return res.value;
}
export async function addToSet<T extends keyof DocType, K extends ArrayKeys<DocType[T], string>>(
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<K extends keyof DocStatusType>(
@@ -305,7 +298,7 @@ export async function setStatus<K extends keyof DocStatusType>(
domainId: string, docType: K, docId: DocStatusType[K]['docId'], uid: number,
args: UpdateFilter<DocStatusType[K]>['$set'], returnDocument: 'before' | 'after' = 'after',
): Promise<DocStatusType[K]> {
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<K extends keyof DocStatusType>(
...(returnDocument === 'before' ? { readConcern: { level: 'majority' }, readPreference: 'primary' } : {}),
},
);
return res.value;
}
export async function setMultiStatus<K extends keyof DocStatusType>(
@@ -333,12 +325,11 @@ export async function setStatusIfNotCondition<T extends keyof DocStatusType>(
returnDocument: 'before' | 'after' = 'after',
): Promise<DocStatusType[T]> {
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<T extends keyof DocStatusType>(
const $not = value > 0 ? { $gte: maxValue } : { $lte: minValue };
const operation = { $inc: { [key]: value } } as UpdateFilter<DocStatusType[T]>;
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<T extends keyof DocStatusType>(
domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number,
key: NumberKeys<DocStatusType[T]>, value: number,
): Promise<DocStatusType[T]> {
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<T extends keyof DocStatusType>(
@@ -393,7 +382,7 @@ export async function revPushStatus<T extends keyof DocStatusType>(
{ $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<T extends keyof DocStatusType>(
{ upsert: true, returnDocument: 'after' },
);
}
return res.value;
return res;
}
export async function revInitStatus<T extends keyof DocStatusType>(
domainId: string, docType: T, docId: DocStatusType[T]['docId'], uid: number,
): Promise<DocStatusType[T]> {
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<T extends keyof DocStatusType>(
@@ -421,8 +409,7 @@ export async function revSetStatus<T extends keyof DocStatusType>(
): Promise<any> {
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) {
+6 -6
View File
@@ -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<DomainDoc>, n: number): Promise<number | null> {
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<number>, 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;
+1 -2
View File
@@ -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) {
+1 -1
View File
@@ -15,7 +15,7 @@ class OauthModel {
{ $set: { uid } },
{ upsert: true, returnDocument: 'after' },
);
return res.value?.uid;
return res?.uid;
}
}
+1 -1
View File
@@ -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;
+1 -2
View File
@@ -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' });
}
+6 -6
View File
@@ -15,13 +15,13 @@ async function getFirst(query: Filter<Schedule>) {
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;
}
+7 -7
View File
@@ -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() } });
}
+4 -4
View File
@@ -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<K extends NumberKeys<SystemKeys>>(_id: K) {
@@ -55,8 +55,8 @@ export async function inc<K extends NumberKeys<SystemKeys>>(_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() {
+5 -5
View File
@@ -19,9 +19,9 @@ async function getFirst(query: Filter<Task>) {
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 });
+1 -1
View File
@@ -67,7 +67,7 @@ class TokenModel {
},
{ returnDocument: 'after' },
);
return res.value;
return res;
}
@ArgMethod
+5 -5
View File
@@ -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
+6 -6
View File
@@ -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;
}
+1 -1
View File
@@ -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"
},
+1 -1
View File
@@ -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"