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

# Feature/196, 198, 199 Grouping users
* Fix user-group find with pagenation method(add search query '{}').
* Fix view for admin user-group management page(uncomplete).
* Prepare userGroupCreate form.
* Prepare create userGroup api.

Tatsuya Ise 8 лет назад
Родитель
Сommit
29266e5df9
4 измененных файлов с 134 добавлено и 76 удалено
  1. 48 50
      lib/models/user-group.js
  2. 78 18
      lib/routes/admin.js
  3. 2 2
      lib/routes/index.js
  4. 6 6
      lib/views/admin/user-groups.html

+ 48 - 50
lib/models/user-group.js

@@ -6,7 +6,7 @@ module.exports = function(crowi) {
 
     , USER_GROUP_PUBLIC_FIELDS = '_id image name createdAt'
 
-    , PAGE_ITEMS = 50
+    , PAGE_ITEMS = 10
 
     , userGroupSchema;
 
@@ -20,36 +20,36 @@ module.exports = function(crowi) {
 
 
   // TBD: グループ画像の更新
-  // userGroupSchema.methods.updateImage = function(image, callback) {
-  //   this.image = image;
-  //   this.save(function(err, userGroupData) {
-  //     return callback(err, userGroupData);
-  //   });
-  // };
+  userGroupSchema.methods.updateImage = function(image, callback) {
+    this.image = image;
+    this.save(function(err, userGroupData) {
+      return callback(err, userGroupData);
+    });
+  };
 
   // TBD: グループ画像の削除
-  // userGroupSchema.methods.deleteImage = function(callback) {
-  //   return this.updateImage(null, callback);
-  // };
+  userGroupSchema.methods.deleteImage = function(callback) {
+    return this.updateImage(null, callback);
+  };
 
-  // グループ公開情報のフィルター
-  userGroupSchema.statics.filterToPublicFields = function(userGroup) {
-    debug('UserGroup is', typeof userGroup, userGroup);
-    if (typeof userGroup !== 'object' || !userGroup._id) {
-      return userGroup;
-    }
-
-    var filteredGroup = {};
-    var fields = USER_GROUP_PUBLIC_FIELDS.split(' ');
-    for (var i = 0; i < fields.length; i++) {
-      var key = fields[i];
-      if (userGroup[key]) {
-        filteredGroup[key] = userGroup[key];
-      }
-    }
+  // // グループ公開情報のフィルター
+  // userGroupSchema.statics.filterToPublicFields = function(userGroup) {
+  //   debug('UserGroup is', typeof userGroup, userGroup);
+  //   if (typeof userGroup !== 'object' || !userGroup._id) {
+  //     return userGroup;
+  //   }
+
+  //   var filteredGroup = {};
+  //   var fields = USER_GROUP_PUBLIC_FIELDS.split(' ');
+  //   for (var i = 0; i < fields.length; i++) {
+  //     var key = fields[i];
+  //     if (userGroup[key]) {
+  //       filteredGroup[key] = userGroup[key];
+  //     }
+  //   }
 
-    return filteredGroup;
-  };
+  //   return filteredGroup;
+  // };
 
   // TBD: グループ検索
   // userGroupSchema.statics.findGroups = function(options, callback) {
@@ -70,16 +70,15 @@ module.exports = function(crowi) {
     debug('NoErrorOccured');
 
     var UserGroup = this;
-    var option = option || {}
-      , sort = option.sort || {createdAt: -1}
-      , fields = option.fields || USER_GROUP_PUBLIC_FIELDS
-      ;
+    // var option = option || {}
+    //   , sort = option.sort || {createdAt: -1}
+    //   , fields = option.fields || USER_GROUP_PUBLIC_FIELDS
+    //   ;
 
+    console.log('');
     return new Promise(function(resolve, reject) {
       UserGroup
         .find()
-        .select(fields)
-        .sort(sort)
         .exec(function (err, userGroupData) {
           if (err) {
             return reject(err);
@@ -117,8 +116,7 @@ module.exports = function(crowi) {
   userGroupSchema.statics.findUserGroupsWithPagination = function(options, callback) {
     var sort = options.sort || {name: 1, createdAt: 1};
 
-    // return callback(err, null);
-    this.paginate({ 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);
@@ -143,17 +141,17 @@ module.exports = function(crowi) {
   // };
 
   // TBD: 登録可能グループ名確認
-  // userGroupSchema.statics.isRegisterableName = function(name, callback) {
-  //   var UserGroup = this;
-  //   var userGroupnameUsable = true;
+  userGroupSchema.statics.isRegisterableName = function(name, callback) {
+    var UserGroup = this;
+    var userGroupnameUsable = true;
 
-  //   this.findOne({name: name}, function (err, userGroupData) {
-  //     if (userGroupData) {
-  //       userGroupnameUsable = false;
-  //     }
-  //     return callback(userGroupnameUsable);
-  //   });
-  // };
+    this.findOne({name: name}, function (err, userGroupData) {
+      if (userGroupData) {
+        userGroupnameUsable = false;
+      }
+      return callback(userGroupnameUsable);
+    });
+  };
 
   // TBD: グループの完全削除
   // userGroupSchema.statics.removeCompletelyById = function(id, callback) {
@@ -189,14 +187,14 @@ module.exports = function(crowi) {
   };
 
   // TBD: グループ画像パスの生成
-  // userGroupSchema.statics.createGroupPictureFilePath = function(userGroup, name) {
-  //   var ext = '.' + name.match(/(.*)(?:\.([^.]+$))/)[2];
+  userGroupSchema.statics.createGroupPictureFilePath = function(userGroup, name) {
+    var ext = '.' + name.match(/(.*)(?:\.([^.]+$))/)[2];
 
-  //   return 'userGroup/' + userGroup._id + ext;
-  // };
+    return 'userGroup/' + userGroup._id + ext;
+  };
 
 
-  userGroupSchema.statics.USER_GROUP_PUBLIC_FIELDS = USER_GROUP_PUBLIC_FIELDS;
+  // userGroupSchema.statics.USER_GROUP_PUBLIC_FIELDS = USER_GROUP_PUBLIC_FIELDS;
   userGroupSchema.statics.PAGE_ITEMS         = PAGE_ITEMS;
 
   return mongoose.model('UserGroup', userGroupSchema);

+ 78 - 18
lib/routes/admin.js

@@ -478,7 +478,6 @@ module.exports = function(crowi, app) {
 
     UserGroup.findUserGroupsWithPagination({ page: page }, function (err, result) {
       const pager = createPager(result.total, result.limit, result.page, result.pages, MAX_PAGE_LIST);
-
       return res.render('admin/user-groups', {
         userGroups: result.docs,
         pager: pager
@@ -486,23 +485,84 @@ module.exports = function(crowi, app) {
     });
   };
 
-  // actions.userGroup.create = function (req, res) {
-  //   var form = req.form.createGroupForm;
-  //   // var toSendEmail = form.sendEmail || false;
-  //   // if (req.form.isValid) {
-  //     User.createUsersByInvitation(form.userGroupName, function (err, newUserGroup) {
-  //       if (err) {
-  //         req.flash('errorMessage', req.form.errors.join('\n'));
-  //       } else {
-  //         req.flash('createdUserGroup', newUserGroup);
-  //       }
-  //       return res.redirect('/admin/user_groups');
-  //     });
-  //   // } else {
-  //   //   req.flash('errorMessage', req.form.errors.join('\n'));
-  //   //   return res.redirect('/admin/user_groups');
-  //   // }
-  // };
+  actions.userGroup.create = function (req, res) {
+    var form = req.form.createGroupForm;
+    if (req.form.isValid) {
+      UserGroup.isRegisterableName(form.userGroupName, function (registerable){
+        if (registerable) {
+          UserGroup.createGroupByName(form.userGroupName, function (err, newUserGroup) {
+            if (err) {
+              req.flash('errorMessage', req.form.errors.join('\n'));
+            } else {
+              req.flash('successMessage', newUserGroup.name)
+              req.flash('createdUserGroup', newUserGroup);
+            }
+            return res.redirect('/admin/user-groups');
+          });
+        }
+        else {
+          req.flash('errorMessage', '同じグループ名が既に存在します。');
+          debug('userGroupName', form.userGroupName);
+          return res.redirect('/admin/user-groups');
+        }
+      });
+    } else {
+      req.flash('errorMessage', req.form.errors.join('\n'));
+      return res.redirect('/admin/user-groups');
+    }
+  };
+
+  actions.userGroup.uploadGroupPicture = function (req, res) {
+    var fileUploader = require('../util/fileUploader')(crowi, app);
+    //var storagePlugin = new pluginService('storage');
+    //var storage = require('../service/storage').StorageService(config);
+
+    var tmpFile = req.file || null;
+    if (!tmpFile) {
+      return res.json({
+        'status': false,
+        'message': 'File type error.'
+      });
+    }
+
+    var tmpPath = tmpFile.path;
+    var filePath = User.createUserPictureFilePath(req.user, tmpFile.filename + tmpFile.originalname);
+    var acceptableFileType = /image\/.+/;
+
+    if (!tmpFile.mimetype.match(acceptableFileType)) {
+      return res.json({
+        'status': false,
+        'message': 'File type error. Only image files is allowed to set as user picture.',
+      });
+    }
+
+    var tmpFileStream = fs.createReadStream(tmpPath, { flags: 'r', encoding: null, fd: null, mode: '0666', autoClose: true });
+
+    fileUploader.uploadFile(filePath, tmpFile.mimetype, tmpFileStream, {})
+      .then(function (data) {
+        var imageUrl = fileUploader.generateUrl(filePath);
+        req.userGroup.updateImage(imageUrl, function (err, data) {
+          fs.unlink(tmpPath, function (err) {
+            if (err) {
+              debug('Error while deleting tmp file.', err);
+            }
+
+            return res.json({
+              'status': true,
+              'url': imageUrl,
+              'message': '',
+            });
+          });
+        });
+      }).catch(function (err) {
+        debug('Uploading error', err);
+
+        return res.json({
+          'status': false,
+          'message': 'Error while uploading to ',
+        });
+      });
+  };
 
   actions.api = {};
   actions.api.appSetting = function(req, res) {

+ 2 - 2
lib/routes/index.js

@@ -100,9 +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
+  // user-groups admin
   app.get('/admin/user-groups'          , loginRequired(crowi, app), middleware.adminRequired(), admin.userGroup.index);
-  // app.post('/admin/user-groups/create'  , form.admin.userGroupCreate, loginRequired(crowi, app), middleware.adminRequired(), csrf, admin.userGroup.create);
+  app.post('/admin/user-group/create'  , form.admin.userGroupCreate, loginRequired(crowi, app), middleware.adminRequired(), csrf, admin.userGroup.create);
 
   app.get('/me'                       , loginRequired(crowi, app) , me.index);
   app.get('/me/password'              , loginRequired(crowi, app) , me.password);

+ 6 - 6
lib/views/admin/user-groups.html

@@ -35,7 +35,7 @@
       <p>
         <button  data-toggle="collapse" class="btn btn-default" href="#createGroupForm">新規グループの作成</button>
       </p>
-      <form role="form" action="/admin/group/create" method="post">
+      <form role="form" action="/admin/user-group/create" method="post">
         <div id="createGroupForm" class="collapse">
           <div class="form-group">
             <label for="createGroupForm[userGroupName]">グループ名</label>
@@ -46,8 +46,8 @@
         <input type="hidden" name="_csrf" value="{{ csrf() }}">
       </form>
 
-      {% set createdGroup = req.flash('createdGroup') %}
-      {% if createdGroup.length %}
+      {% set createdUserGroup = req.flash('createdUserGroup') %}
+      {% if createdUserGroup.length %}
       <div class="modal fade in" id="createdGroupModal">
         <div class="modal-dialog">
           <div class="modal-content">
@@ -59,10 +59,10 @@
 
             <div class="modal-body">
               <p>
-                作成したにユーザを追加してください
+                作成したグループにユーザを追加してください
               </p>
 
-              <pre>{% for cGroup in createdGroup %}{{ cGroup.name }}<br>{% endfor %}</pre>
+              <pre>{{ createdUserGroup.name }}</pre>
             </div>
 
           </div><!-- /.modal-content -->
@@ -108,7 +108,7 @@
         </tbody>
       </table>
 
-      {% include '../widget/pager.html' with {path: "/admin/groups", pager: pager} %}
+      {% include '../widget/pager.html' with {path: "/admin/user-groups", pager: pager} %}
 
     </div>
   </div>