rashadb
rashadb

Reputation: 2543

Create Parse.com Roles Programmatically

I'm looking to create Parse.com roles programmatically because from what I've gathered you can not create parent/child relationships or roles referencing roles in the data browser. I currently do not have any roles in Parse. When I run the following code I get 400 (Bad Request) in my JS console.

$scope.activateRoles = function(){
            console.log("activating vendor");
            Parse.Cloud.run("activateVendor ", {
                success: function (IDK) {
                    alert("The user roles were activated");
                },
                error: function (error) {
                    alert("The user roles were not activated.", error);
                }
            });
        }()

Parse.Cloud.define("createRoles", function(request, response){
    Parse.Cloud.useMasterKey();
    var admin = new Parse.ACL();
    admin.setPublicReadAccess(false);
    admin.setPublicWriteAccess(false);
    admin.getReadAccess("Uh792HOaqi");
    admin.getWriteAccess("Uh792HOaqi");
    admin.setReadAccess("Uh792HOaqi", true);
    admin.setWriteAccess("Uh792HOaqi", true);

    var adminRole = new Parse.Role("admin", admin);
    adminRole.save();

    var agentRole = new Parse.Role("agent", admin);
    agentRole.getRoles().add(adminRole);
    agentRole.save();

    var vendorRole = new Parse.Role("vendor", admin);
    vendorRole.getRoles().add(adminRole);
    vendorRole.save();
})

Upvotes: 2

Views: 366

Answers (2)

rashadb
rashadb

Reputation: 2543

Got to make sure to call success/error. You also want to watch out for making sure to add users to a role that's already been saved. You also can only add roles to a role if the role your adding has already been saved.

Here's what will work:

Parse.Cloud.define("createRoles", function(request, response){
     Parse.Cloud.useMasterKey();
     var admin = new Parse.ACL();
     var adminRole = new Parse.Role("admin", admin);
     adminRole.save().then(function(adminRoleSaved){
        var promises = [];
        var agentRole = new Parse.Role("agent", admin);
        agentRole.getRoles().add(adminRoleSaved);
        promises.push(agentRole.save());

    var me = new Parse.Query(Parse.User);
    me.get(request.params.id, {
        success: function(me) {
            adminRoleSaved.getUsers().add(me);
            adminRoleSaved.save();
        },
        error: function(error){
        }
    });

    var vendorRole = new Parse.Role("business", admin);
    vendorRole.getRoles().add(adminRoleSaved);
    promises.push(vendorRole.save());

    Parse.Promise.when(promises).then(function() {
        response.success();
    }, function(error) {
        response.error(error);
    });
});
});

Upvotes: 2

Robert Rowntree
Robert Rowntree

Reputation: 6289

cloudcode : add child role to parent ... sample working code but maybe not your best implementation... its parse/backbone/marionette impl.

Parse.Cloud.define("addrole", function(request, response) {
  var roleParent = request.params.parentName;
  var roleChild = request.params.childName.trim();
  var _role , _chrole;
  var _error = {
      };
  var _errorch = {
      };
  var _errorparm = {
      };
  var cst = {
      parent:"parent",
      pid:"pid",
      child:"child"
      };
  if(roleParent == roleChild)response.error(_errorparm);
  var cst1 = "parnt";
  var qp = new Parse.Query(Parse.Role);
  qp.equalTo("name", roleParent);
  var qc = new Parse.Query(Parse.Role);
  qc.equalTo("name", roleChild);
  Parse.Cloud.useMasterKey();
  qp.first().then(function(role) {
     _role = role;
     if (typeof _role === "undefined") {
        return Parse.Promise.error(_error);
     } else {
         cst.parent = _role.get("name");
         cst.pid = _role.get("objectId");
         return qc.first();
    };
   }
).then(function(rolechld) {
      _chrole = rolechld;
      if (typeof _chrole === "undefined") {
        return Parse.Promise.error(_errorch);
     } else {
      cst.child = _chrole.get("name");
      console.log(cst);
            _role.getACL().setRoleReadAccess(_chrole, true);
            _role.getRoles().add(_chrole);
            return _role.save();
        }
}).then(function(hello) {
  response.success(_chrole.toJSON());
}, function(error) {
  response.error(error);
});
});

Upvotes: 1

Related Questions