Вот чего я пытаюсь достичь, но почему-то я застрял и не уверен, какой правильный подход, я не могу найти хороших примеров такого случая, поэтому я ищу вашу помощь.
Каждый зарегистрированный пользователь может добавить новый объект в класс «Список». Как только новый элемент создан, я вызываю функцию 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. Много разных функций после документации и разных примеров, но все равно не повезло. Любой совет будет потрясающим!