2014-11-22 2 views
2

다음은 내가 달성하려고하는 것입니다.하지만 어찌 되었든 나는 갇혀 있고 적절한 접근 방식이 확실하지 않습니다. 그런 경우의 좋은 예를 찾을 수 없으므로 당신의 도움을 구하고 있습니다.parse.com 상속 된 ACL + 역할 - afterSave 또는 beforeSave, 까다로운 시나리오

등록 된 각 사용자는 클래스 "목록"에 새 개체를 추가 할 수 있습니다. 새 항목이 만들어지면 afterSave 함수를 호출하고 새 역할을 만드는 적절한 ACL ("membersOf_"+ List.id)을 할당합니다. 그런 다음 사용자는 List.id를 참조로 저장하고 items에 대한 ACL을 list에서 상속해야하는 "Items"클래스에 새 객체를 추가 할 수 있습니다. 목록 및 항목은 원하는 여러 사용자가 공유 할 수 있습니다. 이러한 경우에 몇 가지 문제가 있습니다

  • 새 목록을 만들 때, 나는 새로운 역할을 작성하고 제작자를 할당하고 만든 목록에 같은 역할을 추가 할 필요가
  • 새 항목을 만들 때, 나는 목록을 통과해야 .id를 페이로드로 사용하고 현재 사용자가 권한 목록에 적절한 권한이 있는지 먼저 확인하여 해당 항목을 만들면 클라우드 코드로 확인합니다.
  • 권한 확인이 정상이면이 항목에 동일한 ACL을 부여해야합니다. 목록에 저장하고 있습니다.

여기 내 afterSa가 있습니다. List에 대해 제대로 역할을 만들고 List 객체에 ACL을 할당합니다. (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입니다> 이 목록에 대한 결과는 그가이 목록에 할당 된 항목을 추가해도 괜찮음을 의미합니다. (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 에서 만든 새 역할에 대한 사용자 (창조자)를 추가 할 필요가 - 내가 항목에 동일한 ACL을 추가해야합니다 (2) 목록 객체

I에서 상속 beforeSave에서 페이로드를 수정하여 Item for afterSave에 ACL을 전달하여 여러 가지를 시도했습니다. 문서화와 예제가 다른 많은 기능이 있지만 운이 아직 없습니다. 조언이 정말 좋을 것입니다!

답변

4

좋아, 나는 마침내 그것을 알아 냈다고 생각해. 바라기를 이것은 미래에 누군가를 도울 것입니다. 여기

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 지정된 역할에 사용자를 추가하고 아이템 객체에 동일한 ACL 할당 최종를 BeforeSave 및 afterSave 함수이며, 다른 방법은 VAR의 ACL = list.getACL()를 호출하는 것; itemData.setACL (acl); ' – matus

관련 문제