2014-11-22 8 views
2

Вот чего я пытаюсь достичь, но почему-то я застрял, и я не уверен, что уместно, я не могу найти хороших примеров такого случая, поэтому я Я ищу вашу помощь.parse.com унаследовал ACL + роли - afterSave или beforeSave, сложный сценарий

Каждый зарегистрированный пользователь может добавить новый объект в класс «Список». После создания нового элемента я вызываю функцию afterSave и назначаю правильный ACL, создающий новую роль ("membersOf_" + List.id). Затем пользователь может добавить новый объект в класс «Элементы», который будет хранить List.id в качестве ссылки, а ACL для элемента должен быть унаследован из списка. Списки и элементы могут делиться между несколькими пользователями по своему выбору. Есть несколько проблем, в таком случае:

  • при создании нового списка, нужно создать новую роль и назначить создатель к нему и добавить такую ​​роль в созданный список
  • при создании нового пункта, мне нужно передать список .id как полезную нагрузку и проверять с облачным кодом, если текущий пользователь может создать такой элемент (назначенный указанному списку), сначала проверив, имеет ли он соответствующие разрешения для списка
  • , если проверка доступа в порядке, мне нужно предоставить этому элементу тот же ACL как Список имеет и продолжать с сохранением

Вот мой afterSa ve для List, правильно создавая роль и назначая ACL для объекта List. (1) я пропускаю добавление этой роли пользователя (создатель)

Parse.Cloud.afterSave("List", function(request, response) { 
    var list = request.object; 
    var user = Parse.User.current(); 
    if (list.existed()) { 
     // quit on update, proceed on create 
     return; 
    } 
    var roleName = "membersOf_" + list.id; 
    var listRole = new Parse.Role(roleName, new Parse.ACL(user)); 
    return listRole.save().then(function(listRole) { 
     var acl = new Parse.ACL(); 
     acl.setPublicReadAccess(false); 
     acl.setPublicWriteAccess(false); 
     acl.setReadAccess(listRole, true); 
     acl.setWriteAccess(listRole, true); 
     var itemData = new Parse.Object("List", { 
      ACL: acl 
     }); 
     return itemData.save('objectId', list.id); 
    }); 

    // to do - add user to this role too 
}); 

Вот мой Пункт BeforeSave, чтобы проверить, если пользователь может действительно создать такой объект, я проверяю, если он может запросить таблицу списка, если он получает> 0 результатов для такого списка, что означает, что он будет нормально добавлять объект, назначенный этому списку. (2) Отсутствует наследование ACL

Parse.Cloud.beforeSave("Item", function(request, response) { 
    var item = request.object; 

    var listId = request.object.get("list"); 
    var user = Parse.User.current(); 

    var List = Parse.Object.extend("List"); 
    var query = new Parse.Query(List); 
    query.equalTo("objectId", listId); 

    query.first({ 
     success: function(list) { 
      if (list.id) { 
       response.success(); 
      } 
      else { 
       response.error('No such list or you don\'t have permission to perform this operation.'); 
      } 
     }, 
     error: function(error) { 
      response.error(error); 
     } 
    }); 
}); 

Может кто-нибудь указать мне на правильное решение или помочь решить эту загадку? Я не хватает двух вещей: - (1) Мне нужно, чтобы добавить пользователя (создатель) к новой роли, созданной в afterSave - (2) Мне нужно добавить тот же ACL к пункту, наследуют его от объекта List

I пробовали много вещей, передавая ACL в afterSave для Item, изменяя полезную нагрузку в beforeSave. Множество различных функций после документации и разных примеров, но до сих пор не повезло. Любые советы были бы замечательными!

ответ

4

Хорошо, я думаю, что, наконец, понял. Надеюсь, это поможет кому-то в будущем.

Вот окончательные функции BeforeSave и afterSave добавление пользователя в указанной роли и назначая тот же ACL для объекта Item

Parse.Cloud.afterSave("List", function(request, response) { 
    var list = request.object; 
    var user = Parse.User.current(); 
    if (list.existed()) { 
     // quit on update, proceed on create 
     return; 
    } 
    var roleName = "membersOf_" + list.id; 
    var listRole = new Parse.Role(roleName, new Parse.ACL(user)); 

//+ adding user to role in this line: 
    listRole.relation("users").add(user); 

    return listRole.save().then(function(listRole) { 
     var acl = new Parse.ACL(); 
     acl.setPublicReadAccess(false); 
     acl.setPublicWriteAccess(false); 
     acl.setReadAccess(listRole, true); 
     acl.setWriteAccess(listRole, true); 
     var itemData = new Parse.Object("List", { 
      ACL: acl 
     }); 
     return itemData.save('objectId', list.id); 
    }); 

    // to do - add user to this role too 
}); 


Parse.Cloud.beforeSave("Item", function(request, response) { 
    var item = request.object; 

    var listId = request.object.get("list"); 
    var user = Parse.User.current(); 

// + modifying payload with the same ACL here 
    var acl = new Parse.ACL(); 
    acl.setPublicReadAccess(false); 
    acl.setPublicWriteAccess(false); 
    acl.setRoleWriteAccess("membersOf_" + listId, true); 
    acl.setRoleReadAccess("membersOf_" + listId, true); 
    item.set('ACL', acl); 


    var List = Parse.Object.extend("List"); 
    var query = new Parse.Query(List); 
    query.equalTo("objectId", listId); 

    query.first({ 
     success: function(list) { 
      if (list.id) { 
       response.success(); 
      } 
      else { 
       response.error('No such list or you don\'t have permission to perform this operation.'); 
      } 
     }, 
     error: function(error) { 
      response.error(error); 
     } 
    }); 
}); 
+0

привет @lokers, другой путь был бы назвать «вар = list.getACL ACL(); itemData.setACL (ACL);» – matus