From 7d6db124e7b62ef3a0f4d529f4e28ef05b3e5817 Mon Sep 17 00:00:00 2001 From: himanshu Date: Tue, 4 Nov 2025 02:59:38 +0530 Subject: [PATCH] added logs in masterdataserviceimpl --- .../bbps/controller/MasterDataController.java | 5 +- .../bbps/dto/DeviceDetail.java | 2 + .../bbps/dto/request/BaseClass.java | 13 +- .../bbps/dto/request/BillerDetailRequest.java | 2 +- .../bbps/entites/InboundTraceLog.java | 20 +- .../bbps/entites/OutboundTraceLog.java | 18 +- .../exception/GlobalExceptionHandler.java | 21 +- .../bbps/service/MasterDataService.java | 3 +- .../serviceImpl/MasterDataServiceImpl.java | 290 +++++++++++++----- .../billpaymentservice/bbps/util/Helper.java | 18 +- 10 files changed, 282 insertions(+), 110 deletions(-) diff --git a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java index fbde124..336ce90 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/MasterDataController.java @@ -13,6 +13,7 @@ import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.billpaymentservice.bbps.dto.request.ContactMasterRequest; import com.billpaymentservice.bbps.dto.request.CustomParamRequest; +import com.billpaymentservice.bbps.dto.request.DispositionRequest; import com.billpaymentservice.bbps.dto.request.MasterCategoryRequest; import com.billpaymentservice.bbps.dto.request.MasterRequest; import com.billpaymentservice.bbps.service.MasterDataService; @@ -52,8 +53,8 @@ public class MasterDataController { @PostMapping(value = "/getDispostionDetail", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getDispostionDetail( - @Validated @RequestBody ContactMasterRequest contactMasterRequest) { - return ResponseEntity.ok(masterDataService.getDispositionDetails()); + @Validated @RequestBody DispositionRequest dispositionDetailRequest) { + return ResponseEntity.ok(masterDataService.getDispositionDetails(dispositionDetailRequest)); } /** diff --git a/src/main/java/com/billpaymentservice/bbps/dto/DeviceDetail.java b/src/main/java/com/billpaymentservice/bbps/dto/DeviceDetail.java index a8505e6..1b2676c 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/DeviceDetail.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/DeviceDetail.java @@ -5,10 +5,12 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; @Getter @Setter @NoArgsConstructor @AllArgsConstructor +@ToString public class DeviceDetail { private List detail; diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java b/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java index 41f09ff..880ae88 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/BaseClass.java @@ -25,41 +25,30 @@ public abstract class BaseClass { @NotBlank(message = "Request ID cannot be null or blank") private String reqId; - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String txnId; - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private DeviceDetail deviceDetial; // ✅ 10 User Defined Fields (UDF1–UDF10) - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf1; @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf2; - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf3; - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf4; - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf5; - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf6; - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + private String udf7; - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf8; - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf9; - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String udf10; } diff --git a/src/main/java/com/billpaymentservice/bbps/dto/request/BillerDetailRequest.java b/src/main/java/com/billpaymentservice/bbps/dto/request/BillerDetailRequest.java index 9d2ba0d..867638c 100644 --- a/src/main/java/com/billpaymentservice/bbps/dto/request/BillerDetailRequest.java +++ b/src/main/java/com/billpaymentservice/bbps/dto/request/BillerDetailRequest.java @@ -7,7 +7,7 @@ import lombok.ToString; @Getter @Setter -@ToString +@ToString(callSuper = true) public class BillerDetailRequest extends BaseClass{ @NotNull diff --git a/src/main/java/com/billpaymentservice/bbps/entites/InboundTraceLog.java b/src/main/java/com/billpaymentservice/bbps/entites/InboundTraceLog.java index e2f92a7..15a1b3c 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/InboundTraceLog.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/InboundTraceLog.java @@ -47,11 +47,17 @@ public class InboundTraceLog { @Column(length = 255) private String remark; // error ya note - public InboundTraceLog(String requestId, String txnId, String apiName, String requestPayload) { - this.requestId = requestId; - this.txnId = txnId; - this.apiName = apiName; - this.requestPayload = requestPayload; - this.requestTime = LocalDateTime.now(); - } + + public InboundTraceLog(String requestId, String txnId, String apiName, String mid, + String orgId, String httpMethod, String requestPayload) { +this.requestId = requestId; +this.txnId = txnId; +this.apiName = apiName; +this.mid = mid; +this.orgId = orgId; +this.httpMethod = httpMethod; +this.requestPayload = requestPayload; +this.requestTime = LocalDateTime.now(); +this.createdAt = LocalDateTime.now(); +} } diff --git a/src/main/java/com/billpaymentservice/bbps/entites/OutboundTraceLog.java b/src/main/java/com/billpaymentservice/bbps/entites/OutboundTraceLog.java index 3fe1ff1..06a2088 100644 --- a/src/main/java/com/billpaymentservice/bbps/entites/OutboundTraceLog.java +++ b/src/main/java/com/billpaymentservice/bbps/entites/OutboundTraceLog.java @@ -44,11 +44,15 @@ public class OutboundTraceLog { @Column(length = 255) private String remark; - public OutboundTraceLog(String txnId, String apiName, String endpointUrl, String requestPayload) { - this.txnId = txnId; - this.apiName = apiName; - this.endpointUrl = endpointUrl; - this.requestPayload = requestPayload; - this.sendTime = LocalDateTime.now(); - } + public OutboundTraceLog(String txnId, String requestId, String apiName, + String endpointUrl, String httpMethod, String requestPayload) { +this.txnId = txnId; +this.requestId = requestId; +this.apiName = apiName; +this.endpointUrl = endpointUrl; +this.httpMethod = httpMethod; +this.requestPayload = requestPayload; +this.sendTime = LocalDateTime.now(); +this.createdAt = LocalDateTime.now(); +} } diff --git a/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java b/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java index a695c69..6007b09 100644 --- a/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/billpaymentservice/bbps/exception/GlobalExceptionHandler.java @@ -39,4 +39,23 @@ public class GlobalExceptionHandler { return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); } -} + + // ✅ NEW: Handle ALL other exceptions (Generic Handler) + @ExceptionHandler(Exception.class) + public ResponseEntity> handleAllExceptions(Exception ex) { + + // ✅ Internal logging (tumhare system ko pata chale) + System.err.println("INTERNAL SERVER ERROR: " + ex.getMessage()); + ex.printStackTrace(); // Stack trace for debugging + + // ✅ Client ko generic message + ResponseModel response = new ResponseModel<>( + "Service temporarily unavailable. Please try again later.", + "FAILED", + HttpStatus.INTERNAL_SERVER_ERROR.value(), + null + ); + + return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR); + } +} \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java b/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java index ec815bf..e4be315 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/MasterDataService.java @@ -4,6 +4,7 @@ import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.billpaymentservice.bbps.dto.request.ContactMasterRequest; import com.billpaymentservice.bbps.dto.request.CustomParamRequest; +import com.billpaymentservice.bbps.dto.request.DispositionRequest; import com.billpaymentservice.bbps.dto.request.MasterCategoryRequest; import com.billpaymentservice.bbps.dto.request.MasterRequest; import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; @@ -29,6 +30,6 @@ public interface MasterDataService { public ResponseModel fetchInitiatingChannel(BillerDetailRequest requestModel); - public ResponseModel getDispositionDetails(); + public ResponseModel getDispositionDetails(DispositionRequest dispositionDetailRequest); } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index 0c243af..f618bf6 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -1,3 +1,4 @@ +// java package com.billpaymentservice.bbps.serviceImpl; import java.time.LocalDateTime; @@ -16,6 +17,7 @@ import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.billpaymentservice.bbps.dto.request.ContactMasterRequest; import com.billpaymentservice.bbps.dto.request.CustomParamRequest; +import com.billpaymentservice.bbps.dto.request.DispositionRequest; import com.billpaymentservice.bbps.dto.request.MasterCategoryRequest; import com.billpaymentservice.bbps.dto.request.MasterRequest; import com.billpaymentservice.bbps.dto.response.AmountOptionsResponse; @@ -62,16 +64,16 @@ public class MasterDataServiceImpl implements MasterDataService { private final BillerDataRepository billerDataRespository; private static final Logger log = LoggerFactory.getLogger(MasterDataServiceImpl.class); private final HttpService httpService; + private final ObjectMapper objectMapper = new ObjectMapper(); private final InboundTraceLogRepository inboundTraceLogRepository; private final OutboundTraceLogRepository outboundTraceLogRepository; - private final ObjectMapper objectMapper = new ObjectMapper(); public MasterDataServiceImpl(MerchantRepository merchantRegisterRepo, HttpService httpService, HttpClientApi httpClientApi, Helper helper, BillerDataRepository billerDataRespository, DispositionRepository dispositionRepository, BharatConnectMasterRepository beneficiaryDetailsRepository, - InboundTraceLogRepository inboundTraceLogRepository, - OutboundTraceLogRepository outboundTraceLogRepository) { + InboundTraceLogRepository inboundTraceLogRepository, + OutboundTraceLogRepository outboundTraceLogRepository) { this.merchantRegisterRepo = merchantRegisterRepo; this.httpService = httpService; this.httpClientApi = httpClientApi; @@ -82,35 +84,84 @@ public class MasterDataServiceImpl implements MasterDataService { this.inboundTraceLogRepository = inboundTraceLogRepository; this.outboundTraceLogRepository = outboundTraceLogRepository; - } + /* ---------- Trace helper methods ---------- */ + private InboundTraceLog createInboundLog(String requestId, String txnId, String apiName, String mid, String httpMethod, String requestPayload) { + InboundTraceLog inboundLog = new InboundTraceLog(requestId, txnId, apiName, mid == null ? "N/A" : mid, "BBPS_ORG", httpMethod, requestPayload == null ? "N/A" : requestPayload); + inboundTraceLogRepository.save(inboundLog); + return inboundLog; + } + + private void updateInboundLogSuccess(InboundTraceLog inboundLog, String responsePayload, String responseCode) { + if (inboundLog == null) return; + inboundLog.setResponsePayload(responsePayload); + inboundLog.setResponseCode(responseCode); + inboundLog.setStatus("SUCCESS"); + inboundLog.setResponseTime(LocalDateTime.now()); + inboundTraceLogRepository.save(inboundLog); + } + + private void updateInboundLogFailure(InboundTraceLog inboundLog, String responsePayload, String responseCode) { + if (inboundLog == null) return; + inboundLog.setResponsePayload(responsePayload); + inboundLog.setResponseCode(responseCode); + inboundLog.setStatus("FAILED"); + inboundLog.setResponseTime(LocalDateTime.now()); + inboundTraceLogRepository.save(inboundLog); + } + + private OutboundTraceLog createOutboundLog(String txnId, String requestId, String apiName, String url, String httpMethod, String requestPayload) { + OutboundTraceLog outboundLog = new OutboundTraceLog(txnId, requestId, apiName, url, httpMethod, requestPayload == null ? "N/A" : requestPayload); + outboundTraceLogRepository.save(outboundLog); + return outboundLog; + } + + private void updateOutboundLogResponse(OutboundTraceLog outboundLog, String responsePayload) { + if (outboundLog == null) return; + outboundLog.setResponsePayload(responsePayload); + outboundLog.setResponseReceiveTime(LocalDateTime.now()); + outboundTraceLogRepository.save(outboundLog); + } + + /* ---------- End helpers ---------- */ + @Override public ResponseModel getMasterData(MasterRequest masterRequest) { LOGGER.info("Request DTO: {}", masterRequest); + String txnID = helper.generateTxnId(15); + String apiName = "GetMasterData"; + String requestId =masterRequest.getReqId(); + String requestJson = helper.convertObjectToJson(masterRequest); + + InboundTraceLog inboundLog = createInboundLog(requestId, txnID, apiName, masterRequest.getMid(), "POST", requestJson); + try { BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); log.info("ResPONSE" + headersData); if (headersData == null) { - ResponseModel responseModel = new ResponseModel("Tenant Id Is Null", "Not Found", + updateInboundLogFailure(inboundLog, "Tenant Id Is Null", "NOT_FOUND"); + return new ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, headersData); - return responseModel; } String fullUrl = masterRegisterUrl + BBPSConstant.MASTER_CATEGORY_URL + headersData.getTenantId(); LOGGER.info("Calling external API: {}", fullUrl); + OutboundTraceLog outboundLog = createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); + Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); LOGGER.info("Response Data: {}", responseData); - - ObjectMapper objectMapper = new ObjectMapper(); + + updateOutboundLogResponse(outboundLog, responseData); + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); - // ✅ Same check as in getBillerByBillerId() if (!dataMap.containsKey("generalResp")) { + updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); throw new CustomException(String.valueOf(dataMap.get("message")), // message String.valueOf(dataMap.get("status")), // status Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode @@ -124,105 +175,102 @@ public class MasterDataServiceImpl implements MasterDataService { ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; } catch (JsonProcessingException e) { log.error("Error parsing responseData JSON: {}", e.getMessage()); + updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } } @Override public ResponseModel getBillerByBillerId(BillerDetailRequest billerDetailRequest) { - String txnID = helper.generateTxnId(15); String apiName = "GetBillerByBillerId"; String requestId = billerDetailRequest.getReqId(); - String fullUrl = masterRegisterUrl + BBPSConstant.BILLER_DATA_FETCH_URL + billerDetailRequest.getBillerId(); + String billerId = billerDetailRequest.getBillerId(); + String fullUrl = masterRegisterUrl + BBPSConstant.BILLER_DATA_FETCH_URL + billerId; + + String requestJson = helper.convertObjectToJson(billerDetailRequest); + InboundTraceLog inboundLog = createInboundLog(requestId, txnID, apiName, billerDetailRequest.getMid(), "POST", requestJson); - // 🔹 Inbound Log (request received) - InboundTraceLog inboundLog = new InboundTraceLog(requestId, txnID, apiName, billerDetailRequest.toString()); - inboundTraceLogRepository.save(inboundLog); + OutboundTraceLog outboundLog = createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - // 🔹 Outbound Log (before sending external API request) - OutboundTraceLog outboundLog = new OutboundTraceLog(txnID, apiName, fullUrl, "N/A"); - outboundTraceLogRepository.save(outboundLog); - - // 🔹 Send request Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); + log.info("data is :{}", responseData); - outboundLog.setResponsePayload(responseData); - outboundLog.setResponseReceiveTime(LocalDateTime.now()); - outboundTraceLogRepository.save(outboundLog); - - // 🔹 Parse the response - ObjectMapper objectMapper = new ObjectMapper(); - Map dataMap; + updateOutboundLogResponse(outboundLog, responseData); try { - dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); - } catch (Exception e) { - // 🟥 Invalid JSON case — update inbound log before throwing - inboundLog.setResponsePayload("Invalid JSON: " + e.getMessage()); - inboundLog.setResponseCode("FAILED"); - inboundLog.setResponseTime(LocalDateTime.now()); - inboundTraceLogRepository.save(inboundLog); - throw new CustomException("Invalid JSON received from upstream", "FAILED", 400, e.getMessage()); + Map dataMap = objectMapper.readValue(responseData, + new TypeReference>() {}); + + if (!dataMap.containsKey("generalResp")) { + updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); + throw new CustomException( + String.valueOf(dataMap.get("message")), + String.valueOf(dataMap.get("status")), + Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), + String.valueOf(dataMap.get("remarks")) + ); + } + + BillerDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillerDataResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + + ModelMapper mapper = new ModelMapper(); + mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + BillerDetails entity = mapper.map(responseWrapper.getBillerDAO(), BillerDetails.class); + EntityRelationshipUtil.linkBillerRelationships(entity); + + ResponseModel responseModel = new ResponseModel( + generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper + ); + + updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + + return responseModel; + } catch (JsonProcessingException e) { + log.error("Error parsing responseData JSON: {}", e.getMessage()); + updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + throw new CustomException("Invalid JSON received from API"); } - - // 🔹 If generalResp is missing — API returned error response - if (!dataMap.containsKey("generalResp")) { - // 🟥 Update inbound log before throwing - inboundLog.setResponsePayload(responseData); - inboundLog.setResponseCode(String.valueOf(dataMap.get("status"))); - inboundLog.setResponseTime(LocalDateTime.now()); - inboundTraceLogRepository.save(inboundLog); - - throw new CustomException( - String.valueOf(dataMap.get("message")), - String.valueOf(dataMap.get("status")), - Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), - String.valueOf(dataMap.get("remarks")) - ); - } - - // 🔹 Otherwise, success flow - BillerDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillerDataResponse.class); - GeneralResp generalResp = responseWrapper.getGeneralResp(); - - inboundLog.setResponsePayload(responseData); - inboundLog.setResponseCode(generalResp.getStatus()); - inboundLog.setResponseTime(LocalDateTime.now()); - inboundTraceLogRepository.save(inboundLog); - - return new ResponseModel( - generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper - ); } - @Override public ResponseModel getCustomerParamByBillerId(CustomParamRequest customerParamRequest) { + String txnID = helper.generateTxnId(15); + String apiName = "GetCustomerParamByBillerId"; + String requestId = customerParamRequest.getReqId(); + String requestJson = helper.convertObjectToJson(customerParamRequest); + InboundTraceLog inboundLog = createInboundLog(requestId, txnID, apiName,customerParamRequest.getMid(), "POST", requestJson); + try { String billerId = customerParamRequest.getBillerId(); String fullUrl = masterRegisterUrl + BBPSConstant.CUSTOMPARAM_URL + billerId; + OutboundTraceLog outboundLog = createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); + Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); log.info("data is :{}", responseData); - ObjectMapper objectMapper = new ObjectMapper(); + updateOutboundLogResponse(outboundLog, responseData); Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); if (!dataMap.containsKey("generalResp")) { + updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); throw new CustomException(String.valueOf(dataMap.get("message")), // message String.valueOf(dataMap.get("status")), // status Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) @@ -235,9 +283,12 @@ public class MasterDataServiceImpl implements MasterDataService { ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; } catch (JsonProcessingException e) { log.error("Error parsing responseData JSON: {}", e.getMessage()); + updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -245,7 +296,17 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel getContactMaster(ContactMasterRequest contactMasterRequest) { - + /* + * String txnID = helper.generateTxnId(15); String apiName = "GetContactMaster"; + * String requestId = contactMasterRequest != null ? + * contactMasterRequest.getReqId() : "N/A"; String requestJson = + * helper.convertObjectToJson(contactMasterRequest); InboundTraceLog inboundLog + * = createInboundLog(requestId, txnID, apiName, contactMasterRequest != null ? + * contactMasterRequest.getMid() : "N/A", "POST", requestJson); + * + * // Implementation not present previously - create inbound log and return + * empty response updateInboundLogSuccess(inboundLog, "N/A", "SUCCESS"); + */ return new ResponseModel(); } @@ -253,12 +314,19 @@ public class MasterDataServiceImpl implements MasterDataService { public ResponseModel fetchMasterDataCategoryWise(MasterCategoryRequest masterRequest) { LOGGER.info("Fetching Master Data Category-wise " + masterRequest); + String txnID = helper.generateTxnId(15); + String apiName = "FetchMasterDataCategoryWise"; + String requestId = masterRequest.getReqId(); + String requestJson = helper.convertObjectToJson(masterRequest); + InboundTraceLog inboundLog = createInboundLog(requestId, txnID, apiName,masterRequest.getMid(), "POST", requestJson); + try { String validateMerchant = helper.validateMerchant(masterRequest); if (!"Valid".equalsIgnoreCase(validateMerchant)) { LOGGER.warn("Merchant validation failed: {}", validateMerchant); + updateInboundLogFailure(inboundLog, validateMerchant, "INVALID_MERCHANT"); return new ResponseModel("Merchant validation failed", validateMerchant, BBPSConstant.BADREQUEST, null); } @@ -266,18 +334,20 @@ public class MasterDataServiceImpl implements MasterDataService { BBPSConstant.BILLER_URL, masterRequest.getBillerName(), masterRequest.getCategory(), masterRequest.getPageStart(), masterRequest.getPageEnd()); + OutboundTraceLog outboundLog = createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); + Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); LOGGER.info("Response Data: {}", responseData); - ObjectMapper objectMapper = new ObjectMapper(); + updateOutboundLogResponse(outboundLog, responseData); Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); - // ✅ Same check as in getBillerByBillerId() if (!dataMap.containsKey("generalResp")) { + updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); throw new CustomException(String.valueOf(dataMap.get("message")), // message String.valueOf(dataMap.get("status")), // status Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode @@ -291,27 +361,36 @@ public class MasterDataServiceImpl implements MasterDataService { ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; } catch (JsonProcessingException e) { log.error("Error parsing responseData JSON: {}", e.getMessage()); + updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } - } @Override - public ResponseModel getDispositionDetails() { + public ResponseModel getDispositionDetails(DispositionRequest dispositionDetailRequest) { + String txnID = helper.generateTxnId(15); + String apiName = "GetDispositionDetails"; + String requestId = dispositionDetailRequest.getReqId();; + InboundTraceLog inboundLog = createInboundLog(requestId, txnID, apiName,dispositionDetailRequest.getMid() , "GET", "N/A"); + String fullUrl = masterRegisterUrl + BBPSConstant.DISPOSTION_URL; + OutboundTraceLog outboundLog = createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); Map responseMap = httpService.getRequest(fullUrl); String responseData = responseMap.get("data"); - ObjectMapper objectMapper = new ObjectMapper(); + updateOutboundLogResponse(outboundLog, responseData); try { Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); if (!dataMap.containsKey("generalResp")) { + updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); throw new CustomException(String.valueOf(dataMap.get("message")), // message String.valueOf(dataMap.get("status")), // status Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) @@ -337,37 +416,48 @@ public class MasterDataServiceImpl implements MasterDataService { ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; } catch (JsonProcessingException e) { log.error("Error parsing responseData JSON: {}", e.getMessage()); + updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } - } @Override public ResponseModel fetchCustomerParamGroup(BillerDetailRequest requestModel) { LOGGER.info("Fetching Master Data Category-wise for MID={}", requestModel.getMid()); + String txnID = helper.generateTxnId(15); + String apiName = "FetchCustomerParamGroup"; + String requestId = requestModel.getReqId(); + InboundTraceLog inboundLog = createInboundLog(requestId, txnID, apiName,requestModel.getMid() , "POST", helper.convertObjectToJson(requestModel)); + try { String validateMerchant = helper.validateMerchant(requestModel); if (!"Valid".equalsIgnoreCase(validateMerchant)) { LOGGER.warn("Merchant validation failed: {}", validateMerchant); + updateInboundLogFailure(inboundLog, validateMerchant, "INVALID_MERCHANT"); return new ResponseModel("Merchant validation failed", validateMerchant, BBPSConstant.BADREQUEST, null); } String fullUrl = masterRegisterUrl + BBPSConstant.CUSTOMER_PARAM_GROUP + requestModel.getBillerId(); - // LOGGER.info("Calling Master API: {}", fullUrl); + OutboundTraceLog outboundLog = createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); Map apiResponse = httpService.getRequest(fullUrl); String responseData = apiResponse.get("data").toString(); + updateOutboundLogResponse(outboundLog, responseData); + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); if (!dataMap.containsKey("generalResp")) { + updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); throw new CustomException(String.valueOf(dataMap.get("message")), // message String.valueOf(dataMap.get("status")), // status Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) @@ -381,10 +471,13 @@ public class MasterDataServiceImpl implements MasterDataService { ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; } catch (JsonProcessingException e) { log.error("Error parsing responseData JSON: {}", e.getMessage()); + updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } @@ -393,26 +486,36 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel fetchAllMasterAmountOption(BillerDetailRequest requestModel) { LOGGER.info("Fetching Master Data Amount List for MID={}", requestModel.getMid()); + + String txnID = helper.generateTxnId(15); + String apiName = "FetchAllMasterAmountOption"; + String requestId = requestModel.getReqId(); + InboundTraceLog inboundLog = createInboundLog(requestId, txnID, apiName, requestModel.getMid(), "POST", helper.convertObjectToJson(requestModel)); + try { String validateMerchant = helper.validateMerchant(requestModel); if (!"Valid".equalsIgnoreCase(validateMerchant)) { LOGGER.warn("Merchant validation failed: {}", validateMerchant); + updateInboundLogFailure(inboundLog, validateMerchant, "INVALID_MERCHANT"); return new ResponseModel("Merchant validation failed", validateMerchant, BBPSConstant.BADREQUEST, null); } String fullUrl = masterRegisterUrl + BBPSConstant.AMOUNT_OPTIONS + requestModel.getBillerId(); - // LOGGER.info("Calling Master API: {}", fullUrl); + OutboundTraceLog outboundLog = createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); Map apiResponse = httpService.getRequest(fullUrl); log.info("Response" + apiResponse); String responseData = apiResponse.get("data").toString(); + updateOutboundLogResponse(outboundLog, responseData); + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); if (!dataMap.containsKey("generalResp")) { + updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); throw new CustomException(String.valueOf(dataMap.get("message")), // message String.valueOf(dataMap.get("status")), // status Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) @@ -425,10 +528,13 @@ public class MasterDataServiceImpl implements MasterDataService { ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; } catch (JsonProcessingException e) { log.error("Error parsing responseData JSON: {}", e.getMessage()); + updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } catch (CustomException e) { LOGGER.error("Custom Exception: {}", e.getMessage()); @@ -439,26 +545,36 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel fetchPlanCategorie(BillerDetailRequest requestModel) { LOGGER.info("Fetching Master Data Amount List for MID={}", requestModel.getMid()); + + String txnID = helper.generateTxnId(15); + String apiName = "FetchPlanCategorie"; + String requestId = requestModel.getReqId(); + InboundTraceLog inboundLog = createInboundLog(requestId, txnID, apiName, requestModel.getMid() , "POST", helper.convertObjectToJson(requestModel)); + try { String validateMerchant = helper.validateMerchant(requestModel); if (!"Valid".equalsIgnoreCase(validateMerchant)) { LOGGER.warn("Merchant validation failed: {}", validateMerchant); + updateInboundLogFailure(inboundLog, validateMerchant, "INVALID_MERCHANT"); return new ResponseModel("Merchant validation failed", validateMerchant, BBPSConstant.BADREQUEST, null); } String fullUrl = masterRegisterUrl + BBPSConstant.PLAN_CATEGORIES + requestModel.getBillerId(); - // LOGGER.info("Calling Master API: {}", fullUrl); + OutboundTraceLog outboundLog = createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); Map apiResponse = httpService.getRequest(fullUrl); log.info("Response" + apiResponse); String responseData = apiResponse.get("data").toString(); + updateOutboundLogResponse(outboundLog, responseData); + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); if (!dataMap.containsKey("generalResp")) { + updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); throw new CustomException(String.valueOf(dataMap.get("message")), // message String.valueOf(dataMap.get("status")), // status Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) @@ -471,10 +587,13 @@ public class MasterDataServiceImpl implements MasterDataService { ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; } catch (JsonProcessingException e) { log.error("Error parsing responseData JSON: {}", e.getMessage()); + updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } catch (CustomException e) { LOGGER.error("Custom Exception: {}", e.getMessage()); @@ -485,26 +604,38 @@ public class MasterDataServiceImpl implements MasterDataService { @Override public ResponseModel fetchInitiatingChannel(BillerDetailRequest requestModel) { LOGGER.info("Fetching Initiating Channel List for MID={}", requestModel.getMid()); + + String txnID = helper.generateTxnId(15); + String apiName = "FetchInitiatingChannel"; + String requestId =requestModel.getReqId(); + InboundTraceLog inboundLog = createInboundLog(requestId, txnID, apiName, requestModel.getMid(), "POST", helper.convertObjectToJson(requestModel)); + try { String validateMerchant = helper.validateMerchant(requestModel); if (!"Valid".equalsIgnoreCase(validateMerchant)) { LOGGER.warn("Merchant validation failed: {}", validateMerchant); + updateInboundLogFailure(inboundLog, validateMerchant, "INVALID_MERCHANT"); return new ResponseModel("Merchant validation failed", validateMerchant, BBPSConstant.BADREQUEST, null); } String fullUrl = masterRegisterUrl + BBPSConstant.INITIATING_CHANNEL; LOGGER.info("Calling Master API: {}", fullUrl); + OutboundTraceLog outboundLog = createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); + Map apiResponse = httpService.getRequest(fullUrl); log.info("Response" + apiResponse); String responseData = apiResponse.get("data").toString(); + updateOutboundLogResponse(outboundLog, responseData); + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); if (!dataMap.containsKey("generalResp")) { + updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); throw new CustomException(String.valueOf(dataMap.get("message")), // message String.valueOf(dataMap.get("status")), // status Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode (int) @@ -517,10 +648,13 @@ public class MasterDataServiceImpl implements MasterDataService { ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); + updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; } catch (JsonProcessingException e) { log.error("Error parsing responseData JSON: {}", e.getMessage()); + updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } catch (CustomException e) { LOGGER.error("Custom Exception: {}", e.getMessage()); diff --git a/src/main/java/com/billpaymentservice/bbps/util/Helper.java b/src/main/java/com/billpaymentservice/bbps/util/Helper.java index c52096a..0ad1b43 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/Helper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/Helper.java @@ -9,10 +9,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.billpaymentservice.bbps.dto.ResponseModel; +import com.billpaymentservice.bbps.dto.request.BillerDetailRequest; import com.billpaymentservice.bbps.dto.request.MerchantRequestModel; import com.billpaymentservice.bbps.entites.BBPSMerchantValidation; import com.billpaymentservice.bbps.exception.CustomException; import com.billpaymentservice.bbps.repository.MerchantRepository; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; @Component @@ -23,6 +26,8 @@ public class Helper { private static final String CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; private static final SecureRandom secureRandom = new SecureRandom(); + private final ObjectMapper objectMapper = new ObjectMapper(); + @Autowired private MerchantRepository merchantRegisterRepo; @@ -125,4 +130,15 @@ public class Helper { } return sb.toString(); // Prefix } -} + public String convertObjectToJson(Object obj) { + if (obj == null) return "null"; + try { + return new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(obj); + } catch (com.fasterxml.jackson.core.JsonProcessingException e) { + // log appropriately (use your existing logger) + System.err.println("JSON conversion failed: " + e.getMessage()); + return "{}"; // or "N/A" depending on your needs + } + } + +} \ No newline at end of file