Просмотр исходного кода

# Feature/196, 198, 199 Grouping users
* Prepare group model.(methods are not complete)
* Add group-model method to models index.
* Add group route to routes index.

Tatsuya Ise 8 лет назад
Родитель
Сommit
4e1b25dfb9
4 измененных файлов с 208 добавлено и 202 удалено
  1. 189 202
      lib/models/group.js
  2. 1 0
      lib/models/index.js
  3. 15 0
      lib/routes/admin.js
  4. 3 0
      lib/routes/index.js

+ 189 - 202
lib/models/group.js

@@ -4,12 +4,11 @@ module.exports = function(crowi) {
     , mongoosePaginate = require('mongoose-paginate')
     , uniqueValidator = require('mongoose-unique-validator')
     , crypto = require('crypto')
-    , async = require('async')
     , ObjectId = mongoose.Schema.Types.ObjectId
 
-    , PAGE_ITEMS = 50
+    , GROUP_PUBLIC_FIELDS = '_id image name groupname createdAt'
 
-    , groupEvent = crowi.event('group')
+    , PAGE_ITEMS = 50
 
     , groupSchema;
 
@@ -24,61 +23,67 @@ module.exports = function(crowi) {
   groupSchema.plugin(mongoosePaginate);
   groupSchema.plugin(uniqueValidator);
 
-  groupEvent.on('activated', groupEvent.onActivated);
-
-  function generateRandomTempPassword () {
-    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!=-_';
-    var password = '';
-    var len = 12;
-
-    for (var i = 0; i < len; i++) {
-      var randomPoz = Math.floor(Math.random() * chars.length);
-      password += chars.substring(randomPoz, randomPoz+1);
-    }
-
-    return password;
-  }
-
-  function generatePassword (password) {
-    var hasher = crypto.createHash('sha256');
-    hasher.update(crowi.env.PASSWORD_SEED + password);
-
-    return hasher.digest('hex');
-  }
-
-  groupSchema.methods.isPasswordSet = function() {
-    if (this.password) {
-      return true;
-    }
-    return false;
-  };
-
-  groupSchema.methods.isPasswordValid = function(password) {
-    return this.password == generatePassword(password);
-  };
-
-  groupSchema.methods.setPassword = function(password) {
-    this.password = generatePassword(password);
-    return this;
-  };
-
-  groupSchema.methods.updatePassword = function(password, callback) {
-    this.setPassword(password);
-    this.save(function(err, groupData) {
-      return callback(err, groupData);
-    });
-  };
-
-  groupSchema.methods.updateImage = function(image, callback) {
-    this.image = image;
-    this.save(function(err, groupData) {
-      return callback(err, groupData);
-    });
-  };
-
-  groupSchema.methods.deleteImage = function(callback) {
-    return this.updateImage(null, callback);
-  };
+  // TBD: 仮グループ管理パスワードの生成
+  // function generateRandomTempPassword () {
+  //   var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!=-_';
+  //   var password = '';
+  //   var len = 12;
+
+  //   for (var i = 0; i < len; i++) {
+  //     var randomPoz = Math.floor(Math.random() * chars.length);
+  //     password += chars.substring(randomPoz, randomPoz+1);
+  //   }
+
+  //   return password;
+  // }
+
+  // TBD: グループ管理パスワードの生成
+  // function generatePassword (password) {
+  //   var hasher = crypto.createHash('sha256');
+  //   hasher.update(crowi.env.PASSWORD_SEED + password);
+
+  //   return hasher.digest('hex');
+  // }
+
+  // TBD: グループ管理パスワードの設定済確認
+  // groupSchema.methods.isPasswordSet = function() {
+  //   if (this.password) {
+  //     return true;
+  //   }
+  //   return false;
+  // };
+
+  // TBD: グループ管理パスワードのバリデーション
+  // groupSchema.methods.isPasswordValid = function(password) {
+  //   return this.password == generatePassword(password);
+  // };
+
+  // TBD: グループ管理パスワードの設定
+  // groupSchema.methods.setPassword = function(password) {
+  //   this.password = generatePassword(password);
+  //   return this;
+  // };
+
+  // グループ管理パスワードの更新
+  // groupSchema.methods.updatePassword = function(password, callback) {
+  //   this.setPassword(password);
+  //   this.save(function(err, groupData) {
+  //     return callback(err, groupData);
+  //   });
+  // };
+
+  // TBD: グループ画像の更新
+  // groupSchema.methods.updateImage = function(image, callback) {
+  //   this.image = image;
+  //   this.save(function(err, groupData) {
+  //     return callback(err, groupData);
+  //   });
+  // };
+
+  // TBD: グループ画像の削除
+  // groupSchema.methods.deleteImage = function(callback) {
+  //   return this.updateImage(null, callback);
+  // };
 
   groupSchema.statics.filterToPublicFields = function(group) {
     debug('Group is', typeof group, group);
@@ -98,59 +103,30 @@ module.exports = function(crowi) {
     return filteredGroup;
   };
 
-  groupSchema.statics.findGroups = function(options, callback) {
-    var sort = options.sort || {status: 1, createdAt: 1};
+  // TBD: グループ検索
+  // groupSchema.statics.findGroups = function(options, callback) {
+  //   var sort = options.sort || {createdAt: 1};
 
-    this.find()
-      .sort(sort)
-      .skip(options.skip || 0)
-      .limit(options.limit || 21)
-      .exec(function (err, groupData) {
-        callback(err, groupData);
-      });
+  //   this.find()
+  //     .sort(sort)
+  //     .skip(options.skip || 0)
+  //     .limit(options.limit || 21)
+  //     .exec(function (err, groupData) {
+  //       callback(err, groupData);
+  //     });
 
-  };
+  // };
 
   groupSchema.statics.findAllGroups = function(option) {
     var Group = this;
     var option = option || {}
       , sort = option.sort || {createdAt: -1}
-      , status = option.status || [STATUS_ACTIVE, STATUS_SUSPENDED]
       , fields = option.fields || GROUP_PUBLIC_FIELDS
       ;
 
-    if (!Array.isArray(status)) {
-      status = [status];
-    }
-
     return new Promise(function(resolve, reject) {
       Group
         .find()
-        .or(status.map(s => { return {status: s}; }))
-        .select(fields)
-        .sort(sort)
-        .exec(function (err, groupData) {
-          if (err) {
-            return reject(err);
-          }
-
-          return resolve(groupData);
-        });
-    });
-  };
-
-  groupSchema.statics.findGroupsByIds = function(ids, option) {
-    var Group = this;
-    var option = option || {}
-      , sort = option.sort || {createdAt: -1}
-      , status = option.status || STATUS_ACTIVE
-      , fields = option.fields || GROUP_PUBLIC_FIELDS
-      ;
-
-
-    return new Promise(function(resolve, reject) {
-      Group
-        .find({ _id: { $in: ids }, status: status })
         .select(fields)
         .sort(sort)
         .exec(function (err, groupData) {
@@ -163,19 +139,33 @@ module.exports = function(crowi) {
     });
   };
 
-  groupSchema.statics.findAdmins = function(callback) {
-    var Group = this;
-    this.find({admin: true})
-      .exec(function(err, admins) {
-        debug('Admins: ', admins);
-        callback(err, admins);
-      });
-  };
+  // TBD: IDによるグループ検索
+  // groupSchema.statics.findGroupsByIds = function(ids, option) {
+  //   var Group = this;
+  //   var option = option || {}
+  //     , sort = option.sort || {createdAt: -1}
+  //     , fields = option.fields || GROUP_PUBLIC_FIELDS
+  //     ;
+
+  //   return new Promise(function(resolve, reject) {
+  //     Group
+  //       .find({ _id: { $in: ids }})
+  //       .select(fields)
+  //       .sort(sort)
+  //       .exec(function (err, groupData) {
+  //         if (err) {
+  //           return reject(err);
+  //         }
+
+  //         return resolve(groupData);
+  //       });
+  //   });
+  // };
 
   groupSchema.statics.findGroupsWithPagination = function(options, callback) {
-    var sort = options.sort || {status: 1, groupname: 1, createdAt: 1};
+    var sort = options.sort || {groupname: 1, createdAt: 1};
 
-    this.paginate({status: { $ne: STATUS_DELETED }}, { page: options.page || 1, limit: options.limit || PAGE_ITEMS }, function(err, result) {
+    this.paginate({ page: options.page || 1, limit: options.limit || PAGE_ITEMS }, function(err, result) {
       if (err) {
         debug('Error on pagination:', err);
         return callback(err, null);
@@ -185,100 +175,97 @@ module.exports = function(crowi) {
     }, { sortBy : sort });
   };
 
-  groupSchema.statics.findGroupByGroupname = function(groupname) {
-    var Group = this;
-    return new Promise(function(resolve, reject) {
-      Group.findOne({groupname: groupname}, function (err, groupData) {
-        if (err) {
-          return reject(err);
-        }
-
-        return resolve(groupData);
-      });
-    });
-  };
-
-  groupSchema.statics.isRegisterableGroupname = function(groupname, callback) {
-    var Group = this;
-    var groupnameUsable = true;
-
-    this.findOne({groupname: groupname}, function (err, groupData) {
-      if (groupData) {
-        groupnameUsable = false;
-      }
-      return callback(groupnameUsable);
-    });
-  };
-
-  groupSchema.statics.removeCompletelyById = function(id, callback) {
-    var Group = this;
-    Group.findById(id, function (err, groupData) {
-      if (!groupData) {
-        return callback(err, null);
-      }
-
-      debug('Removing group:', groupData);
-
-      groupData.remove(function(err) {
-        if (err) {
-          return callback(err, null);
-        }
-
-        return callback(null, 1);
-      });
-    });
-  };
-
-  groupSchema.statics.resetPasswordByRandomString = function(id) {
-    var Group = this;
-
-    return new Promise(function(resolve, reject) {
-      Group.findById(id, function (err, groupData) {
-        if (!groupData) {
-          return reject(new Error('Group not found'));
-        }
-
-        var newPassword = generateRandomTempPassword();
-        groupData.setPassword(newPassword);
-        groupData.save(function(err, groupData) {
-          if (err) {
-            return reject(err);
-          }
-
-          resolve({group: groupData, newPassword: newPassword});
-        });
-      });
-    });
-  };
-
-  groupSchema.statics.createGroupByNameAndPassword = function(name, groupname, password, callback) {
-    var Group = this
-      , newGroup = new Group();
-
-    newGroup.name = name;
-    newGroup.groupname = groupname;
-    newGroup.setPassword(password);
-    newGroup.createdAt = Date.now();
-
-    newGroup.save(function(err, groupData) {
-      return callback(err, groupData);
-    });
-  };
-
-  groupSchema.statics.createGroupPictureFilePath = function(group, name) {
-    var ext = '.' + name.match(/(.*)(?:\.([^.]+$))/)[2];
-
-    return 'group/' + group._id + ext;
-  };
-
-  groupSchema.statics.getGroupnameByPath = function(path) {
-    var groupname = null;
-    if (m = path.match(/^\/group\/([^\/]+)\/?/)) {
-      groupname = m[1];
-    }
-
-    return groupname;
-  };
+  // TBD: グループ名によるグループ検索
+  // groupSchema.statics.findGroupByGroupname = function(groupname) {
+  //   var Group = this;
+  //   return new Promise(function(resolve, reject) {
+  //     Group.findOne({groupname: groupname}, function (err, groupData) {
+  //       if (err) {
+  //         return reject(err);
+  //       }
+
+  //       return resolve(groupData);
+  //     });
+  //   });
+  // };
+
+  // TBD: 登録可能グループ名確認
+  // groupSchema.statics.isRegisterableGroupname = function(groupname, callback) {
+  //   var Group = this;
+  //   var groupnameUsable = true;
+
+  //   this.findOne({groupname: groupname}, function (err, groupData) {
+  //     if (groupData) {
+  //       groupnameUsable = false;
+  //     }
+  //     return callback(groupnameUsable);
+  //   });
+  // };
+
+  // TBD: グループの完全削除
+  // groupSchema.statics.removeCompletelyById = function(id, callback) {
+  //   var Group = this;
+  //   Group.findById(id, function (err, groupData) {
+  //     if (!groupData) {
+  //       return callback(err, null);
+  //     }
+
+  //     debug('Removing group:', groupData);
+
+  //     groupData.remove(function(err) {
+  //       if (err) {
+  //         return callback(err, null);
+  //       }
+
+  //       return callback(null, 1);
+  //     });
+  //   });
+  // };
+
+  // TBD: ランダム生成パスワードリセット
+  // groupSchema.statics.resetPasswordByRandomString = function(id) {
+  //   var Group = this;
+
+  //   return new Promise(function(resolve, reject) {
+  //     Group.findById(id, function (err, groupData) {
+  //       if (!groupData) {
+  //         return reject(new Error('Group not found'));
+  //       }
+
+  //       var newPassword = generateRandomTempPassword();
+  //       groupData.setPassword(newPassword);
+  //       groupData.save(function(err, groupData) {
+  //         if (err) {
+  //           return reject(err);
+  //         }
+
+  //         resolve({group: groupData, newPassword: newPassword});
+  //       });
+  //     });
+  //   });
+  // };
+
+  // TBD: グループ名・パスワードによるグループ生成
+  // groupSchema.statics.createGroupByNameAndPassword = function(name, groupname, password, callback) {
+  //   var Group = this
+  //     , newGroup = new Group();
+
+  //   newGroup.name = name;
+  //   newGroup.groupname = groupname;
+  //   newGroup.setPassword(password);
+  //   newGroup.createdAt = Date.now();
+
+  //   newGroup.save(function(err, groupData) {
+  //     return callback(err, groupData);
+  //   });
+  // };
+
+  // TBD: グループ画像パスの生成
+  // groupSchema.statics.createGroupPictureFilePath = function(group, name) {
+  //   var ext = '.' + name.match(/(.*)(?:\.([^.]+$))/)[2];
+
+  //   return 'group/' + group._id + ext;
+  // };
 
 
   groupSchema.statics.GROUP_PUBLIC_FIELDS = GROUP_PUBLIC_FIELDS;

+ 1 - 0
lib/models/index.js

@@ -3,6 +3,7 @@
 module.exports = {
   Page: require('./page'),
   User: require('./user'),
+  Group: require('./group'),
   Revision: require('./revision'),
   Bookmark: require('./bookmark'),
   Comment: require('./comment'),

+ 15 - 0
lib/routes/admin.js

@@ -5,6 +5,7 @@ module.exports = function(crowi, app) {
     , models = crowi.models
     , Page = models.Page
     , User = models.User
+    , Group = models.Group
     , Config = models.Config
     , PluginUtils = require('../plugins/plugin-utils')
     , pluginUtils = new PluginUtils()
@@ -471,6 +472,20 @@ module.exports = function(crowi, app) {
     });
   }
 
+  actions.group = {};
+  actions.group.index = function (req, res) {
+    var page = parseInt(req.query.page) || 1;
+
+    Group.findGroupsWithPagination({ page: page }, function (err, result) {
+      const pager = createPager(result.total, result.limit, result.page, result.pages, MAX_PAGE_LIST);
+
+      return res.render('admin/groups', {
+        groups: result.docs,
+        pager: pager
+      });
+    });
+  };
+
   actions.api = {};
   actions.api.appSetting = function(req, res) {
     var form = req.form.settingForm;

+ 3 - 0
lib/routes/index.js

@@ -100,6 +100,9 @@ module.exports = function(crowi, app) {
   // new route patterns from here:
   app.post('/_api/admin/users.resetPassword'  , loginRequired(crowi, app) , middleware.adminRequired() , csrf, admin.user.resetPassword);
 
+  // groups admin
+  app.get('/admin/groups', loginRequired(crowi, app), middleware.adminRequired(), admin.group.index);
+
   app.get('/me'                       , loginRequired(crowi, app) , me.index);
   app.get('/me/password'              , loginRequired(crowi, app) , me.password);
   app.get('/me/apiToken'              , loginRequired(crowi, app) , me.apiToken);