ソースを参照

customizable method

Shun Miyazawa 3 年 前
コミット
9efb1be1c6

+ 16 - 7
packages/app/src/server/models/activity.ts

@@ -116,13 +116,22 @@ activitySchema.statics.getPaginatedActivity = async function(limit: number, offs
   return paginateResult;
   return paginateResult;
 };
 };
 
 
-activitySchema.statics.getSnapshotUsernames = async function(q: string, limit: number) {
-  const result = await this.aggregate([
-    { $match: { 'snapshot.username': new RegExp(q) } },
-    { $group: { _id: '$snapshot.username' } },
-    { $limit: limit },
-  ]);
-  return result.map(r => r._id);
+activitySchema.statics.getSnapshotUsernames = async function(q: string, option) {
+  const opt = option || {};
+  const sortOpt = opt.sortOpt || { 'snapshot.username': 'asc' };
+  const offset = opt.offset || 0;
+  const limit = opt.limit || 10;
+
+  const usernames = await this.aggregate()
+    .match({ 'snapshot.username': { $regex: q, $options: 'i' } })
+    .group({ _id: '$snapshot.username' })
+    .sort(sortOpt)
+    .skip(offset)
+    .limit(limit);
+
+  const totalCount = (await this.find({ 'snapshot.username': { $regex: q, $options: 'i' } }).distinct('snapshot.username')).length;
+
+  return { usernames: usernames.map(r => r._id), totalCount };
 };
 };
 
 
 export default getOrCreateModel<ActivityDocument, ActivityModel>('Activity', activitySchema);
 export default getOrCreateModel<ActivityDocument, ActivityModel>('Activity', activitySchema);

+ 16 - 2
packages/app/src/server/models/user.js

@@ -715,8 +715,22 @@ module.exports = function(crowi) {
     return users;
     return users;
   };
   };
 
 
-  userSchema.statics.findUserByUsernameRegex = async function(username, limit, status) {
-    return this.find({ username: { $regex: username, $options: 'i' }, status: { $in: status } }).limit(limit);
+  userSchema.statics.findUserByUsernameRegex = async function(username, status, option) {
+    const opt = option || {};
+    const sortOpt = opt.sortOpt || { username: 1 };
+    const offset = opt.offset || 0;
+    const limit = opt.limit || 10;
+
+    const conditions = { username: { $regex: username, $options: 'i' }, status: { $in: status } };
+
+    const users = await this.find(conditions)
+      .sort(sortOpt)
+      .skip(offset)
+      .limit(limit);
+
+    const totalCount = (await this.find(conditions).distinct('username')).length;
+
+    return { users, totalCount };
   };
   };
 
 
   class UserUpperLimitException {
   class UserUpperLimitException {

+ 8 - 8
packages/app/src/server/routes/apiv3/users.js

@@ -948,21 +948,21 @@ module.exports = (crowi) => {
       const data = {};
       const data = {};
 
 
       if (options.isIncludeActiveUsernames == null || options.isIncludeActiveUsernames) {
       if (options.isIncludeActiveUsernames == null || options.isIncludeActiveUsernames) {
-        const activeUsers = await User.findUserByUsernameRegex(q, limit, [User.STATUS_ACTIVE]);
-        const activeUsernames = activeUsers.map(user => user.username);
-        Object.assign(data, { activeUsernames });
+        const activeUserData = await User.findUserByUsernameRegex(q, [User.STATUS_ACTIVE]);
+        const activeUsernames = activeUserData.users.map(user => user.username);
+        Object.assign(data, { activeUser: { usernames: activeUsernames, totalCount: activeUserData.totalCount } });
       }
       }
 
 
       if (options.isIncludeInactiveUsernames) {
       if (options.isIncludeInactiveUsernames) {
         const inactiveUserStates = [User.STATUS_REGISTERED, User.STATUS_SUSPENDED, User.STATUS_DELETED, User.STATUS_INVITED];
         const inactiveUserStates = [User.STATUS_REGISTERED, User.STATUS_SUSPENDED, User.STATUS_DELETED, User.STATUS_INVITED];
-        const inactiveUsers = await User.findUserByUsernameRegex(q, limit, inactiveUserStates);
-        const inactiveUsernames = inactiveUsers.map(user => user.username);
-        Object.assign(data, { inactiveUsernames });
+        const inactiveUserData = await User.findUserByUsernameRegex(q, inactiveUserStates);
+        const inactiveUsernames = inactiveUserData.users.map(user => user.username);
+        Object.assign(data, { inactiveUser: { usernames: inactiveUsernames, totalCount: inactiveUserData.totalCount } });
       }
       }
 
 
       if (options.isIncludeActivitySnapshotUsernames && req.user.admin) {
       if (options.isIncludeActivitySnapshotUsernames && req.user.admin) {
-        const activitySnapshotUsernames = await Activity.getSnapshotUsernames(q, limit);
-        Object.assign(data, { activitySnapshotUsernames });
+        const activitySnapshotUserData = await Activity.getSnapshotUsernames(q);
+        Object.assign(data, { activitySnapshotUser: activitySnapshotUserData });
       }
       }
 
 
       return res.apiv3({ data });
       return res.apiv3({ data });