mirror of
https://github.com/pcvolkmer/mv64e-etl-processor
synced 2025-09-13 01:02:50 +00:00
refactor: several changes related to code style and readability (#152)
* refactor: extract provision code extraction * refactor: catch exceptions by type without later type check * refactor: further code cleanup * chore: log error with error level, not debug level
This commit is contained in:
@@ -23,8 +23,6 @@ import ca.uhn.fhir.context.FhirContext;
|
|||||||
import ca.uhn.fhir.parser.IParser;
|
import ca.uhn.fhir.parser.IParser;
|
||||||
import dev.dnpm.etl.processor.config.AppFhirConfig;
|
import dev.dnpm.etl.processor.config.AppFhirConfig;
|
||||||
import dev.dnpm.etl.processor.config.GPasConfigProperties;
|
import dev.dnpm.etl.processor.config.GPasConfigProperties;
|
||||||
import java.net.URI;
|
|
||||||
import java.net.URISyntaxException;
|
|
||||||
import org.apache.commons.lang3.NotImplementedException;
|
import org.apache.commons.lang3.NotImplementedException;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.hc.core5.net.URIBuilder;
|
import org.apache.hc.core5.net.URIBuilder;
|
||||||
@@ -39,9 +37,11 @@ import org.springframework.http.*;
|
|||||||
import org.springframework.retry.support.RetryTemplate;
|
import org.springframework.retry.support.RetryTemplate;
|
||||||
import org.springframework.web.client.HttpClientErrorException.BadRequest;
|
import org.springframework.web.client.HttpClientErrorException.BadRequest;
|
||||||
import org.springframework.web.client.HttpClientErrorException.Unauthorized;
|
import org.springframework.web.client.HttpClientErrorException.Unauthorized;
|
||||||
import org.springframework.web.client.RestClientException;
|
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
|
||||||
public class GpasPseudonymGenerator implements Generator {
|
public class GpasPseudonymGenerator implements Generator {
|
||||||
|
|
||||||
private final FhirContext r4Context;
|
private final FhirContext r4Context;
|
||||||
@@ -52,10 +52,10 @@ public class GpasPseudonymGenerator implements Generator {
|
|||||||
private final RestTemplate restTemplate;
|
private final RestTemplate restTemplate;
|
||||||
private final @NotNull String genomDeTanDomain;
|
private final @NotNull String genomDeTanDomain;
|
||||||
private final @NotNull String pidPsnDomain;
|
private final @NotNull String pidPsnDomain;
|
||||||
protected final static String createOrGetPsn = "$pseudonymizeAllowCreate";
|
protected static final String CREATE_OR_GET_PSN = "$pseudonymizeAllowCreate";
|
||||||
protected final static String createMultiDomainPsn = "$pseudonymize-secondary";
|
protected static final String CREATE_MULTI_DOMAIN_PSN = "$pseudonymize-secondary";
|
||||||
private final static String SINGLE_PSN_PART_NAME = "pseudonym";
|
private static final String SINGLE_PSN_PART_NAME = "pseudonym";
|
||||||
private final static String MULTI_PSN_PART_NAME = "value";
|
private static final String MULTI_PSN_PART_NAME = "value";
|
||||||
|
|
||||||
public GpasPseudonymGenerator(GPasConfigProperties gpasCfg, RetryTemplate retryTemplate,
|
public GpasPseudonymGenerator(GPasConfigProperties gpasCfg, RetryTemplate retryTemplate,
|
||||||
RestTemplate restTemplate, AppFhirConfig appFhirConfig) {
|
RestTemplate restTemplate, AppFhirConfig appFhirConfig) {
|
||||||
@@ -85,7 +85,7 @@ public class GpasPseudonymGenerator implements Generator {
|
|||||||
switch (domainType) {
|
switch (domainType) {
|
||||||
case SINGLE_PSN_DOMAIN -> {
|
case SINGLE_PSN_DOMAIN -> {
|
||||||
final var requestBody = createSinglePsnRequestBody(id, pidPsnDomain);
|
final var requestBody = createSinglePsnRequestBody(id, pidPsnDomain);
|
||||||
final var responseEntity = getGpasPseudonym(requestBody, createOrGetPsn);
|
final var responseEntity = getGpasPseudonym(requestBody, CREATE_OR_GET_PSN);
|
||||||
final var gPasPseudonymResult = (Parameters) r4Context.newJsonParser()
|
final var gPasPseudonymResult = (Parameters) r4Context.newJsonParser()
|
||||||
.parseResource(responseEntity.getBody());
|
.parseResource(responseEntity.getBody());
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ public class GpasPseudonymGenerator implements Generator {
|
|||||||
}
|
}
|
||||||
case MULTI_PSN_DOMAIN -> {
|
case MULTI_PSN_DOMAIN -> {
|
||||||
final var requestBody = createMultiPsnRequestBody(id, genomDeTanDomain);
|
final var requestBody = createMultiPsnRequestBody(id, genomDeTanDomain);
|
||||||
final var responseEntity = getGpasPseudonym(requestBody, createMultiDomainPsn);
|
final var responseEntity = getGpasPseudonym(requestBody, CREATE_MULTI_DOMAIN_PSN);
|
||||||
final var gPasPseudonymResult = (Parameters) r4Context.newJsonParser()
|
final var gPasPseudonymResult = (Parameters) r4Context.newJsonParser()
|
||||||
.parseResource(responseEntity.getBody());
|
.parseResource(responseEntity.getBody());
|
||||||
|
|
||||||
@@ -150,23 +150,22 @@ public class GpasPseudonymGenerator implements Generator {
|
|||||||
log.debug("API request succeeded. Response: {}", responseEntity.getStatusCode());
|
log.debug("API request succeeded. Response: {}", responseEntity.getStatusCode());
|
||||||
return responseEntity;
|
return responseEntity;
|
||||||
}
|
}
|
||||||
} catch (RestClientException rce) {
|
} catch (BadRequest e) {
|
||||||
if (rce instanceof BadRequest) {
|
String msg = "gPas or request configuration is incorrect. Please check both."
|
||||||
String msg = "gPas or request configuration is incorrect. Please check both."
|
+ e.getMessage();
|
||||||
+ rce.getMessage();
|
log.error(msg);
|
||||||
log.debug(
|
throw new PseudonymRequestFailed(msg, e);
|
||||||
msg);
|
} catch (Unauthorized e) {
|
||||||
throw new PseudonymRequestFailed(msg, rce);
|
var msg = "gPas access credentials are invalid check your configuration. msg: '%s"
|
||||||
}
|
.formatted(e.getMessage());
|
||||||
if (rce instanceof Unauthorized) {
|
log.error(msg);
|
||||||
var msg = "gPas access credentials are invalid check your configuration. msg: '%s".formatted(
|
throw new PseudonymRequestFailed(msg, e);
|
||||||
rce.getMessage());
|
}
|
||||||
log.error(msg);
|
catch (Exception unexpected) {
|
||||||
throw new PseudonymRequestFailed(msg, rce);
|
|
||||||
}
|
|
||||||
} catch (Exception unexpected) {
|
|
||||||
throw new PseudonymRequestFailed(
|
throw new PseudonymRequestFailed(
|
||||||
"API request due unexpected error unsuccessful gPas unsuccessful.", unexpected);
|
"API request due unexpected error unsuccessful gPas unsuccessful.",
|
||||||
|
unexpected
|
||||||
|
);
|
||||||
}
|
}
|
||||||
throw new PseudonymRequestFailed(
|
throw new PseudonymRequestFailed(
|
||||||
"API request due unexpected error unsuccessful gPas unsuccessful.");
|
"API request due unexpected error unsuccessful gPas unsuccessful.");
|
||||||
|
@@ -137,15 +137,7 @@ class ConsentProcessor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val provisionComponent: ProvisionComponent = provisions.first()
|
val provisionComponent: ProvisionComponent = provisions.first()
|
||||||
|
val provisionCode = getProvisionCode(provisionComponent)
|
||||||
var provisionCode: String? = null
|
|
||||||
if (provisionComponent.code != null && provisionComponent.code.isNotEmpty()) {
|
|
||||||
val codableConcept: CodeableConcept = provisionComponent.code.first()
|
|
||||||
if (codableConcept.coding != null && codableConcept.coding.isNotEmpty()) {
|
|
||||||
provisionCode = codableConcept.coding.first().code
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (provisionCode != null) {
|
if (provisionCode != null) {
|
||||||
try {
|
try {
|
||||||
val modelProjectConsentPurpose =
|
val modelProjectConsentPurpose =
|
||||||
@@ -177,6 +169,17 @@ class ConsentProcessor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getProvisionCode(provisionComponent: ProvisionComponent): String? {
|
||||||
|
var provisionCode: String? = null
|
||||||
|
if (provisionComponent.code != null && provisionComponent.code.isNotEmpty()) {
|
||||||
|
val codableConcept: CodeableConcept = provisionComponent.code.first()
|
||||||
|
if (codableConcept.coding != null && codableConcept.coding.isNotEmpty()) {
|
||||||
|
provisionCode = codableConcept.coding.first().code
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return provisionCode
|
||||||
|
}
|
||||||
|
|
||||||
private fun setGenomDeSubmissionType(mtbFile: Mtb) {
|
private fun setGenomDeSubmissionType(mtbFile: Mtb) {
|
||||||
if (appConfigProperties.genomDeTestSubmission) {
|
if (appConfigProperties.genomDeTestSubmission) {
|
||||||
mtbFile.metadata.type = MvhSubmissionType.TEST
|
mtbFile.metadata.type = MvhSubmissionType.TEST
|
||||||
@@ -238,9 +241,9 @@ class ConsentProcessor(
|
|||||||
consent.provision.provision.filter { subProvision ->
|
consent.provision.provision.filter { subProvision ->
|
||||||
isRequestDateInRange(requestDate, subProvision.period)
|
isRequestDateInRange(requestDate, subProvision.period)
|
||||||
// search coding entries of current provision for code and system
|
// search coding entries of current provision for code and system
|
||||||
subProvision.code.map { c -> c.coding }.flatten().firstOrNull { code ->
|
subProvision.code.map { c -> c.coding }.flatten().any { code ->
|
||||||
targetCode.equals(code.code) && targetSystem.equals(code.system)
|
targetCode.equals(code.code) && targetSystem.equals(code.system)
|
||||||
} != null
|
}
|
||||||
}.map { subProvision ->
|
}.map { subProvision ->
|
||||||
subProvision
|
subProvision
|
||||||
}
|
}
|
||||||
@@ -257,11 +260,11 @@ class ConsentProcessor(
|
|||||||
researchAllowedPolicySystem: String?,
|
researchAllowedPolicySystem: String?,
|
||||||
policyRules: Collection<Coding>
|
policyRules: Collection<Coding>
|
||||||
): Boolean {
|
): Boolean {
|
||||||
return policyRules.find { code ->
|
return policyRules.any { code ->
|
||||||
researchAllowedPolicySystem.equals(code.getSystem()) && (researchAllowedPolicyOid.equals(
|
researchAllowedPolicySystem.equals(code.getSystem()) && (researchAllowedPolicyOid.equals(
|
||||||
code.getCode()
|
code.getCode()
|
||||||
))
|
))
|
||||||
} != null
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isRequestDateInRange(requestDate: Date?, provPeriod: Period): Boolean {
|
fun isRequestDateInRange(requestDate: Date?, provPeriod: Period): Boolean {
|
||||||
|
Reference in New Issue
Block a user