diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 66ba1acd9..371e0263c 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.24.5", + "version": "2.24.6", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/model/domain.ts b/packages/hydrooj/src/model/domain.ts index 98ed5ffbf..964d22712 100644 --- a/packages/hydrooj/src/model/domain.ts +++ b/packages/hydrooj/src/model/domain.ts @@ -6,6 +6,7 @@ import { ArgMethod } from '../utils'; import { MaybeArray, NumberKeys } from '../typeutils'; import * as bus from '../service/bus'; import db from '../service/db'; +import UserModel, { deleteUserCache } from './user'; const coll = db.collection('domain'); const collUser = db.collection('domain.user'); @@ -110,11 +111,16 @@ class DomainModel { } @ArgMethod - static setUserRole(domainId: string, uid: MaybeArray, role: string) { + static async setUserRole(domainId: string, uid: MaybeArray, role: string) { if (!(uid instanceof Array)) { - return collUser.updateOne({ domainId, uid }, { $set: { role } }, { upsert: true }); + const res = await collUser.findOneAndUpdate({ domainId, uid }, { $set: { role } }, { upsert: true, returnOriginal: false }); + deleteUserCache(res.value); + return res; } - return collUser.updateMany({ domainId, uid: { $in: uid } }, { $set: { role } }, { upsert: true }); + const filter = { domainId, uid: { $in: uid } }; + const affected = await UserModel.getMulti(filter).project({ mail: 1, uname: 1 }).toArray(); + affected.forEach((udoc) => deleteUserCache(udoc)); + return await collUser.updateMany(filter, { $set: { role } }, { upsert: true }); } static async getRoles(domainId: string, count?: boolean): Promise; @@ -147,6 +153,7 @@ class DomainModel { } static async setRoles(domainId: string, roles: Dictionary) { + deleteUserCache(domainId); const current = await DomainModel.get(domainId); for (const role in roles) { current.roles[role] = roles[role].toString(); @@ -167,6 +174,7 @@ class DomainModel { coll.updateOne({ _id: domainId }, { $set: current }), collUser.updateMany({ domainId, role: { $in: roles } }, { $set: { role: 'default' } }), ]); + deleteUserCache(domainId); } static async getDomainUser(domainId: string, udoc: DomainUserArg) { @@ -183,6 +191,7 @@ class DomainModel { } static setMultiUserInDomain(domainId: string, query: any, params: any) { + deleteUserCache(domainId); return collUser.updateMany({ domainId, ...query }, { $set: params }, { upsert: true }); } @@ -190,8 +199,10 @@ class DomainModel { return collUser.find({ domainId, ...query }); } - static setUserInDomain(domainId: string, uid: number, params: any) { - return collUser.updateOne({ domainId, uid }, { $set: params }, { upsert: true }); + static async setUserInDomain(domainId: string, uid: number, params: any) { + const udoc = await UserModel.getById(domainId, uid); + deleteUserCache(udoc); + return await collUser.updateOne({ domainId, uid }, { $set: params }, { upsert: true }); } @ArgMethod diff --git a/packages/hydrooj/src/model/user.ts b/packages/hydrooj/src/model/user.ts index ec6b9bf27..4b345443a 100644 --- a/packages/hydrooj/src/model/user.ts +++ b/packages/hydrooj/src/model/user.ts @@ -19,8 +19,12 @@ const coll: Collection = db.collection('user'); const logger = new Logger('model/user'); const cache = new LRU({ max: 500, maxAge: 300 * 1000 }); -function deleteUserCache(udoc: User | Udoc) { - if (udoc) { +export function deleteUserCache(udoc: User | Udoc | string) { + if (typeof udoc === 'string') { + for (const key of cache.keys().filter((k) => k.endsWith(`/${udoc}`))) { + cache.del(key); + } + } else if (udoc) { const id = [udoc._id.toString(), udoc.uname.toLowerCase(), udoc.mail.toLowerCase()]; for (const key of cache.keys().filter((k) => id.includes(k.split('/')[0]))) { cache.del(key); diff --git a/packages/onlyoffice/package.json b/packages/onlyoffice/package.json index 9cbe7d3e6..c3c97b9bf 100644 --- a/packages/onlyoffice/package.json +++ b/packages/onlyoffice/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/onlyoffice", - "version": "1.0.0", + "version": "1.0.1", "main": "package.json", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ",