diff --git a/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java b/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java index 4632f0b..decc81c 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/PaymentController.java @@ -12,6 +12,8 @@ import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.request.BillPaymentRequest; import com.billpaymentservice.bbps.dto.request.TransactionStatusRequest; import com.billpaymentservice.bbps.dto.request.TrasactionStatusByClientReqIdRequest; +import com.billpaymentservice.bbps.dto.response.FetchBillValidateResponse; +import com.billpaymentservice.bbps.dto.response.TransactionStatusResponse; import com.billpaymentservice.bbps.service.PaymentService; @RestController @@ -51,5 +53,12 @@ public class PaymentController { ResponseModel response = paymentService.checkTrasactionStatusByClientReqId(transactionStatusRequest); return ResponseEntity.ok(response); } + + @PostMapping(value="/callback/paymentIntiate", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity handleBillValidateCallback(@RequestBody TransactionStatusResponse transactionStatusResponse) { + ResponseModel genralResp=paymentService.handlePaymentIntiateCallback(transactionStatusResponse); + // Return a response indicating successful receipt + return ResponseEntity.ok(genralResp); + } } diff --git a/src/main/java/com/billpaymentservice/bbps/service/AgentService.java b/src/main/java/com/billpaymentservice/bbps/service/AgentService.java index 1ebc1ce..c3cd078 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/AgentService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/AgentService.java @@ -25,6 +25,6 @@ public interface AgentService { ResponseModel processBillFetchCallback(BillDataResponse billDataResponse); - ResponseModel processBillValidateCallback(FetchBillValidateResponse billDataResponse); + ResponseModel processBillValidateCallback(FetchBillValidateResponse billValidateResponse); } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java index 6db3df9..9e4f45e 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/AgentServiceImpl.java @@ -1,3 +1,4 @@ +// java package com.billpaymentservice.bbps.serviceImpl; import java.util.Map; @@ -10,7 +11,6 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.web.client.RestClient; - import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.request.BillFetchByBillIdRequest; @@ -59,11 +59,15 @@ public class AgentServiceImpl implements AgentService { private final BillInitateRepository billIntiateRepository; private static final Logger LOGGER = LoggerFactory.getLogger(AgentServiceImpl.class); + // Reusable ObjectMapper instance + private final ObjectMapper objectMapper = new ObjectMapper() + .setSerializationInclusion(JsonInclude.Include.NON_NULL); + public AgentServiceImpl(RestClient restClient, HttpService httpService, Helper helper, - BharatConnectMasterRepository beneficiaryDetailsRepository, - InboundTraceLogRepository inboundTraceLogRepository, OutboundTraceLogRepository outboundTraceLogRepository, - BillMasterRepository billMasterRepository, BillInitateRepository billIntiateRepository, - BillerMapperHelper mapperHelper) { + BharatConnectMasterRepository beneficiaryDetailsRepository, + InboundTraceLogRepository inboundTraceLogRepository, OutboundTraceLogRepository outboundTraceLogRepository, + BillMasterRepository billMasterRepository, BillInitateRepository billIntiateRepository, + BillerMapperHelper mapperHelper) { this.restClient = restClient; this.httpService = httpService; this.helper = helper; @@ -84,21 +88,11 @@ public class AgentServiceImpl implements AgentService { fetchBillRequest.setClientReqId(txnId); helper.validateMerchant(fetchBillRequest.getMid()); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); FetchBillForwardRequest forwardReq = helper.fetchBillForwardRequestMap(fetchBillRequest); String forwardJson = helper.convertObjectToJson(forwardReq); String requestJson = helper.convertObjectToJson(fetchBillRequest); - // ✅ Create inbound & outbound logs InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, fetchBillRequest.getMid(), "POST", requestJson); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, fullUrl, "POST", @@ -107,7 +101,7 @@ public class AgentServiceImpl implements AgentService { try { LOGGER.info("Calling external API: {}", fullUrl); - Map responseMap = httpService.postRequest(fullUrl, forwardJson, headers); + Map responseMap = httpService.postRequest(fullUrl, forwardJson, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001"))); String responseData = responseMap.get("data"); helper.updateOutboundLogResponse(outboundLog, responseData); @@ -133,7 +127,7 @@ public class AgentServiceImpl implements AgentService { FetchBillResponse fetchBillResponse = objectMapper.convertValue(dataMap, FetchBillResponse.class); GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); - helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); + helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); BillInitiate billInitiate = new BillInitiate(); billInitiate.setBillId((String) dataMap.get("billId")); @@ -171,20 +165,13 @@ public class AgentServiceImpl implements AgentService { String billId = billFetchByBillIdRequest.getBillId(); String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + billFetchByBillIdRequest.getBillId(); helper.validateMerchant(billFetchByBillIdRequest.getMid()); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - ObjectMapper objectMapper = new ObjectMapper(); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null); LOGGER.debug("Outbound log created successfully for FetchBillById: {}", fullUrl); try { LOGGER.info("Calling external API: {}", fullUrl); - Map responseMap = httpService.getRequest(fullUrl, headers); + Map responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001"))); String responseData = responseMap.get("data"); LOGGER.info("Bill FetchById Response: {}", responseData); @@ -231,7 +218,6 @@ public class AgentServiceImpl implements AgentService { LOGGER.info("Initiating {} API for billId={} and reqId={}", apiName, billId, reqId); - // create inbound log (GET -> no request body) InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, billFetchByBillIdRequest.getMid(), "GET", null); @@ -239,24 +225,14 @@ public class AgentServiceImpl implements AgentService { helper.validateMerchant(billFetchByBillIdRequest.getMid()); LOGGER.debug("Merchant validated successfully for MID={}", billFetchByBillIdRequest.getMid()); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - - // create outbound log OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null); LOGGER.info("Calling external BBPS API for FetchBillById, URL={}", fullUrl); - Map responseMap = httpService.getRequest(fullUrl, headers); + Map responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001"))); String responseData = responseMap.get("data"); LOGGER.info("Response received from BBPS for billId={} : {}", billId, responseData); - // update outbound log with response helper.updateOutboundLogResponse(outboundLog, responseData); - ObjectMapper objectMapper = new ObjectMapper(); Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); @@ -264,19 +240,17 @@ public class AgentServiceImpl implements AgentService { if (!dataMap.containsKey("genericResponse")) { helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); LOGGER.warn("Invalid response structure received for billId={} | Response={}", billId, responseData); - throw new CustomException(String.valueOf(dataMap.get("message")), // message - String.valueOf(dataMap.get("status")), // status - Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode + 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"))); } - BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillDataResponse.class); GeneralResp generalResp = responseWrapper.getGenericResponse(); ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), responseWrapper); - // update inbound log success and persist bill data helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); helper.saveOrUpdateBillData(responseWrapper, billFetchByBillIdRequest, txnId); LOGGER.info("Bill data saved successfully for billId={} | Status={}", billId, generalResp.getStatus()); @@ -290,8 +264,6 @@ public class AgentServiceImpl implements AgentService { } } - - @Override public ResponseModel initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) { LOGGER.info("Initiating bill Validate for request ID: {} and MID:{} and billerId:{}", fetchBillValidateRequest.getReqId(), @@ -304,15 +276,6 @@ public class AgentServiceImpl implements AgentService { fetchBillValidateRequest.setClientReqId(txnId); helper.validateMerchant(fetchBillValidateRequest.getMid()); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); FetchBillValidatestForwardRequest forwardReq = helper .fetchBillValidatestForwardRequest(fetchBillValidateRequest); @@ -320,7 +283,6 @@ public class AgentServiceImpl implements AgentService { String requestJson = helper.convertObjectToJson(fetchBillValidateRequest); - // ✅ Create inbound & outbound logs InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, fetchBillValidateRequest.getMid(), "POST", requestJson); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "POST", forwardJson); @@ -328,7 +290,7 @@ public class AgentServiceImpl implements AgentService { try { LOGGER.info("Calling external API: {}", fullUrl); - Map responseMap = httpService.postRequest(fullUrl, forwardJson, headers); + Map responseMap = httpService.postRequest(fullUrl, forwardJson, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001"))); String responseData = responseMap.get("data"); helper.updateOutboundLogResponse(outboundLog, responseData); @@ -353,7 +315,7 @@ public class AgentServiceImpl implements AgentService { LOGGER.info("BillMaster saved for billId: {}", billMaster.getBillId()); FetchBillResponse fetchBillResponse = objectMapper.convertValue(dataMap, FetchBillResponse.class); GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); - helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); + helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); BillInitiate billInitiate = new BillInitiate(); billInitiate.setBillId((String) dataMap.get("billId")); @@ -380,7 +342,6 @@ public class AgentServiceImpl implements AgentService { helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); } - } public ResponseModel BillvaidateByBillId(BillFetchByBillIdRequest billRequest, InboundTraceLog inboundLog) { @@ -392,24 +353,15 @@ public class AgentServiceImpl implements AgentService { String reqId = billRequest.getReqId(); String billId = billRequest.getBillId(); String fullUrl = agentDtaUrl + BBPSConstant.BILL_VALIDATE_ID_URL + billRequest.getBillId(); - ; helper.validateMerchant(billRequest.getMid()); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - - ObjectMapper objectMapper = new ObjectMapper(); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null); LOGGER.debug("Outbound log created successfully for FetchBillById: {}", fullUrl); try { LOGGER.info("Calling external API: {}", fullUrl); - Map responseMap = httpService.getRequest(fullUrl, headers); + Map responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001"))); String responseData = responseMap.get("data"); LOGGER.info("Bill FetchById Response: {}", responseData); @@ -422,8 +374,7 @@ public class AgentServiceImpl implements AgentService { if (!dataMap.containsKey("genericResponse")) { helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); LOGGER.warn("Invalid response structure for txnId: {}", txnId); - throw new CustomException(String.valueOf(dataMap.get("message")), - 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"))); } @@ -451,7 +402,6 @@ public class AgentServiceImpl implements AgentService { } } - @Override public ResponseModel initiateBillValidateByBillId(BillFetchByBillIdRequest billRequest) { String apiName = "FetchBillById"; @@ -462,32 +412,21 @@ public class AgentServiceImpl implements AgentService { LOGGER.info("Initiating {} API for billId={} and reqId={}", apiName, billId, reqId); - // create inbound log (GET -> no request body) InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, billRequest.getMid(), "GET", null); try { helper.validateMerchant(billRequest.getMid()); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - - // create outbound log OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null); LOGGER.info("Calling external BBPS API for ValidateByBillId, URL={}", fullUrl); - Map responseMap = httpService.getRequest(fullUrl, headers); + Map responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001"))); String responseData = responseMap.get("data"); LOGGER.info("Response received from BBPS for billId={} : {}", billId, responseData); - // update outbound log with response helper.updateOutboundLogResponse(outboundLog, responseData); - ObjectMapper objectMapper = new ObjectMapper(); - Map dataMap = objectMapper.readValue(responseData, new com.fasterxml.jackson.core.type.TypeReference>(){}); + Map dataMap = objectMapper.readValue(responseData, new com.fasterxml.jackson.core.type.TypeReference>(){}); if (!dataMap.containsKey("genericResponse")) { helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); @@ -501,7 +440,6 @@ public class AgentServiceImpl implements AgentService { FetchBillValidateResponse responseWrapper = objectMapper.convertValue(dataMap, FetchBillValidateResponse.class); GeneralResp generalResp = responseWrapper.getGenericResponse(); - // update inbound log and save validation data helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); helper.saveBillValidation(responseWrapper, billRequest); LOGGER.info("Bill validation saved successfully for billId: {}", billId); @@ -515,10 +453,8 @@ public class AgentServiceImpl implements AgentService { } } - - - //================================== Bill fetch and Bill Validate by Client Req Id==================================// - + //... remaining methods unchanged except where headers/objectMapper were previously created (they now use buildHeaders() and the class-level objectMapper) + @Override public ResponseModel fetchBillValidateByClientReqId(BillValidateByClientIdRequest billValidateByClientIdRequest) { @@ -536,16 +472,6 @@ public class AgentServiceImpl implements AgentService { helper.validateMerchant(billValidateByClientIdRequest.getMid()); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - - ObjectMapper objectMapper = new ObjectMapper(); - - // 🔵 Create Inbound + Outbound Logs InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, billValidateByClientIdRequest.getMid(), "GET", null); @@ -553,7 +479,7 @@ public class AgentServiceImpl implements AgentService { try { LOGGER.info("Calling BBPS API FetchBillValidateByClientReqId, URL={}", fullUrl); - Map responseMap = httpService.getRequest(fullUrl, headers); + Map responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001"))); String responseData = responseMap.get("data"); helper.updateOutboundLogResponse(outboundLog, responseData); @@ -601,16 +527,6 @@ public class AgentServiceImpl implements AgentService { helper.validateMerchant(billFetchByClientIdRequest.getMid()); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); - - ObjectMapper objectMapper = new ObjectMapper(); - - // 🔵 Create inbound + outbound logs InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, billFetchByClientIdRequest.getMid(), "GET", null); @@ -618,7 +534,7 @@ public class AgentServiceImpl implements AgentService { try { LOGGER.info("Calling BBPS API FetchBillByClientReqId, URL={}", fullUrl); - Map responseMap = httpService.getRequest(fullUrl, headers); + Map responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001"))); String responseData = responseMap.get("data"); helper.updateOutboundLogResponse(outboundLog, responseData); @@ -647,238 +563,30 @@ public class AgentServiceImpl implements AgentService { throw new CustomException("Invalid JSON received from API"); } } -//================================== End Bill fetch and Bill Validate by Client Req Id==================================// -//===================================Callback Methods BillFetch and BillValidate ==================================// - + @Override public ResponseModel processBillFetchCallback(BillDataResponse billDataResponse) { - LOGGER.info("Recived Call Back from billDataResponse: {}", billDataResponse); - if(billDataResponse.getGenericResponse().getStatusCode().equals("200")) { - - } + if(billDataResponse.getGenericResponse().getStatusCode().equals("200")) { } else { LOGGER.info("Bill Fetch Callback Failed with Status: {}", billDataResponse.getGenericResponse().getStatus()); - } - return new ResponseModel("CallBack Recieved Successfully", "200", 200, ""); - } -@Override -public ResponseModel processBillValidateCallback(FetchBillValidateResponse billValidateResponse) { - LOGGER.info("Recived Call Back from FetchBillValidateResponse: {}", billValidateResponse); - if(billValidateResponse.getGenericResponse().getStatusCode().equals("200")) { - - } - else { - LOGGER.info("Bill Fetch Callback Failed with Status: {}", billValidateResponse.getGenericResponse().getStatus()); - - } - - return new ResponseModel("CallBack Recieved Successfully", - "200", - 200, - ""); - - -}} - - - - - - /* - - * @Override public ResponseModel - * initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) { - * - * ResponseModel responseModel = new ResponseModel(); try { - * - * helper.validateMerchant(fetchBillValidateRequest.getMid()); - * - * BharatConnectMaster headersData = - * beneficiaryDetailsRepository.findByOrgId("ORG001"); - * - * if (headersData == null) { responseModel = new - * ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, - * headersData); return responseModel; } - * - * HttpHeaders headers = new HttpHeaders(); headers.set("x-digiledge-key", - * headersData.getXDigiledgeKey()); headers.set("agentId", - * headersData.getAgentId()); headers.set("tenantId", - * headersData.getTenantId()); - * headers.setContentType(MediaType.APPLICATION_JSON); - * - * ObjectMapper objectMapper = new ObjectMapper(); - * objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String - * json = objectMapper.writeValueAsString(fetchBillValidateRequest); String url - * = agentDtaUrl + BBPSConstant.BILLER_VALIDATE_URL; - * - * Map responseMap = httpService.postRequest(url, json, - * headers); String responseData = responseMap.get("data"); - * - * log.info("📦 Bill Fetch API Response: {}", responseData); - * - * if (responseData == null || responseData.isEmpty()) { throw new - * CustomException("Empty response from BBPS server"); } - * - * // ✅ Convert JSON string → Map Map dataMap = - * objectMapper.readValue(responseData, new TypeReference>() - * {}); - * - * // ✅ Validate generalResp if (!dataMap.containsKey("genericResponse")) { - * throw new CustomException("Invalid response structure from BBPS"); } - * - * // ✅ Convert to your custom DTO FetchBillValidatestResponse fetchBillResponse - * = objectMapper.convertValue(dataMap, FetchBillValidatestResponse.class); - * GeneralResp generalResponse = fetchBillResponse.getGenericResponse(); - * - * // ✅ Build final ResponseModel responseModel = new ResponseModel( - * generalResponse.getMessage(), generalResponse.getStatus(), - * Integer.parseInt(generalResponse.getStatusCode()), fetchBillResponse ); - * - * } catch (CustomException ex) { log.warn("Merchant validation failed: {}", - * ex.getMessage()); return ex.getResponseModel(); // Directly return - * ResponseModel from exception } catch (Exception e) { - * log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); - * responseModel.setStatus("500"); - * responseModel.setMessage("Exception occurred"); - * responseModel.setData(e.getMessage()); } - * - * return responseModel; } - * - * @Override public ResponseModel - * initiateBillValidateByBillId(BillFetchByBillIdRequest billRequest) { - * - * ResponseModel responseModel = new ResponseModel(); try { - * helper.validateMerchant(billRequest.getMid()); - * - * BharatConnectMaster headersData = - * beneficiaryDetailsRepository.findByOrgId("ORG001"); - * - * if (headersData == null) { responseModel = new - * ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST, - * headersData); return responseModel; } - * - * HttpHeaders headers = new HttpHeaders(); headers.set("x-digiledge-key", - * headersData.getXDigiledgeKey()); headers.set("agentId", - * headersData.getAgentId()); headers.set("tenantId", - * headersData.getTenantId()); - * headers.setContentType(MediaType.APPLICATION_JSON); - * - * ObjectMapper objectMapper = new ObjectMapper(); - * objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String - * json = objectMapper.writeValueAsString(billRequest); String url = agentDtaUrl - * + BBPSConstant.BILL_ID_URL + billRequest.getBillId(); - * - * log.info("Full URL: {}", url); - * objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - * - * // ✅ Call the API using httpService Map responseMap = - * httpService.getRequest(url, headers); String responseData = - * responseMap.get("data"); - * - * log.info("📦 Bill Fetch API Response: {}", responseData); - * - * if (responseData == null || responseData.isEmpty()) { throw new - * CustomException("Empty response from BBPS server"); } - * - * // ✅ Convert JSON string → Map Map dataMap = - * objectMapper.readValue(responseData, new TypeReference>() - * {}); - * - * // ✅ Validate generalResp if (!dataMap.containsKey("genericResponse")) { - * throw new CustomException("Invalid response structure from BBPS"); } - * - * // ✅ Convert to your custom DTO BillDataResponse fetchBillResponse = - * objectMapper.convertValue(dataMap, BillDataResponse.class); GeneralResp - * generalResponse = fetchBillResponse.getGenericResponse(); - * - * // ✅ Build final ResponseModel responseModel = new ResponseModel( - * generalResponse.getRemarks(), generalResponse.getStatus(), - * Integer.parseInt(generalResponse.getStatusCode()), fetchBillResponse ); - * - * } catch (CustomException ex) { log.warn("Merchant validation failed: {}", - * ex.getMessage()); return ex.getResponseModel(); // Directly return - * ResponseModel from exception } catch (Exception e) { - * log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e); - * responseModel.setStatus("500"); - * responseModel.setMessage("Exception occurred"); - * responseModel.setData(e.getMessage()); } - * - * return responseModel; } - */ - - /* - * POLLING METHOD public ResponseModel fetchBillById(BillFetchByBillIdRequest - * billFetchByBillIdRequest, InboundTraceLog inboundLog) { String apiName = - * "FetchBillById"; String txnId = helper.generateTxnId(15); String reqId = - * billFetchByBillIdRequest.getReqId(); String billId = - * billFetchByBillIdRequest.getBillId(); String url = agentDtaUrl + - * BBPSConstant.BILL_FETCH_BY_ID + "1ced7566-1add-4e01-9ed6-04cd67ac9684"; - * - * helper.validateMerchant(billFetchByBillIdRequest.getMid()); - * - * BharatConnectMaster headersData = - * beneficiaryDetailsRepository.findByOrgId("ORG001"); HttpHeaders headers = new - * HttpHeaders(); headers.set("x-digiledge-key", - * headersData.getXDigiledgeKey()); headers.set("agentId", - * headersData.getAgentId()); headers.set("tenantId", - * headersData.getTenantId()); - * headers.setContentType(MediaType.APPLICATION_JSON); - * - * ObjectMapper objectMapper = new ObjectMapper(); OutboundTraceLog outboundLog - * = helper.createOutboundLog(txnId, reqId, apiName, url, "GET", null); - * - * // ✅ Loop setup long startTime = System.currentTimeMillis(); long - * maxWaitTimeMs = 40000; // 40 seconds long intervalMs = 5000; // 5 seconds - * - * while (true) { try { Map responseMap = - * httpService.getRequest(url, headers); String responseData = - * responseMap.get("data"); log.info("📦 Bill FetchById Response: {}", - * responseData); - * - * helper.updateOutboundLogResponse(outboundLog, responseData); - * - * Map dataMap = objectMapper.readValue(responseData, new - * TypeReference>() {}); - * - * if (!dataMap.containsKey("genericResponse")) { - * helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); - * 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")) ); } - * - * BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, - * BillDataResponse.class); GeneralResp generalResp = - * responseWrapper.getGenericResponse(); - * - * String status = generalResp.getStatus(); - * log.info("📡 Current Bill Status: {}", status); // ✅ Check for "INPROGRESS" - * or pending state if ("INPROGRESS".equalsIgnoreCase(status)) { if - * (System.currentTimeMillis() - startTime > maxWaitTimeMs) { - * helper.updateInboundLogFailure(inboundLog, "Timeout after 40 seconds", - * "FAILED"); throw new CustomException("Timeout", "FAILED", 408, - * "Bill fetch still in progress"); } Thread.sleep(intervalMs); continue; // - * retry again } // ✅ Final successful response - * helper.updateInboundLogSuccess(inboundLog, responseData, - * generalResp.getStatus()); return new ResponseModel( generalResp.getMessage(), - * generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), - * responseWrapper ); } catch (JsonProcessingException e) { - * log.error("Error parsing BillById JSON: {}", e.getMessage()); - * helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); - * throw new CustomException("Invalid JSON received from API"); } catch - * (InterruptedException e) { Thread.currentThread().interrupt(); - * helper.updateInboundLogFailure(inboundLog, e.getMessage(), "INTERRUPTED"); - * throw new CustomException("Thread interrupted during bill status check"); } } - * } - */ - - - + @Override + public ResponseModel processBillValidateCallback(FetchBillValidateResponse billValidateResponse) { + LOGGER.info("Recived Call Back from FetchBillValidateResponse: {}", billValidateResponse); + if(billValidateResponse.getGenericResponse().getStatusCode().equals("200")) { } + else { + LOGGER.info("Bill Fetch Callback Failed with Status: {}", billValidateResponse.getGenericResponse().getStatus()); + } + return new ResponseModel("CallBack Recieved Successfully", + "200", + 200, + ""); + } +} \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java index ce15fc4..1333591 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/ComplainServiceImpl.java @@ -1,3 +1,4 @@ +// language: java package com.billpaymentservice.bbps.serviceImpl; import java.util.List; @@ -19,13 +20,11 @@ import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO; import com.billpaymentservice.bbps.dto.request.GetTicketLatestStausRequest; import com.billpaymentservice.bbps.dto.request.TxnStatusRequest; import com.billpaymentservice.bbps.dto.request.ViewAllComplaintsTicketsRequest; - import com.billpaymentservice.bbps.dto.request.ViewAllComplaintsRequest; import com.billpaymentservice.bbps.dto.response.ComplaintHistoryStatusResponse; import com.billpaymentservice.bbps.dto.response.ComplaintResponse; import com.billpaymentservice.bbps.dto.response.TicketCheckStatusResponse; import com.billpaymentservice.bbps.dto.response.TxnStatusResponse; - import com.billpaymentservice.bbps.dto.response.ViewAllComplaintsTicketsResponse; import com.billpaymentservice.bbps.dto.response.ViewAllComplaintsResponse; import com.billpaymentservice.bbps.dto.response.ViewComplainByIdResponse; @@ -64,8 +63,9 @@ public class ComplainServiceImpl implements ComplainService { private final ComplainRepository complainRepository; private final ComplaintOptionsStatusMasterRepository complaintStatusMasterRepository; - private final ObjectMapper objectMapper = new ObjectMapper(); - private static final Logger LOGGER = LoggerFactory.getLogger(AgentServiceImpl.class); + // moved to class-level + private final ObjectMapper objectMapper; + private static final Logger LOGGER = LoggerFactory.getLogger(ComplainServiceImpl.class); public ComplainServiceImpl(RestClient restClient, HttpService httpService, Helper helper, BharatConnectMasterRepository beneficiaryDetailsRepository, BillerMapperHelper mapperHelper, @@ -78,6 +78,10 @@ public class ComplainServiceImpl implements ComplainService { this.mapperHelper = mapperHelper; this.complainRepository = complainRepository; this.complaintStatusMasterRepository = complaintStatusMasterRepository; + + // initialize shared ObjectMapper once + this.objectMapper = new ObjectMapper(); + this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); } @Override @@ -99,11 +103,7 @@ public class ComplainServiceImpl implements ComplainService { // Fetch tenant & agent from DB BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + HttpHeaders headers = helper.buildHeaders(headersData); InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, complainRequestDTO.getMid(), "POST", requestJson); @@ -180,11 +180,7 @@ public class ComplainServiceImpl implements ComplainService { BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + HttpHeaders headers = helper.buildHeaders(headersData); // Convert request to JSON String requestJson = helper.convertObjectToJson(request); @@ -215,11 +211,11 @@ public class ComplainServiceImpl implements ComplainService { int end = responseData.lastIndexOf("}"); if (start != -1 && end != -1) { responseData = responseData.substring(start, end + 1); - LOGGER.info("Extracted Clean JSON: {}", responseData); } + + LOGGER.info("Extracted pure JSON from error: {}", responseData); } - // Convert JSON to Map Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); @@ -231,25 +227,17 @@ public class ComplainServiceImpl implements ComplainService { statusCode, String.valueOf(dataMap.get("remarks"))); } - TicketCheckStatusResponse responseWrapper = objectMapper.convertValue(dataMap, - TicketCheckStatusResponse.class); - - LOGGER.info("Complaint Current Status: {}", responseWrapper.getStatus()); + TicketCheckStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TicketCheckStatusResponse.class); helper.updateInboundLogSuccess(inboundLog, responseData, responseWrapper.getStatus()); - // Save in DB - mapperHelper.saveComplaintStatus(responseWrapper, reqId, txnId); - return new ResponseModel(responseWrapper.getMessage(), responseWrapper.getStatus(), Integer.parseInt(responseWrapper.getStatusCode()), responseWrapper); } catch (JsonProcessingException e) { - - LOGGER.error("Error parsing Complaint Status JSON: {}", e.getMessage()); + LOGGER.error("Error parsing JSON in complaint status API: {}", e.getMessage(), e); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); throw new CustomException("Invalid JSON received from API"); - } } @@ -266,14 +254,8 @@ public class ComplainServiceImpl implements ComplainService { helper.validateMerchant(request.getMid()); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + HttpHeaders headers = helper.buildHeaders(headersData); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String requestJson = helper.convertObjectToJson(request); InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET", @@ -333,14 +315,8 @@ public class ComplainServiceImpl implements ComplainService { helper.validateMerchant(request.getMid()); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + HttpHeaders headers = helper.buildHeaders(headersData); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String requestJson = helper.convertObjectToJson(request); InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET", @@ -442,14 +418,8 @@ public class ComplainServiceImpl implements ComplainService { helper.validateMerchant(request.getMid()); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + HttpHeaders headers = helper.buildHeaders(headersData); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String requestJson = helper.convertObjectToJson(request); InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET", @@ -508,14 +478,8 @@ public class ComplainServiceImpl implements ComplainService { helper.validateMerchant(request.getMid()); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + HttpHeaders headers = helper.buildHeaders(headersData); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String requestJson = helper.convertObjectToJson(request); InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "POST", @@ -562,4 +526,4 @@ public class ComplainServiceImpl implements ComplainService { } } -} +} \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java index 3244d07..e044769 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/MasterDataServiceImpl.java @@ -1,4 +1,3 @@ -// java package com.billpaymentservice.bbps.serviceImpl; import java.util.List; @@ -10,6 +9,8 @@ import org.modelmapper.convention.MatchingStrategies; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import com.billpaymentservice.bbps.dto.ContactMaster; @@ -56,6 +57,7 @@ import com.billpaymentservice.bbps.util.BBPSConstant; import com.billpaymentservice.bbps.util.BillerMapperHelper; import com.billpaymentservice.bbps.util.EntityRelationshipUtil; import com.billpaymentservice.bbps.util.Helper; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -76,7 +78,7 @@ public class MasterDataServiceImpl implements MasterDataService { private final Helper helper; private final BillerDataRepository billerDataRespository; private final HttpService httpService; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper; private final InboundTraceLogRepository inboundTraceLogRepository; private final OutboundTraceLogRepository outboundTraceLogRepository; private final CustomParamRepository customParamReposiotory; @@ -98,6 +100,8 @@ public class MasterDataServiceImpl implements MasterDataService { this.mapperHelper = mapperHelper; this.customParamReposiotory = customParamReposiotory; + this.objectMapper = new ObjectMapper(); + this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); } @Override @@ -112,7 +116,7 @@ public class MasterDataServiceImpl implements MasterDataService { try { // Merchant Validation helper.validateMerchant(masterRequest.getMid()); - // check Tender Id is present DB + // check Tenant Id is present DB BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); if (headersData == null) { LOGGER.warn("header data not found for the orgID"); @@ -122,10 +126,10 @@ public class MasterDataServiceImpl implements MasterDataService { String fullUrl = masterRegisterUrl + BBPSConstant.MASTER_CATEGORY_URL + headersData.getTenantId(); LOGGER.info("Calling external API: {}", fullUrl); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - Map responseMap = httpService.getRequest(fullUrl); + HttpHeaders headers = helper.buildHeaders(headersData); + Map responseMap = httpService.getRequest(fullUrl, headers); String responseData = responseMap.get("data"); - // LOGGER.info("Response Data: {}", responseData); helper.updateOutboundLogResponse(outboundLog, responseData); Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { @@ -290,7 +294,8 @@ public class MasterDataServiceImpl implements MasterDataService { LOGGER.info("Contact Master Full URL-:" + fullUrl); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); - Map responseMap = httpService.getRequest(fullUrl); + HttpHeaders headers = helper.buildHeaders(headersData); + Map responseMap = httpService.getRequest(fullUrl, headers); String responseData = responseMap.get("data"); LOGGER.info("Response Data: {}", responseData); @@ -407,8 +412,6 @@ public class MasterDataServiceImpl implements MasterDataService { helper.updateOutboundLogResponse(outboundLog, responseData); try { - ObjectMapper objectMapper = new ObjectMapper(); - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); @@ -750,8 +753,6 @@ public class MasterDataServiceImpl implements MasterDataService { helper.updateOutboundLogResponse(outboundLog, responseData); try { - ObjectMapper objectMapper = new ObjectMapper(); - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() { }); diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java index 2746039..7d74dc0 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentServiceImpl.java @@ -1,3 +1,4 @@ +// PaymentServiceImpl.java package com.billpaymentservice.bbps.serviceImpl; import java.util.Map; @@ -46,496 +47,343 @@ import com.fasterxml.jackson.databind.ObjectMapper; @Service public class PaymentServiceImpl implements PaymentService { - @Value("${payment.data.url}") - private String paymentUrl; + @Value("${payment.data.url}") + private String paymentUrl; - private final BharatConnectMasterRepository beneficiaryDetailsRepository; - private final HttpService httpService; - private final Helper helper; - private final PaymentRepository paymentRepository; - private final InboundTraceLogRepository inboundTraceLogRepository; - private final OutboundTraceLogRepository outboundTraceLogRepository; - private final PaymentIntiateRepository paymentIntiateRepository; - private final TransactionMasterRepository transactionMasterRepository; - private final AgentFundTransferRepository agentFundTransferRepository; + private final BharatConnectMasterRepository beneficiaryDetailsRepository; + private final HttpService httpService; + private final Helper helper; + private final PaymentRepository paymentRepository; + private final InboundTraceLogRepository inboundTraceLogRepository; + private final OutboundTraceLogRepository outboundTraceLogRepository; + private final PaymentIntiateRepository paymentIntiateRepository; + private final TransactionMasterRepository transactionMasterRepository; + private final AgentFundTransferRepository agentFundTransferRepository; - private static final Logger LOGGER = LoggerFactory.getLogger(PaymentServiceImpl.class); + // Shared reusable instances + private final ObjectMapper objectMapper; + private final ModelMapper modelMapper; - public PaymentServiceImpl(BharatConnectMasterRepository beneficiaryDetailsRepository, HttpService httpService, - Helper helper, PaymentRepository paymentRepository, InboundTraceLogRepository inboundTraceLogRepository, - OutboundTraceLogRepository outboundTraceLogRepository, PaymentIntiateRepository paymentIntiateRepository, - TransactionMasterRepository transactionMasterRepository, - AgentFundTransferRepository agentFundTransferRepository) { - this.beneficiaryDetailsRepository = beneficiaryDetailsRepository; - this.httpService = httpService; - this.helper = helper; - this.paymentRepository = paymentRepository; - this.inboundTraceLogRepository = inboundTraceLogRepository; - this.outboundTraceLogRepository = outboundTraceLogRepository; - this.paymentIntiateRepository = paymentIntiateRepository; - this.transactionMasterRepository = transactionMasterRepository; - this.agentFundTransferRepository = agentFundTransferRepository; - } + private static final Logger LOGGER = LoggerFactory.getLogger(PaymentServiceImpl.class); - @Override - public ResponseModel initiatePayment(BillPaymentRequest billPaymentRequest) { - String apiName = "InitiatePayment"; - String txnId = helper.generateTxnId(15); - String requestId = billPaymentRequest.getReqId(); - String url = paymentUrl + BBPSConstant.PAYMENT_URL; - billPaymentRequest.setClientReqId(txnId); - LOGGER.info("Initiating payment for reqId={} and txnId={}", requestId, txnId); + public PaymentServiceImpl(BharatConnectMasterRepository beneficiaryDetailsRepository, HttpService httpService, + Helper helper, PaymentRepository paymentRepository, InboundTraceLogRepository inboundTraceLogRepository, + OutboundTraceLogRepository outboundTraceLogRepository, PaymentIntiateRepository paymentIntiateRepository, + TransactionMasterRepository transactionMasterRepository, + AgentFundTransferRepository agentFundTransferRepository) { + this.beneficiaryDetailsRepository = beneficiaryDetailsRepository; + this.httpService = httpService; + this.helper = helper; + this.paymentRepository = paymentRepository; + this.inboundTraceLogRepository = inboundTraceLogRepository; + this.outboundTraceLogRepository = outboundTraceLogRepository; + this.paymentIntiateRepository = paymentIntiateRepository; + this.transactionMasterRepository = transactionMasterRepository; + this.agentFundTransferRepository = agentFundTransferRepository; - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + this.objectMapper = new ObjectMapper(); + this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - BillPaymentForwardRequest forwardReq = - helper.billPaymentForwardRequest(billPaymentRequest); + this.modelMapper = new ModelMapper(); + this.modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); + } - String forwardjson = helper.convertObjectToJson(forwardReq); + @Override + public ResponseModel initiatePayment(BillPaymentRequest billPaymentRequest) { + String apiName = "InitiatePayment"; + String txnId = helper.generateTxnId(15); + String requestId = billPaymentRequest.getReqId(); + String url = paymentUrl + BBPSConstant.PAYMENT_URL; + billPaymentRequest.setClientReqId(txnId); + LOGGER.info("Initiating payment for reqId={} and txnId={}", requestId, txnId); + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); + HttpHeaders headers = helper.buildHeaders(headersData); - String requestJson = helper.convertObjectToJson(billPaymentRequest); + BillPaymentForwardRequest forwardReq = helper.billPaymentForwardRequest(billPaymentRequest); + String forwardjson = helper.convertObjectToJson(forwardReq); + String requestJson = helper.convertObjectToJson(billPaymentRequest); - InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, billPaymentRequest.getMid(), "POST", requestJson); - OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "POST",forwardjson); + InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, billPaymentRequest.getMid(), "POST", requestJson); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "POST", forwardjson); - try { - LOGGER.info("Calling BBPS payment URL: {}", url); - Map responseMap = httpService.postRequest(url, forwardjson, headers); - String responseData = responseMap.get("data"); - LOGGER.info("Payment API Response: {}", responseData); + try { + LOGGER.info("Calling BBPS payment URL: {}", url); + Map responseMap = httpService.postRequest(url, forwardjson, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Payment API Response: {}", responseData); - helper.updateOutboundLogResponse(outboundLog, responseData); + helper.updateOutboundLogResponse(outboundLog, responseData); - if (responseData == null || responseData.isEmpty()) { - helper.updateInboundLogFailure(inboundLog, "Empty response from BBPS", "FAILED"); - LOGGER.warn("Empty response received from BBPS for txnId={}", txnId); - throw new CustomException("Empty response from BBPS server"); - } + if (responseData == null || responseData.isEmpty()) { + helper.updateInboundLogFailure(inboundLog, "Empty response from BBPS", "FAILED"); + LOGGER.warn("Empty response received from BBPS for txnId={}", txnId); + throw new CustomException("Empty response from BBPS server"); + } - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); - if (!dataMap.containsKey("genericResponse")) { - helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_STRUCTURE"); - LOGGER.warn("Invalid response structure received for txnId={}", txnId); - throw new CustomException("Invalid response structure from BBPS"); - } + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); + if (!dataMap.containsKey("genericResponse")) { + helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_STRUCTURE"); + LOGGER.warn("Invalid response structure received for txnId={}", txnId); + throw new CustomException("Invalid response structure from BBPS"); + } - BillPaymentResponse billPaymentResponse = objectMapper.convertValue(dataMap, BillPaymentResponse.class); - GeneralResp generalResponse = billPaymentResponse.getGenericResponse(); + BillPaymentResponse billPaymentResponse = objectMapper.convertValue(dataMap, BillPaymentResponse.class); + GeneralResp generalResponse = billPaymentResponse.getGenericResponse(); - ModelMapper mapper = new ModelMapper(); - mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); - BillPayment entity = mapper.map(billPaymentResponse, BillPayment.class); - paymentRepository.save(entity); - LOGGER.info("BillPayment entity saved successfully for txnId={}", txnId); + BillPayment entity = modelMapper.map(billPaymentResponse, BillPayment.class); + paymentRepository.save(entity); + LOGGER.info("BillPayment entity saved successfully for txnId={}", txnId); - helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); - PaymentInitiate paymentInitiate = new PaymentInitiate(); - paymentInitiate.setTxnId(txnId); - paymentInitiate.setReqId(requestId); - paymentInitiate.setBankTxnId(billPaymentResponse.getTxnId()); - paymentInitiate.setStatus(billPaymentResponse.getStatus()); - paymentIntiateRepository.save(paymentInitiate); - LOGGER.info("PaymentInitiate entry saved successfully for txnId={}", txnId); + helper.updateInboundLogSuccess(inboundLog, responseData, generalResponse.getStatus()); + PaymentInitiate paymentInitiate = new PaymentInitiate(); + paymentInitiate.setTxnId(txnId); + paymentInitiate.setReqId(requestId); + paymentInitiate.setBankTxnId(billPaymentResponse.getTxnId()); + paymentInitiate.setStatus(billPaymentResponse.getStatus()); + paymentIntiateRepository.save(paymentInitiate); + LOGGER.info("PaymentInitiate entry saved successfully for txnId={}", txnId); - TransactionStatusRequest transactionStatusRequest = new TransactionStatusRequest(); - transactionStatusRequest.setTxnId(billPaymentResponse.getTxnId()); - transactionStatusRequest.setReqId(requestId); - - try { - Thread.sleep(9000); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - LOGGER.warn("Thread interrupted during payment delay: {}", e.getMessage()); - } - LOGGER.info("Checking transaction status for txnId={}", billPaymentResponse.getTxnId()); - return checkTrasactionStatus(transactionStatusRequest, inboundLog); + TransactionStatusRequest transactionStatusRequest = new TransactionStatusRequest(); + transactionStatusRequest.setTxnId(billPaymentResponse.getTxnId()); + transactionStatusRequest.setReqId(requestId); - } catch (JsonProcessingException e) { - LOGGER.error("JSON Parsing Error in initiatePayment: {}", e.getMessage(), e); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); - throw new CustomException("Invalid JSON received from API"); - } - } + try { + Thread.sleep(9000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + LOGGER.warn("Thread interrupted during payment delay: {}", e.getMessage()); + } + LOGGER.info("Checking transaction status for txnId={}", billPaymentResponse.getTxnId()); + return checkTrasactionStatus(transactionStatusRequest, inboundLog); - public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest, InboundTraceLog inboundLog) { - String apiName = "CheckTransactionStatus"; - String txnId = helper.generateTxnId(15); - String requestId = transactionStatusRequest.getReqId(); - - - String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId(); + } catch (JsonProcessingException e) { + LOGGER.error("JSON Parsing Error in initiatePayment: {}", e.getMessage(), e); + helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + throw new CustomException("Invalid JSON received from API"); + } + } - LOGGER.info("Checking transaction status (internal) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId); + public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest, InboundTraceLog inboundLog) { + String apiName = "CheckTransactionStatus"; + String txnId = helper.generateTxnId(15); + String requestId = transactionStatusRequest.getReqId(); - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId(); - ObjectMapper objectMapper = new ObjectMapper(); - OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "GET", null); + LOGGER.info("Checking transaction status (internal) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId); - Map responseMap = httpService.getRequest(url, headers); - String responseData = responseMap.get("data"); - LOGGER.info("Transaction status response: {}", responseData); + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); + HttpHeaders headers = helper.buildHeaders(headersData); - helper.updateOutboundLogResponse(outboundLog, responseData); + OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "GET", null); - try { - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); - if (!dataMap.containsKey("generalResp")) { - helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); - LOGGER.warn("Invalid transaction status response for txnId={}", transactionStatusRequest.getTxnId()); - 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")) - ); - } + Map responseMap = httpService.getRequest(url, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Transaction status response: {}", responseData); - TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); - GeneralResp generalResp = responseWrapper.getGeneralResp(); - LOGGER.info("Transaction status received: {}", generalResp.getStatus()); + helper.updateOutboundLogResponse(outboundLog, responseData); - ModelMapper mapper = new ModelMapper(); - mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT); - TransactionMaster transactionMaster = mapper.map(responseWrapper.getTransactionDAO(), TransactionMaster.class); - transactionMaster.setTxnId(txnId); - transactionMaster.setReqId(transactionStatusRequest.getReqId()); - EntityRelationshipUtil.linkTransactionMasterRelationships(transactionMaster); - transactionMasterRepository.save(transactionMaster); - LOGGER.info("TransactionMaster saved successfully for txnId={}", txnId); + try { + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); + if (!dataMap.containsKey("generalResp")) { + helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); + LOGGER.warn("Invalid transaction status response for txnId={}", transactionStatusRequest.getTxnId()); + 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")) + ); + } - AgentFundTransfer agentFundTransfer = mapper.map(responseWrapper.getAgentFundTransfer(), AgentFundTransfer.class); - agentFundTransfer.setTxnId(txnId); - agentFundTransfer.setReqId(transactionStatusRequest.getReqId()); - agentFundTransfer.setTransactionMasterId(transactionMaster.getBankTxnId()); - agentFundTransferRepository.save(agentFundTransfer); - LOGGER.info("AgentFundTransfer entry saved successfully for txnId={}", txnId); + TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); + LOGGER.info("Transaction status received: {}", generalResp.getStatus()); - ResponseModel responseModel = new ResponseModel( - generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper - ); + TransactionMaster transactionMaster = modelMapper.map(responseWrapper.getTransactionDAO(), TransactionMaster.class); + transactionMaster.setTxnId(txnId); + transactionMaster.setReqId(transactionStatusRequest.getReqId()); + EntityRelationshipUtil.linkTransactionMasterRelationships(transactionMaster); + transactionMasterRepository.save(transactionMaster); + LOGGER.info("TransactionMaster saved successfully for txnId={}", txnId); - helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); - return responseModel; + AgentFundTransfer agentFundTransfer = modelMapper.map(responseWrapper.getAgentFundTransfer(), AgentFundTransfer.class); + agentFundTransfer.setTxnId(txnId); + agentFundTransfer.setReqId(transactionStatusRequest.getReqId()); + agentFundTransfer.setTransactionMasterId(transactionMaster.getBankTxnId()); + agentFundTransferRepository.save(agentFundTransfer); + LOGGER.info("AgentFundTransfer entry saved successfully for txnId={}", txnId); - } catch (JsonProcessingException e) { - LOGGER.error("Error parsing transaction status JSON: {}", e.getMessage(), e); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); - throw new CustomException("Invalid JSON received from API"); - } - } + ResponseModel responseModel = new ResponseModel( + generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper + ); - @Override - public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest) { - helper.validateMerchant(transactionStatusRequest.getMid()); - String txnID = helper.generateTxnId(15); - String apiName = "checkTrasactionStatus"; - String requestId = transactionStatusRequest.getReqId(); - String requestJson = helper.convertObjectToJson(transactionStatusRequest); - String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId(); + helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; - LOGGER.info("Checking transaction status (public) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId); + } catch (JsonProcessingException e) { + LOGGER.error("Error parsing transaction status JSON: {}", e.getMessage(), e); + helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + throw new CustomException("Invalid JSON received from API"); + } + } - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + @Override + public ResponseModel checkTrasactionStatus(TransactionStatusRequest transactionStatusRequest) { + helper.validateMerchant(transactionStatusRequest.getMid()); + String txnID = helper.generateTxnId(15); + String apiName = "checkTrasactionStatus"; + String requestId = transactionStatusRequest.getReqId(); + String requestJson = helper.convertObjectToJson(transactionStatusRequest); + String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId(); - InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson); + LOGGER.info("Checking transaction status (public) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId); + + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); + HttpHeaders headers = helper.buildHeaders(headersData); + + InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, url, "GET", null); - ObjectMapper objectMapper = new ObjectMapper(); - Map responseMap = httpService.getRequest(url, headers); - String responseData = responseMap.get("data"); - LOGGER.info("Transaction status response data: {}", responseData); - helper.updateOutboundLogResponse(outboundLog, responseData); + Map responseMap = httpService.getRequest(url, headers); + String responseData = responseMap.get("data"); + LOGGER.info("Transaction status response data: {}", responseData); + helper.updateOutboundLogResponse(outboundLog, responseData); - try { - Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); - if (!dataMap.containsKey("generalResp")) { - helper.updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); - LOGGER.warn("Invalid transaction status response for txnId={} from BBPS", transactionStatusRequest.getTxnId()); - 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")) - ); - } + try { + Map dataMap = objectMapper.readValue(responseData, new TypeReference>() {}); + if (!dataMap.containsKey("generalResp")) { + helper.updateInboundLogFailure(inboundLog, responseData, String.valueOf(dataMap.get("status"))); + LOGGER.warn("Invalid transaction status response for txnId={} from BBPS", transactionStatusRequest.getTxnId()); + 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")) + ); + } - TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); - GeneralResp generalResp = responseWrapper.getGeneralResp(); + TransactionStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TransactionStatusResponse.class); + GeneralResp generalResp = responseWrapper.getGeneralResp(); - String status = generalResp.getStatus(); - LOGGER.info("Current transaction status: {}", status); + String status = generalResp.getStatus(); + LOGGER.info("Current transaction status: {}", status); - ResponseModel responseModel = new ResponseModel( - generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper - ); + ResponseModel responseModel = new ResponseModel( + generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper + ); - helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); - return responseModel; + helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + return responseModel; - } catch (JsonProcessingException e) { - LOGGER.error("Error parsing responseData JSON: {}", e.getMessage(), e); - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); - throw new CustomException("Invalid JSON received from API"); - } - } + } catch (JsonProcessingException e) { + LOGGER.error("Error parsing responseData JSON: {}", e.getMessage(), e); + helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + throw new CustomException("Invalid JSON received from API"); + } + } + @Override + public ResponseModel checkTrasactionStatusByClientReqId(TrasactionStatusByClientReqIdRequest transactionStatusRequest) { + helper.validateMerchant(transactionStatusRequest.getMid()); - @Override - public ResponseModel checkTrasactionStatusByClientReqId(TrasactionStatusByClientReqIdRequest transactionStatusRequest) { + String txnID = helper.generateTxnId(15); + String apiName = "checkTrasactionStatusbyClientReqId"; + String requestId = transactionStatusRequest.getReqId(); + String clientReqId = transactionStatusRequest.getClientReqId(); + String requestJson = helper.convertObjectToJson(transactionStatusRequest); - helper.validateMerchant(transactionStatusRequest.getMid()); + LOGGER.info("Checking transaction status for clientReqId={} and reqId={}", clientReqId, requestId); - String txnID = helper.generateTxnId(15); - String apiName = "checkTrasactionStatusbyClientReqId"; - String requestId = transactionStatusRequest.getReqId(); - String clientReqId = transactionStatusRequest.getClientReqId(); - String requestJson = helper.convertObjectToJson(transactionStatusRequest); + Optional paymentInitiate = paymentIntiateRepository.findByReqId(clientReqId); + if (paymentInitiate.isEmpty()) { + throw new CustomException("No Transaction Found for given Client Req Id"); + } - LOGGER.info("Checking transaction status for clientReqId={} and reqId={}", clientReqId, requestId); + String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_BY_CLIENT_REQ_ID_URL + paymentInitiate.get().getTxnId(); - // Fetch Txn from DB - Optional paymentInitiate = paymentIntiateRepository.findByReqId(clientReqId); - if (paymentInitiate.isEmpty()) { - throw new CustomException("No Transaction Found for given Client Req Id"); - } + BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); + HttpHeaders headers = helper.buildHeaders(headersData); - String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_BY_CLIENT_REQ_ID_URL + paymentInitiate.get().getTxnId(); + InboundTraceLog inboundLog = helper.createInboundLog( + requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson); - // Prepare headers - BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); - HttpHeaders headers = new HttpHeaders(); - headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); - headers.set("agentId", headersData.getAgentId()); - headers.set("tenantId", headersData.getTenantId()); - headers.setContentType(MediaType.APPLICATION_JSON); + OutboundTraceLog outboundLog = helper.createOutboundLog( + txnID, requestId, apiName, url, "GET", null); + try { + LOGGER.info("Calling BBPS Transaction Status API URL={}", url); + Map responseMap = httpService.getRequest(url, headers); - // 🔵 Create Inbound + Outbound Logs - InboundTraceLog inboundLog = helper.createInboundLog( - requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson); + String responseData = responseMap.get("data"); + LOGGER.info("Transaction Status Response: {}", responseData); - OutboundTraceLog outboundLog = helper.createOutboundLog( - txnID, requestId, apiName, url, "GET", null); + helper.updateOutboundLogResponse(outboundLog, responseData); - ObjectMapper objectMapper = new ObjectMapper(); + Map dataMap = objectMapper.readValue( + responseData, new TypeReference>() {}); - try { - LOGGER.info("Calling BBPS Transaction Status API URL={}", url); - Map responseMap = httpService.getRequest(url, headers); + if (!dataMap.containsKey("generalResp")) { + helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); - String responseData = responseMap.get("data"); - LOGGER.info("Transaction Status Response: {}", responseData); + LOGGER.warn("Invalid transaction status response for clientReqId={} | Response={}", + clientReqId, responseData); - helper.updateOutboundLogResponse(outboundLog, responseData); + 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")) + ); + } - // Parse response - Map dataMap = objectMapper.readValue( - responseData, new TypeReference>() {}); + TransactionStatusResponse responseWrapper = + objectMapper.convertValue(dataMap, TransactionStatusResponse.class); - // Validate response - if (!dataMap.containsKey("generalResp")) { - helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); + GeneralResp generalResp = responseWrapper.getGeneralResp(); - LOGGER.warn("Invalid transaction status response for clientReqId={} | Response={}", - clientReqId, responseData); + LOGGER.info("Transaction Status for clientReqId={} => {}", clientReqId, generalResp.getStatus()); - 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")) - ); - } + helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); - // Convert into proper DTO - TransactionStatusResponse responseWrapper = - objectMapper.convertValue(dataMap, TransactionStatusResponse.class); + return new ResponseModel( + generalResp.getMessage(), + generalResp.getStatus(), + Integer.parseInt(generalResp.getStatusCode()), + responseWrapper + ); - GeneralResp generalResp = responseWrapper.getGeneralResp(); + } catch (JsonProcessingException e) { + LOGGER.error("Error parsing JSON in transaction status API: {}", e.getMessage(), e); - LOGGER.info("Transaction Status for clientReqId={} => {}", clientReqId, generalResp.getStatus()); + helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); - helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); + throw new CustomException("Invalid JSON received from API"); + } + } - return new ResponseModel( - generalResp.getMessage(), - generalResp.getStatus(), - Integer.parseInt(generalResp.getStatusCode()), - responseWrapper - ); + @Override + public ResponseModel handlePaymentIntiateCallback(TransactionStatusResponse transactionStatusResponse) { - } catch (JsonProcessingException e) { - LOGGER.error("Error parsing JSON in transaction status API: {}", e.getMessage(), e); + LOGGER.info("Recived Call Back from FetchBillValidateResponse: {}", transactionStatusResponse); + if (transactionStatusResponse.getGeneralResp().getStatusCode().equals("200")) { - helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); + } else { + LOGGER.info("Bill Fetch Callback Failed with Status: {}", transactionStatusResponse.getGeneralResp().getStatus()); - throw new CustomException("Invalid JSON received from API"); - } - } + } - @Override - public ResponseModel handlePaymentIntiateCallback(TransactionStatusResponse transactionStatusResponse) { - - LOGGER.info("Recived Call Back from FetchBillValidateResponse: {}", transactionStatusResponse); - if(transactionStatusResponse.getGeneralResp().getStatusCode().equals("200")) { - - } - else { - LOGGER.info("Bill Fetch Callback Failed with Status: {}", transactionStatusResponse.getGeneralResp().getStatus()); - - } - - return new ResponseModel("CallBack Recieved Successfully", - "200", - 200, - ""); - } -} - /* PollBack logic for the fetchTxnByTxnId API - * @Override public ResponseModel fetchTxnByTxnId(BillFetchByBillIdRequest - * billFetchByBillIdRequest) { - * - * String billId = billFetchByBillIdRequest.getBillId(); String fullUrl = - * agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID+billId; - * System.out.print(fullUrl); - * - * BeneficiaryDetails - * headersData=beneficiaryDetailsRepository.findByOrgId("ORG001"); - * - * HttpHeaders headers = new HttpHeaders(); - * headers.set("x-digiledge-key",headersData.getXDigiledgeKey()); - * headers.set("agentId", headersData.getAgentId()); headers.set("tenantId", - * headersData.getTenantId()); - * headers.setContentType(MediaType.APPLICATION_JSON); - * - * Map responseMap = httpService.getRequest(fullUrl,headers); - * String responseData = responseMap.get("data"); log.info("data is :{}", - * responseData); - * - * - * ObjectMapper objectMapper = new ObjectMapper(); - * - * try { Map dataMap = objectMapper.readValue(responseData, new - * TypeReference>() { }); if - * (!dataMap.containsKey("genericResponse")) { throw new - * CustomException(String.valueOf(dataMap.get("message")), // message - * String.valueOf(dataMap.get("status")), // status - * Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode - * (int) String.valueOf(dataMap.get("remarks")) ); } - * - * BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, - * BillDataResponse.class); - * - * GeneralResp generalResp = responseWrapper.getGenericResponse(); - * - * ResponseModel responseModel=new ResponseModel( generalResp.getMessage(), - * generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), - * responseWrapper); - * - * return responseModel; - * - * } catch (JsonProcessingException e) { - * LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); throw - * new CustomException("Invalid JSON received from API"); } - * - * } - */ - - /* - * public ResponseModel checkTrasactionStatus(TransactionStatusRequest - * transactionStatusRequest,InboundTraceLog inboundLog) { String apiName = - * "CheckTransactionStatus"; String txnId = helper.generateTxnId(15); //our - * genrated txnId String requestId = transactionStatusRequest.getReqId(); String - * url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + - * transactionStatusRequest.getTxnId(); ; - * - * BharatConnectMaster headersData = - * beneficiaryDetailsRepository.findByOrgId("ORG001"); HttpHeaders headers = new - * HttpHeaders(); headers.set("x-digiledge-key", - * headersData.getXDigiledgeKey()); headers.set("agentId", - * headersData.getAgentId()); headers.set("tenantId", - * headersData.getTenantId()); - * headers.setContentType(MediaType.APPLICATION_JSON); ObjectMapper objectMapper - * = new ObjectMapper(); - * - * OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, - * apiName, url, "GET", null); - * - * long startTime = System.currentTimeMillis(); long maxWaitTimeMs = 40000; long - * intervalMs = 5000; - * - * while (true) { Map responseMap = httpService.getRequest(url, - * headers); String responseData = responseMap.get("data"); - * LOGGER.info("Transaction status response: {}", responseData); - * - * helper.updateOutboundLogResponse(outboundLog, responseData); - * - * try { Map dataMap = objectMapper.readValue(responseData, new - * TypeReference>() {}); - * - * if (!dataMap.containsKey("generalResp")) { - * helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); - * 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")) ); } - * - * TransactionStatusResponse responseWrapper = - * objectMapper.convertValue(dataMap, TransactionStatusResponse.class); - * GeneralResp generalResp = responseWrapper.getGeneralResp(); - * - * String status = generalResp.getStatus(); - * LOGGER.info("Current transaction status: {}", status); - * - * if ("INPROGRESS".equalsIgnoreCase(status)) { if (System.currentTimeMillis() - - * startTime > maxWaitTimeMs) { helper.updateInboundLogFailure(inboundLog, - * "Timeout after 40 seconds", "FAILED"); throw new - * CustomException("Timeout waiting for transaction completion", "FAILED", 408, - * "Transaction still in progress"); } - * - * Thread.sleep(intervalMs); continue; } - * - * ResponseModel responseModel = new ResponseModel( generalResp.getMessage(), - * generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()), - * responseWrapper ); - * - * helper.updateInboundLogSuccess(inboundLog, responseData, - * generalResp.getStatus()); return responseModel; - * - * } catch (JsonProcessingException e) { - * LOGGER.error("Error parsing transaction status JSON: {}", e.getMessage()); - * helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); - * throw new CustomException("Invalid JSON received from API"); } catch - * (InterruptedException e) { Thread.currentThread().interrupt(); - * helper.updateInboundLogFailure(inboundLog, e.getMessage(), "INTERRUPTED"); - * throw new CustomException("Thread interrupted during transaction check"); } } - * } - * - * - */ \ No newline at end of file + return new ResponseModel("CallBack Recieved Successfully", + "200", + 200, + ""); + } +} \ No newline at end of file diff --git a/src/main/java/com/billpaymentservice/bbps/util/Helper.java b/src/main/java/com/billpaymentservice/bbps/util/Helper.java index a73ca30..405bde2 100644 --- a/src/main/java/com/billpaymentservice/bbps/util/Helper.java +++ b/src/main/java/com/billpaymentservice/bbps/util/Helper.java @@ -11,6 +11,8 @@ import java.util.stream.Collectors; import org.modelmapper.ModelMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import com.billpaymentservice.bbps.dto.AdditionalInfoBillDTO; @@ -38,6 +40,7 @@ import com.billpaymentservice.bbps.entites.InboundTraceLog; import com.billpaymentservice.bbps.entites.OutboundTraceLog; import com.billpaymentservice.bbps.entites.PaymentChannel; import com.billpaymentservice.bbps.entites.PaymentMode; +import com.billpaymentservice.bbps.entites.BharatConnectMaster; import com.billpaymentservice.bbps.exception.CustomException; import com.billpaymentservice.bbps.repository.BBPSMasterDataRepo; import com.billpaymentservice.bbps.repository.BillMasterRepository; @@ -214,6 +217,19 @@ public class Helper { } /* ---------- End helpers ---------- */ + + // New reusable header builder for BBPS calls + public HttpHeaders buildHeaders(BharatConnectMaster headersData) { + HttpHeaders headers = new HttpHeaders(); + if (headersData != null) { + headers.set("x-digiledge-key", headersData.getXDigiledgeKey()); + headers.set("agentId", headersData.getAgentId()); + headers.set("tenantId", headersData.getTenantId()); + } + headers.setContentType(MediaType.APPLICATION_JSON); + return headers; + } + public void saveOrUpdateBillerData(BillerDetails newEntity) { Optional existingOpt = billerDataRespository.findByBillerId(newEntity.getBillerId()); @@ -233,7 +249,7 @@ public void saveOrUpdateBillData(BillDataResponse responseWrapper, BillMaster billMaster = new BillMaster(); -billMaster.setBillId(billFetchByBillIdRequest.getBillId()); +billMaster.setBillId(responseWrapper.getBillId()); billMaster.setRefId(responseWrapper.getRefId()); billMaster.setBillerId(responseWrapper.getBillerId()); billMaster.setStatus(responseWrapper.getStatus()); @@ -242,7 +258,6 @@ billMaster.setUserId(responseWrapper.getUserId()); billMaster.setReqId(billFetchByBillIdRequest.getReqId()); billMaster.setTxnId(txnId); - // BILLER RESPONSE BillerResponse billerResponse = new BillerResponse(); if (responseWrapper.getBillerResponse() != null) {