这是我想要实现的目标,但不知怎的,我被困住了,我不确定什么是正确的方法,我找不到任何这种情况的好例子,所以我正在寻求你的帮助。 / p>
每个注册用户都可以向课程" List"添加新对象。创建新项目后,我调用afterSave函数并分配正确的ACL来创建新角色(" membersOf _" + List.id)。接下来,用户可以将新对象添加到类" Items",它将存储List.id作为参考,并且项目的ACL应该从列表继承。列表和项目可以在他们选择的多个用户之间共享。在这种情况下几乎没有问题:
这是我的afterSave for List,正确创建角色并为ACL对象分配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
});
这里是我的项目之前保存以验证用户是否可以实际创建这样的对象,我正在检查他是否可以查询列表,如果他得到> 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)我需要向Item添加相同的ACL,从List对象继承它
我尝试过很多东西,在afterSave for Item中传递ACL,修改beforeSave中的有效负载。许多不同的功能遵循文档和不同的例子,但仍然没有运气。 任何建议都很棒!
答案 0 :(得分:4)
好的,我想我终于搞清楚了。希望这将有助于将来的人。
这是最后的beforeSave和afterSave函数,将用户添加到指定的角色并为Item对象分配相同的ACL
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);
}
});
});