Fetching the latest order with status (Node.js)
In this use case, the user refreshes the order screen to get the latest updates. On the other hand, the seller pushes updates to the application as and when there is a change to the fulfillment status of the order.
Code snippets
Client calls the BAP server to trigger status:
router.post("/local_retail/get_order_status", getOrderStatus);
async function get_order_status({ body }, res) {
try {
// .. Validate the client request before below function
await generateStatusRequest(body)
} catch (error) {
res.status(500).send(httpResponse("NACK", error));
}
};
BAP server generates the protocol request body
// Code to generate the protocol request body i.e. function generateStatusRequest() specified above
async function generateStatusRequest(body) {
/*
Example Request JSON :
{
"context": {
"domain": "nic2004:52110",
"country": "IND",
"city": "std:080",
"action": "status",
"core_version": "0.9.1",
"bap_id": "https://mock_bap.com/",
"bap_uri": "https://mock_bap.com/beckn/",
"bpp_id": "https://mock_bpp.com/",
"bpp_uri": "https://mock_bpp.com/beckn/",
"transaction_id": "1209849124",
"message_id": "123412423423",
"timestamp": "2021-03-23T10:00:40.065Z"
},
"message": {
"order_id": "order_1"
}
}
*/
//The below code generates the above example JSON.
const transactionId = _.get(body, "transactionId");
// Returns the Context including MessageId
const context = createContext(transactionId);
const statusRequestBody = {
context,
message: {
// Construct from the request
}
};
//call protocol status
const response = await callStatus(statusRequestBody);
res
.status(200)
.send({ ...response.data, messageId: context["message_id"] });
}
BAP server calls protocol status to the network
async function callStatus(statusRequestBody) {
// It lookups the registry for BG OR BPP
let uri = lookup();
// Construct Header
const headers = constructAuthHeader(); // Auth Header with digital Signature
return axios({ url: `${uri}/local_retail/status`, method: "POST", headers, data: statusRequestBody });
}
BAP receives protocol on_status
/*
Example Response JSON:
{
"context": {
"domain": "nic2004:52110",
"country": "IND",
"city": "std:080",
"action": "on_status",
"core_version": "0.9.1",
"bap_id": "https://mock_bap.com/",
"bap_uri": "https://mock_bap.com/beckn/",
"bpp_id": "https://mock_bpp.com/",
"bpp_uri": "https://mock_bpp.com/beckn/",
"transaction_id": "1209849124",
"message_id": "12341242343",
"timestamp": "2021-03-23T10:00:40.065Z"
},
"message": {
"order": {
"id": "order_1",
"state": "Picked from Store",
"items":[
{
"id": "item_1",
"quantity": {
"count": 2
}
},
{
"id": "item_2",
"quantity": {
"count": 1
}
},
],
"billing": {
"name": "John Doe",
"address": {
"door": "21A",
"name": "ABC Apartments",
"locality": "HSR Layout",
"city": "Bengaluru",
"state": "Karnataka",
"country": "India",
"area_code": "560102"
},
"email": "[email protected]",
"phone": "+919876543210"
},
"fulfillment": {
"type": "home-delivery",
"tracking": false,
"start": {
"location": {
"id": "koramangala-4th-block-location",
"descriptor": {
"name": "Pooja Stores"
},
"gps": "12.9349377,77.6055586"
},
"time": {
"range": {
"start": "2021-06-15T07:09:30.000Z",
"end": "2021-06-15T07:10:30.000Z"
}
},
"instructions": {
"name": "pick up instructions",
"short_desc": "Provide the order id"
},
"contact": {
"phone": "+919999999999",
"email": "[email protected]"
}
},
"end": {
"location": {
"gps": "12.914028, 77.638698",
"address": {
"door": "21A",
"name": "ABC Apartments",
"locality": "HSR Layout",
"city": "Bengaluru",
"state": "Karnataka",
"country": "India",
"area_code": "560102"
}
},
"time": {
"range": {
"start": "2021-06-15T07:11:36.212Z",
"end": "2021-06-15T07:12:36.212Z"
}
},
"instructions": {
"name": "drop off instructions",
"short_desc": "Leave at door step"
},
"contact": {
"phone": "+919876543210",
"email": "[email protected]"
}
}
},
"quote": {
"price": {
"currency": "INR",
"value": "370"
},
"breakup": [
{
"title": "Red Apples",
"price": {
"currency": "INR",
"value": "180"
}
},
{
"title": "Green Apples Organic",
"price": {
"currency": "INR",
"value": "170"
}
},
{
"title": "Delivery Charges",
"price": {
"currency": "INR",
"value": "20"
}
}
]
},
"payment": {
"uri": "https://api.bpp.com/pay?amt=$640&mode=upi&vpa=bpp@upi",
"tl_method": "http/get",
"params": {
"transaction_id": "transaction_453",
"amount": "640",
"mode": "upi",
"vpa": "bpp@upi"
},
"type": "ON-FULFILLMENT",
"status": "NOT-PAID"
}
}
}
}
*/
// Auth middleware authenticates the digital signature of the incoming request
router.post("/local_retail/on_status", auth, onStatus);
async function onStatus({ body }, res) {
// Save the response to Database
await saveToDb(body);
};
Client polls BAP to get the on_status results
// Endpoint for the client to poll the search data based on the message id
async function getMessageById(req) {
try {
const messageId = _.get(req, "messageId");
// Get the data using message Id
const response = await getData(messageId);
res.status(200).send(httpResponse('ACK', "", response));
} catch(error) {
res.status(500).send(httpResponse("NACK", error));
}
};