Search by location for consultation options nearby (Node.js)

In this use case, the user simply searches for doctors, clinics and hospitals around his location.

Search

Code snippets

Client calls the BAP server to trigger search:

    router.post("/healthcare_consultation/search_by_location", searchByLocation);

    async function searchByLocation({ body }, res) {
        try {
            //  .. Validate the client request before below function
            await generateSearchRequest(body)
        } catch (error) {
            res.status(500).send(httpResponse("NACK", error));
        }
    };

BAP server generates the protocol request body


    // Code to generate the protocol request body i.e. function generateSearchRequest() specified above
    async function generateSearchRequest(clientRequestBody) {
/*
Example Request JSON :
{
    "context": {
        "domain": "nic2004:85121",
        "country": "IND",
        "city": "std:080",
        "action": "search",
        "core_version": "0.9.2",
        "bap_id": "https://mock_bap.com/",
        "bap_uri": "https://mock_bap.com/beckn/",
        "transaction_id": "1239890342",
        "message_id": "123793824",
        "timestamp": "2021-03-23T10:00:40.065Z"
    },
    "message": {
        "intent": {
            "fulfillment": {
                "end": {
                    "location": {
                        "gps": "12.4535445,77.9283792"
                    }
                }
            }
        }
    }
}
*/
        //The below code generates the above example JSON.
        const transactionId = _.get(body, "transactionId");
        // Returns the Context including MessageId
        const context = createContext(transactionId);
        const searchRequestBody = {
            context,
            message:  {
                intent: {
                    fulfillment: {
                        // Construct from the request
                    },
                }
            }
        };
        //call protocol search
        const response = await callSearch(searchRequestBody);
        res
        .status(200)
        .send({ ...response.data, messageId: context["message_id"] });
    }

BAP server calls protocol search to the network

   async function callSearch(searchRequestBody) {
        // It lookups the registry for BG OR BPP
        let uri = lookup();
        // Construct Header
        const headers = constructAuthHeader(); // Auth Header with digital Signature
        return axios({ url: `${uri}/healthcare_consultation/search`, method: "POST", data: request, headers});
    }

BAP receives protocol on_search

