فهرست منبع

# Feature/196, 198, 199 Grouping users
* Fix page-edit-form (not complete).
* Fix page update logic page-group-relation updatable(not complete).

Tatsuya Ise 8 سال پیش
والد
کامیت
b8533f6dfe
4فایلهای تغییر یافته به همراه62 افزوده شده و 5 حذف شده
  1. 14 0
      lib/models/page-group-relation.js
  2. 28 5
      lib/models/page.js
  3. 15 0
      lib/models/user-group-relation.js
  4. 5 0
      lib/views/_form.html

+ 14 - 0
lib/models/page-group-relation.js

@@ -89,6 +89,20 @@ module.exports = function(crowi) {
     });
   };
 
+  // ページを元に関係性を取得
+  pageGroupRelationSchema.statics.findByPage = function(page) {
+    var PageGroupRelation = this
+
+    PageGroupRelation
+      .findOne({ targetPage: page})
+      .exec(function (err, data) {
+        if (err) {
+          return reject(err);
+        }
+        return resolve(data);
+    });
+  };
+
   // 関係性の生成
   pageGroupRelationSchema.statics.createRelation = function(userGroup, page, callback) {
     var PageGroupRelation = this

+ 28 - 5
lib/models/page.js

@@ -489,7 +489,7 @@ module.exports = function(crowi) {
           return reject(pageNotFoundError);
         }
 
-        if (!pageData.isGrantedFor(userData)) {
+        if (!pageData.isGrantedFor(userData) && !self.isExistsGrantedGroupFor(pageData, userData)) {
           return reject(new Error('Page is not granted for the user')); //PAGE_GRANT_ERROR, null);
         }
 
@@ -792,7 +792,7 @@ module.exports = function(crowi) {
 
         // グループに紐づけられたとき、関係性を生成
         if (provGrant != GRANT_USER_GROUP && grant == GRANT_USER_GROUP) {
-          UserGroupRelation.createRelation(userGroupData, page, function (err, relationData) {
+          PageGroupRelation.createRelation(userGroupData, page, function (err, relationData) {
             if (err) {
               return reject(err);
             }
@@ -805,7 +805,7 @@ module.exports = function(crowi) {
 
   pageSchema.statics.updateGrantUserGroup = function(page, userGroupData) {
     var Page = this
-      , UserGroupRelation = crowi.model('UserGroupRelation');
+      , PageGroupRelation = crowi.model('PageGroupRelation');
 
     return new Promise(function (resolve, reject) {
       page.grant = GRANT_USER_GROUP;
@@ -816,12 +816,13 @@ module.exports = function(crowi) {
           return reject(err);
         }
 
-        UserGroupRelation.createRelation(userGroupData, page, function(err, relationData) {
+        PageGroupRelation.createRelation(userGroupData, page, function(err, relationData) {
+          debug('Page.updateGrant, saved grantedUsers.', err, relationData);
           if (err) {
             return reject(err);
           }
         });
-        return resolve(data);
+        return resolve(relationData);
       });
     });
   }
@@ -1218,6 +1219,28 @@ module.exports = function(crowi) {
     return;
   };
 
+  // 指定ページに紐づくユーザグループに、対象のユーザが含まれるかを確認
+  pageSchema.statics.isExistsGrantedGroupFor = function(pageData, userData) {
+    var PageGroupRelation = crowi.model('PageGroupRelation');
+    var UserGroupRelation = crowi.model('UserGroupRelation');
+
+    return new Promise(function (resolve, reject) {
+      PageGroupRelation.findByPage(pageData)
+      .then(function (pageRelation) {
+        UserGroupRelation.checkIsRelatedUserForGroup(userData, data.relatedGroup)
+        .then(function (checkResult) {
+          return resolve(checkResult);
+        })
+        .catch((err) => {
+          return reject(err);
+        });
+      })
+      .catch((err) => {
+        return reject(err);
+      });
+    });
+  }
+
   /**
    * return path that added slash to the end for specified path
    */

+ 15 - 0
lib/models/user-group-relation.js

@@ -89,6 +89,21 @@ module.exports = function(crowi) {
     });
   };
 
+  // グループとユーザを指定し、関係性が存在するかチェック
+  userGroupRelationSchema.statics.checkIsRelatedUserForGroup = function (userData, userGroup, callback) {
+    var UserGroupRelation = this;
+
+    return new Promise(function (resolve, reject) {
+      UserGroupRelation.count( {relatedGroup: userGroup, relatedUser: userData}, function (err, count) {
+      if (err) {
+        return reject(err);
+      }
+      // isRelated == (1 < count)
+      return resolve((1 < count));
+      });
+    });
+  };
+
   // 関係性の生成
   userGroupRelationSchema.statics.createRelation = function(userGroup, user, callback) {
     var UserGroupRelation = this

+ 5 - 0
lib/views/_form.html

@@ -54,6 +54,11 @@
           {% endfor %}
         </select>
         {% endif %}
+        <select name="pageForm[grantUserGroup]" class="form-control">
+          {% for userGroup in relatedUserGroups %}
+          <option value="{{ userGroup }}"></option>
+          {% endfor %}
+        </select>
         <input type="hidden" id="edit-form-csrf" name="_csrf" value="{{ csrf() }}">
         <input type="submit" class="btn btn-primary" id="edit-form-submit" value="{{ t('Update Page') }}" />
       </div>