Search code examples
javascriptparse-platformpromiseparse-cloud-code

Parse Cloud code not responding error or success with promises


My Parse cloud code is not responding with an error or success. It just times out, I don't know what I'm doing wrong. It should save multiple values in different tables, and finish with sending a push message to a user.

The push message and user table are adjusted and send, but the street and the ledger objects are not being saved correctly. Also the response is not being called.

I did work in the past (or I was just lucky). Any thought on what I'm doing wrong?

  var buyerId = request.params.buyerid;
  var sellerName = request.params.sellername;
  var streetId = request.params.streetid;
  var amount = request.params.amount;
  var pushMessageTemplate = request.params.pushMessage;

  var log = request ? request.log : console;
  var Streets = Parse.Object.extend('SHStreets');
  var streetQuery = new Parse.Query(Streets);
  streetQuery.equalTo("objectId", streetId);
  streetQuery.first({
    useMasterKey: true,
    success: function (street) {
      var streetName = street.get("name");

      var query = new Parse.Query(Parse.User);
      query.equalTo("objectId", buyerId);
      query.first({
        useMasterKey: true,
        success: function (user) {
          var promises = [];
          var now = new Date();

          var buyerName = user.get("username");
          // Set and save the change
          user.set("balance", user.get("balance") - amount);
          user.set("streets", user.get("streets") + 1);

          street.set("current_owner", user);
          street.set("owned_since", now);
          street.set("for_sale", false);
          street.set("price_bought", amount);

          var acl = new Parse.ACL();
          acl.setPublicReadAccess(true);
          acl.setWriteAccess(user, true);
          street.setACL(acl);

          //update ledger
          var Ledger = Parse.Object.extend("Ledger");
          var ledger = new Ledger();

          ledger.set("type", "buy");
          ledger.set("amount", amount);
          ledger.set('ledger_time', now);
          ledger.set("user", user);
          ledger.set("description", "x");

          promises.push(Parse.Object.saveAll([street, user, ledger], { useMasterKey: true }));

          // Find users with a given email
          var userQuery = new Parse.Query(Parse.User);
          userQuery.equalTo("objectId", user.id);

          var pushQuery = new Parse.Query(Parse.Installation);
          pushQuery.exists("user"); // filter out installations without users
          pushQuery.include('user'); // expand the user pointer
          pushQuery.matchesQuery("user", userQuery);

          // Send push notification to query
          promises.push(Parse.Push.send({
            where: pushQuery, // Set our installation query
            data: {
              alert: _.template(pushMessageTemplate)({
                sellername: sellerName,
                streetname: streetName,
                amount: amount
              })
            }
          }, {
              useMasterKey: true,
          }));

          return Parse.Promise.when(promises).then(function () {
            response.success("success");
          });
        },
        error: function (error) {
          log.error('buy-street error', error.message);
          response.error("Uh oh, buy request success failed." + error.message);
        }
      });
    },
    error: function (error) {
      log.error('buy-street error', error.message);
      response.error("Uh oh, buy request success failed." + error.message);
    }
  });

Solution

  • I was missing a function error for the return of the promises.

     return Parse.Promise.when(promises).then(function () {
        // Set the job's sucess status
        response.success('success');
     },function(error) {
        response.error(error);
     });