Sending the latest status of an ongoing consultation (Java)
In this use case, the user wants to get the latest status of an ongoing consultation. It could be getting the status of a test, or getting an update about the doctor’s availability.
Code snippets
BPP receives protocol status
/*
Example Request JSON:
{
"context": {
"domain": "nic2004:85121",
"country": "IND",
"city": "std:080",
"action": "status",
"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_id": "order_1"
}
}
*/
// BPP Status Endpoint
@PostMapping("/bpp/status")
public ResponseEntity status(
@RequestHeader HttpHeaders headers,
@RequestBody StatusRequest request) {
var response = bppApplicationService.status(request, headers);
return ResponseEntity.ok(response);
}
BPP processes the status
public Response status(StatusRequest request, HttpHeaders headers) {
var onStatusRequest = new OnStatusRequest();
// Validate the headers
var isHeadersValid = validateHeaders(headers);
// Construct and return error
if (!isHeadersValid) return null;
// Get the latest consultation status
var orderId = request.getMessage().getOrderId();
// Execute business logic here
// Generate the response
onStatusRequest = generateStatusResponse(orderId);
//invoke on_status api
return invokeOnStatus(onStatusRequest, headers);
}
}
BPP generates response
/*
Example Response JSON:
{
"context": {
"domain": "nic2004:85121",
"country": "IND",
"city": "std:080",
"action": "on_status",
"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": {
"id": "order_1",
"state": "Time slot blocked",
"items": [
{
"id": "dr_veena_slot_1",
"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": "IN-PERSON",
"end": {
"location": {
"id": "good-health-koramangala",
"gps": "12.9349377,77.6055586"
},
"time": {
"range": {
"start": "2021-08-11T04:30:00.000Z",
"end": "2021-08-11T05:30:00.000Z"
}
},
"contact": {
"phone": "+919876543210",
"email": "[email protected]"
}
},
"agent": {
"name": "Dr. Veena H",
"dob": "1989-08-12",
"gender": "Female",
"tags": {
"doctor_registration_no": "12345"
},
"phone": "+919876543210",
"email": "[email protected]"
},
"customer": {
"person": {
"name": "Remya C",
"dob": "1989-08-12",
"gender": "Female"
},
"contact": {
"phone": "+919898987676",
"email": "[email protected]"
}
}
},
"quote": {
"price": {
"currency": "INR",
"value": "1100"
},
"breakup": [
{
"title": "Consultation Charges",
"price": {
"currency": "INR",
"value": "1000"
}
},
{
"title": "Service Charge",
"price": {
"currency": "INR",
"value": "100"
}
}
],
"ttl": "P1H"
},
"payment": {
"uri": "https://api.bpp.com/pay?amt=$amount&txn_id=ksh87yriuro34iyr3p4&mode=upi&vpa=bpp@upi",
"tl_method": "http/get",
"params": {
"transaction_id": "ksh87yriuro34iyr3p4",
"amount": "1100",
"mode": "upi",
"vpa": "bpp@upi"
},
"type": "ON-FULFILLMENT",
"status": "NOT-PAID"
}
}
}
}
*/
public OnStatusRequest generateStatusResponse(String orderId) {
var statusResult = StatusResponseBuilder.builder.result(orderId).build();
// Convert response into protocol object similar to example above
return statusResult;
}
BPP calls protocol on_status
public Response invokeOnStatus(OnStatusRequest statusResponse, HttpHeaders headers) {
if(statusResponse.getError() == null) {
// Call BAP on_status api with the status 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_status,
constructResponseHeaders(),
statusResponse,
OnStatusRequest.class);
return Response.of("ACK", null);
} else {
return Response.of("NACK", null);
}
}