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.

Select

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);
        }
    }