I am trying to clean my Parse Cloud Code functions to make them easier to maintain. To do so I tried to use Promises but I can't get rid of errors.
Here is the aim of my code :
- Decrement score of User1
- Push a notification to User2 saying --> User1.name is asking you to : Action
Actual Cloud Code (working) :
Parse.Cloud.useMasterKey();
var action = request.object.get("action");
var from = request.object.get("from");
var to = request.object.get("to");
var reward = request.object.get("reward");
// Query 'from User' to decrement his score
var queryScore = new Parse.Query(Parse.User);
queryScore.get(from.id, {
success: function(score)
{
// Decrement score of 'fromUser'.
var newScore = score.get("score");
newScore -= reward;
score.set("score", newScore);
score.save(null, {
success: function(success)
{
// Score was saved.
// Find devices associated with 'to User'
var queryTo = new Parse.Query(Parse.User);
queryTo.equalTo("objectId", to.id);
var pushQueryTo = new Parse.Query(Parse.Installation);
pushQueryTo.matchesQuery("user", queryTo);
pushQueryTo.first({
success: function(installation)
{
// Device found
// Fetch 'from User' infos
from.fetch({
success: function(User) {
// 'from User' fetched
// Send Push to 'to User'
var first_name = User.get("first_name");
var preferredLanguages = installation.get("preferredLanguages");
var alert = ""
switch (preferredLanguages) {
case "fr":
alert = first_name + " vous demande de : " + action
break;
default:
alert = first_name + " is asking you to : " + action
}
Parse.Push.send({
where: pushQueryTo,
data: {
"alert": alert,
"badge": "Increment",
"content-available": "1",
"type": "actionAsked",
"sound": "default"
}
});
// Everything is done!
response.success();
},
error: function(error) {
// An error occurred.
response.error(error);
}
});
},
error: function(error)
{
// An error occurred.
response.error(error);
}
});
},
error: function(error)
{
// An error occurred.
response.error(error);
}
});
},
error: function(error)
{
// An error occurred.
response.error(error);
}
});
Chain Promises Cloud Code (not working) :
Parse.Cloud.useMasterKey();
var action = request.object.get("action");
var from = request.object.get("from");
var to = request.object.get("to");
var reward = request.object.get("reward");
// Query 'from User' to decrement his score
var queryScore = new Parse.Query(Parse.User);
queryScore.get(from.id).then(function(score) {
// Decrement score of 'fromUser'.
var newScore = score.get("score");
newScore -= reward;
score.set("score", newScore);
return score.save();
}).then(function(result) {
// Score was saved.
// Find devices associated with 'to User'
var queryTo = new Parse.Query(Parse.User);
queryTo.equalTo("objectId", to.id);
var pushQueryTo = new Parse.Query(Parse.Installation);
pushQueryTo.matchesQuery("user", queryTo);
return pushQueryTo.first();
}).then(function(device) {
// Device found
// Fetch 'from User' infos
return from.fetch();
}).then(function(from){
// 'from User' fetched
// Send Push to 'to User'
var first_name = from.get("first_name");
var preferredLanguages = device.get("preferredLanguages");
var alert = ""
switch (preferredLanguages) {
case "fr":
alert = first_name + " vous demande de : " + action
break;
default:
alert = first_name + " is asking you to : " + action
}
Parse.Push.send({
where: pushQueryTo,
data: {
"alert": alert,
"badge": "Increment",
"content-available": "1",
"type": "actionAsked",
"sound": "default"
}
});
// Everything is done!
response.success();
},function(error) {
// An error occurred.
response.error(error);
});
The error I get :
Apparently my error is concerning the "device" variable.