Adding an offer the cart and sending a discounted quote (Node.js)

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"
                }
            ]
        }
    }
}
*/
    // Auth middleware authenticates the digital signature of the incoming request
    router.post('/local_retail/select', auth, select);

    function select({ headers, body }, res) {
        try {
            const message = _.get(body, "message");
            const context = _.get(body, "context");
            if (!context) {
                return res.status(400).send(httpResponse("NACK", "Missing Context"));
            }
            if (!message) {
                return res.status(400).send(httpResponse("NACK", "Missing Message"));
            }
            // ... Returns the ack immediately and continue the processing after validation
            res.status(200).send(httpResponse("ACK"));
            processSelect(headers, body)
        } catch (error) {
            res.status(500).send(httpResponse("NACK", error));
        }
    };

BPP processes the search

    function processSelect(requestHeaders, selectRequestBody) {
        // Execute business logic here
        let selectResponse = {}
        generateResponse(requestHeaders, selectResponse)
    }

BPP generates response

    function generateResponse(requestHeaders, rawResponse){
/*
Example Request 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"
            }
        }
    }
}
*/
        let onSelectResponseBody = {

        }
        //call protocol on_rating
        await callOnSelect(requestHeaders, onSelectResponseBody);
    }

BPP calls protocol on_select

    async function callOnSelect(requestHeaders, onSelectResponseBody) {
        // Take the subscriber Id from the header and calls the registry to get the url. If already cached it need not to call again
        const uri = await lookup(requestHeaders);
        // Construct Header
        const headers = constructAuthHeader(); // Auth Header with digital Signature
        return axios({ url: `${uri}/local_retail/on_select`, method: "POST", headers, data: onSelectResponseBody });
    }