Search code examples
javascriptparse-platformrolesparse-cloud-code

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

Solution

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