Receiving a search intent based on product name and sending list of pharmacies that sell matching items (Java)
In this use case, the user types the name of a pharmaceutical product on a search bar and expects a list of stores that sell the items matching his search. This sort of result appears in the case of retail aggregator BPPs that have onboarded multiple pharmacys on their platform
Code snippets
BPP receives protocol search
/*
Example Request JSON:
{
"context": {
"domain": "nic2004:52311",
"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": {
"item": {
"descriptor": {
"name": "Antibiotics"
}
},
"fulfillment": {
"end": {
"location": {
"gps": "12.4535445,77.9283792"
}
}
}
}
}
}
*/
// BPP Search endpoint
@PostMapping("/bpp/search")
public ResponseEntity search(
@RequestHeader HttpHeaders headers,
@RequestBody SearchRequest request) {
var response = bppApplicationService.search(request, headers);
return ResponseEntity.ok(response);
}
BPP processes the search
public Response search(SearchRequest request, HttpHeaders headers) {
var searchResponse = new OnSearchRequest();
// Validate the headers
var isHeadersValid = validateHeaders(headers);
// Construct and return error
if (!isHeadersValid) return null;
// Fetch the data based on the request
var requestIntent = request.getMessage().getIntent();
// Execute business logic here
// Generate the response
searchResponse = generateSearchResponse();
//invoke on_search api
return invokeOnSearch(searchResponse, headers);
}
}
BPP generates response
/*
Example Response JSON:
{
"context": {
"domain": "nic2004:52311",
"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": "Pharma BPP"
},
"bpp/providers": [
{
"id": "abc_medicines",
"descriptor": {
"name": "ABC Medicines"
},
"locations": [
{
"id": "abc_medicines_koramangala",
"gps": "12.9349377,77.6055586"
}
]
},
{
"id": "good_health",
"descriptor": {
"name": "Good Health Pharmacy"
},
"locations": [
{
"id": "good_health_koramangala",
"gps": "12.9349406,77.6208795"
}
]
},
{
"id": "medhealth_pharmacy",
"descriptor": {
"name": "MedHealth Pharmacy"
},
"locations": [
{
"id": "medhealth_pharmacy_koramangala"
}
]
}
]
}
}
}
*/
public OnSearchRequest generateSearchResponse(List searchResult) {
var searchResult = SearchResponseBuilder.builder.result(searchResult).build();
// Convert response into protocol object similar to example above
return searchResult;
}
BPP calls protocol on_search
public Response invokeOnSearch(OnSearchRequest searchResponse, HttpHeaders headers) {
if(searchResponse.getError() == null) {
// Call BAP on_search api with the search response
var url = lookUp(headers);
var response = apiClient.post(url[0] + Context.ActionEnum.on_search,
constructResponseHeaders(),
searchResponse,
OnSearchRequest.class);
return Response.of("ACK", null);
} else {
return Response.of("NACK", null);
}
}