for the review

This commit is contained in:
himanshu
2025-10-28 15:46:31 +05:30
parent 4d501f7b4a
commit 92e71695a5
24 changed files with 331 additions and 284 deletions
@@ -16,9 +16,11 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.billpaymentservice.bbps.dto.MasterApiResponse; import com.billpaymentservice.bbps.dto.MasterApiResponse;
import com.billpaymentservice.bbps.dto.ResponseModel;
import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.billpaymentservice.bbps.dto.request.BillerDetailRequest;
import com.billpaymentservice.bbps.dto.request.ContactMasterRequest; import com.billpaymentservice.bbps.dto.request.ContactMasterRequest;
import com.billpaymentservice.bbps.dto.request.CustomerParamRequest; import com.billpaymentservice.bbps.dto.request.CustomParamRequest;
import com.billpaymentservice.bbps.dto.request.MasterRequest;
import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; import com.billpaymentservice.bbps.dto.request.MerchantRequestModel;
import com.billpaymentservice.bbps.dto.response.BillerDataResponse; import com.billpaymentservice.bbps.dto.response.BillerDataResponse;
import com.billpaymentservice.bbps.dto.response.BillerResponse; import com.billpaymentservice.bbps.dto.response.BillerResponse;
@@ -41,8 +43,7 @@ public class MasterDataController {
} }
/**Get Details of the biller by billId **/ /**Get Details of the biller by billId **/
@PostMapping(value = "/getBillerDetails", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "/getBillerDetails", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<BillerDataResponse> getBillerDetails( public ResponseEntity<ResponseModel> getBillerDetails(@Validated @RequestBody BillerDetailRequest billerDetailRequest) {
@Validated @RequestBody BillerDetailRequest billerDetailRequest) {
log.info("Received biller details request for billerId: {}", billerDetailRequest.getBillerId()); log.info("Received biller details request for billerId: {}", billerDetailRequest.getBillerId());
@@ -50,7 +51,7 @@ public class MasterDataController {
} }
/**Get Master Contact**/ /**Get Master Contact**/
@PostMapping(value = "/getContactMasterResponse", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "/getContactMasterResponse", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ContactMasterResponse> getContactMaster( public ResponseEntity<ResponseModel> getContactMaster(
@Validated @RequestBody ContactMasterRequest contactMasterRequest ) { @Validated @RequestBody ContactMasterRequest contactMasterRequest ) {
return ResponseEntity.ok(masterDataService.getContactMaster(contactMasterRequest)); return ResponseEntity.ok(masterDataService.getContactMaster(contactMasterRequest));
@@ -58,29 +59,16 @@ public class MasterDataController {
/** Get CustomerParam by billerId.The parameter is different from the data we are getting in the billerDetail **/ /** Get CustomerParam by billerId.The parameter is different from the data we are getting in the billerDetail **/
@PostMapping(value = "/getCustomerParamDetails", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "/getCustomerParamDetails", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<CustomParamResp> getBillerDetails( public ResponseEntity<ResponseModel> getBillerDetails(
@Validated @RequestBody CustomerParamRequest customerParamRequest) { @Validated @RequestBody CustomParamRequest customerParamRequest) {
log.info("Received biller details request for billerId: {}",customerParamRequest.getBillerId() ); log.info("Received biller details request for billerId: {}",customerParamRequest.getBillerId() );
return ResponseEntity.ok(masterDataService.getCustomerParamByBillerId(customerParamRequest)); return ResponseEntity.ok(masterDataService.getCustomerParamByBillerId(customerParamRequest));
} }
@PostMapping("/getAllMastersData")
/** Get All Masters API Fetch All Category from BBPS URL **/ public ResponseModel fetchMasterData(@Validated @RequestBody MasterRequest masterRequest) {
@GetMapping("/getAllMasters") return masterDataService.getMasterData(masterRequest);
public ResponseEntity<List<MasterApiResponse>> fetchMasterData(
@Validated @RequestBody MerchantRequestModel requestModel, HttpServletRequest request) {
log.info("Fetching Master Data Registered URL");
return masterDataService.getMasterData(requestModel, request);
} }
/** Get Master Category Wise API Fetch Category Wise from BBPS URL **/
@GetMapping("/getMasterCategoryWise")
public ResponseEntity<BillerResponse> getMasterDataCategoryWise(
@Validated @RequestBody MerchantRequestModel requestModel, HttpServletRequest request,
@RequestParam String category, @RequestParam(defaultValue = "0") int pageStart, @RequestParam int pageEnd) {
log.info("Request received: category=" + category + ", pageNumber=" + pageStart + ", pageSize=" + pageEnd);
return masterDataService.fetchMasterDataCategoryWise(requestModel, category, pageStart, pageEnd);
}
} }
@@ -0,0 +1,16 @@
package com.billpaymentservice.bbps.dto;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CustomerParamsRequest {
private List<Tag> tags;
}
@@ -1,10 +1,14 @@
package com.billpaymentservice.bbps.dto; package com.billpaymentservice.bbps.dto;
import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
@Getter @Getter
@Setter @Setter
@AllArgsConstructor
@NoArgsConstructor
public class GeneralResp { public class GeneralResp {
private String statusCode; private String statusCode;
private String status; private String status;
@@ -17,7 +17,7 @@ import lombok.ToString;
@ToString @ToString
public class MasterApiResponse { public class MasterApiResponse {
private GeneralResponse generalResp; private GeneralResp generalResp;
private List<CategoryResponse> categoryRespList; private List<CategoryResponse> categoryRespList;
} }
@@ -0,0 +1,15 @@
package com.billpaymentservice.bbps.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class RemitterIdentity {
private String name;
private String value;
}
@@ -0,0 +1,46 @@
package com.billpaymentservice.bbps.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ResponseModel<T> {
private String message;
private String status;
private int statusCode;
private Object data;
private Object duplicateData;
private int size;
public ResponseModel(String message, String status, int statusCode, Object data) {
super();
this.message = message;
this.status = status;
this.statusCode = statusCode;
this.data = data;
}
public ResponseModel(String message, String status, int statusCode, Object data,Object data1) {
this.message = message;
this.status = status;
this.statusCode = statusCode;
this.data = data;
this.duplicateData=data1;
}
public ResponseModel(String message, String status, int statusCode, Object data, int size) {
super();
this.message = message;
this.status = status;
this.statusCode = statusCode;
this.data = data;
this.size = size;
}
}
@@ -0,0 +1,15 @@
package com.billpaymentservice.bbps.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Tag {
private String name;
private String value;
}
@@ -1,7 +1,5 @@
package com.billpaymentservice.bbps.dto.request; package com.billpaymentservice.bbps.dto.request;
import com.billpaymentservice.bbps.entites.BaseClass;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -1,7 +1,5 @@
package com.billpaymentservice.bbps.dto.request; package com.billpaymentservice.bbps.dto.request;
import com.billpaymentservice.bbps.entites.BaseClass;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -12,7 +10,7 @@ import lombok.Setter;
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class CustomerParamRequest extends BaseClass { public class CustomParamRequest extends BaseClass {
@NotNull @NotNull
private String billerId; private String billerId;
@@ -0,0 +1,31 @@
package com.billpaymentservice.bbps.dto.request;
import java.util.List;
import com.billpaymentservice.bbps.dto.CustomerParamsRequest;
import com.billpaymentservice.bbps.dto.RemitterIdentity;
import com.billpaymentservice.bbps.dto.Tag;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class FetchBillRequest extends BaseClass {
private String tenantId; // M
private String billerId; // M
private String billerName; // M
private String billerCategory; // M
private String clientReqId; // C
private String macAdress; // C
private String customerMobNo; // M
private String remitterName; // O
private String paymentChannel; // M
private List<Tag> deviceBlockTags; // M
private CustomerParamsRequest customerParamsRequest; // M
private List<RemitterIdentity> remitterIdentity; // O
}
@@ -0,0 +1,15 @@
package com.billpaymentservice.bbps.dto.request;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class MasterRequest extends BaseClass {
@NotNull
private String tenantId;
}
@@ -5,7 +5,7 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class MerchantRequestModel { public class MerchantRequestModel {
private String mid; private String mid;
private String secretKey; private String secretKey;
@@ -2,7 +2,9 @@ package com.billpaymentservice.bbps.dto.response;
import com.billpaymentservice.bbps.dto.BillerDAO; import com.billpaymentservice.bbps.dto.BillerDAO;
import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.dto.GeneralResp;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -11,7 +13,7 @@ import lombok.Setter;
@Setter @Setter
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public class BillerDataResponse { public class BillerDataResponse {
private BillerDAO billerDAO; private BillerDAO billerDAO;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private GeneralResp generalResp; private GeneralResp generalResp;
} }
@@ -6,6 +6,7 @@ import com.billpaymentservice.bbps.dto.ContactMaster;
import com.billpaymentservice.bbps.dto.CustomParam; import com.billpaymentservice.bbps.dto.CustomParam;
import com.billpaymentservice.bbps.dto.CustomerParam; import com.billpaymentservice.bbps.dto.CustomerParam;
import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.dto.GeneralResp;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -17,6 +18,7 @@ import lombok.Setter;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class CustomParamResp { public class CustomParamResp {
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private GeneralResp generalResp; private GeneralResp generalResp;
private List<CustomParam> customParamResp; private List<CustomParam> customParamResp;
} }
@@ -0,0 +1,33 @@
package com.billpaymentservice.bbps.dto.response;
import com.billpaymentservice.bbps.dto.GeneralResponse;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class FetchBillResponse {
private GeneralResponse genericResponse;
private String billId;
private String refId;
private String billerId;
private String status;
private String actionType;
private String userId;
private String billerResponse;
private String additionalInfo;
private String customerParams;
private String creationDate;
private String modifiedDate;
private long createdEpochDate;
private long modifiedEpochDate;
}
@@ -1,22 +0,0 @@
package com.billpaymentservice.bbps.entites;
import com.billpaymentservice.bbps.dto.DeviceDetail;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class BaseClass {
private String mid;
private String secretKey;
private String txnId;
private DeviceDetail deviceDetial;
}
@@ -1,29 +1,36 @@
package com.billpaymentservice.bbps.exception; package com.billpaymentservice.bbps.exception;
import com.billpaymentservice.bbps.dto.ResponseModel;
import com.billpaymentservice.bbps.dto.GeneralResp;
public class CustomException extends RuntimeException { public class CustomException extends RuntimeException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final GeneralResp generalResp; private final ResponseModel responseModel;
public CustomException(String statusCode, String status,String message,String remark) { public CustomException(String message, String status, int statusCode, String remarks) {
super(message); super(message);
this.generalResp = new GeneralResp(); this.responseModel = new ResponseModel();
this.generalResp.setStatusCode(statusCode); this.responseModel.setMessage(message);
this.generalResp.setStatus(status); this.responseModel.setStatus(status);
this.generalResp.setMessage(message); this.responseModel.setStatusCode(statusCode);
this.generalResp.setRemarks(remark); this.responseModel.setData(null);
this.responseModel.setDuplicateData(remarks);
}
public ResponseModel getResponseModel() {
return responseModel;
} }
public CustomException(String message) { public CustomException(String message) {
super(message); super(message);
this.generalResp = new GeneralResp(); this.responseModel = new ResponseModel();
this.generalResp.setStatusCode("500"); this.responseModel.setMessage(message);
this.generalResp.setStatus("Failure"); this.responseModel.setStatus("FAILED");
this.generalResp.setMessage(message); this.responseModel.setStatusCode(400);
this.generalResp.setRemarks(""); this.responseModel.setData(null);
} this.responseModel.setDuplicateData(null);
public GeneralResp getGeneralResp() {
return generalResp;
} }
} }
@@ -5,12 +5,13 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.dto.GeneralResp;
import com.billpaymentservice.bbps.dto.ResponseModel;
@ControllerAdvice @ControllerAdvice
public class GlobalExceptionHandler { public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class) @ExceptionHandler(CustomException.class)
public ResponseEntity<GeneralResp> handleCustomException(CustomException ex) { public ResponseEntity<ResponseModel> handleCustomException(CustomException ex) {
return new ResponseEntity<>(ex.getGeneralResp(), HttpStatus.INTERNAL_SERVER_ERROR); return new ResponseEntity<>(ex.getResponseModel(), HttpStatus.BAD_REQUEST);
} }
} }
@@ -1,32 +1,22 @@
package com.billpaymentservice.bbps.service; package com.billpaymentservice.bbps.service;
import com.billpaymentservice.bbps.dto.ResponseModel;
import java.util.List;
import org.springframework.http.ResponseEntity;
import com.billpaymentservice.bbps.dto.MasterApiResponse;
import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.billpaymentservice.bbps.dto.request.BillerDetailRequest;
import com.billpaymentservice.bbps.dto.request.ContactMasterRequest; import com.billpaymentservice.bbps.dto.request.ContactMasterRequest;
import com.billpaymentservice.bbps.dto.request.CustomerParamRequest; import com.billpaymentservice.bbps.dto.request.CustomParamRequest;
import com.billpaymentservice.bbps.dto.request.MasterRequest;
import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; import com.billpaymentservice.bbps.dto.request.MerchantRequestModel;
import com.billpaymentservice.bbps.dto.response.BillerDataResponse;
import com.billpaymentservice.bbps.dto.response.BillerResponse;
import com.billpaymentservice.bbps.dto.response.ContactMasterResponse;
import com.billpaymentservice.bbps.dto.response.CustomParamResp;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
public interface MasterDataService { public interface MasterDataService {
public BillerDataResponse getBillerByBillerId(BillerDetailRequest billerDetailRequest); public ResponseModel getBillerByBillerId(BillerDetailRequest billerDetailRequest);
public ResponseEntity<List<MasterApiResponse>> getMasterData(MerchantRequestModel requestModel, public ResponseModel getMasterData(MasterRequest masterRequest);
HttpServletRequest request);
public ResponseEntity<BillerResponse> fetchMasterDataCategoryWise(MerchantRequestModel requestModel, String category, int pageStart, int pageEnd); public ResponseModel fetchMasterDataCategoryWise(MerchantRequestModel requestModel, String category, int pageStart, int pageEnd);
public CustomParamResp getCustomerParamByBillerId(CustomerParamRequest customerParamRequest); public ResponseModel getCustomerParamByBillerId(CustomParamRequest customerParamRequest);
public ContactMasterResponse getContactMaster(ContactMasterRequest contactMasterRequest); public ResponseModel getContactMaster(ContactMasterRequest contactMasterRequest);
} }
@@ -41,7 +41,6 @@ public class HttpClientApi {
LOGGER.info("Pesapal: Payment Status Response Body: {}", responseBody); LOGGER.info("Pesapal: Payment Status Response Body: {}", responseBody);
// Set response values in map // Set response values in map
responseMap.put("respCode", response.getStatusCode());
responseMap.put("data", responseBody); responseMap.put("data", responseBody);
} catch (HttpClientErrorException | HttpServerErrorException httpEx) { } catch (HttpClientErrorException | HttpServerErrorException httpEx) {
@@ -13,13 +13,17 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.billpaymentservice.bbps.dto.GeneralResp;
import com.billpaymentservice.bbps.dto.MasterApiResponse; import com.billpaymentservice.bbps.dto.MasterApiResponse;
import com.billpaymentservice.bbps.dto.ResponseModel;
import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.billpaymentservice.bbps.dto.request.BillerDetailRequest;
import com.billpaymentservice.bbps.dto.request.ContactMasterRequest; import com.billpaymentservice.bbps.dto.request.ContactMasterRequest;
import com.billpaymentservice.bbps.dto.request.CustomerParamRequest; import com.billpaymentservice.bbps.dto.request.CustomParamRequest;
import com.billpaymentservice.bbps.dto.request.MasterRequest;
import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; import com.billpaymentservice.bbps.dto.request.MerchantRequestModel;
import com.billpaymentservice.bbps.dto.response.BillerDataResponse; import com.billpaymentservice.bbps.dto.response.BillerDataResponse;
import com.billpaymentservice.bbps.dto.response.BillerResponse; import com.billpaymentservice.bbps.dto.response.BillerResponse;
import com.billpaymentservice.bbps.dto.response.CategoryResponse;
import com.billpaymentservice.bbps.dto.response.ContactMasterResponse; import com.billpaymentservice.bbps.dto.response.ContactMasterResponse;
import com.billpaymentservice.bbps.dto.response.CustomParamResp; import com.billpaymentservice.bbps.dto.response.CustomParamResp;
import com.billpaymentservice.bbps.entites.BBPSMerchantValidation; import com.billpaymentservice.bbps.entites.BBPSMerchantValidation;
@@ -29,7 +33,6 @@ import com.billpaymentservice.bbps.repository.MerchantRepository;
import com.billpaymentservice.bbps.service.MasterDataService; import com.billpaymentservice.bbps.service.MasterDataService;
import com.billpaymentservice.bbps.util.BBPSConstant; import com.billpaymentservice.bbps.util.BBPSConstant;
import com.billpaymentservice.bbps.util.Helper; import com.billpaymentservice.bbps.util.Helper;
import com.billpaymentservice.bbps.util.ResponseParser;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
@@ -46,7 +49,6 @@ public class MasterDataServiceImpl implements MasterDataService {
private MerchantRepository merchantRegisterRepo; private MerchantRepository merchantRegisterRepo;
private HttpClientApi httpClientApi; private HttpClientApi httpClientApi;
private ResponseParser responseParser;
private Helper helper; private Helper helper;
@@ -58,16 +60,17 @@ public class MasterDataServiceImpl implements MasterDataService {
public MasterDataServiceImpl(MerchantRepository merchantRegisterRepo, public MasterDataServiceImpl(MerchantRepository merchantRegisterRepo,
HttpService httpService, HttpService httpService,
HttpClientApi httpClientApi, HttpClientApi httpClientApi,
Helper helper, Helper helper
ResponseParser responseParser) { ) {
this.merchantRegisterRepo = merchantRegisterRepo; this.merchantRegisterRepo = merchantRegisterRepo;
this.httpService = httpService; this.httpService = httpService;
this.httpClientApi = httpClientApi; this.httpClientApi = httpClientApi;
this.helper = helper; this.helper = helper;
this.responseParser = responseParser;
} }
@Override @Override
public BillerDataResponse getBillerByBillerId(BillerDetailRequest billerDetailRequest) { public ResponseModel getBillerByBillerId(BillerDetailRequest billerDetailRequest) {
String billerId = billerDetailRequest.getBillerId(); String billerId = billerDetailRequest.getBillerId();
String fullUrl = masterRegisterUrl + BBPSConstant.BILLER_DATA_FETCH_URL+billerId; String fullUrl = masterRegisterUrl + BBPSConstant.BILLER_DATA_FETCH_URL+billerId;
@@ -84,12 +87,21 @@ public class MasterDataServiceImpl implements MasterDataService {
new TypeReference<Map<String, Object>>() { new TypeReference<Map<String, Object>>() {
}); });
if (!dataMap.containsKey("generalResp")) { if (!dataMap.containsKey("generalResp")) {
throw new CustomException(String.valueOf(dataMap.get("statusCode")), throw new CustomException(String.valueOf(dataMap.get("message")), // message
String.valueOf(dataMap.get("status")), String.valueOf(dataMap.get("message")), String.valueOf(dataMap.get("status")), // status
String.valueOf(dataMap.get("remarks"))); Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int)
String.valueOf(dataMap.get("remarks")) );
} }
BillerDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillerDataResponse.class); BillerDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillerDataResponse.class);
return responseWrapper; GeneralResp generalResp = responseWrapper.getGeneralResp();
ResponseModel responseModel=new ResponseModel( generalResp.getMessage(),
generalResp.getStatus(),
Integer.parseInt(generalResp.getStatusCode()),
responseWrapper);
return responseModel;
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
log.error("Error parsing responseData JSON: {}", e.getMessage()); log.error("Error parsing responseData JSON: {}", e.getMessage());
@@ -99,54 +111,53 @@ public class MasterDataServiceImpl implements MasterDataService {
} }
@Override @Override
public ResponseEntity<List<MasterApiResponse>> getMasterData(MerchantRequestModel requestModel, public ResponseModel getMasterData(MasterRequest masterRequest) {
HttpServletRequest request) { LOGGER.info("Request DTO: {}", masterRequest);
LOGGER.info("Request DTO" + request);
BBPSMerchantValidation merchantValidation = merchantRegisterRepo.findByMid(requestModel.getMid()); String fullUrl = masterRegisterUrl + BBPSConstant.MASTER_CATEGORY_URL + masterRequest.getTenantId();
List<MasterApiResponse> responseModel = new ArrayList<>(); LOGGER.info("Calling external API: {}", fullUrl);
// if Start merchant validations
if (Optional.ofNullable(merchantValidation).isPresent()) {
// if Start merchant active check
if (merchantValidation.isActive()) {
LOGGER.info("mid Value: " + requestModel.getMid() + " secret Value: " + requestModel.getSecretKey() Map<String, String> responseMap = httpService.getRequest(fullUrl);
+ "txt Value: " + requestModel); String responseData = responseMap.get("data");
String fullUrl = masterRegisterUrl + BBPSConstant.MASTER_CATEGORY_URL; LOGGER.info("Response Data: {}", responseData);
HashMap<String, Object> response = httpClientApi.getRequestForPaymentStatus(fullUrl);
LOGGER.info("BBPS bank response data: " + response.get("data") + " code: " + response.get("respCode")); ObjectMapper objectMapper = new ObjectMapper();
// if Start merchant cehck response code
if (response.get("respCode") != null && response.get("respCode").toString().contains("200")) { try {
LOGGER.info("Response -: " + response.get("data")); Map<String, Object> dataMap = objectMapper.readValue(responseData, new TypeReference<Map<String, Object>>() {});
String jsonData = response.get("data").toString();
MasterApiResponse generalResponse = responseParser.parseResponse(jsonData);
LOGGER.info("kkk" + generalResponse.toString()); // ✅ Same check as in getBillerByBillerId()
// 5️⃣ Prepare API response model if (!dataMap.containsKey("generalResp")) {
throw new CustomException(
String.valueOf(dataMap.get("message")), // message
String.valueOf(dataMap.get("status")), // status
Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode
String.valueOf(dataMap.get("remarks")) // remarks
);
}
responseModel.add(generalResponse); MasterApiResponse responseWrapper = objectMapper.convertValue(dataMap, MasterApiResponse.class);
GeneralResp generalResp = responseWrapper.getGeneralResp();
} else { ResponseModel responseModel = new ResponseModel(
LOGGER.warn("Unexpected response code: " + response.get("respCode")); generalResp.getMessage(),
generalResp.getStatus(),
Integer.parseInt(generalResp.getStatusCode()),
responseWrapper
);
} return responseModel;
} else {
LOGGER.info("Merchant Not Active for mid - " + requestModel.getMid());
throw new AppException("Merchant Not Active", BBPSConstant.CODE_MERCHANT_INACTIVE);
}
} else {
LOGGER.info("Merchant Not Valid for mid - " + requestModel.getMid());
throw new AppException("Merchant Not Valid", BBPSConstant.CODE_MERCHANT_INVALID);
}
return ResponseEntity.ok(responseModel);
} catch (JsonProcessingException e) {
log.error("Error parsing responseData JSON: {}", e.getMessage());
throw new CustomException("Invalid JSON received from API");
}
} }
@Override @Override
public ResponseEntity<BillerResponse> fetchMasterDataCategoryWise(MerchantRequestModel requestModel, public ResponseModel fetchMasterDataCategoryWise(MerchantRequestModel requestModel,
String category, int pageStart, int pageEnd) { String category, int pageStart, int pageEnd) {
LOGGER.info("Fetching Master Data Category-wise for MID={}, Category={}, PageStart={}, PageEnd={}", LOGGER.info("Fetching Master Data Category-wise for MID={}, Category={}, PageStart={}, PageEnd={}",
requestModel.getMid(), category, pageStart, pageEnd); requestModel.getMid(), category, pageStart, pageEnd);
@@ -173,7 +184,7 @@ public class MasterDataServiceImpl implements MasterDataService {
if (response.get("respCode") != null && response.get("respCode").toString().contains("200")) { if (response.get("respCode") != null && response.get("respCode").toString().contains("200")) {
LOGGER.info("Response -: " + response.get("data")); LOGGER.info("Response -: " + response.get("data"));
String jsonData = response.get("data").toString(); String jsonData = response.get("data").toString();
responseModel = responseParser.billerResponse(jsonData); //responseModel = responseParser.billerResponse(jsonData);
LOGGER.info("kkk" + responseModel.toString()); LOGGER.info("kkk" + responseModel.toString());
// 5️⃣ Prepare API response model // 5️⃣ Prepare API response model
@@ -191,12 +202,12 @@ public class MasterDataServiceImpl implements MasterDataService {
LOGGER.info("Merchant Not Valid for mid - " + requestModel.getMid()); LOGGER.info("Merchant Not Valid for mid - " + requestModel.getMid());
throw new AppException("Merchant Not Valid", BBPSConstant.CODE_MERCHANT_INVALID); throw new AppException("Merchant Not Valid", BBPSConstant.CODE_MERCHANT_INVALID);
} }
return ResponseEntity.ok(responseModel); return new ResponseModel();
} }
@Override @Override
public CustomParamResp getCustomerParamByBillerId(CustomerParamRequest customerParamRequest) { public ResponseModel getCustomerParamByBillerId(CustomParamRequest customerParamRequest) {
String billerId = customerParamRequest.getBillerId(); String billerId = customerParamRequest.getBillerId();
String fullUrl = masterRegisterUrl + BBPSConstant.CUSTOMPARAM_URL+billerId; String fullUrl = masterRegisterUrl + BBPSConstant.CUSTOMPARAM_URL+billerId;
@@ -212,12 +223,21 @@ public class MasterDataServiceImpl implements MasterDataService {
new TypeReference<Map<String, Object>>() { new TypeReference<Map<String, Object>>() {
}); });
if (!dataMap.containsKey("generalResp")) { if (!dataMap.containsKey("generalResp")) {
throw new CustomException(String.valueOf(dataMap.get("statusCode")), throw new CustomException(String.valueOf(dataMap.get("message")), // message
String.valueOf(dataMap.get("status")), String.valueOf(dataMap.get("message")), String.valueOf(dataMap.get("status")), // status
String.valueOf(dataMap.get("remarks"))); Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int)
String.valueOf(dataMap.get("remarks")) );
} }
CustomParamResp responseWrapper = objectMapper.convertValue(dataMap, CustomParamResp.class); CustomParamResp responseWrapper = objectMapper.convertValue(dataMap, CustomParamResp.class);
return responseWrapper; GeneralResp generalResp = responseWrapper.getGeneralResp();
ResponseModel responseModel=new ResponseModel( generalResp.getMessage(),
generalResp.getStatus(),
Integer.parseInt(generalResp.getStatusCode()),
responseWrapper);
return responseModel;
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
log.error("Error parsing responseData JSON: {}", e.getMessage()); log.error("Error parsing responseData JSON: {}", e.getMessage());
throw new CustomException("Invalid JSON received from API"); throw new CustomException("Invalid JSON received from API");
@@ -226,8 +246,8 @@ public class MasterDataServiceImpl implements MasterDataService {
} }
@Override @Override
public ContactMasterResponse getContactMaster(ContactMasterRequest contactMasterRequest) { public ResponseModel getContactMaster(ContactMasterRequest contactMasterRequest) {
return null; return new ResponseModel();
} }
} }
@@ -24,7 +24,7 @@ public class BBPSConstant {
public static final String ENCRYPTION_FAILED = "Error in encrypting order request"; public static final String ENCRYPTION_FAILED = "Error in encrypting order request";
public static final String BILLER_URL = "/billers"; public static final String BILLER_URL = "/billers";
public static final String MASTER_CATEGORY_URL = "/categories-master?tenantId=FE41"; public static final String MASTER_CATEGORY_URL = "/categories-master?tenantId=";
public static final String BILLER_DATA_FETCH_URL="/billersById?billerId="; public static final String BILLER_DATA_FETCH_URL="/billersById?billerId=";
public static final String CUSTOMPARAM_URL="/customerParam?billerId="; public static final String CUSTOMPARAM_URL="/customerParam?billerId=";
@@ -48,4 +48,27 @@ public class Helper {
LOGGER.info("Merchant is valid and active for MID: {}", requestModel.getMid()); LOGGER.info("Merchant is valid and active for MID: {}", requestModel.getMid());
return true; return true;
} }
public String validateMerchant(Object requestModel) {
// if (requestModel == null || requestModel.getMid() == null) {
// LOGGER.warn("MerchantRequestModel or MID is null");
// return "Invalid request: MID is required";
// }
//
// // Fetch merchant details
// BBPSMerchantValidation merchant = merchantRegisterRepo.findByMid(requestModel.getMid());
//
// if (merchant == null) {
// LOGGER.warn("Merchant not found for MID: {}", requestModel.getMid());
// return "Merchant not found";
// }
//
// if (!Boolean.TRUE.equals(merchant.isActive())) {
// LOGGER.warn("Merchant inactive for MID: {}", requestModel.getMid());
// return "Merchant inactive";
// }
//
// LOGGER.info("Merchant is valid and active for MID: {}", requestModel.getMid());
return "Valid"; // Success message
}
} }
@@ -1,134 +0,0 @@
package com.billpaymentservice.bbps.util;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.billpaymentservice.bbps.dto.FaqDetailsResponse;
import com.billpaymentservice.bbps.dto.GeneralResponse;
import com.billpaymentservice.bbps.dto.MasterApiResponse;
import com.billpaymentservice.bbps.dto.MasterCategoryBillerResponse;
import com.billpaymentservice.bbps.dto.response.BillerResponse;
import com.billpaymentservice.bbps.dto.response.CategoryResponse;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
@Component
public class ResponseParser {
private static final Logger LOGGER = LoggerFactory.getLogger(ResponseParser.class);
private final ObjectMapper mapper = new ObjectMapper();
public MasterApiResponse parseResponse(String jsonResponse) {
MasterApiResponse finalResponse = new MasterApiResponse();
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode root = mapper.readTree(jsonResponse);
// ✅ Parse generalResp correctly
JsonNode generalRespNode = root.path("generalResp");
GeneralResponse generalResp = new GeneralResponse();
generalResp.setStatusCode(generalRespNode.path("statusCode").asText());
generalResp.setStatus(generalRespNode.path("status").asText());
generalResp.setMessage(generalRespNode.path("message").asText());
generalResp.setRemarks(generalRespNode.path("remarks").asText());
finalResponse.setGeneralResp(generalResp);
// ✅ Parse categoryRespList
List<CategoryResponse> categoryList = new ArrayList<>();
JsonNode categoryArray = root.path("categoryRespList");
if (categoryArray.isArray()) {
for (JsonNode node : categoryArray) {
CategoryResponse data = new CategoryResponse();
data.setCategoryId(node.path("categoryId").asText());
data.setCategoryName(node.path("categoryName").asText());
data.setCategoryIcon(node.path("categoryIcon").asText());
data.setCategoryDomain(node.path("categoryDomain").asText(""));
data.setButtonName(node.path("buttonName").asText(""));
data.setTextArea(node.path("textArea").asText(""));
// Parse faqDetailsList
List<FaqDetailsResponse> faqList = new ArrayList<>();
JsonNode faqArray = node.path("faqDetailsList");
if (faqArray.isArray()) {
for (JsonNode faqNode : faqArray) {
FaqDetailsResponse faq = new FaqDetailsResponse();
faq.setName(faqNode.path("name").asText());
faq.setValue(faqNode.path("value").asText());
faqList.add(faq);
}
}
data.setFaqDetailsList(faqList);
categoryList.add(data);
}
}
finalResponse.setCategoryRespList(categoryList);
} catch (Exception e) {
throw new RuntimeException("Failed to parse BBPS master API response", e);
}
return finalResponse;
}
public BillerResponse billerResponse(String jsonResponse) {
BillerResponse billerResponse = new BillerResponse();
try {
JsonNode root = mapper.readTree(jsonResponse);
// ✅ Pagination info
billerResponse.setPageNo(root.path("pageNo").asInt());
billerResponse.setPageSize(root.path("pageSize").asInt());
billerResponse.setTotalElements(root.path("totalElements").asLong());
billerResponse.setTotalPages(root.path("totalPages").asInt());
// ✅ General Response Info
JsonNode generalNode = root.path("generalResp");
GeneralResponse generalResp = new GeneralResponse();
generalResp.setStatusCode(generalNode.path("statusCode").asText());
generalResp.setStatus(generalNode.path("status").asText());
generalResp.setMessage(generalNode.path("message").asText());
generalResp.setRemarks(generalNode.path("remarks").asText());
billerResponse.setGeneralResp(generalResp);
// ✅ Parse biller list
List<MasterCategoryBillerResponse> billerList = new ArrayList<>();
JsonNode billerArray = root.path("billerResp");
if (billerArray.isArray()) {
for (JsonNode billerNode : billerArray) {
MasterCategoryBillerResponse biller = new MasterCategoryBillerResponse();
biller.setBillerId(billerNode.path("billerId").asText());
biller.setBillerName(billerNode.path("billerName").asText());
biller.setBillerType(billerNode.path("billerType").asText());
biller.setBillerCategory(billerNode.path("billerCategory").asText());
biller.setBillerCoverage(billerNode.path("billerCoverage").asText());
biller.setBillerResponseType(billerNode.path("billerResponseType").asText());
biller.setBillerDescription(billerNode.path("billerDescription").asText());
biller.setPlanMDMRequirement(billerNode.path("planMDMRequirement").asText());
biller.setAdhocBiller(billerNode.path("adhocBiller").asText());
biller.setPaymentAmountExactness(billerNode.path("paymentAmountExactness").asText());
billerList.add(biller);
}
}
billerResponse.setBillerResp(billerList);
LOGGER.info("✅ Successfully parsed BillerResponse with {} billers", billerList.size());
} catch (Exception e) {
LOGGER.error("❌ Error parsing BillerResponse: {}", e.getMessage(), e);
throw new RuntimeException("Failed to parse BBPS Biller API response", e);
}
return billerResponse;
}
}