parse.com унаследовал ACL + роли - afterSave или beforeSave, хитрый сценарий

Вот чего я пытаюсь достичь, но почему-то я застрял и не уверен, какой правильный подход, я не могу найти хороших примеров такого случая, поэтому я ищу вашу помощь.

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

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

Вот мой afterSave для списка, правильно создающий роль и назначающий 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) мне нужно добавить тот же ACL к элементу, унаследовать его от объекта списка

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


person lokers    schedule 22.11.2014    source источник


Ответы (1)


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

Вот окончательные функции 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);
        }
    });
});
person lokers    schedule 22.11.2014
comment
привет @lokers, другим способом было бы вызвать 'var acl = list.getACL(); itemData.setACL(acl);' - person matus; 05.01.2015