Sending details of the service of a single-mode mobility service provider (Node.js)

In this use case, the user usually clicks on a mobility service provider to view the service it offers. The mobility service provider, usually returns the details of the mobility service with its fare policy

Search

Code snippets

BPP receives protocol search

/*
Example Request JSON :
{
    "context": {
        "domain": "nic2004:60221",
        "country": "IND",
        "city": "std:080",
        "action": "search",
        "core_version": "0.9.1",
        "bap_id": "https://mock_bap.com/",
        "bap_uri": "https://mock_bap.com/beckn/",
        "transaction_id": "1209849124",
        "message_id": "12341242342",
        "timestamp": "2021-03-23T10:00:40.065Z"
    },
    "message": {
        "intent" : {
            "fulfillment": {
                "start" : {
                    "location" : {
                        "gps" : "12.9349377,77.6055586"
                    }
                },
                "end" : {
                    "location" : {
                        "gps" : "12.4535445,77.9283792"
                    }
                }
            }
        }
    }
}
*/
    // Auth middleware authenticates the digital signature of the incoming request
    router.post('/mobility/search', auth, search);

    function search({ 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"));
            processSearch(headers, body)
        } catch (error) {
            res.status(500).send(httpResponse("NACK", error));
        }
    };

BPP processes the search

   function processSearch(requestHeaders, searchRequestBody) {
        // Execute business logic here
    ​    let searchResponse = {

        }
        generateResponse(requestHeaders, searchResponse)
    }

BPP generates response

    async function generateResponse(requestHeaders, rawResponse){
/*
Example Request JSON :
{
    "context": {
        "domain": "nic2004:60221",
        "country": "IND",
        "city": "std:080",
        "action": "on_search",
        "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": {
        "catalog": {
            "bpp/descriptor": {
                "name": "Big Mobility"
            },
            "bpp/providers": [
                {
                    "id": "yellow-mobility",
                    "descriptor" : {
                        "name": "Yellow Cabs"
                    },
                    "locations": [
                        {
                            "id": "closest-suv-spot",
                            "gps": "12.9349377,77.6055586"
                        },
                        {
                            "id": "closest-sedan-spot",
                            "gps": "12.9349377,77.6055586"
                        },
                        {
                            "id": "closest-sedan-outstation",
                            "gps": "12.9349377,77.6055586"
                        }
                    ],
                    "categories": [
                        {
                            "id": "spot_booking",
                            "descriptor": {
                                "name": "Spot booking"
                            }
                        },
                        {
                            "id": "outstation",
                            "descriptor": {
                                "name": "Outstation"
                            }
                        }
                    ],
                    "items": [
                        {
                            "id": "sedan_spot",
                            "descriptor" : {
                                "name" : "4 seater Sedan",
                                "images" : [
                                    "https://mock_bpp.com/images/sedan.jpg"
                                ]
                            },
                            "category_id": "spot_booking",
                            "location_id": "closest-sedan-spot",
                            "price" : {
                                "currency": "INR",
                                "value": "170"
                            },
                            "time": {
                                "label": "ETA",
                                "duration": "P14M"
                            },
                            "matched": true
                        },
                        {
                            "id": "suv_spot",
                            "descriptor" : {
                                "name" : "6 seater SUV ",
                                "images" : [
                                    "https://mock_bpp.com/images/suv.jpg"
                                ]
                            },
                            "category_id": "spot_booking",
                            "location_id": "closest-suv-spot",
                            "price" : {
                                "currency": "INR",
                                "value": "290"
                            },
                            "time": {
                                "label": "ETA",
                                "duration": "P12M"
                            },
                            "matched": true
                        },
                        {
                            "id": "sedan_outstation",
                            "descriptor" : {
                                "name" : "4 Seater Sedan",
                                "images" : [
                                    "https://mock_bpp.com/images/sedan-out.jpg"
                                ]
                            },
                            "category_id": "outstation",
                            "location_id": "closest-sedan-outstation",
                            "price" : {
                                "currency": "INR",
                                "value": "570"
                            },
                            "time": {
                                "label": "ETA",
                                "duration": "P17M"
                            },
                            "matched": true
                        }
                    ]
                },
                {
                    "id": "red-mobility",
                    "descriptor": {
                        "name": "Cabs 4 All"
                    },
                    "locations": [
                        {
                            "id": "closest-sedan",
                            "gps": "12.9349377,77.6055586"
                        }
                    ],
                    "categories": [
                        {
                            "id": "rental",
                            "descriptor": {
                                "name": "Rental"
                            }
                        }
                    ],
                    "items": [
                        {
                            "id": "sedan_rental",
                            "descriptor" : {
                                "name" : "Sedan 5 hours",
                                "images" : [
                                    "https://mock_bpp.com/images/sedan_rental.jpg"
                                ]
                            },
                            "category_id": "rental",
                            "location_id": "closest-sedan",
                            "price" : {
                                "currency": "INR",
                                "value": "200"
                            },
                            "time": {
                                "label": "ETA",
                                "duration": "P12M"
                            },
                            "matched": true
                        }
                    ]
                }
            ]
        }
    }
}
*/
        //The below code generates the above example JSON.
        let onSearchResponseBody = { }
        //call protocol on_search
        await callOnSearch(requestHeaders, onSearchResponseBody);
    }

BPP calls protocol on_search

    async function callOnSearch(requestHeaders, onSearchResponseBody) {
        // 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}/mobility/on_search`, method: "POST", headers, data: onRatingResponseBody });
    }