1
0
mirror of https://github.com/pcvolkmer/mv64e-etl-processor synced 2025-09-13 09: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:
2025-09-04 12:47:56 +02:00
committed by GitHub
parent 10b5bedac3
commit 3d9d84438d
2 changed files with 40 additions and 38 deletions

View File

@@ -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.");

View File

@@ -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 {