diff --git a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java index c6610d1..6464d34 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java @@ -1,24 +1,59 @@ package com.billpaymentservice.bbps.controller; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.billpaymentservice.bbps.dto.MasterApiResponse; import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; +import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; +import com.billpaymentservice.bbps.dto.response.BillerResponse; import com.billpaymentservice.bbps.service.MasterDataService; +import jakarta.servlet.http.HttpServletRequest; + +@RequestMapping("/masterData") @RestController public class MasterDataController { - private final MasterDataService masterDataService; + private static final Logger LOGGER = LoggerFactory.getLogger(MasterDataController.class); - public MasterDataController(MasterDataService masterDataService) { - this.masterDataService = masterDataService; - } + private final MasterDataService masterDataService; - @PostMapping("/getBillerById") - public String getBillerById(@RequestBody BillerDetailRequest billerRequestRequest) { - masterDataService.getBillerByBillerId(billerRequestRequest); - return "Abc"; - } + public MasterDataController(MasterDataService masterDataService) { + this.masterDataService = masterDataService; + } + + @PostMapping("/getBillerById") + public String getBillerById(@RequestBody BillerDetailRequest billerRequestRequest) { + masterDataService.getBillerByBillerId(billerRequestRequest); + return "Abc"; + } + + /** Get All Masters API Fetch All Category from BBPS URL **/ + @GetMapping("/getAllMasters") + public ResponseEntity> fetchMasterData( + @Validated @RequestBody MerchantRequestModel requestModel, HttpServletRequest request) { + LOGGER.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 getMasterDataCategoryWise( + @Validated @RequestBody MerchantRequestModel requestModel, HttpServletRequest request, + @RequestParam String category, @RequestParam(defaultValue = "0") int pageStart, @RequestParam int pageEnd) { + + LOGGER.info("Request received: category=" + category + ", pageNumber=" + pageStart + ", pageSize=" + pageEnd); + return masterDataService.fetchMasterDataCategoryWise(requestModel,category, pageStart, pageEnd); + } } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/FaqDetailsResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/FaqDetailsResponse.java new file mode 100644 index 0000000..fdec361 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/FaqDetailsResponse.java @@ -0,0 +1,12 @@ +package com.billpaymentservice.bbps.dto; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class FaqDetailsResponse { + + private String name; + private String value; +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/GeneralResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/GeneralResponse.java new file mode 100644 index 0000000..1b443c0 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/GeneralResponse.java @@ -0,0 +1,21 @@ +package com.billpaymentservice.bbps.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class GeneralResponse { + + private String statusCode; + private String status; + private String message; + private String remarks; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/MasterApiResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/MasterApiResponse.java new file mode 100644 index 0000000..877a89f --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/MasterApiResponse.java @@ -0,0 +1,23 @@ +package com.billpaymentservice.bbps.dto; + +import java.util.List; + +import com.billpaymentservice.bbps.dto.response.CategoryResponse; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class MasterApiResponse { + + private GeneralResponse generalResp; + private List categoryRespList; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/MasterCategoryBillerResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/MasterCategoryBillerResponse.java new file mode 100644 index 0000000..e85199e --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/MasterCategoryBillerResponse.java @@ -0,0 +1,25 @@ +package com.billpaymentservice.bbps.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class MasterCategoryBillerResponse { + + private String billerId; + private String billerName; + private String billerType; + private String billerCategory; + private String billerCoverage; + private String billerResponseType; + private String billerDescription; + private String planMDMRequirement; + private String adhocBiller; + private String paymentAmountExactness; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/MerchantRequestModel.java b/src/main/java/com/billpaymentservice/bbps/dto/request/MerchantRequestModel.java new file mode 100644 index 0000000..1447ec6 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/MerchantRequestModel.java @@ -0,0 +1,13 @@ +package com.billpaymentservice.bbps.dto.request; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MerchantRequestModel { + + private String mid; + private String secretKey; + private String txnId; +} diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/BillerResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/BillerResponse.java new file mode 100644 index 0000000..d33d8a7 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/BillerResponse.java @@ -0,0 +1,26 @@ +package com.billpaymentservice.bbps.dto.response; + +import java.util.List; + +import com.billpaymentservice.bbps.dto.GeneralResponse; +import com.billpaymentservice.bbps.dto.MasterCategoryBillerResponse; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class BillerResponse { + + private int pageNo; + private int pageSize; + private long totalElements; + private int totalPages; + private GeneralResponse generalResp; + private List billerResp; + +} \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/dto/response/CategoryResponse.java b/src/main/java/com/billpaymentservice/bbps/dto/response/CategoryResponse.java new file mode 100644 index 0000000..e243500 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/dto/response/CategoryResponse.java @@ -0,0 +1,28 @@ +package com.billpaymentservice.bbps.dto.response; + +import java.util.List; + +import com.billpaymentservice.bbps.dto.FaqDetailsResponse; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CategoryResponse { + + private String categoryId; + private String categoryName; + private String categoryIcon; + private String categoryDomain; + private String buttonName; + private String textArea; + private List faqDetailsList; + +} diff --git a/src/main/java/com/billpaymentservice/bbps/entites/BBPSMerchantValidation.java b/src/main/java/com/billpaymentservice/bbps/entites/BBPSMerchantValidation.java new file mode 100644 index 0000000..103dc23 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/entites/BBPSMerchantValidation.java @@ -0,0 +1,46 @@ +package com.billpaymentservice.bbps.entites; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Table(name = "bbps_merchant_validation") +public class BBPSMerchantValidation { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(length = 35) + private String mid; + + private String merchantName; + + @Column(length = 50) + private String encKey; + + private boolean active = true; + + @Column(length = 100) + private String registeredEmailId; + + private Long registeredMobileNo; + + private String merchantCallbackUrl; + + private String txtId; + + private boolean is_deleted; +} diff --git a/src/main/java/com/billpaymentservice/bbps/exception/AppException.java b/src/main/java/com/billpaymentservice/bbps/exception/AppException.java new file mode 100644 index 0000000..c14fec0 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/exception/AppException.java @@ -0,0 +1,35 @@ +package com.billpaymentservice.bbps.exception; + +import org.springframework.http.HttpStatus; + +import lombok.Getter; + +@Getter +public class AppException extends RuntimeException { + + private final String status; + private final String message; + private final int statusCode; + private final Object data; + + public AppException(String message, HttpStatus httpStatus) { + this(message, httpStatus, null); + } + + public AppException(String message, HttpStatus httpStatus, Object data) { + super(message); + this.message = message; + this.status = httpStatus.name(); + this.statusCode = httpStatus.value(); + this.data = data; + } + + public AppException(String message2, String codeMerchantInvalid) { + + this.message = message2; + this.status = codeMerchantInvalid; + this.statusCode = 0; + this.data = new Object(); + + } +} diff --git a/src/main/java/com/billpaymentservice/bbps/repository/MerchantRepository.java b/src/main/java/com/billpaymentservice/bbps/repository/MerchantRepository.java new file mode 100644 index 0000000..c773555 --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/repository/MerchantRepository.java @@ -0,0 +1,12 @@ +package com.billpaymentservice.bbps.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import com.billpaymentservice.bbps.entites.BBPSMerchantValidation; + +public interface MerchantRepository extends JpaRepository { + + @Query("from BBPSMerchantValidation where mid = ?1 and is_deleted = false") + public BBPSMerchantValidation findByMid(String mid); +} diff --git a/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java b/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java index c81cc9c..386ba56 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java @@ -1,10 +1,24 @@ package com.billpaymentservice.bbps.service; +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.MerchantRequestModel; import com.billpaymentservice.bbps.dto.response.BillerDataResponse; +import com.billpaymentservice.bbps.dto.response.BillerResponse; + +import jakarta.servlet.http.HttpServletRequest; public interface MasterDataService { public BillerDataResponse getBillerByBillerId(BillerDetailRequest billerDetailRequest); - + + public ResponseEntity> getMasterData(MerchantRequestModel requestModel, + HttpServletRequest request); + + public ResponseEntity fetchMasterDataCategoryWise(MerchantRequestModel requestModel, String category, int pageStart, int pageEnd); + } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpClientApi.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpClientApi.java new file mode 100644 index 0000000..1b4c9be --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpClientApi.java @@ -0,0 +1,61 @@ +package com.billpaymentservice.bbps.serviceImpl; + +import java.util.Collections; +import java.util.HashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.client.RestTemplate; + +@Service +public class HttpClientApi { + + private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientApi.class); + + public HashMap getRequestForPaymentStatus(String url) { + HashMap responseMap = new HashMap<>(); + + try { + RestTemplate restTemplate = new RestTemplate(); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + + HttpEntity request = new HttpEntity<>(headers); + + LOGGER.info("BBPS: Payment Status Request URL: {}", url); + + ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, request, String.class); + + String responseBody = response.getBody(); + LOGGER.info("Pesapal: Payment Status Response Body: {}", responseBody); + + // Set response values in map + responseMap.put("respCode", response.getStatusCode()); + responseMap.put("data", responseBody); + + } catch (HttpClientErrorException | HttpServerErrorException httpEx) { + LOGGER.error("BBPS: HTTP error during payment status check", httpEx); + responseMap.put("respCode", String.valueOf(httpEx.getStatusCode())); + responseMap.put("data", "Exception: " + httpEx.getResponseBodyAsString()); + + } catch (Exception e) { + LOGGER.error("BBPS: Unexpected error during payment status check", e); + responseMap.put("respCode", String.valueOf(HttpStatus.EXPECTATION_FAILED)); + responseMap.put("error", "Exception During REST Call: " + e.getMessage()); + } + + return responseMap; + } + +} diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index dcfc34d..50d5a85 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -1,14 +1,150 @@ package com.billpaymentservice.bbps.serviceImpl; -import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; -import com.billpaymentservice.bbps.dto.response.BillerDataResponse; -import com.billpaymentservice.bbps.service.MasterDataService; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; -public class MasterDataServiceImpl implements MasterDataService { +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import com.billpaymentservice.bbps.dto.MasterApiResponse; +import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; +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.entites.BBPSMerchantValidation; +import com.billpaymentservice.bbps.exception.AppException; +import com.billpaymentservice.bbps.repository.MerchantRepository; +import com.billpaymentservice.bbps.service.MasterDataService; +import com.billpaymentservice.bbps.util.BBPSConstant; +import com.billpaymentservice.bbps.util.ResponseParser; + +import jakarta.servlet.http.HttpServletRequest; + +@Service +public class MasterDataServiceImpl implements MasterDataService { + + private static final Logger LOGGER = LoggerFactory.getLogger(MasterDataServiceImpl.class); + + @Value("${master.data.url}") + private String masterRegisterUrl; + + @Autowired + private MerchantRepository merchantRegisterRepo; + + @Autowired + private HttpClientApi httpClientApi; + + @Autowired + private ResponseParser responseParser; @Override public BillerDataResponse getBillerByBillerId(BillerDetailRequest billerDetailRequest) { // TODO Auto-generated method stub return null; } + + @Override + public ResponseEntity> getMasterData(MerchantRequestModel requestModel, + HttpServletRequest request) { + LOGGER.info("Request DTO" + request); + + BBPSMerchantValidation merchantValidation = merchantRegisterRepo.findByMid(requestModel.getMid()); + List responseModel = new ArrayList<>(); + // 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() + + "txt Value: " + requestModel); + String fullUrl = masterRegisterUrl + BBPSConstant.MASTER_CATEGORY_URL; + HashMap response = httpClientApi.getRequestForPaymentStatus(fullUrl); + + LOGGER.info("BBPS bank response data: " + response.get("data") + " code: " + response.get("respCode")); + // if Start merchant cehck response code + + if (response.get("respCode") != null && response.get("respCode").toString().contains("200")) { + LOGGER.info("Response -: " + response.get("data")); + String jsonData = response.get("data").toString(); + MasterApiResponse generalResponse = responseParser.parseResponse(jsonData); + + LOGGER.info("kkk" + generalResponse.toString()); + // 5️⃣ Prepare API response model + + responseModel.add(generalResponse); + + } else { + LOGGER.warn("Unexpected response code: " + response.get("respCode")); + + } + + } 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); + + } + + @Override + public ResponseEntity fetchMasterDataCategoryWise(MerchantRequestModel requestModel, + String category, int pageStart, int pageEnd) { + LOGGER.info("Fetching Master Data Category-wise for MID={}, Category={}, PageStart={}, PageEnd={}", + requestModel.getMid(), category, pageStart, pageEnd); + //bollean + //if(validate(arequetsModel) + BBPSMerchantValidation merchantValidation = merchantRegisterRepo.findByMid(requestModel.getMid()); + BillerResponse responseModel = new BillerResponse(); + // 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() + + "txt Value: " + requestModel); + // 2️⃣ Build API URL + String fullUrl = String.format("%s%s?category=%s&page=%d&pagesize=%d", masterRegisterUrl, + BBPSConstant.BILLER_URL, category, pageStart, pageEnd); + + LOGGER.info("Calling Master API: {}", fullUrl); + HashMap response = httpClientApi.getRequestForPaymentStatus(fullUrl); + + LOGGER.info("BBPS bank response data: " + response.get("data") + " code: " + response.get("respCode")); + // if Start merchant cehck response code + + if (response.get("respCode") != null && response.get("respCode").toString().contains("200")) { + LOGGER.info("Response -: " + response.get("data")); + String jsonData = response.get("data").toString(); + responseModel = responseParser.billerResponse(jsonData); + + LOGGER.info("kkk" + responseModel.toString()); + // 5️⃣ Prepare API response model + + } else { + LOGGER.warn("Unexpected response code: " + response.get("respCode")); + + } + + } 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); + + } + } \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java b/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java index 14222e3..b07440d 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java +++ b/src/main/java/com/billpaymentservice/bbps/util/BBPSConstant.java @@ -2,4 +2,28 @@ package com.billpaymentservice.bbps.util; public class BBPSConstant { + public static final Long SENT_TO_PROCESSOR_CODE = 198L; + public static final Long SUCCESS_CODE = 200L; + public static final Long FAILED_CODE = 99L; + public static final Long SCHEDULER_CODE = 222L; + public static final Long PENDING_CODE = 211L; + public static final Long FRAUD_CODE = 1001L; + + public static final String SUCCESS_STATUS = "success"; + public static final String FAILED_STATUS = "failed"; + public static final String PENDING_STATUS = "pending"; + public static final String SENT_TO_PROCESSOR_STATUS = "txn sent to processor"; + + public static final String SUCCESS_REMARK = "200-Transaction process successfully"; + public static final String FAILED_REMARK = "99-Transaction failed"; + public static final String FRAUD_REMARK = "1001-Transaction failed due to a fraud attempt"; + + public static final String CODE_MERCHANT_INACTIVE = "B002"; + public static final String CODE_MERCHANT_INVALID = "B003"; + + public static final String ENCRYPTION_FAILED = "Error in encrypting order request"; + + public static final String BILLER_URL = "/billers"; + public static final String MASTER_CATEGORY_URL = "/categories-master?tenantId=FE41"; + } diff --git a/src/main/java/com/billpaymentservice/bbps/util/ResponseParser.java b/src/main/java/com/billpaymentservice/bbps/util/ResponseParser.java new file mode 100644 index 0000000..daa78ad --- /dev/null +++ b/src/main/java/com/billpaymentservice/bbps/util/ResponseParser.java @@ -0,0 +1,134 @@ +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 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 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 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; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 35dd3c7..09065fd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,13 +1,17 @@ spring.application.name=bbps + +# Server port +server.port=9090 + # JPA & Hibernate spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect # DataSource -spring.datasource.url=jdbc:postgresql://localhost:5432/personalPractice +spring.datasource.url=jdbc:postgresql://localhost:5432/TestingDB spring.datasource.username=postgres -spring.datasource.password=Admin123 +spring.datasource.password=UAT@DB_2025 spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.type=com.zaxxer.hikari.HikariDataSource @@ -19,21 +23,11 @@ spring.datasource.hikari.idle-timeout=2000000 spring.datasource.hikari.max-lifetime=110000 spring.datasource.hikari.auto-commit=true -# Server port -server.port=8086 - # Logging levels logging.level.io.github.resilience4j.retry=DEBUG -# Certificate -certificate.path=D:/Switch Document/rbl_lincpay/rbl_lincpay.pfx -certificate.password=lincpay - -# NPCI URLs -npci.respPay.url=https://globalcertzone.npci.org.in:443/imps/RespPay/2.0/urn:txnid: -npci.respChkTxn.url=https://globalcertzone.npci.org.in:443/imps/RespChkTxn/2.0/urn:txnid: -npci.respValAdd.url=https://globalcertzone.npci.org.in:443/imps/RespValAdd/2.0/urn:txnid: -npci.ack.schemas=src/main/resources/schemas/imps_ack.xsd +# BBPS URLs +master.data.url = https://bbps-staging.digiledge.in/agent/cou-master/masters # Resilience4j Retry resilience4j.retry.instances.callbackService.max-attempts=1