Search code examples
androidparse-platformnosql

Insert mirror object using Parse Cloud


I have a scenario where I need to duplicate an object (after or before saving it to Parse) only changing one field. The problem is, I can't figure out how to find the stop condition when saving this new object and the afterSave callback getting called again and again. My object:

{
        "createdAt": "2015-02-21T23:25:03.525Z",
        "creator": {
            "__type": "Pointer",
            "className": "_User",
            "objectId": "2k9OzzBrPr"
        },
        "date": {
            "__type": "Date",
            "iso": "2015-02-21T22:46:39.048Z"
        },
        "description": "Hdheha",
        "from": {
            "__type": "Pointer",
            "className": "_User",
            "objectId": "Sd9B1XyZVL"
        },
        "has_accepted": false,
        "has_answered": false,
        "objectId": "YQCWRo0j2V",
        "status": 0,
        "to": {
            "__type": "Pointer",
            "className": "_User",
            "objectId": "2k9OzzBrPr"
        },
        "updatedAt": "2015-02-21T23:25:03.525Z",
        "value": 2.3499999046325684
    }

My (try) server code:

function saveMirrorDebit(request) {
    var toUser = request.object.get("to");
    var fromUser = request.object.get("from");
    var invertedDebit = request.object;

    var Debit = Parse.Object.extend("Debit");
    var query = new Parse.Query(Debit);
    query.equalTo("parent_debit", {
        __type : "Pointer",
        className : "Debit",
        objectId : invertedDebit.id
    });

    query.find({
        success : function (debit) {
            if (debit) {
                console.log('debito nao nulo');
            } else {
                console.log('debito nulo, criando o espelho invertido');

                var newDebit = new Debit();

                newDebit.set("creator", invertedDebit.get("creator"));
                newDebit.set("from", toUser);
                newDebit.set("to", fromUser);
                newDebit.set("value", -invertedDebit.get("value"));
                newDebit.set("parent_debit", {
                    __type : "Pointer",
                    className : "Debit",
                    objectId : invertedDebit.id
                });

                newDebit.save(null);
            }
        },
        error : function (error) {
            console.log(error);
        }
    });
}

Which is called on afterSave:

Parse.Cloud.afterSave("Debit", function (request) {
...
saveMirrorDebit(request);
...
}

How can I approach this ?

Thanks


Solution

  • First, I wouldn't recommend you duplicating any object... What are you trying to achieve?

    Anyhow, in an afterSave, you can achieve what you want. Note that the beforeSave could save you one API call.

    Parse.Cloud.afterSave("Debit", function (request) {
    
        var debit = request.object;
        if (!(debit.has("duplicated"))){
            var Debit = Parse.Object.extend("Debit");
            var duplicated_debit = new Debit();
            duplicated_debit.set("creator", debit.get("creator"));
            duplicated_debit.set("date", debit.get("date"));
            duplicated_debit.set("from", debit.get("from"));
            // repeat as many times as needed, include your "change logic here"
    
            // that's where the magic happens
            duplicated_debit.set("duplicated",true);
            debit.set("duplicated",true);
            Parse.Object.saveAll([duplicated_debit,debit]);
        }
    }