diff --git a/src/main/environment/common_ci.properties b/src/main/environment/common_ci.properties index 440eeea..5f4a103 100644 --- a/src/main/environment/common_ci.properties +++ b/src/main/environment/common_ci.properties @@ -82,7 +82,15 @@ abdmConfirmAadhaarBio=@env.ABDM_HEALTH_ID_BASE_URL@/api/v1/auth/confirmWithAadha abdmAccountProfile=@env.ABDM_Account_ID_BASE_URL@/api/v1/account/profile ##ABDM Facility services -getAbdmFacilityServicies= @env.ABDM_HEALTH_ID_BASE_URL@/devservice/v1/bridges/getServices +getAbdmFacilityServicies= @env.ABDM_BASE_URL@/devservice/v1/bridges/getServices + +##ABDM V3 APIs +getAuthCertPublicKey = @env.ABDM_HEALTH_ID_BASE_URL@/api/v1/auth/cert +requestOtpForEnrollment = @env.ABDM_BASE_URL@/abha/api/v3/enrollment/request/otp +abhaEnrollByAadhaar = @env.ABDM_BASE_URL@/abha/api/v3/enrollment/enrol/byAadhaar +printAbhaCard = @env.ABDM_BASE_URL@/abha/api/v3/profile/account/abha-card +abhaLoginRequestOtp = @env.ABDM_BASE_URL@/abha/api/v3/profile/login/request/otp +verifyAbhaLogin = @env.ABDM_BASE_URL@/abha/api/v3/profile/login/verify abhaMode=sbx diff --git a/src/main/environment/common_dev.properties b/src/main/environment/common_dev.properties index f7484b6..3e8017b 100644 --- a/src/main/environment/common_dev.properties +++ b/src/main/environment/common_dev.properties @@ -84,6 +84,13 @@ abdmAccountProfile=@env.ABDM_Account_ID_BASE_URL@/api/v1/account/profile ##ABDM Facility services getAbdmFacilityServicies= https://dev.abdm.gov.in/devservice/v1/bridges/getServices +##ABDM V3 APIs +getAuthCertPublicKey = https://healthidsbx.abdm.gov.in/api/v1/auth/cert +requestOtpForEnrollment = https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp +abhaEnrollByAadhaar = https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/byAadhaar +printAbhaCard = https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/abha-card +abhaLoginRequestOtp = https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/request/otp +verifyAbhaLogin = https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/verify abhaMode=sbx diff --git a/src/main/environment/common_example.properties b/src/main/environment/common_example.properties index dee5c20..208ebf3 100644 --- a/src/main/environment/common_example.properties +++ b/src/main/environment/common_example.properties @@ -84,6 +84,14 @@ abdmAccountProfile=@env.ABDM_Account_ID_BASE_URL@/api/v1/account/profile ##ABDM Facility services getAbdmFacilityServicies= https://dev.abdm.gov.in/devservice/v1/bridges/getServices +##ABDM V3 APIs +getAuthCertPublicKey = https://healthidsbx.abdm.gov.in/api/v1/auth/cert +requestOtpForEnrollment = https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp +abhaEnrollByAadhaar = https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/byAadhaar +printAbhaCard = https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/abha-card +abhaLoginRequestOtp = https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/request/otp +verifyAbhaLogin = https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/verify + abhaMode=sbx diff --git a/src/main/environment/common_test.properties b/src/main/environment/common_test.properties index f7484b6..d798719 100644 --- a/src/main/environment/common_test.properties +++ b/src/main/environment/common_test.properties @@ -84,6 +84,14 @@ abdmAccountProfile=@env.ABDM_Account_ID_BASE_URL@/api/v1/account/profile ##ABDM Facility services getAbdmFacilityServicies= https://dev.abdm.gov.in/devservice/v1/bridges/getServices +##ABDM V3 APIs +getAuthCertPublicKey = https://healthidsbx.abdm.gov.in/api/v1/auth/cert +requestOtpForEnrollment = https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/request/otp +abhaEnrollByAadhaar = https://abhasbx.abdm.gov.in/abha/api/v3/enrollment/enrol/byAadhaar +printAbhaCard = https://abhasbx.abdm.gov.in/abha/api/v3/profile/account/abha-card +abhaLoginRequestOtp = https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/request/otp +verifyAbhaLogin = https://abhasbx.abdm.gov.in/abha/api/v3/profile/login/verify + abhaMode=sbx diff --git a/src/main/java/com/wipro/fhir/controller/v3/abha/CreateAbhaV3Controller.java b/src/main/java/com/wipro/fhir/controller/v3/abha/CreateAbhaV3Controller.java new file mode 100644 index 0000000..2917e63 --- /dev/null +++ b/src/main/java/com/wipro/fhir/controller/v3/abha/CreateAbhaV3Controller.java @@ -0,0 +1,110 @@ +package com.wipro.fhir.controller.v3.abha; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.fhir.service.ndhm.GenerateHealthID_CardServiceImpl; +import com.wipro.fhir.service.v3.abha.CreateAbhaV3Service; +import com.wipro.fhir.utils.exception.FHIRException; +import com.wipro.fhir.utils.response.OutputResponse; + +import io.swagger.v3.oas.annotations.Operation; + +@CrossOrigin +@RestController +@RequestMapping(value = "/abhaCreation", headers = "Authorization") +public class CreateAbhaV3Controller { + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + @Autowired + private CreateAbhaV3Service createAbhaV3Service; + + @CrossOrigin + @Operation(summary = "Generate OTP for ABHA enrollment") + @PostMapping(value = { "/requestOtpForAbhaEnrollment" }) + public String requestOtpForEnrollment(@RequestBody String request) { + logger.info("Generate OTP for ABHA enrollment API request " + request); + OutputResponse response = new OutputResponse(); + try { + if (request != null) { + String s = createAbhaV3Service.getOtpForEnrollment(request); + response.setResponse(s); + } else + throw new FHIRException("NDHM_FHIR Empty request object"); + } catch (FHIRException e) { + response.setError(5000, e.getMessage()); + logger.error(e.toString()); + } + logger.info("NDHM_FHIR generate OTP for ABHA card API response " + response.toString()); + return response.toString(); + } + + @CrossOrigin + @Operation(summary = "ABHA enrollment by Aadhaar") + @PostMapping(value = { "/abhaEnrollmentByAadhaar" }) + public String abhaEnrollmentByAadhaar(@RequestBody String request) { + logger.info("ABHA enrollment BY Aadhaar API request " + request); + OutputResponse response = new OutputResponse(); + String res = null; + try { + if (request != null) { + res = createAbhaV3Service.enrollmentByAadhaar(request); + response.setResponse(res); + } else + throw new FHIRException("NDHM_FHIR Empty request object"); + } catch (FHIRException e) { + response.setError(5000, e.getMessage()); + logger.error(e.toString()); + } + logger.info("NDHM_FHIR generate OTP for ABHA card API response " + response.toString()); + return response.toString(); + } + + @CrossOrigin + @Operation(summary = "Verify Mobile OTP for ABHA enrollment") + @PostMapping(value = { "/verifyAuthByMobile" }) + public String verifyMobileForAuth(@RequestBody String request) { + logger.info("Verify Mobile OTP for ABHA enrollment " + request); + OutputResponse response = new OutputResponse(); + try { + if (request != null) { + String s = createAbhaV3Service.verifyAuthByMobile(request); + response.setResponse(s); + } else + throw new FHIRException("NDHM_FHIR Empty request object"); + } catch (FHIRException e) { + response.setError(5000, e.getMessage()); + logger.error(e.toString()); + } + logger.info("NDHM_FHIR generate OTP for ABHA card API response " + response.toString()); + return response.toString(); + } + + @CrossOrigin + @Operation(summary = "Print Abha card") + @PostMapping(value = { "/printAbhaCard" }) + public String printAbhaCard(@RequestBody String request) { + OutputResponse response = new OutputResponse(); + try { + if (request != null) { + String s = createAbhaV3Service.getAbhaCardPrinted(request); + response.setResponse(s); + } else + throw new FHIRException("NDHM_FHIR Empty request object"); + } catch (FHIRException e) { + response.setError(5000, e.getMessage()); + logger.error(e.toString()); + } + logger.info("NDHM_FHIR generate OTP for ABHA card API respponse " + response.toString()); + return response.toString(); + } + + +} diff --git a/src/main/java/com/wipro/fhir/controller/v3/abha/LoginAbhaV3Controller.java b/src/main/java/com/wipro/fhir/controller/v3/abha/LoginAbhaV3Controller.java new file mode 100644 index 0000000..24977f2 --- /dev/null +++ b/src/main/java/com/wipro/fhir/controller/v3/abha/LoginAbhaV3Controller.java @@ -0,0 +1,68 @@ +package com.wipro.fhir.controller.v3.abha; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.wipro.fhir.service.v3.abha.LoginAbhaV3Service; +import com.wipro.fhir.utils.exception.FHIRException; +import com.wipro.fhir.utils.response.OutputResponse; + +import io.swagger.v3.oas.annotations.Operation; + +@CrossOrigin +@RestController +@RequestMapping(value = "/abhaLogin", headers = "Authorization") +public class LoginAbhaV3Controller { + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + @Autowired + private LoginAbhaV3Service loginAbhaV3Service; + + @CrossOrigin + @Operation(summary = "Request OTP for Abha LOgin") + @PostMapping(value = { "/abhaLoginRequestOtp" }) + public String requestOtpForAbhaLogin(@RequestBody String request) { + logger.info("Generate OTP for ABHA Login API request " + request); + OutputResponse response = new OutputResponse(); + try { + if (request != null) { + String s = loginAbhaV3Service.requestOtpForAbhaLogin(request); + response.setResponse(s); + } else + throw new FHIRException("NDHM_FHIR Empty request object"); + } catch (FHIRException e) { + response.setError(5000, e.getMessage()); + logger.error(e.toString()); + } + logger.info("NDHM_FHIR generate OTP for ABHA login API response " + response.toString()); + return response.toString(); + } + + @CrossOrigin + @Operation(summary = "verify OTP for Abha LOgin") + @PostMapping(value = { "/verifyAbhaLogin" }) + public String verifyAbhaLogin(@RequestBody String request) { + logger.info("verify OTP for ABHA Login API request " + request); + OutputResponse response = new OutputResponse(); + try { + if (request != null) { + String s = loginAbhaV3Service.verifyAbhaLogin(request); + response.setResponse(s); + } else + throw new FHIRException("NDHM_FHIR Empty request object"); + } catch (FHIRException e) { + response.setError(5000, e.getMessage()); + logger.error(e.toString()); + } + logger.info("NDHM_FHIR Verify abha login API response " + response.toString()); + return response.toString(); + } + +} diff --git a/src/main/java/com/wipro/fhir/data/mongo/care_context/PatientCareContexts.java b/src/main/java/com/wipro/fhir/data/mongo/care_context/PatientCareContexts.java index efe0597..6d2736f 100644 --- a/src/main/java/com/wipro/fhir/data/mongo/care_context/PatientCareContexts.java +++ b/src/main/java/com/wipro/fhir/data/mongo/care_context/PatientCareContexts.java @@ -23,6 +23,7 @@ import java.util.ArrayList; +import org.bson.types.ObjectId; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @@ -37,8 +38,8 @@ public class PatientCareContexts { @Id @Expose - @Field(value = "id") - private String id; + @Field(value = "_id") + private ObjectId _id; @Expose @Field(value = "phoneNumber") diff --git a/src/main/java/com/wipro/fhir/data/v3/abhaCard/BioRequest.java b/src/main/java/com/wipro/fhir/data/v3/abhaCard/BioRequest.java new file mode 100644 index 0000000..5009509 --- /dev/null +++ b/src/main/java/com/wipro/fhir/data/v3/abhaCard/BioRequest.java @@ -0,0 +1,14 @@ +package com.wipro.fhir.data.v3.abhaCard; + +import lombok.Data; + +@Data +public class BioRequest { + + private String timestamp; + private String txnId; + private String aadhaar; + private Object fingerPrintAuthPid; + private String mobile; + +} diff --git a/src/main/java/com/wipro/fhir/data/v3/abhaCard/ConsentRequest.java b/src/main/java/com/wipro/fhir/data/v3/abhaCard/ConsentRequest.java new file mode 100644 index 0000000..c454a9c --- /dev/null +++ b/src/main/java/com/wipro/fhir/data/v3/abhaCard/ConsentRequest.java @@ -0,0 +1,10 @@ +package com.wipro.fhir.data.v3.abhaCard; + +import lombok.Data; + +@Data +public class ConsentRequest { + + private String code; + private String version; +} diff --git a/src/main/java/com/wipro/fhir/data/v3/abhaCard/EnrollByAadhaar.java b/src/main/java/com/wipro/fhir/data/v3/abhaCard/EnrollByAadhaar.java new file mode 100644 index 0000000..ae797af --- /dev/null +++ b/src/main/java/com/wipro/fhir/data/v3/abhaCard/EnrollByAadhaar.java @@ -0,0 +1,14 @@ +package com.wipro.fhir.data.v3.abhaCard; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import lombok.Data; + +@Data +public class EnrollByAadhaar{ + public Map authData; + public ConsentRequest consent; +} + diff --git a/src/main/java/com/wipro/fhir/data/v3/abhaCard/LoginAbhaRequest.java b/src/main/java/com/wipro/fhir/data/v3/abhaCard/LoginAbhaRequest.java new file mode 100644 index 0000000..f9a36b2 --- /dev/null +++ b/src/main/java/com/wipro/fhir/data/v3/abhaCard/LoginAbhaRequest.java @@ -0,0 +1,12 @@ +package com.wipro.fhir.data.v3.abhaCard; + +import lombok.Data; + +@Data +public class LoginAbhaRequest { + + private String loginId; + private String loginMethod; + private String loginHint; + +} diff --git a/src/main/java/com/wipro/fhir/data/v3/abhaCard/LoginMethod.java b/src/main/java/com/wipro/fhir/data/v3/abhaCard/LoginMethod.java new file mode 100644 index 0000000..2536f29 --- /dev/null +++ b/src/main/java/com/wipro/fhir/data/v3/abhaCard/LoginMethod.java @@ -0,0 +1,16 @@ +package com.wipro.fhir.data.v3.abhaCard; + +import lombok.Data; + +@Data +public class LoginMethod { + + private String loginId; + private String loginMethod; + private String pId; + private String tnxId; + private String mobileNumber; + private String createdBy; + private int providerServiceMapId; + +} diff --git a/src/main/java/com/wipro/fhir/data/v3/abhaCard/OtpRequest.java b/src/main/java/com/wipro/fhir/data/v3/abhaCard/OtpRequest.java new file mode 100644 index 0000000..25d905a --- /dev/null +++ b/src/main/java/com/wipro/fhir/data/v3/abhaCard/OtpRequest.java @@ -0,0 +1,15 @@ +package com.wipro.fhir.data.v3.abhaCard; + +import java.sql.Timestamp; + +import lombok.Data; + +@Data +public class OtpRequest { + + private String timestamp; + private String txnId; + private String otpValue; + private String mobile; + +} diff --git a/src/main/java/com/wipro/fhir/data/v3/abhaCard/RequestOTPEnrollment.java b/src/main/java/com/wipro/fhir/data/v3/abhaCard/RequestOTPEnrollment.java new file mode 100644 index 0000000..8eefe19 --- /dev/null +++ b/src/main/java/com/wipro/fhir/data/v3/abhaCard/RequestOTPEnrollment.java @@ -0,0 +1,14 @@ +package com.wipro.fhir.data.v3.abhaCard; + +import lombok.Data; + +@Data +public class RequestOTPEnrollment { + + String tnxId; + String[] scope; + String loginHint; + String loginId; + String otpSystem; + +} diff --git a/src/main/java/com/wipro/fhir/data/v3/abhaCard/VerifyAbhaLogin.java b/src/main/java/com/wipro/fhir/data/v3/abhaCard/VerifyAbhaLogin.java new file mode 100644 index 0000000..311b523 --- /dev/null +++ b/src/main/java/com/wipro/fhir/data/v3/abhaCard/VerifyAbhaLogin.java @@ -0,0 +1,13 @@ +package com.wipro.fhir.data.v3.abhaCard; + +import java.util.Map; + +import lombok.Data; + +@Data +public class VerifyAbhaLogin { + + public String[] scope; + public Map authData; + +} diff --git a/src/main/java/com/wipro/fhir/repo/common/AllergyIntoleranceDataModelRepo.java b/src/main/java/com/wipro/fhir/repo/common/AllergyIntoleranceDataModelRepo.java index e7d980e..655e949 100644 --- a/src/main/java/com/wipro/fhir/repo/common/AllergyIntoleranceDataModelRepo.java +++ b/src/main/java/com/wipro/fhir/repo/common/AllergyIntoleranceDataModelRepo.java @@ -21,6 +21,8 @@ */ package com.wipro.fhir.repo.common; +import java.math.BigInteger; + import org.springframework.data.repository.CrudRepository; import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.stereotype.Repository; @@ -29,7 +31,7 @@ @Repository @RestResource(exported = false) -public interface AllergyIntoleranceDataModelRepo extends CrudRepository { +public interface AllergyIntoleranceDataModelRepo extends CrudRepository { } diff --git a/src/main/java/com/wipro/fhir/repo/healthID/HealthIDRepo.java b/src/main/java/com/wipro/fhir/repo/healthID/HealthIDRepo.java index 2c8ec03..8426917 100644 --- a/src/main/java/com/wipro/fhir/repo/healthID/HealthIDRepo.java +++ b/src/main/java/com/wipro/fhir/repo/healthID/HealthIDRepo.java @@ -23,4 +23,8 @@ public ArrayList getHealthIDDetailsUsingHealthNumber( @Query(" SELECT HIDR from HealthIDResponse HIDR WHERE HIDR.mobile = :mobile") public ArrayList getHealthIDDetailsUsingMobileNumber(@Param("mobile") String mobile); + + @Query("SELECT COUNT(*) FROM HealthIDResponse HIDR WHERE HIDR.healthIdNumber = :healthId") + public Integer getCountOfHealthIdNumber(@Param("healthId") String healthId); + } diff --git a/src/main/java/com/wipro/fhir/repo/mongo/amrit_resource/PatientCareContextsMongoRepo.java b/src/main/java/com/wipro/fhir/repo/mongo/amrit_resource/PatientCareContextsMongoRepo.java index af05eea..a5e265d 100644 --- a/src/main/java/com/wipro/fhir/repo/mongo/amrit_resource/PatientCareContextsMongoRepo.java +++ b/src/main/java/com/wipro/fhir/repo/mongo/amrit_resource/PatientCareContextsMongoRepo.java @@ -21,6 +21,7 @@ */ package com.wipro.fhir.repo.mongo.amrit_resource; +import org.bson.types.ObjectId; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.rest.core.annotation.RestResource; import org.springframework.stereotype.Repository; @@ -29,6 +30,6 @@ @Repository @RestResource(exported = false) -public interface PatientCareContextsMongoRepo extends MongoRepository { +public interface PatientCareContextsMongoRepo extends MongoRepository { public PatientCareContexts findByIdentifier(String benID); } diff --git a/src/main/java/com/wipro/fhir/service/common/CommonServiceImpl.java b/src/main/java/com/wipro/fhir/service/common/CommonServiceImpl.java index 24c51c8..5d676d3 100644 --- a/src/main/java/com/wipro/fhir/service/common/CommonServiceImpl.java +++ b/src/main/java/com/wipro/fhir/service/common/CommonServiceImpl.java @@ -334,8 +334,8 @@ public int addCareContextToMongo(PatientDemographic pDemo, PatientEligibleForRes ArrayList ccList = new ArrayList<>(); CareContexts cc = new CareContexts(); - logger.info("********t_benvisistData fetch response : {}", res); + cc.setReferenceNumber(pVisit.getVisitCode() != null ? pVisit.getVisitCode().toString() : null); cc.setDisplay(pVisit.getVisitCategory() != null ? pVisit.getVisitCategory().toString() : null); Object[] resData = null; @@ -347,7 +347,8 @@ public int addCareContextToMongo(PatientDemographic pDemo, PatientEligibleForRes logger.info("********data to be saved in mongo :" , cc); PatientCareContexts pcc; - PatientCareContexts resultSet; + PatientCareContexts resultSet = null; + if (pDemo.getBeneficiaryID() != null) { pcc = patientCareContextsMongoRepo.findByIdentifier(pDemo.getBeneficiaryID().toString()); @@ -357,7 +358,7 @@ public int addCareContextToMongo(PatientDemographic pDemo, PatientEligibleForRes ccList.add(cc); pcc.setCareContextsList(ccList); resultSet = patientCareContextsMongoRepo.save(pcc); - + } else { pcc = new PatientCareContexts(); pcc.setCaseReferenceNumber(pDemo.getBeneficiaryID().toString()); @@ -393,10 +394,9 @@ public int addCareContextToMongo(PatientDemographic pDemo, PatientEligibleForRes pcc.setCareContextsList(ccList); // save carecontext back to mongo resultSet = patientCareContextsMongoRepo.save(pcc); - } - if (resultSet != null && resultSet.getId() != null) + if (resultSet != null && resultSet.get_id() != null) response = 1; } diff --git a/src/main/java/com/wipro/fhir/service/v3/abha/CertificateKeyService.java b/src/main/java/com/wipro/fhir/service/v3/abha/CertificateKeyService.java new file mode 100644 index 0000000..63bf1e8 --- /dev/null +++ b/src/main/java/com/wipro/fhir/service/v3/abha/CertificateKeyService.java @@ -0,0 +1,9 @@ +package com.wipro.fhir.service.v3.abha; + +import com.wipro.fhir.utils.exception.FHIRException; + +public interface CertificateKeyService { + + public String getCertPublicKey() throws FHIRException; + +} diff --git a/src/main/java/com/wipro/fhir/service/v3/abha/CertificateKeyServiceImpl.java b/src/main/java/com/wipro/fhir/service/v3/abha/CertificateKeyServiceImpl.java new file mode 100644 index 0000000..71e5845 --- /dev/null +++ b/src/main/java/com/wipro/fhir/service/v3/abha/CertificateKeyServiceImpl.java @@ -0,0 +1,41 @@ +package com.wipro.fhir.service.v3.abha; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.wipro.fhir.utils.exception.FHIRException; + +@Service +public class CertificateKeyServiceImpl implements CertificateKeyService{ + + @Value("${getAuthCertPublicKey}") + String getAuthCertPublicKey; + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + @Override + public String getCertPublicKey() throws FHIRException { + + RestTemplate restTemplate = new RestTemplate(); + HttpEntity requestEntity = new HttpEntity<>(null); + + ResponseEntity certResp = restTemplate.exchange(getAuthCertPublicKey, HttpMethod.GET, requestEntity, + String.class); + String body = certResp.getBody(); + + String publicKeyString = body.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "") + .replaceAll("\\s+", ""); + + logger.info("publicKeyString : " + publicKeyString); + + return publicKeyString; + + } + +} diff --git a/src/main/java/com/wipro/fhir/service/v3/abha/CreateAbhaV3Service.java b/src/main/java/com/wipro/fhir/service/v3/abha/CreateAbhaV3Service.java new file mode 100644 index 0000000..6231476 --- /dev/null +++ b/src/main/java/com/wipro/fhir/service/v3/abha/CreateAbhaV3Service.java @@ -0,0 +1,16 @@ +package com.wipro.fhir.service.v3.abha; + +import com.wipro.fhir.utils.exception.FHIRException; + +public interface CreateAbhaV3Service { + + public String getOtpForEnrollment(String request) throws FHIRException; + + public String enrollmentByAadhaar(String request) throws FHIRException; + + public String verifyAuthByMobile(String request) throws FHIRException; + + public String getAbhaCardPrinted(String reqObj) throws FHIRException; + + +} diff --git a/src/main/java/com/wipro/fhir/service/v3/abha/CreateAbhaV3ServiceImpl.java b/src/main/java/com/wipro/fhir/service/v3/abha/CreateAbhaV3ServiceImpl.java new file mode 100644 index 0000000..5d4fe3e --- /dev/null +++ b/src/main/java/com/wipro/fhir/service/v3/abha/CreateAbhaV3ServiceImpl.java @@ -0,0 +1,425 @@ +package com.wipro.fhir.service.v3.abha; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.TimeZone; +import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.wipro.fhir.data.healthID.HealthIDResponse; +import com.wipro.fhir.data.v3.abhaCard.BioRequest; +import com.wipro.fhir.data.v3.abhaCard.ConsentRequest; +import com.wipro.fhir.data.v3.abhaCard.EnrollByAadhaar; +import com.wipro.fhir.data.v3.abhaCard.LoginMethod; +import com.wipro.fhir.data.v3.abhaCard.OtpRequest; +import com.wipro.fhir.data.v3.abhaCard.RequestOTPEnrollment; +import com.wipro.fhir.repo.healthID.HealthIDRepo; +import com.wipro.fhir.service.ndhm.Common_NDHMService; +import com.wipro.fhir.service.ndhm.GenerateSession_NDHMService; +import com.wipro.fhir.utils.Encryption; +import com.wipro.fhir.utils.exception.FHIRException; +import com.wipro.fhir.utils.http.HttpUtils; +import com.wipro.fhir.utils.mapper.InputMapper; + +@Service +public class CreateAbhaV3ServiceImpl implements CreateAbhaV3Service { + + @Autowired + private GenerateSession_NDHMService generateSession_NDHM; + @Autowired + private Common_NDHMService common_NDHMService; + @Autowired + HttpUtils httpUtils; + @Autowired + Encryption encryption; + @Autowired + HealthIDRepo healthIDRepo; + @Autowired + CertificateKeyService certificateKeyService; + + @Value("${requestOtpForEnrollment}") + String requestOtpForEnrollment; + + @Value("${abhaEnrollByAadhaar}") + String abhaEnrollByAadhaar; + + @Value("${printAbhaCard}") + String printAbhaCard; + + @Value("${abhaMode}") + String abhaMode; + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + @Override + public String getOtpForEnrollment(String request) throws FHIRException { + String res = null; + Map responseMap = new HashMap<>(); + RestTemplate restTemplate = new RestTemplate(); + String encryptedLoginId = null; + String publicKeyString = null; + + try { + String ndhmAuthToken = generateSession_NDHM.getNDHMAuthToken(); + + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", MediaType.APPLICATION_JSON + ";charset=utf-8"); + headers.add("REQUEST-ID", UUID.randomUUID().toString()); + + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + df.setTimeZone(tz); + String nowAsISO = df.format(new Date()); + headers.add("TIMESTAMP", nowAsISO); + headers.add("Authorization", ndhmAuthToken); + + RequestOTPEnrollment reqOtpEnrollment = new RequestOTPEnrollment(); + LoginMethod loginMethod = InputMapper.gson().fromJson(request, LoginMethod.class); + + publicKeyString = certificateKeyService.getCertPublicKey(); + if (loginMethod.getLoginId() != null) { + encryptedLoginId = encryption.encrypt(loginMethod.getLoginId(), publicKeyString); + } + + if ("AADHAAR".equalsIgnoreCase(loginMethod.getLoginMethod())) { + reqOtpEnrollment.setLoginId(encryptedLoginId); + reqOtpEnrollment.setOtpSystem("aadhaar"); + reqOtpEnrollment.setLoginHint("aadhaar"); + reqOtpEnrollment.setScope(new String[] { "abha-enrol" }); + } + + String requestOBJ = new Gson().toJson(reqOtpEnrollment); + logger.info("ABDM reqobj for request otp for enrollment: " + requestOBJ); + + HttpEntity httpEntity = new HttpEntity<>(requestOBJ, headers); + ResponseEntity responseEntity = restTemplate.exchange(requestOtpForEnrollment, HttpMethod.POST, + httpEntity, String.class); + + logger.info("ABDM response for request otp for enrollment: " + responseEntity); + String responseStrLogin = common_NDHMService.getBody(responseEntity); + if (responseEntity.getStatusCode() == HttpStatusCode.valueOf(200) && responseEntity.hasBody()) { + JsonObject jsnOBJ = JsonParser.parseString(responseStrLogin).getAsJsonObject(); + String txnId = jsnOBJ.get("txnId").getAsString(); + String message = jsnOBJ.get("message").getAsString(); + responseMap.put("txnId", txnId); + responseMap.put("message", message); + res = new Gson().toJson(responseMap); + } else { + throw new FHIRException(responseEntity.getBody()); + } + } catch (Exception e) { + throw new FHIRException(e.getMessage()); + } + + return res; + } + + @Override + public String enrollmentByAadhaar(String request) throws FHIRException { + Map responseMap = new HashMap<>(); + RestTemplate restTemplate = new RestTemplate(); + String encryptedLoginId = null; + String publicKeyString = null; + String requestObj = null; + + try { + String ndhmAuthToken = generateSession_NDHM.getNDHMAuthToken(); + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", MediaType.APPLICATION_JSON.toString()); + headers.add("REQUEST-ID", UUID.randomUUID().toString()); + + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + df.setTimeZone(tz); + String nowAsISO = df.format(new Date()); + headers.add("TIMESTAMP", nowAsISO); + headers.add("Authorization", ndhmAuthToken); + + // Create the enrollByAadhar object + EnrollByAadhaar enrollByAadhar = new EnrollByAadhaar(); + LoginMethod loginData = InputMapper.gson().fromJson(request, LoginMethod.class); + + publicKeyString = certificateKeyService.getCertPublicKey(); + if (loginData.getLoginId() != null) { + encryptedLoginId = encryption.encrypt(loginData.getLoginId(), publicKeyString); + } + + if ("AADHAAR".equalsIgnoreCase(loginData.getLoginMethod())) { + + requestObj = formAadharEnrollReqObjByAadhar(loginData, encryptedLoginId); + logger.info("ABDM request object for ABHA enrollment by AADHAAR: " + requestObj); + + } else if ("BIOMETRIC".equalsIgnoreCase(loginData.getLoginMethod())) { + + requestObj = formAadharEnrollReqObjByBiometric(loginData, encryptedLoginId); + logger.info("ABDM request object for ABHA enrollment by BIOMETRIC: " + requestObj); + + } + + HttpEntity httpEntity = new HttpEntity<>(requestObj, headers); + ResponseEntity responseEntity = restTemplate.exchange(abhaEnrollByAadhaar, HttpMethod.POST, + httpEntity, String.class); + + logger.info("ABDM response for ABHA enrollment: " + responseEntity); + String responseStrLogin = common_NDHMService.getBody(responseEntity); + if (responseEntity.getStatusCode() == HttpStatusCode.valueOf(200) && responseEntity.hasBody()) { + JsonObject jsonResponse = JsonParser.parseString(responseStrLogin).getAsJsonObject(); + + // Check for success messages + String message = jsonResponse.get("message").getAsString(); + if (message != null && (message.equalsIgnoreCase("account created successfully") + || message.equalsIgnoreCase("this account already exist"))) { + + if (jsonResponse.has("ABHAProfile")) { + JsonObject abhaProfileAsJsonObj = jsonResponse.get("ABHAProfile").getAsJsonObject(); + Gson gson = new Gson(); + String json = gson.toJson(abhaProfileAsJsonObj); + + HealthIDResponse healthIDResp = gson.fromJson(json, HealthIDResponse.class); + constructHealthIdResponse(healthIDResp, abhaProfileAsJsonObj); + healthIDResp.setProviderServiceMapID(loginData.getProviderServiceMapId()); + healthIDResp.setCreatedBy(loginData.getCreatedBy()); + Integer healthIdCount = healthIDRepo.getCountOfHealthIdNumber(healthIDResp.getHealthIdNumber()); + HealthIDResponse save = healthIDResp; + if (healthIdCount < 1) { + healthIDRepo.save(healthIDResp); + } + responseMap.put("ABHAProfile", gson.toJson(save)); + responseMap.put("txnId", jsonResponse.get("txnId").getAsString()); + responseMap.put("isNew", jsonResponse.get("isNew").getAsString()); + if (jsonResponse.has("tokens") && jsonResponse.get("tokens").isJsonObject()) { + JsonObject tokensObject = jsonResponse.get("tokens").getAsJsonObject(); + if (tokensObject.has("token") && !tokensObject.get("token").isJsonNull()) { + String token = tokensObject.get("token").getAsString(); + responseMap.put("xToken", token); + } + } + } + } + } else { + throw new FHIRException(responseEntity.getBody()); + } + } catch (Exception e) { + throw new FHIRException(e.getMessage()); + } + + return responseMap.toString(); + } + + @Override + public String verifyAuthByMobile(String request) throws FHIRException { + String res = null; + Map responseMap = new HashMap<>(); + RestTemplate restTemplate = new RestTemplate(); + String encryptedLoginId = null; + String publicKeyString = null; + + try { + String ndhmAuthToken = generateSession_NDHM.getNDHMAuthToken(); + + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", MediaType.APPLICATION_JSON + ";charset=utf-8"); + headers.add("REQUEST-ID", UUID.randomUUID().toString()); + + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + df.setTimeZone(tz); + String nowAsISO = df.format(new Date()); + headers.add("TIMESTAMP", nowAsISO); + headers.add("Authorization", ndhmAuthToken); + + RequestOTPEnrollment reqOtpEnrollment = new RequestOTPEnrollment(); + LoginMethod loginMethod = InputMapper.gson().fromJson(request, LoginMethod.class); + + publicKeyString = certificateKeyService.getCertPublicKey(); + if (loginMethod.getLoginId() != null) { + encryptedLoginId = encryption.encrypt(loginMethod.getLoginId(), publicKeyString); + } + + if ("AADHAAR".equalsIgnoreCase(loginMethod.getLoginMethod())) { + reqOtpEnrollment.setLoginId(encryptedLoginId); + reqOtpEnrollment.setTnxId(loginMethod.getTnxId()); + reqOtpEnrollment.setOtpSystem("abdm"); + reqOtpEnrollment.setLoginHint("mobile"); + reqOtpEnrollment.setScope(new String[] { "abha-enrol", "mobile-verify" }); + + } + + String requestOBJ = new Gson().toJson(reqOtpEnrollment); + logger.info("ABDM reqobj for verify mobile number for abha enrollment: " + requestOBJ); + + HttpEntity httpEntity = new HttpEntity<>(requestOBJ, headers); + ResponseEntity responseEntity = restTemplate.exchange(requestOtpForEnrollment, HttpMethod.POST, + httpEntity, String.class); + + logger.info("ABDM response for verify mobile number for abha enrollment: " + responseEntity); + String responseStrLogin = common_NDHMService.getBody(responseEntity); + if (responseEntity.getStatusCode() == HttpStatusCode.valueOf(200) && responseEntity.hasBody()) { + JsonObject jsnOBJ = JsonParser.parseString(responseStrLogin).getAsJsonObject(); + String txnId = jsnOBJ.get("txnId").getAsString(); + String message = jsnOBJ.get("message").getAsString(); + responseMap.put("txnId", txnId); + responseMap.put("message", message); + res = new Gson().toJson(responseMap); + } else { + throw new FHIRException(responseEntity.getBody()); + } + } catch (Exception e) { + throw new FHIRException(e.getMessage()); + } + + return res; + } + + public String formAadharEnrollReqObjByAadhar(LoginMethod loginData, String encryptedLoginId) { + + EnrollByAadhaar enrollByAadhar = new EnrollByAadhaar(); + OtpRequest otp = new OtpRequest(); + + // Get current timestamp + OffsetDateTime now = OffsetDateTime.now(java.time.ZoneOffset.UTC); + DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; + String formattedTimestamp = now.format(formatter); + otp.setTimestamp(formattedTimestamp); + + otp.setTxnId(loginData.getTnxId()); + otp.setOtpValue(encryptedLoginId); + otp.setMobile(loginData.getMobileNumber()); + + Map authDataMap = new HashMap<>(); + authDataMap.put("otp", otp); + authDataMap.put("authMethods", new String[] { "otp" }); + + enrollByAadhar.setAuthData(authDataMap); + + ConsentRequest consent = new ConsentRequest(); + consent.setCode("abha-enrollment"); + consent.setVersion("1.4"); + enrollByAadhar.setConsent(consent); + logger.info("ABDM request for enroll by Aadhaar: " + enrollByAadhar); + + String requestObj = new Gson().toJson(enrollByAadhar); + + return requestObj; + } + + public String formAadharEnrollReqObjByBiometric(LoginMethod loginData, String encryptedLoginId) { + + EnrollByAadhaar enrollByAadhar = new EnrollByAadhaar(); + BioRequest bio = new BioRequest(); + + // Get current timestamp + OffsetDateTime now = OffsetDateTime.now(java.time.ZoneOffset.UTC); + DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; + String formattedTimestamp = now.format(formatter); + bio.setTimestamp(formattedTimestamp); + + bio.setTxnId(loginData.getTnxId()); + + bio.setAadhaar(encryptedLoginId); + bio.setFingerPrintAuthPid(loginData.getPId()); + bio.setMobile(loginData.getMobileNumber()); + + Map authDataMap = new HashMap<>(); + authDataMap.put("bio", bio); + authDataMap.put("authMethods", new String[] { "bio" }); + + enrollByAadhar.setAuthData(authDataMap); + + ConsentRequest consent = new ConsentRequest(); + consent.setCode("abha-enrollment"); + consent.setVersion("1.4"); + enrollByAadhar.setConsent(consent); + logger.info("ABDM request for enroll by biometric: " + enrollByAadhar); + + String requestObj = new Gson().toJson(enrollByAadhar); + + return requestObj; + } + + @Override + public String getAbhaCardPrinted(String reqObj) throws FHIRException { + + String res = null; + Map responseMap = new HashMap<>(); + RestTemplate restTemplate = new RestTemplate(); + + + try { + String ndhmAuthToken = generateSession_NDHM.getNDHMAuthToken(); + + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", MediaType.APPLICATION_JSON + ";charset=utf-8"); + headers.add("REQUEST-ID", UUID.randomUUID().toString()); + + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + df.setTimeZone(tz); + String nowAsISO = df.format(new Date()); + headers.add("TIMESTAMP", nowAsISO); + headers.add("Authorization", ndhmAuthToken); + + JsonObject stringReqObj = JsonParser.parseString(reqObj).getAsJsonObject(); + if (stringReqObj.has("xToken") && stringReqObj.get("xToken") != null) { + String xToken = stringReqObj.get("xToken").getAsString(); + headers.add("X-token", "Bearer " + xToken); + } + HttpEntity httpEntity = new HttpEntity<>(headers); + ResponseEntity responseEntity = restTemplate.exchange(printAbhaCard, HttpMethod.GET, httpEntity, + String.class); + + logger.info("ABDM response for print Abha card:" + responseEntity); + String responseStrLogin = common_NDHMService.getBody(responseEntity); + if (responseEntity.getStatusCode() == HttpStatusCode.valueOf(202)) { + responseMap.put("png", responseStrLogin); + res = new Gson().toJson(responseMap); + } else { + throw new FHIRException(responseEntity.getBody()); + } + + } catch (Exception e) { + throw new FHIRException(e.getMessage()); + } + return res; + + } + + private void constructHealthIdResponse(HealthIDResponse healthIDResp, JsonObject profile) throws ParseException { + healthIDResp.setHealthIdNumber(profile.get("ABHANumber").getAsString()); + String abhaAddress = profile.get("phrAddress").getAsString().replace("[", "").replace("]", ""); + healthIDResp.setHealthId(abhaAddress); + healthIDResp.setName( + healthIDResp.getFirstName() + " " + healthIDResp.getMiddleName() + " " + healthIDResp.getLastName()); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy"); + Date date = simpleDateFormat.parse(profile.get("dob").getAsString()); + SimpleDateFormat year = new SimpleDateFormat("yyyy"); + SimpleDateFormat month = new SimpleDateFormat("MM"); + SimpleDateFormat day = new SimpleDateFormat("dd"); + healthIDResp.setYearOfBirth(year.format(date)); + healthIDResp.setMonthOfBirth(month.format(date)); + healthIDResp.setDayOfBirth(day.format(date)); + } + +} diff --git a/src/main/java/com/wipro/fhir/service/v3/abha/LoginAbhaV3Service.java b/src/main/java/com/wipro/fhir/service/v3/abha/LoginAbhaV3Service.java new file mode 100644 index 0000000..0ad41fc --- /dev/null +++ b/src/main/java/com/wipro/fhir/service/v3/abha/LoginAbhaV3Service.java @@ -0,0 +1,11 @@ +package com.wipro.fhir.service.v3.abha; + +import com.wipro.fhir.utils.exception.FHIRException; + +public interface LoginAbhaV3Service { + + String requestOtpForAbhaLogin(String request) throws FHIRException; + + String verifyAbhaLogin(String request) throws FHIRException; + +} diff --git a/src/main/java/com/wipro/fhir/service/v3/abha/LoginAbhaV3ServiceImpl.java b/src/main/java/com/wipro/fhir/service/v3/abha/LoginAbhaV3ServiceImpl.java new file mode 100644 index 0000000..1baaf7e --- /dev/null +++ b/src/main/java/com/wipro/fhir/service/v3/abha/LoginAbhaV3ServiceImpl.java @@ -0,0 +1,223 @@ +package com.wipro.fhir.service.v3.abha; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.TimeZone; +import java.util.UUID; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.wipro.fhir.data.healthID.HealthIDResponse; +import com.wipro.fhir.data.v3.abhaCard.LoginAbhaRequest; +import com.wipro.fhir.data.v3.abhaCard.LoginMethod; +import com.wipro.fhir.data.v3.abhaCard.OtpRequest; +import com.wipro.fhir.data.v3.abhaCard.RequestOTPEnrollment; +import com.wipro.fhir.data.v3.abhaCard.VerifyAbhaLogin; +import com.wipro.fhir.service.ndhm.Common_NDHMService; +import com.wipro.fhir.service.ndhm.GenerateSession_NDHMService; +import com.wipro.fhir.utils.Encryption; +import com.wipro.fhir.utils.exception.FHIRException; +import com.wipro.fhir.utils.http.HttpUtils; +import com.wipro.fhir.utils.mapper.InputMapper; + +@Service +public class LoginAbhaV3ServiceImpl implements LoginAbhaV3Service { + + @Autowired + private GenerateSession_NDHMService generateSession_NDHM; + @Autowired + private Common_NDHMService common_NDHMService; + @Autowired + private Encryption encryption; + @Autowired + private CertificateKeyService certificateKeyService; + + @Value("${abhaLoginRequestOtp}") + String abhaLoginRequestOtp; + + @Value("${verifyAbhaLogin}") + String verifyAbhaLoginUrl; + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + @Override + public String requestOtpForAbhaLogin(String request) throws FHIRException { + String res = null; + Map responseMap = new HashMap<>(); + RestTemplate restTemplate = new RestTemplate(); + String encryptedLoginId = null; + String publicKeyString = null; + + try { + String ndhmAuthToken = generateSession_NDHM.getNDHMAuthToken(); + + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", MediaType.APPLICATION_JSON + ";charset=utf-8"); + headers.add("REQUEST-ID", UUID.randomUUID().toString()); + + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + df.setTimeZone(tz); + String nowAsISO = df.format(new Date()); + headers.add("TIMESTAMP", nowAsISO); + headers.add("Authorization", ndhmAuthToken); + + RequestOTPEnrollment reqOtpEnrollment = new RequestOTPEnrollment(); + LoginAbhaRequest loginAbhaRequest = InputMapper.gson().fromJson(request, LoginAbhaRequest.class); + + publicKeyString = certificateKeyService.getCertPublicKey(); + if (loginAbhaRequest.getLoginId() != null) { + encryptedLoginId = encryption.encrypt(loginAbhaRequest.getLoginId(), publicKeyString); + reqOtpEnrollment.setLoginId(encryptedLoginId); + } + + if ("AADHAAR".equalsIgnoreCase(loginAbhaRequest.getLoginMethod())) { + reqOtpEnrollment.setOtpSystem("aadhaar"); + reqOtpEnrollment.setScope(new String[] { "abha-login", "aadhaar-verify" }); + } else if ("mobile".equalsIgnoreCase(loginAbhaRequest.getLoginMethod())) { + reqOtpEnrollment.setOtpSystem("abdm"); + reqOtpEnrollment.setScope(new String[] { "abha-login", "mobile-verify" }); + } + + if ("ABHA".equalsIgnoreCase(loginAbhaRequest.getLoginHint())) { + reqOtpEnrollment.setOtpSystem("abdm"); + reqOtpEnrollment.setLoginHint("abha"); + } else if ("AADHAAR".equalsIgnoreCase(loginAbhaRequest.getLoginHint())) { + reqOtpEnrollment.setLoginHint("aadhaar"); + } else if ("MOBILE".equalsIgnoreCase(loginAbhaRequest.getLoginHint())) { + reqOtpEnrollment.setLoginHint("mobile"); + } + + String requestOBJ = new Gson().toJson(reqOtpEnrollment); + logger.info("ABDM reqobj for request otp for Abha login: " + requestOBJ); + + HttpEntity httpEntity = new HttpEntity<>(requestOBJ, headers); + ResponseEntity responseEntity = restTemplate.exchange(abhaLoginRequestOtp, HttpMethod.POST, + httpEntity, String.class); + + logger.info("ABDM response for request otp for Abha login: " + responseEntity); + String responseStrLogin = common_NDHMService.getBody(responseEntity); + if (responseEntity.getStatusCode() == HttpStatusCode.valueOf(200) && responseEntity.hasBody()) { + JsonObject jsnOBJ = JsonParser.parseString(responseStrLogin).getAsJsonObject(); + String txnId = jsnOBJ.get("txnId").getAsString(); + String message = jsnOBJ.get("message").getAsString(); + responseMap.put("txnId", txnId); + responseMap.put("message", message); + res = new Gson().toJson(responseMap); + } else { + throw new FHIRException(responseEntity.getBody()); + } + } catch (Exception e) { + throw new FHIRException(e.getMessage()); + } + + return res; + } + + + @Override + public String verifyAbhaLogin(String request) throws FHIRException { + Map responseMap = new HashMap<>(); + RestTemplate restTemplate = new RestTemplate(); + String encryptedLoginId = null; + String publicKeyString = null; + HealthIDResponse health = new HealthIDResponse(); + + try { + String ndhmAuthToken = generateSession_NDHM.getNDHMAuthToken(); + MultiValueMap headers = new LinkedMultiValueMap<>(); + headers.add("Content-Type", MediaType.APPLICATION_JSON.toString()); + headers.add("REQUEST-ID", UUID.randomUUID().toString()); + + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + df.setTimeZone(tz); + String nowAsISO = df.format(new Date()); + headers.add("TIMESTAMP", nowAsISO); + headers.add("Authorization", ndhmAuthToken); + + // Create the enrollByAadhar object + VerifyAbhaLogin verifyAbhaLogin = new VerifyAbhaLogin(); + LoginMethod loginData = InputMapper.gson().fromJson(request, LoginMethod.class); + + publicKeyString = certificateKeyService.getCertPublicKey(); + if (loginData.getLoginId() != null) { + encryptedLoginId = encryption.encrypt(loginData.getLoginId(), publicKeyString); + } + + OtpRequest otp = new OtpRequest(); + + otp.setTxnId(loginData.getTnxId()); + otp.setOtpValue(encryptedLoginId); + + Map authDataMap = new HashMap<>(); + authDataMap.put("otp", otp); + authDataMap.put("authMethods", new String[] { "otp" }); + + verifyAbhaLogin.setAuthData(authDataMap); + + if ("AADHAAR".equalsIgnoreCase(loginData.getLoginMethod())) { + verifyAbhaLogin.setScope(new String[] {"abha-login", "aadhaar-verify" } ); + + } else if ("MOBILE".equalsIgnoreCase(loginData.getLoginMethod())) { + verifyAbhaLogin.setScope(new String[] {"abha-login", "mobile-verify" } ); + + } + + String requestObj = new Gson().toJson(verifyAbhaLogin); + logger.info("ABDM request for verify abha login: " + requestObj); + + HttpEntity httpEntity = new HttpEntity<>(requestObj, headers); + ResponseEntity responseEntity = restTemplate.exchange(verifyAbhaLoginUrl, HttpMethod.POST, + httpEntity, String.class); + + logger.info("ABDM response for verify abha login: " + httpEntity); + String responseStrLogin = common_NDHMService.getBody(responseEntity); + if (responseEntity.getStatusCode() == HttpStatusCode.valueOf(200) && responseEntity.hasBody()) { + JsonObject jsonResponse = JsonParser.parseString(responseStrLogin).getAsJsonObject(); + + // Check for success messages + String authResult = jsonResponse.get("authResult").getAsString(); + if (authResult != null && (authResult.equalsIgnoreCase("success"))) { + + if (jsonResponse.has("accounts")) { + responseMap.put("abhaDetails", jsonResponse.get("accounts").getAsJsonArray().get(0).getAsJsonObject().toString()); + responseMap.put("txnId", jsonResponse.get("txnId").getAsString()); + if (jsonResponse.has("token")) { + responseMap.put("xToken", jsonResponse.get("token").getAsString()); + } + } + } else { + String message = jsonResponse.get("message").getAsString(); + throw new FHIRException(message); + } + } else { + throw new FHIRException(responseEntity.getBody()); + } + } catch (Exception e) { + throw new FHIRException(e.getMessage()); + } + + return responseMap.toString(); + } + + +} diff --git a/src/main/java/com/wipro/fhir/utils/Encryption.java b/src/main/java/com/wipro/fhir/utils/Encryption.java new file mode 100644 index 0000000..99cd569 --- /dev/null +++ b/src/main/java/com/wipro/fhir/utils/Encryption.java @@ -0,0 +1,50 @@ +package com.wipro.fhir.utils; + +import java.security.InvalidKeyException; +import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException; +import java.security.PublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import com.wipro.fhir.utils.exception.FHIRException; + +@Service +public class Encryption { + + @Value("${ndhmuserAuthenticate}") + private String ndhmUserAuthenticate; + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + public String encrypt(String text, String publicKeyString) throws FHIRException, NoSuchAlgorithmException, + InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { + String encryptedTextBase64 = ""; + byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyString); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes); + PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); + + // Cipher used in ABHA v3 APIs + Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encryptedText = cipher.doFinal(text.getBytes()); + encryptedTextBase64 = Base64.getEncoder().encodeToString(encryptedText); + logger.info("encryptedTextBase64 :" + encryptedTextBase64); + + return encryptedTextBase64; + + } + +}