Adding an offer the cart and sending a discounted quote (Java)

In this use case, the user applies an offer to a cart to avail a discount on a particular item or the total cart value. This offer is usually entered by the user as a code that when added, requests the seller to update the quote. Sometimes, the code may be used to avail additional services like free shipping, free packaging etc

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": {
            "offers": [
                {
                    "id": "offer_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
                        }
                    }
                }
            ],
            "offers": [
                {
                    "id": "offer_1"
                }
            ],
            "quote": {
                "price": {
                    "currency": "INR",
                    "value": "110"
                },
                "breakup": [
                    {
                        "title": "Brown Bread 400 gm",
                        "price": {
                            "currency": "INR",
                            "value": "40"
                        }
                    },
                    {
                        "title": "Good Life Toned Milk 1L",
                        "price": {
                            "currency": "INR",
                            "value": "120"
                        }
                    },
                    {
                        "title": "50 rupees off",
                        "price": {
                            "currency": "INR",
                            "value": "-50"
                        }
                    }
                ],
                "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);
        }
    }