Adding an item to the cart and sending an updated quote (Java)
In this use case, the user wants to add an item to his cart. This usually results in the seller blocking that item in his inventory for a limited period of time at af fixed price. Sometimes, the seller may also apply a discount on the total cart value. In some other cases, the seller might even add promotional items to the cart at zero price.
Code snippets
BPP receives protocol select
/*
Example Request JSON:
{
"context": {
"domain": "local_retail",
"country": "IND",
"city": "std:080",
"action": "select",
"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": {
"order": {
"items": [
{
"id": "item_1",
"quantity": {
"count": 1
}
}
]
}
}
}
*/
// BPP Select endpoint
@PostMapping("/bpp/select")
public ResponseEntity select(
@RequestHeader HttpHeaders headers,
@RequestBody SelectRequest request) {
var response = bppApplicationService.select(request, headers);
return ResponseEntity.ok(response);
}
BPP processes the select
public Response select(SelectRequest request, HttpHeaders headers) {
var selectResponse = new OnSelectRequest();
// 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().getOrder();
// Execute business logic here
// Generate the response
selectResponse = generateSelectResponse(selectResult);
//invoke on_select api
return invokeOnSelect(selectResponse, headers);
}
}
BPP generates response
/*
Example Response JSON:
{
"context": {
"domain": "local_retail",
"country": "IND",
"city": "std:080",
"action": "on_select",
"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": {
"order": {
"items": [
{
"id": "item_1",
"price" : {
"currency": "INR",
"value": "40"
},
"quantity": {
"selected": {
"count": 1
}
}
},
{
"id": "item_4",
"price" : {
"currency": "INR",
"value": "60"
},
"quantity": {
"selected": {
"count": 2
}
}
}
],
"quote": {
"price": {
"currency": "INR",
"value": "180"
},
"breakup": [
{
"title": "Brown Bread 400 gm",
"price": {
"currency": "INR",
"value": "40"
}
},
{
"title": "Good Life Toned Milk 1L",
"price": {
"currency": "INR",
"value": "120"
}
}
],
"ttl": "P4D"
}
}
}
}
*/
public OnSelectRequest generateSelectResponse(List selectedResults) {
var selectResult = SelectResponseBuilder.builder.result(selectedResults).build();
// Convert response into protocol object similar to example above
return selectResult;
}
BPP calls protocol on_select
public Response invokeOnSelect(OnSelectRequest selectResponse, HttpHeaders headers) {
if(selectResponse.getError() == null) {
// Call BAP on_select api with the select 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_select,
constructResponseHeaders(),
selectResponse,
OnSelectRequest.class);
return Response.of("ACK", null);
} else {
return Response.of("NACK", null);
}
}