diff --git a/packages/hydrooj/src/handler/domain.ts b/packages/hydrooj/src/handler/domain.ts index 9036b18a7..a7d065f4d 100644 --- a/packages/hydrooj/src/handler/domain.ts +++ b/packages/hydrooj/src/handler/domain.ts @@ -438,21 +438,15 @@ export const DomainApi = { ), groups: Query( Schema.object({ - search: Schema.string(), - names: Schema.array(Schema.string()), domainId: Schema.string().required(), + uid: Schema.number().step(1), + names: Schema.array(Schema.string()), + search: Schema.string(), + limit: Schema.number().step(1).max(100), }), async (ctx, args) => { if (!ctx.user.hasPerm(PERM.PERM_VIEW) && !ctx.user.hasPriv(PRIV.PRIV_VIEW_ALL_DOMAIN)) throw new PermissionError(PERM.PERM_VIEW); - const groups = await user.listGroup(args.domainId); - if (args.names?.length) { - return groups.filter((g) => args.names.includes(g.name)); - } - if (args.search) { - const searchLower = args.search.toLowerCase(); - return groups.filter((g) => g.name.toLowerCase().includes(searchLower)); - } - return groups; + return user.listGroup(args.domainId, args.uid, args.names, args.search, args.search ? (args.limit ?? 10) : undefined); }, ), 'domain.group': Mutation( diff --git a/packages/hydrooj/src/model/user.ts b/packages/hydrooj/src/model/user.ts index 86d5d2aef..08ce30bc9 100644 --- a/packages/hydrooj/src/model/user.ts +++ b/packages/hydrooj/src/model/user.ts @@ -479,8 +479,22 @@ class UserModel { ]); } - static async listGroup(domainId: string, uid?: number) { - const groups = await collGroup.find(typeof uid === 'number' ? { domainId, uids: uid } : { domainId }).toArray(); + static async listGroup(domainId: string, uid?: number, names?: string[], search?: string, limit?: number) { + const filter: Filter = { domainId }; + if (typeof uid === 'number') filter.uids = uid; + if (names?.length && search) { + filter.$and = [ + { name: { $in: names } }, + { name: { $regex: escapeRegExp(search), $options: 'i' } }, + ]; + } else if (names?.length) { + filter.name = { $in: names }; + } else if (search) { + filter.name = { $regex: escapeRegExp(search), $options: 'i' }; + } + let cursor = collGroup.find(filter); + if (limit) cursor = cursor.limit(limit); + const groups = await cursor.toArray(); if (uid) { groups.push({ _id: new ObjectId(), domainId, uids: [uid], name: uid.toString(),