Răsfoiți Sursa

Implement: admin/users.search api

Sotaro KARASAWA 9 ani în urmă
părinte
comite
4fc9ce3b51
4 a modificat fișierele cu 57 adăugiri și 2 ștergeri
  1. 28 2
      lib/models/user.js
  2. 16 0
      lib/routes/admin.js
  3. 1 0
      lib/routes/index.js
  4. 12 0
      test/models/user.test.js

+ 28 - 2
lib/models/user.js

@@ -11,9 +11,9 @@ module.exports = function(crowi) {
     , STATUS_SUSPENDED  = 3
     , STATUS_DELETED    = 4
     , STATUS_INVITED    = 5
-    , USER_PUBLIC_FIELDS = '_id image googleId name username email status createdAt' // TODO: どこか別の場所へ...
+    , USER_PUBLIC_FIELDS = '_id image googleId name username email introduction status createdAt admin' // TODO: どこか別の場所へ...
 
-    , PAGE_ITEMS        = 20
+    , PAGE_ITEMS        = 50
 
     , userEvent = crowi.event('user')
 
@@ -326,6 +326,31 @@ module.exports = function(crowi) {
     }, { sortBy : sort });
   };
 
+  userSchema.statics.findUsersByPartOfEmail = function(emailPart, options) {
+    const status = options.status || null;
+    const emailPartRegExp = new RegExp(emailPart.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
+    const User = this;
+
+    return new Promise((resolve, reject) => {
+      const query = User.find({ email: emailPartRegExp }, USER_PUBLIC_FIELDS);
+
+      if (status) {
+        query.and({status});
+      }
+
+      query
+        .limit(PAGE_ITEMS + 1)
+        .exec((err, userData) => {
+          if (err) {
+            return reject(err);
+          }
+
+          return resolve(userData);
+        });
+    });
+  };
+
+
   userSchema.statics.findUserByUsername = function(username) {
     var User = this;
     return new Promise(function(resolve, reject) {
@@ -573,6 +598,7 @@ module.exports = function(crowi) {
   userSchema.statics.STATUS_DELETED = STATUS_DELETED;
   userSchema.statics.STATUS_INVITED = STATUS_INVITED;
   userSchema.statics.USER_PUBLIC_FIELDS = USER_PUBLIC_FIELDS;
+  userSchema.statics.PAGE_ITEMS = PAGE_ITEMS;
 
   return mongoose.model('User', userSchema);
 };

+ 16 - 0
lib/routes/admin.js

@@ -399,6 +399,22 @@ module.exports = function(crowi, app) {
     });
   };
 
+  // app.get('/_api/admin/users.search' , admin.api.userSearch);
+  actions.api.usersSearch = function(req, res) {
+    const User = crowi.model('User');
+    const email =req.query.email;
+
+    User.findUsersByPartOfEmail(email, {})
+    .then(users => {
+      const result = {
+        data: users
+      };
+      return res.json(ApiResponse.success(result));
+    }).catch(err => {
+      return res.json(ApiResponse.error());
+    });
+  };
+
   function saveSetting(req, res, form)
   {
     Config.updateNamespaceByArray('crowi', form, function(err, config) {

+ 1 - 0
lib/routes/index.js

@@ -54,6 +54,7 @@ module.exports = function(crowi, app) {
   app.get('/admin/notification/slackAuth'    , loginRequired(crowi, app) , middleware.adminRequired() , admin.notification.slackAuth);
   app.post('/_api/admin/notification.add'    , loginRequired(crowi, app) , middleware.adminRequired() , csrf, admin.api.notificationAdd);
   app.post('/_api/admin/notification.remove' , loginRequired(crowi, app) , middleware.adminRequired() , csrf, admin.api.notificationRemove);
+  app.get('/_api/admin/users.search'         , loginRequired(crowi, app) , middleware.adminRequired() , admin.api.usersSearch);
 
   app.get('/admin/users'                , loginRequired(crowi, app) , middleware.adminRequired() , admin.user.index);
   app.post('/admin/user/invite'         , form.admin.userInvite ,  loginRequired(crowi, app) , middleware.adminRequired() , csrf, admin.user.invite);

+ 12 - 0
test/models/user.test.js

@@ -29,6 +29,18 @@ describe('User', function () {
           done();
         });
       });
+
+      it('should be found by findUsersByPartOfEmail', function(done) {
+
+        User.findUsersByPartOfEmail('ao', {})
+        .then(function(userData) {
+          expect(userData).to.be.array;
+          expect(userData[0]).to.instanceof(User);
+          expect(userData[0].email).to.equal('aoi@example.com');
+          done();
+        });
+
+      });
     });
   });