Sending details of the service of a single-mode mobility service provider (Java)

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"
                    }
                }
            }
        }
    }
}
*/
    // 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(searchResult);

        //invoke on_search api
        return invokeOnSearch(searchResponse, headers);
    }
}

BPP generates response

/*
Example Response 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
                        }
                    ]
                }
            ]
        }
    }
}
*/
    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

            // Call to look up function which returns the the public key and BAP/BG Endpoint to be called 
            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);
        }
    }