2

这是我想要实现的目标,但不知何故我被卡住了,我不确定什么是正确的方法,我找不到这种情况的任何好的例子,所以我正在寻求你的帮助。

每个注册用户都可以将新对象添加到“列表”类。创建新项目后,我调用 afterSave 函数并分配适当的 ACL 创建新角色(“membersOf_”+ List.id)。接下来,用户可以将新对象添加到“Items”类,它将存储 List.id 作为引用,并且项目的 ACL 应该从列表中继承。列表和项目可以在他们选择的多个用户之间共享。在这种情况下几乎没有问题:

  • 创建新列表时,我需要创建新角色并将创建者分配给它并将此类角色添加到创建的列表中
  • 创建新项目时,我需要将 List.id 作为有效负载传递,并使用云代码验证当前用户是否可以创建此类项目(分配给指定列表),方法是首先检查他是否具有对 List 的适当权限
  • 如果权限检查正常,我需要为该项目提供与 List 相同的 ACL 并继续保存

这是我对 List 的 afterSave,正确创建角色并将 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
});

这是我的 Item beforeSave 以验证用户是否真的可以创建这样的对象,我正在检查他是否可以查询 List 表,如果他得到 >0 个这样的 List 结果,这意味着他可以添加分配给这个 List 的 Item。(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 添加到 Item,从 List 对象继承它

我已经尝试了很多事情,在 afterSave 中为 Item 传递 ACL,在 beforeSave 中修改有效负载。文档和不同示例之后的许多不同功能,但仍然没有运气。任何建议都会很棒!

4

1 回答 1

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);
        }
    });
});
于 2014-11-22T11:32:42.323 回答