solarbabies
solarbabies

Reputation: 312

How can I assign multiple roles to one user in Parse?

I've written a bit of Cloud Code which executes after every user is saved. Inside, I would like to add the user to two roles, Alpha and Free, but this code only successfully adds new users to the Alpha role; the Free role has no data in the users table. Is there a way in Parse to assign users multiple roles?

Here is my Cloud Code.

Parse.Cloud.afterSave(Parse.User, function(request, response) {
    Parse.Cloud.useMasterKey(); // grant administrative access to write to roles
    var user = request.object;

    query = new Parse.Query(Parse.Role);
    query.equalTo("name", "Alpha");
    query.first ( {
        success: function(object) {
            object.relation("users").add(user);
            object.save();
            response.success("The user has been authorized.");
        },
        error: function(error) {
            response.error("User authorization failed!");
        }
    });

    query = new Parse.Query(Parse.Role);
    query.equalTo("name", "Free");
    query.first ( {
        success: function(object) {
            object.relation("users").add(user);
            object.save();
            response.success("The user has been authorized.");
        },
        error: function(error) {
            response.error("User authorization failed!");
        }
    });
});

Upvotes: 1

Views: 714

Answers (1)

danh
danh

Reputation: 62676

The problem is sequencing. We need all of the queries and saves to complete before response.success() is called. As it is now, the timing of actions in the code is not deterministic. Clean it up by using the promises returned by the parse sdk...

Parse.Cloud.afterSave(Parse.User, function(request, response) {
    Parse.Cloud.useMasterKey(); // grant administrative access to write to roles
    var user = request.object;
    query = new Parse.Query(Parse.Role);
    query.equalTo("name", "Alpha");
    query.first().then(function(object) {
        object.relation("users").add(user);
        return object.save();
    }).then(function() {
        query = new Parse.Query(Parse.Role);
        query.equalTo("name", "Free");
        return query.first();
    }).then(function(object) {
        object.relation("users").add(user);
        return object.save();
    }).then(function() {
        response.success("The user has been authorized.");
    }, function(error) {
        response.error("error: " + error.message);
    });  
});

Upvotes: 1

Related Questions