diff --git a/src/main/java/com/wipro/fhir/controller/healthID/CreateHealthIdRecord.java b/src/main/java/com/wipro/fhir/controller/healthID/CreateHealthIdRecord.java index e2cf7b7..f9adb2a 100644 --- a/src/main/java/com/wipro/fhir/controller/healthID/CreateHealthIdRecord.java +++ b/src/main/java/com/wipro/fhir/controller/healthID/CreateHealthIdRecord.java @@ -3,6 +3,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -33,9 +35,9 @@ public class CreateHealthIdRecord { */ @Operation(summary = "Map ABHA to beneficiary") @PostMapping(value = { "/mapHealthIDToBeneficiary" }) - public String mapHealthIDToBeneficiary( + public ResponseEntity mapHealthIDToBeneficiary( @RequestBody String request, @RequestHeader(value = "Authorization") String Authorization) { - logger.info("NDHM_FHIR Map ABHA to beneficiary API request " + request); + logger.info("NDHM_FHIR Map ABHA to beneficiary API request received"); OutputResponse response = new OutputResponse(); try { if (request != null) { @@ -45,16 +47,22 @@ public String mapHealthIDToBeneficiary( throw new FHIRException("NDHM_FHIR Empty request object"); } catch (FHIRException e) { response.setError(5000, e.getMessage()); - logger.error(e.toString()); + logger.error("NDHM_FHIR error mapping ABHA to beneficiary: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response.toString()); + } catch (Exception e) { + response.setError(5000, "An unexpected error occurred"); + logger.error("NDHM_FHIR unexpected error mapping ABHA to beneficiary", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response.toString()); } - logger.info("NDHM_FHIR Map ABHA to beneficiary API response " + response.toString()); - return response.toString(); + logger.info("NDHM_FHIR Map ABHA to beneficiary API response sent successfully"); + return ResponseEntity.ok(response.toString()); } + @Operation(summary = "Add New health ID record to healthId table") @PostMapping(value = { "/addHealthIdRecord" }) - public String addRecordToHealthIdTable( + public ResponseEntity addRecordToHealthIdTable( @RequestBody String request, @RequestHeader(value = "Authorization") String Authorization) { - logger.info("NDHM_FHIR API to add the new health record coming from FLW request " + request); + logger.info("NDHM_FHIR API to add new health record request received"); OutputResponse response = new OutputResponse(); try { if (request != null) { @@ -64,10 +72,15 @@ public String addRecordToHealthIdTable( throw new FHIRException("NDHM_FHIR Empty request object"); } catch (FHIRException e) { response.setError(5000, e.getMessage()); - logger.error(e.toString()); + logger.error("NDHM_FHIR error adding health record: {}", e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response.toString()); + } catch (Exception e) { + response.setError(5000, "An unexpected error occurred"); + logger.error("NDHM_FHIR unexpected error adding health record", e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response.toString()); } - logger.info("NDHM_FHIR API to add the new health record coming from FLW response " + response.toString()); - return response.toString(); + logger.info("NDHM_FHIR API to add new health record response sent successfully"); + return ResponseEntity.ok(response.toString()); } diff --git a/src/main/java/com/wipro/fhir/service/atoms/feed/bahmni/ClinicalFeedWorker.java b/src/main/java/com/wipro/fhir/service/atoms/feed/bahmni/ClinicalFeedWorker.java index e86d219..bf94133 100644 --- a/src/main/java/com/wipro/fhir/service/atoms/feed/bahmni/ClinicalFeedWorker.java +++ b/src/main/java/com/wipro/fhir/service/atoms/feed/bahmni/ClinicalFeedWorker.java @@ -92,7 +92,17 @@ public String encounterFeedManager() throws IllegalArgumentException, FeedExcept if (feed != null && feed.getId() != null && feed.getLinkSelf() != null) { String[] arr = feed.getLinkSelf().split("/"); - pointer = Integer.parseInt(arr[arr.length - 1]); + if (arr.length > 0 && !arr[arr.length - 1].isEmpty()) { + try { + int parsedPointer = Integer.parseInt(arr[arr.length - 1]); + pointer = parsedPointer > 0 ? parsedPointer : atomsFeedStartPage; + } catch (NumberFormatException e) { + logger.error("Invalid feed page pointer in linkSelf URL: {}", feed.getLinkSelf()); + pointer = atomsFeedStartPage; + } + } else { + pointer = atomsFeedStartPage; + } } else if (feed == null || (feed.getLinkSelf() == null && feed.getLinkVia() == null && feed.getLinkPrevArchive() == null)) { @@ -173,10 +183,10 @@ public List readPatientEncounterFeeds(String parent feedPageCompleted); returnList.add(encounterFullRepresentation); } else - throw new Exception("Error in saving clinical data for patient : " + throw new FHIRException("Error in saving clinical data for patient : " + encounterFullRepresentation.getPatientId()); } else - throw new Exception("Patient ID not available"); + throw new FHIRException("Patient ID not available"); } } @@ -203,29 +213,42 @@ public List readPatientEncounterFeeds(String parent } } - int tempPointer = 0; + int tempPointer = pointer; for (SyndLink link : feedLink) { if (link.getRel() != null && link.getHref() != null && link.getRel().equalsIgnoreCase("next-archive")) { String[] arr = link.getHref().split("/"); - tempPointer = Integer.parseInt(arr[arr.length - 1]); + if (arr.length > 0 && !arr[arr.length - 1].isEmpty()) { + try { + int parsedPointer = Integer.parseInt(arr[arr.length - 1]); + if (parsedPointer > 0) { + tempPointer = parsedPointer; + } else { + logger.error("Non-positive next-archive pointer in feed URL: {}", link.getHref()); + } + } catch (NumberFormatException e) { + logger.error("Invalid next-archive pointer in feed URL: {}", link.getHref()); + } + } else { + logger.error("Missing next-archive pointer in feed URL: {}", link.getHref()); + } break; - } } pointer = tempPointer; } catch (IllegalArgumentException e) { + logger.error("Invalid argument while processing feed page {}: {}", pointer, e.getMessage()); pointer = 0; - } catch (FeedException e) { + logger.error("Feed parsing error on page {}: {}", pointer, e.getMessage()); pointer = 0; - } catch (IOException e) { + logger.error("IO error reading feed page {}: {}", pointer, e.getMessage()); pointer = 0; - } catch (Exception e) { + logger.error("Unexpected error processing feed page {}: {}", pointer, e.getMessage()); pointer = 0; } nextFeed = true; diff --git a/src/main/java/com/wipro/fhir/service/patient_data_handler/PatientDataGatewayServiceImpl.java b/src/main/java/com/wipro/fhir/service/patient_data_handler/PatientDataGatewayServiceImpl.java index 7586ec3..831f13d 100644 --- a/src/main/java/com/wipro/fhir/service/patient_data_handler/PatientDataGatewayServiceImpl.java +++ b/src/main/java/com/wipro/fhir/service/patient_data_handler/PatientDataGatewayServiceImpl.java @@ -35,6 +35,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.google.gson.Gson; import com.wipro.fhir.data.healthID.BenHealthIDMapping; @@ -89,32 +90,42 @@ public List feedPatientProfileToMo } @Override + @Transactional(rollbackFor = FHIRException.class) public String generatePatientProfileAMRIT_SaveTo_Mongo(String Authorization) throws FHIRException { - + List ppList = new ArrayList<>(); List resultSetList = tRG_PatientResourceData_Repo .getByProcessedOrderByCreatedDateLimit20(); ppList = generatePatientProfileFromAMRIT(Authorization, resultSetList); - ppList = feedPatientProfileToMongoDB(ppList); + List savedList = feedPatientProfileToMongoDB(ppList); - if (ppList != null && ppList.size() > 0) { + if (savedList != null && savedList.size() > 0) { List ids = new ArrayList<>(); ids.add((long) 0); - for (PatientDemographicModel_NDHM_Patient_Profile pp : ppList) { + for (PatientDemographicModel_NDHM_Patient_Profile pp : savedList) { ids.add(pp.getTriggerTableAIId()); } - tRG_PatientResourceData_Repo.updateProcessedFlagForProfileCreated(ids); + try { + tRG_PatientResourceData_Repo.updateProcessedFlagForProfileCreated(ids); + } catch (Exception e) { + // Mongo save succeeded but MySQL update failed — stores are now inconsistent. + // Log affected IDs so ops can manually reconcile; re-throw to signal failure. + logger.error("MySQL update failed after Mongo save — inconsistent state. Affected IDs: {}. Error: {}", ids, e.getMessage()); + throw new FHIRException("Failed to update processed flag after Mongo save. " + e.getMessage()); + } + ppList = savedList; } return new Gson().toJson(ppList); } @Override + @Transactional(rollbackFor = FHIRException.class) public String generatePatientProfileAMRIT_SaveTo_Mongo(String Authorization, ResourceRequestHandler resourceRequestHandler) throws FHIRException { - + List ppList = new ArrayList<>(); List resultSetList = tRG_PatientResourceData_Repo @@ -122,15 +133,23 @@ public String generatePatientProfileAMRIT_SaveTo_Mongo(String Authorization, ppList = generatePatientProfileFromAMRIT(Authorization, resultSetList); - ppList = feedPatientProfileToMongoDB(ppList); + List savedList = feedPatientProfileToMongoDB(ppList); - if (ppList != null && ppList.size() > 0) { + if (savedList != null && savedList.size() > 0) { List ids = new ArrayList<>(); ids.add((long) 0); - for (PatientDemographicModel_NDHM_Patient_Profile pp : ppList) { + for (PatientDemographicModel_NDHM_Patient_Profile pp : savedList) { ids.add(pp.getTriggerTableAIId()); } - tRG_PatientResourceData_Repo.updateProcessedFlagForProfileCreated(ids); + try { + tRG_PatientResourceData_Repo.updateProcessedFlagForProfileCreated(ids); + } catch (Exception e) { + // Mongo save succeeded but MySQL update failed — stores are now inconsistent. + // Log affected IDs so ops can manually reconcile; re-throw to signal failure. + logger.error("MySQL update failed after Mongo save — inconsistent state. Affected IDs: {}. Error: {}", ids, e.getMessage()); + throw new FHIRException("Failed to update processed flag after Mongo save. " + e.getMessage()); + } + ppList = savedList; } return new Gson().toJson(ppList); @@ -291,8 +310,8 @@ private PatientDemographicModel_NDHM_Patient_Profile generatePatientProfileFromP address.setState(pd.getI_bendemographics().getStateName()); if (pd.getI_bendemographics().getAddressLine1() != null - || pd.getI_bendemographics().getAddressLine1() != null - || pd.getI_bendemographics().getAddressLine1() != null) { + || pd.getI_bendemographics().getAddressLine2() != null + || pd.getI_bendemographics().getAddressLine3() != null) { String address1 = (pd.getI_bendemographics().getAddressLine1() != null) ? pd.getI_bendemographics().getAddressLine1() : "";