I have learned promise chaining with error handling to my satisfaction as per below first code section. But I am unable to get the following principle working with my Parse Cloud Code. My Cloud code works well but I have monster functions I need to refactor and organize.
My goal here
Is to have smaller cloud functions I can call without repeating code, as such, I want to have a function to trip an error if a user already is part of a group Parse.Role, otherwise I will add user to Role. Of course if error trips I want to stop the rest of the execution.
Please see second code snippets. I would appreciate some professional input.
function addOne(number) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(number += 1);
}, 1000);
});
}
/// Throws error unless number is 5
var test = addOne(5);
test.then(function(currentValue) {
currentValue ++;
if (currentValue > 7) {
return Promise.reject(Error("Initial value too high"));
} else {
return Promise.resolve(currentValue);
}
})
.then(function(value) {
value -= 2;
if (value < 5) {
return Promise.reject(Error("Initial value too low"));
} else {
return Promise.resolve(value);
}
})
.then(function(finalValue) {
finalValue ++;
if (finalValue != 6) {
return Promise.reject(Error("Not the sweet spot"));
} else {
console.log("You choose RIGHT!" + String(Promise.resolve("TEST")));
}
});
/// THIS IS ONE VERSION - NOT WORKING PROPERLY
/// Check if user is part of group
Parse.Cloud.define("mmDoesUserHaveGroup", async function(request) {
let userID = request.params.user;
// Search user class by user id parameter
let userQuery = await new Parse.Query(Parse.User).equalTo('objectId', userID).find({useMasterKey: true});
let userObject = userQuery[0];
// Check for user in all Roles
const query = await new Parse.Query(Parse.Role).equalTo('users', userObject).find({ useMasterKey: true })
.then(function() {
if (query.length != 0) {
return Promise.reject(Error('User is part of group already'));
} else {
return Promise.resolve();
}
});
});
Parse.Cloud.define("ccCreateGroup", async function(request) {
let userID = request.user.id;
const doesUserHaveGroup = Parse.Cloud.run("mmDoesUserHaveGroup", {user: userID});
doesUserHaveGroup
.then(function() {
return Promise.resolve("Create group action next");
})
.catch(error => Error(error.message));
});
/// ANOTHER VERSION - NOT WORKING EITHER
/// Returns false if user is not part of group or does not own group else error
Parse.Cloud.define("mmDoesUserHaveGroup", async function(request) {
let userID = request.params.user;
// Search user class by user id parameter
let userQuery = await new Parse.Query(Parse.User).equalTo('objectId', userID).find({useMasterKey: true});
let userObject = userQuery[0];
// Check for user in all Roles
const query = await new Parse.Query(Parse.Role).equalTo('users', userObject).find({ useMasterKey: true })
.then(function() {
if (query.length != 0) {
return true;
} else {
return false;
}
});
});
Parse.Cloud.define("ccCreateGroup", async function(request) {
let userID = request.user.id;
const doesUserHaveGroup = Parse.Cloud.run("mmDoesUserHaveGroup", {user: userID});
doesUserHaveGroup
.then(function(groupStatus) {
if (groupStatus) {
return Promise.reject(Error("User already has group"));
} else {
return Promise.resolve("Create group action next");
}
});
});