Adding an item to the cart and sending an updated quote (Node.js)
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
}
}
]
}
}
}
*/
// 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
}
}
}
],
"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"
}
}
}
}
*/
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 });
}