Sending tracking information of an order (Node.js)

In this use case, the user usually clicks on "Track Order" or sometimes, the application automatically renders the tracking screen as part of the order screen. Here the seller usually sends a tracking link to the tracking page of the order.

Track

Code snippets

BPP receives protocol track

/*
Example Request JSON:
{
    "context": {
        "domain": "nic2004:52110",
        "country": "IND",
        "city": "std:080",
        "action": "track",
        "core_version": "0.9.1",
        "bap_id": "https://mock_bap.com/",
        "bap_uri": "https://mock_bap.com/beckn/",
        "bpp_id": "https://mock_bpp.com/",
        "bpp_uri": "https://mock_bpp.com/beckn/",
        "transaction_id": "1209849124",
        "message_id": "12341242347",
        "timestamp": "2021-03-23T10:00:40.065Z"
    },
    "message": {
        "order_id": "order_1",
        "callback_url": "https://mock_bap.com/order_track?orderId=order_1"
    }
}
*/
    // Auth middleware authenticates the digital signature of the incoming request
    router.post('/local_retail/status', auth, track);

    function track({ headers, body }, res) {
        try {
            const message = _.get(body, "message");
            const context = _.get(body, "context");
            if (!context) {
                return res.status(400).send(httpResponse("NACK", "Missing Context"));
            }
            if (!message) {
                return res.status(400).send(httpResponse("NACK", "Missing Message"));
            }
            // ... Returns the ack immediately and continue the processing after validation
            res.status(200).send(httpResponse("ACK"));
            processStatus(headers, body)
        } catch (error) {
            res.status(500).send(httpResponse("NACK", error));
        }
    };

BPP processes the track

    function processStatus(requestHeaders, trackRequestBody) {
        // Execute business logic here
        let statusResponse = {}
        generateResponse(requestHeaders, statusResponse)
    }

BPP generates response

    function generateResponse(requestHeaders, rawResponse){

/*
Example Request JSON :
{
    "context": {
        "domain": "nic2004:52110",
        "country": "IND",
        "city": "std:080",
        "action": "on_track",
        "core_version": "0.9.1",
        "bap_id": "https://mock_bap.com/",
        "bap_uri": "https://mock_bap.com/beckn/",
        "bpp_id": "https://mock_bpp.com/",
        "bpp_uri": "https://mock_bpp.com/beckn/",
        "transaction_id": "1209849124",
        "message_id": "12341242343",
        "timestamp": "2021-03-23T10:00:40.065Z"
    },
    "message": {
        "tracking": {
            "tl_method": "http/get",
            "url": "https://track.mock_bpp.com?order_id=order_1",
            "status": "active"
        }
    }
}
*/
        //The below code generates the above example JSON.
        let onTrackResponseBody = {

        }
        //call protocol on_track
        await callOnTrack(requestHeaders, onTrackResponseBody);
    }

BPP calls protocol on_track

    function callOnTrack(requestHeaders, onTrackResponseBody) {
        // Take the subscriber Id from the header and calls the registry to get the url. If already cached it need not to call again
        const uri = await lookup(requestHeaders);
        // Construct Header
        const headers = constructAuthHeader(); // Auth Header with digital Signature
        return axios({ url: `${uri}/local_retail/on_track`, method: "POST", headers, data: onTrackResponseBody })
    }