/*
Example Response JSON:
{
    "context": {
        "domain": "nic2004:85121",
        "country": "IND",
        "city": "std:080",
        "action": "on_search",
        "core_version": "0.9.2",
        "bap_id": "https://mock_bap.com/",
        "bap_uri": "https://mock_bap.com/beckn/",
        "transaction_id": "1239890342",
        "message_id": "123793824",
        "timestamp": "2021-03-23T10:00:40.065Z"
    },
    "message": {
        "catalog": {
            "bpp/descriptor": {
                "name": "Clinic Chains BPP"
            },
            "bpp/providers": [
                {
                    "id": "good-health-clinic",
                    "descriptor": {
                        "name": "Good Health Clinic"
                    },
                    "locations": [
                        {
                            "id": "good-health-koramangala",
                            "gps": "12.9349377,77.6055586"
                        }
                    ],
                    "categories": [
                        {
                            "id": "dermatology",
                            "descriptor": {
                                "name": "Dermatology"
                            }
                        },
                        {
                            "id": "family-medicine",
                            "descriptor": {
                                "name": "Family medicine"
                            }
                        }
                    ],
                    "items": [
                        {
                            "id": "dr_veena",
                            "descriptor": {
                                "name": "Dr.Veena in person consultation"
                            },
                            "category_id": "dermatology",
                            "location_id": "good-health-koramangala",
                            "matched": true
                        },
                        {
                            "id": "dr_veena_slot_1",
                            "parent_item_id": "dr_veena",
                            "descriptor": {
                                "name": "Dr.Veena in person morning slot 1"
                            },
                            "time": {
                                "range": {
                                    "start": "2021-08-11T04:30:00.000Z",
                                    "end": "2021-08-11T05:30:00.000Z"
                                }
                            },
                            "price": {
                                "currency": "INR",
                                "value": "1000"
                            }
                        },
                        {
                            "id": "dr_veena_slot_2",
                            "parent_item_id": "dr_veena",
                            "descriptor": {
                                "name": "Dr.Veena in person morning slot 2"
                            },
                            "time": {
                                "range": {
                                    "start": "2021-08-11T05:30:00.000Z",
                                    "end": "2021-08-11T06:30:00.000Z"
                                }
                            },
                            "price": {
                                "currency": "INR",
                                "value": "1000"
                            }
                        },
                        {
                            "id": "dr_tony",
                            "descriptor": {
                                "name": "Dr.Tony online consultation"
                            },
                            "category_id": "family-medicine",
                            "matched": true
                        },
                        {
                            "id": "dr_tony_slot_1",
                            "parent_item_id": "dr_tony",
                            "descriptor": {
                                "name": "Dr.Tony online slot 1"
                            },
                            "time": {
                                "range": {
                                    "start": "2021-08-11T07:30:00.000Z",
                                    "end": "2021-08-11T08:30:00.000Z"
                                }
                            },
                            "price": {
                                "currency": "INR",
                                "value": "1000"
                            }
                        },
                        {
                            "id": "dr_tony_slot_2",
                            "parent_item_id": "dr_tony",
                            "descriptor": {
                                "name": "Dr.Tony online slot 1"
                            },
                            "time": {
                                "range": {
                                    "start": "2021-08-11T08:30:00.000Z",
                                    "end": "2021-08-11T09:30:00.000Z"
                                }
                            },
                            "price": {
                                "currency": "INR",
                                "value": "1000"
                            }
                        }
                    ]
                },
                {
                    "id": "healthy-clinic",
                    "descriptor": {
                        "name": "Healthy Clinic"
                    },
                    "locations": [
                        {
                            "id": "healthy-skin-clinic-koramangala",
                            "gps": "12.9349377,77.6055586"
                        }
                    ],
                    "categories": [
                        {
                            "id": "dermatology",
                            "descriptor": {
                                "name": "Dermatology"
                            }
                        }
                    ],
                    "items": [
                        {
                            "id": "dr_noor",
                            "descriptor": {
                                "name": "Dr.Noor online consultation"
                            },
                            "category_id": "dermatology",
                            "matched": true
                        },
                        {
                            "id": "dr_noor_slot_1",
                            "parent_item_id": "dr_noor",
                            "descriptor": {
                                "name": "Dr.Noor online slot 1"
                            },
                            "time": {
                                "range": {
                                    "start": "2021-08-11T07:30:00.000Z",
                                    "end": "2021-08-11T08:30:00.000Z"
                                }
                            },
                            "price": {
                                "currency": "INR",
                                "value": "1000"
                            }
                        },
                        {
                            "id": "dr_noor_slot_2",
                            "parent_item_id": "dr_noor",
                            "descriptor": {
                                "name": "Dr.Noor online slot 1"
                            },
                            "time": {
                                "range": {
                                    "start": "2021-08-11T08:30:00.000Z",
                                    "end": "2021-08-11T09:30:00.000Z"
                                }
                            },
                            "price": {
                                "currency": "INR",
                                "value": "1000"
                            }
                        }
                    ]
                }
            ]
        }
    }
}
*/
    // Auth middleware authenticates the digital signature of the incoming request
    router.post("/healthcare_consultation/on_search", auth, onSearch);
    async function onSearch({ body }, res) {
        // Save the response to Database
        await saveToDb(body);
    };

Client polls BAP to get the on_search results

    // Endpoint for the client to poll the search data based on the message id
    async function getMessageById(req) {
        try {
            const messageId = _.get(req, "messageId");
            // Get the data using message Id
            const response = await getData(messageId);
            res.status(200).send(httpResponse('ACK', "", response));
        } catch(error) {
            res.status(500).send(httpResponse("NACK", error));
        }
    };