Receiving the rating of the the delivery of an order with feedback (Java)
In this use case, the user rates the delivery of a fulfilled order. The rating is usually between 1 to 5. The delivery service sometimes asks for a reason why the user has provided a particular rating.
Code snippets
BPP receives protocol rating
/*
Example Request JSON:
{
"context": {
"domain": "local_retail",
"country": "IND",
"city": "std:080",
"action": "rating",
"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-06-23T08:18:49.303Z"
},
"message": {
"id": "fulfillment_1",
"value": 5
}
}
*/
// BPP Rating Endpoint
@PostMapping("/bpp/rating")
public ResponseEntity rating(
@RequestHeader HttpHeaders headers,
@RequestBody RatingRequest request) {
var response = bppApplicationService.rating(request, headers);
return ResponseEntity.ok(response);
}
BPP processes the rating
public Response rating(RatingRequest request, HttpHeaders headers) {
var onRatingRequest = new OnRatingRequest();
// Validate the headers
var isHeadersValid = validateHeaders(headers);
// Construct and return error
if (!isHeadersValid) return null;
// Rate the given order
var rateOrder = request.getMessage().getId();
// Execute business logic here
// Generate the response
onRatingRequest = rateDelivery(rateOrder);
//invoke on_rate api
return invokeOnRating(onRatingRequest, headers);
}
}
BPP generates response
/*
Example Response JSON:
{
"context": {
"domain": "local_retail",
"country": "IND",
"city": "std:080",
"action": "on_rating",
"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-06-29T10:52:01.620Z"
},
"message": {
"feedback": {
"id": "b9e92323-5ff7-4e1f-be43-24e87362b89f",
"descriptor": "https://feedback.bpp.com/provider/pooja-stores/2839",
"parent_id": "fulfillment_1"
}
}
}
*/
public OnRatingRequest rateDelivery(OrderRating orderRating) {
var ratingResult = RatingResponseBuilder.builder.result(orderRating).build();
// Convert response into protocol object similar to example above
return ratingResult;
}
BPP calls protocol on_rating
public Response invokeOnRating(OnRatingRequest ratingResponse, HttpHeaders headers) {
if(ratingResponse.getError() == null) {
// Call BAP on_rating api with the order response
// Call to look up function which returns the the public key and BAP Endpoint to be called
var url = lookUp(headers);
// Call BAP on_rating api with the rating order object
var response = apiClient.post(url[0] + Context.ActionEnum.on_rating,
constructResponseHeaders(),
ratingResponse,
OnRatingRequest.class);
return Response.of("ACK", null);
} else {
return Response.of("NACK", null);
}
}