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);
}
});
});