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

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

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

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

Вот мой afterSave для 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
});

Вот мой Item перед сохранением, чтобы проверить, может ли пользователь на самом деле создать такой объект, я проверяю, может ли он запросить таблицу List, если он получит>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 в Item, унаследовать его от объекта List

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

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);
        }
    });
});
Другие вопросы по тегам