diff --git a/src/main/java/gov/cms/madie/terminology/config/WebFluxConfiguration.java b/src/main/java/gov/cms/madie/terminology/config/WebFluxConfiguration.java index d261177..58e8853 100644 --- a/src/main/java/gov/cms/madie/terminology/config/WebFluxConfiguration.java +++ b/src/main/java/gov/cms/madie/terminology/config/WebFluxConfiguration.java @@ -6,8 +6,8 @@ @Configuration public class WebFluxConfiguration implements WebFluxConfigurer { - @Override - public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { - configurer.defaultCodecs().maxInMemorySize(500 * 1024); - } -} \ No newline at end of file + @Override + public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { + configurer.defaultCodecs().maxInMemorySize(500 * 1024); + } +} diff --git a/src/main/java/gov/cms/madie/terminology/controller/VsacController.java b/src/main/java/gov/cms/madie/terminology/controller/VsacController.java index 64fd92b..a73fc16 100644 --- a/src/main/java/gov/cms/madie/terminology/controller/VsacController.java +++ b/src/main/java/gov/cms/madie/terminology/controller/VsacController.java @@ -38,19 +38,19 @@ public class VsacController { @GetMapping(path = "/valueset", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getValueSet( - Principal principal, - @RequestParam String oid, - @RequestParam(required = false, name = "profile") String profile, - @RequestParam(required = false, name = "includeDraft") String includeDraft, - @RequestParam(required = false, name = "release") String release, - @RequestParam(required = false, name = "version") String version) { + Principal principal, + @RequestParam String oid, + @RequestParam(required = false, name = "profile") String profile, + @RequestParam(required = false, name = "includeDraft") String includeDraft, + @RequestParam(required = false, name = "release") String release, + @RequestParam(required = false, name = "version") String version) { log.debug("Entering: getValueSet()"); final String username = principal.getName(); Optional umlsUser = vsacService.findByHarpId(username); if (umlsUser.isPresent()) { RetrieveMultipleValueSetsResponse valuesetResponse = - vsacService.getValueSet(oid, umlsUser.get(), profile, includeDraft, release, version); + vsacService.getValueSet(oid, umlsUser.get(), profile, includeDraft, release, version); ValueSet fhirValueSet = vsacService.convertToFHIRValueSet(valuesetResponse); log.debug("valueset id = " + fhirValueSet.getId()); @@ -67,7 +67,7 @@ protected String serializeFhirValueset(ValueSet fhirValueSet) { @PutMapping(path = "/value-sets/searches", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity searchValueSets( - Principal principal, @RequestBody ValueSetsSearchCriteria searchCriteria) { + Principal principal, @RequestBody ValueSetsSearchCriteria searchCriteria) { log.debug("VsacController::getValueSets"); final String username = principal.getName(); @@ -75,11 +75,11 @@ public ResponseEntity searchValueSets( if (umlsUser.isPresent()) { List vsacValueSets = - vsacService.getValueSets(searchCriteria, umlsUser.get()); + vsacService.getValueSets(searchCriteria, umlsUser.get()); List fhirValueSets = vsacService.convertToFHIRValueSets(vsacValueSets); String serializedValueSets = - fhirValueSets.stream().map(this::serializeFhirValueset).collect(Collectors.joining(", ")); + fhirValueSets.stream().map(this::serializeFhirValueset).collect(Collectors.joining(", ")); return ResponseEntity.ok().body("[" + serializedValueSets + "]"); } @@ -88,14 +88,14 @@ public ResponseEntity searchValueSets( @PutMapping("/qdm/value-sets/searches") public ResponseEntity> getQdmValueSets( - Principal principal, @RequestBody ValueSetsSearchCriteria searchCriteria) { + Principal principal, @RequestBody ValueSetsSearchCriteria searchCriteria) { log.debug("VsacController::getQdmValueSets"); final String username = principal.getName(); Optional umlsUser = vsacService.findByHarpId(username); if (umlsUser.isPresent()) { List qdmValueSets = - vsacService.getValueSetsInQdmFormat(searchCriteria, umlsUser.get()); + vsacService.getValueSetsInQdmFormat(searchCriteria, umlsUser.get()); return ResponseEntity.ok().body(qdmValueSets); } @@ -104,9 +104,9 @@ public ResponseEntity> getQdmValueSets( @PutMapping(path = "/validations/codes", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> validateCodes( - Principal principal, - @RequestBody List cqlCodes, - @RequestParam(required = false, defaultValue = "FHIR") String model) { + Principal principal, + @RequestBody List cqlCodes, + @RequestParam(required = false, defaultValue = "FHIR") String model) { final String username = principal.getName(); Optional umlsUser = vsacService.findByHarpId(username); if (umlsUser.isPresent() && umlsUser.get().getApiKey() != null) { @@ -131,23 +131,7 @@ public ResponseEntity umlsLogin(Principal principal, @RequestBody String @GetMapping("/umls-credentials/status") public ResponseEntity checkUserLogin(Principal principal) { return vsacService.validateUmlsInformation(principal.getName()) - ? ResponseEntity.ok().body(Boolean.TRUE) - : new ResponseEntity<>(HttpStatus.UNAUTHORIZED); - } - - @GetMapping(path = "/update-code-systems", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity> retrieveAndUpdateCodeSystems(Principal principal) { - final String username = principal.getName(); - Optional umlsUser = vsacService.findByHarpId(username); - - if (umlsUser.isPresent() && !StringUtils.isBlank(umlsUser.get().getApiKey())) { - return ResponseEntity.ok().body(fhirTerminologyService.retrieveAllCodeSystems(umlsUser.get())); - } - else{ - log.error( - "Unable to Retrieve List of code systems, " - + "UMLS Authentication Key Not found for user : [{}}]", - username); - throw new VsacUnauthorizedException("Please login to UMLS before proceeding"); } + ? ResponseEntity.ok().body(Boolean.TRUE) + : new ResponseEntity<>(HttpStatus.UNAUTHORIZED); } } diff --git a/src/main/java/gov/cms/madie/terminology/controller/VsacFhirTerminologyController.java b/src/main/java/gov/cms/madie/terminology/controller/VsacFhirTerminologyController.java index 2462dd2..ebbb103 100644 --- a/src/main/java/gov/cms/madie/terminology/controller/VsacFhirTerminologyController.java +++ b/src/main/java/gov/cms/madie/terminology/controller/VsacFhirTerminologyController.java @@ -4,12 +4,14 @@ import gov.cms.madie.terminology.dto.QdmValueSet; import gov.cms.madie.terminology.dto.ValueSetsSearchCriteria; import gov.cms.madie.terminology.exceptions.VsacUnauthorizedException; +import gov.cms.madie.terminology.models.CodeSystem; import gov.cms.madie.terminology.models.UmlsUser; import gov.cms.madie.terminology.service.FhirTerminologyService; import gov.cms.madie.terminology.service.VsacService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -59,4 +61,21 @@ public ResponseEntity> getValueSetsExpansions( username); throw new VsacUnauthorizedException("Please login to UMLS before proceeding"); } + + @GetMapping(path = "/update-code-systems", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> retrieveAndUpdateCodeSystems(Principal principal) { + final String username = principal.getName(); + Optional umlsUser = vsacService.findByHarpId(username); + + if (umlsUser.isPresent() && !StringUtils.isBlank(umlsUser.get().getApiKey())) { + return ResponseEntity.ok() + .body(fhirTerminologyService.retrieveAllCodeSystems(umlsUser.get())); + } else { + log.error( + "Unable to Retrieve List of code systems, " + + "UMLS Authentication Key Not found for user : [{}}]", + username); + throw new VsacUnauthorizedException("Please login to UMLS before proceeding"); + } + } } diff --git a/src/main/java/gov/cms/madie/terminology/models/CodeSystem.java b/src/main/java/gov/cms/madie/terminology/models/CodeSystem.java index 91cd396..961ea2a 100644 --- a/src/main/java/gov/cms/madie/terminology/models/CodeSystem.java +++ b/src/main/java/gov/cms/madie/terminology/models/CodeSystem.java @@ -15,12 +15,10 @@ @Builder(toBuilder = true) @NoArgsConstructor @Document - public class CodeSystem { - @Id private String id; //version ID - private String name; - private String version; - private Identifier identifier; // identifier[0] of identifier List - private Meta meta; - private Instant lastUpdated; + @Id private String versionId; // meta().versionId + private String name; + private String version; + private String value; // identifier[0].value oid of identifier List + private Instant lastUpdated; // when we got it } diff --git a/src/main/java/gov/cms/madie/terminology/models/Identifier.java b/src/main/java/gov/cms/madie/terminology/models/Identifier.java deleted file mode 100644 index aa09ed8..0000000 --- a/src/main/java/gov/cms/madie/terminology/models/Identifier.java +++ /dev/null @@ -1,5 +0,0 @@ -package gov.cms.madie.terminology.models; -public class Identifier { - private String system; - private String value; -} diff --git a/src/main/java/gov/cms/madie/terminology/models/Meta.java b/src/main/java/gov/cms/madie/terminology/models/Meta.java deleted file mode 100644 index d97a467..0000000 --- a/src/main/java/gov/cms/madie/terminology/models/Meta.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.cms.madie.terminology.models; -import java.time.Instant; -import java.util.List; -public class Meta { - private String versionId; - // This is instant at time of query, not to be confused with the actual resource.meta.lastUpdated, which is a timestamp of when vsac posted the version - private Instant lastUpdated; - private List profile; -} diff --git a/src/main/java/gov/cms/madie/terminology/repositories/CodeSystemRepository.java b/src/main/java/gov/cms/madie/terminology/repositories/CodeSystemRepository.java new file mode 100644 index 0000000..e1e2128 --- /dev/null +++ b/src/main/java/gov/cms/madie/terminology/repositories/CodeSystemRepository.java @@ -0,0 +1,10 @@ +package gov.cms.madie.terminology.repositories; + +import gov.cms.madie.terminology.models.CodeSystem; +import org.springframework.data.mongodb.repository.MongoRepository; +import java.util.Optional; + +public interface CodeSystemRepository extends MongoRepository { + Optional findByVersionId(String versionId); + +} diff --git a/src/main/java/gov/cms/madie/terminology/service/FhirTerminologyService.java b/src/main/java/gov/cms/madie/terminology/service/FhirTerminologyService.java index 6c900df..6eb9028 100644 --- a/src/main/java/gov/cms/madie/terminology/service/FhirTerminologyService.java +++ b/src/main/java/gov/cms/madie/terminology/service/FhirTerminologyService.java @@ -2,12 +2,13 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.parser.IParser; -import gov.cms.madie.models.cql.terminology.VsacCode; import gov.cms.madie.models.mapping.CodeSystemEntry; import gov.cms.madie.models.measure.ManifestExpansion; import gov.cms.madie.terminology.dto.QdmValueSet; import gov.cms.madie.terminology.dto.ValueSetsSearchCriteria; +import gov.cms.madie.terminology.models.CodeSystem; import gov.cms.madie.terminology.models.UmlsUser; +import gov.cms.madie.terminology.repositories.CodeSystemRepository; import gov.cms.madie.terminology.util.TerminologyServiceUtil; import gov.cms.madie.terminology.webclient.FhirTerminologyServiceWebClient; import lombok.RequiredArgsConstructor; @@ -16,7 +17,9 @@ import org.hl7.fhir.r4.model.ValueSet; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import org.springframework.web.util.UriComponentsBuilder; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -28,7 +31,7 @@ public class FhirTerminologyService { private final FhirContext fhirContext; private final FhirTerminologyServiceWebClient fhirTerminologyServiceWebClient; private final MappingService mappingService; - + private final CodeSystemRepository codeSystemRepository; @Cacheable("manifest-list") public List getManifests(UmlsUser umlsUser) { IParser parser = fhirContext.newJsonParser(); @@ -110,28 +113,72 @@ private List getValueSetConcepts( return List.of(); } -// call individual - public List retrieveCodeSystemsPage(UmlsUser umlsUser){ + // one to call only, one to mutate and build + public Bundle retrieveCodeSystemsPage(UmlsUser umlsUser, Integer offset, Integer count) { IParser parser = fhirContext.newJsonParser(); - String responseString = fhirTerminologyServiceWebClient.getCodeSystemsPage(0, 100, umlsUser.getApiKey()); - Bundle CodeSystemsBundle = parser.parseResource(Bundle.class, responseString); - var CodeSystemsOptions = new ArrayList(); - CodeSystemsBundle - .getEntry() - .forEach( - entry -> - CodeSystemsOptions.add( - ManifestExpansion.builder() - .id(entry.getResource().getIdPart()) - .fullUrl(entry.getFullUrl()) - .build())); - return CodeSystemsOptions; + String responseString = + fhirTerminologyServiceWebClient.getCodeSystemsPage(offset, count, umlsUser.getApiKey()); + return parser.parseResource( + Bundle.class, responseString); } - public List retrieveAllCodeSystems(UmlsUser umlsUser) { - - return retrieveCodeSystemsPage(umlsUser); - // save + private void updateOrInsertAllCodeSystems(List codeSystemList){ + for (CodeSystem codeSystem : codeSystemList) { + Optional existingCodeSystemOptional = codeSystemRepository.findByVersionId(codeSystem.getVersionId()); + if (existingCodeSystemOptional.isPresent()) { + // Update existing CodeSystem + CodeSystem existingCodeSystem = existingCodeSystemOptional.get(); + existingCodeSystem.setName(codeSystem.getName()); + existingCodeSystem.setValue(codeSystem.getValue()); + existingCodeSystem.setLastUpdated(Instant.now()); + codeSystemRepository.save(existingCodeSystem); + log.info("CodeSystem updated: {}", existingCodeSystem); + } else { + // Insert new CodeSystem + codeSystemRepository.save(codeSystem); + log.info("New CodeSystem inserted: {}", codeSystem); + } + } } + private void recursiveRetrieveCodeSystems(UmlsUser umlsUser, Integer offset, Integer count, List allCodeSystems) { + log.info("requesting page offset: {} count: {}", offset, count); + Bundle codeSystemBundle = retrieveCodeSystemsPage(umlsUser, offset, count); + List codeSystemsPage = new ArrayList<>(); // build small list + codeSystemBundle.getEntry().forEach(entry -> { + var codeSystem = (org.hl7.fhir.r4.model.CodeSystem) entry.getResource(); + String codeSystemValue = ""; + if (!codeSystem.getIdentifier().isEmpty()) { + codeSystemValue = codeSystem.getIdentifier().get(0).getValue(); + } + codeSystemsPage.add( + CodeSystem.builder() + .versionId(codeSystem.getMeta().getVersionId()) + .version(codeSystem.getVersion()) + .name(codeSystem.getName()) + .value(codeSystemValue) + .lastUpdated(Instant.now()) + .build()); + }); + allCodeSystems.addAll(codeSystemsPage); // update big list + var links = codeSystemBundle.getLink(); + links.forEach((l) -> { + if (l.getRelation().equals("next")){ + // if next, call self and continue until fail. + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(l.getUrl()); + String newOffset = builder.build().getQueryParams().getFirst("_offset"); + String newCount = builder.build().getQueryParams().getFirst("_count"); + assert newOffset != null; + assert newCount != null; + recursiveRetrieveCodeSystems(umlsUser, Integer.parseInt(newOffset), Integer.parseInt(newCount), allCodeSystems); + } + }); + } + public List retrieveAllCodeSystems(UmlsUser umlsUser) { + List allCodeSystems = new ArrayList<>(); + recursiveRetrieveCodeSystems(umlsUser, 0, 50, allCodeSystems); + // Once we have all codeSystems, update DB using mongo + updateOrInsertAllCodeSystems(allCodeSystems); + return allCodeSystems; + } } diff --git a/src/main/java/gov/cms/madie/terminology/util/TerminologyServiceUtil.java b/src/main/java/gov/cms/madie/terminology/util/TerminologyServiceUtil.java index 994dc47..ac5e612 100644 --- a/src/main/java/gov/cms/madie/terminology/util/TerminologyServiceUtil.java +++ b/src/main/java/gov/cms/madie/terminology/util/TerminologyServiceUtil.java @@ -64,12 +64,15 @@ public static URI buildRetrieveCodeUri(String baseUrl, String codePath) { } public static URI buildRetrieveCodeSystemsUri(String baseUrl, Integer offset, Integer count) { - // http://uat-cts.nlm.nih.gov/fhir/res/CodeSystem?_offset=100&_count=100 + // http://uat-cts.nlm.nih.gov/fhir/res/CodeSystem?_offset=100&_count=100 return UriComponentsBuilder.fromUriString(baseUrl) - .queryParam("_offset", Integer.toString(offset)) - .queryParam("_count", Integer.toString(count)) - .buildAndExpand().encode().toUri(); + .queryParam("_offset", Integer.toString(offset)) + .queryParam("_count", Integer.toString(count)) + .buildAndExpand() + .encode() + .toUri(); } + public static String buildCodePath( String codeSystemName, String codeSystemVersion, String codeId) { // "/CodeSystem/LOINC22/Version/2.67/Code/21112-8/Info"; diff --git a/src/main/java/gov/cms/madie/terminology/webclient/FhirTerminologyServiceWebClient.java b/src/main/java/gov/cms/madie/terminology/webclient/FhirTerminologyServiceWebClient.java index 1c4f818..2755d27 100644 --- a/src/main/java/gov/cms/madie/terminology/webclient/FhirTerminologyServiceWebClient.java +++ b/src/main/java/gov/cms/madie/terminology/webclient/FhirTerminologyServiceWebClient.java @@ -29,14 +29,14 @@ public class FhirTerminologyServiceWebClient { public FhirTerminologyServiceWebClient( @Value("${client.fhir-terminology-service.base-url}") String fhirTerminologyServiceBaseUrl, @Value("${client.fhir-terminology-service.manifests-urn}") String manifestUrn, - @Value("${client.fhir-terminology-service.code-system-urn}") String codeSystemUrn) { - @Value("${client.fhir-terminology-service.manifests-urn}") String manifestUrn, + @Value("${client.fhir-terminology-service.code-system-urn}") String codeSystemUrn, @Value("${client.default_profile}") String defaultProfile) { fhirTerminologyWebClient = WebClient.builder() .baseUrl(fhirTerminologyServiceBaseUrl) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) - .codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(-1)) + .codecs( + clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(-1)) .build(); this.manifestPath = manifestUrn; this.codeSystemPath = codeSystemUrn; @@ -60,26 +60,27 @@ public String getManifestBundle(String apiKey) { }) .block(); } - public String getCodeSystemsPage(Integer offset, Integer count, String apiKey) { - // https://uat-cts.nlm.nih.gov/fhir/res/CodeSystem?_offset=0&_count=100 - URI codeUri = TerminologyServiceUtil.buildRetrieveCodeSystemsUri(codeSystemPath, offset, count); - log.debug("Retrieving codeSystems at {}, offset {}, count {}", codeSystemPath, offset, count); - return fhirTerminologyWebClient - .get() - .uri(codeUri.toString()) - .headers(headers -> headers.setBasicAuth("apikey", apiKey)) - .exchangeToMono( - clientResponse -> { - if (clientResponse.statusCode().equals(HttpStatus.BAD_REQUEST) - || clientResponse.statusCode().equals(HttpStatus.OK)) { - return clientResponse.bodyToMono(String.class); - } else { - log.debug("Received NON-OK response while retrieving codePath"); - return clientResponse.createException().flatMap(Mono::error); - } - }) - .block(); - } + + public String getCodeSystemsPage(Integer offset, Integer count, String apiKey) { + // https://uat-cts.nlm.nih.gov/fhir/res/CodeSystem?_offset=0&_count=100 + URI codeUri = TerminologyServiceUtil.buildRetrieveCodeSystemsUri(codeSystemPath, offset, count); + log.debug("Retrieving codeSystems at {}, offset {}, count {}", codeSystemPath, offset, count); + return fhirTerminologyWebClient + .get() + .uri(codeUri.toString()) + .headers(headers -> headers.setBasicAuth("apikey", apiKey)) + .exchangeToMono( + clientResponse -> { + if (clientResponse.statusCode().equals(HttpStatus.BAD_REQUEST) + || clientResponse.statusCode().equals(HttpStatus.OK)) { + return clientResponse.bodyToMono(String.class); + } else { + log.debug("Received NON-OK response while retrieving codePath"); + return clientResponse.createException().flatMap(Mono::error); + } + }) + .block(); + } public String getValueSetResource( String apiKey, @@ -108,4 +109,3 @@ public String getValueSetResource( .block(); } } - diff --git a/src/main/java/gov/cms/madie/terminology/webclient/TerminologyServiceWebClient.java b/src/main/java/gov/cms/madie/terminology/webclient/TerminologyServiceWebClient.java index 3268251..5a8dd1a 100644 --- a/src/main/java/gov/cms/madie/terminology/webclient/TerminologyServiceWebClient.java +++ b/src/main/java/gov/cms/madie/terminology/webclient/TerminologyServiceWebClient.java @@ -25,10 +25,10 @@ public class TerminologyServiceWebClient { private final String defaultProfile; public TerminologyServiceWebClient( - WebClient.Builder webClientBuilder, - @Value("${client.vsac_base_url}") String baseUrl, - @Value("${client.valueset_endpoint}") String valueSetEndpoint, - @Value("${client.default_profile}") String defaultProfile) { + WebClient.Builder webClientBuilder, + @Value("${client.vsac_base_url}") String baseUrl, + @Value("${client.valueset_endpoint}") String valueSetEndpoint, + @Value("${client.default_profile}") String defaultProfile) { this.terminologyClient = webClientBuilder.baseUrl(baseUrl).build(); this.baseUrl = baseUrl; @@ -38,58 +38,58 @@ public TerminologyServiceWebClient( } public RetrieveMultipleValueSetsResponse getValueSet( - String oid, - String apiKey, - String profile, - String includeDraft, - String release, - String version) { + String oid, + String apiKey, + String profile, + String includeDraft, + String release, + String version) { URI valuesetURI = getValueSetURI(oid, profile, includeDraft, release, version); log.debug("valuesetURI = " + valuesetURI.getQuery()); Mono responseMono = - terminologyClient - .get() - .uri(valuesetURI) - .headers(headers -> headers.setBasicAuth("apikey", apiKey)) - .retrieve() - .onStatus(HttpStatusCode::is5xxServerError, ClientResponse::createException) - .onStatus(HttpStatusCode::is4xxClientError, ClientResponse::createException) - .bodyToMono(RetrieveMultipleValueSetsResponse.class); + terminologyClient + .get() + .uri(valuesetURI) + .headers(headers -> headers.setBasicAuth("apikey", apiKey)) + .retrieve() + .onStatus(HttpStatusCode::is5xxServerError, ClientResponse::createException) + .onStatus(HttpStatusCode::is4xxClientError, ClientResponse::createException) + .bodyToMono(RetrieveMultipleValueSetsResponse.class); // temp use of block until fixing 401 issue return responseMono.block(); } protected URI getValueSetURI( - String oid, String profile, String includeDraft, String release, String version) { + String oid, String profile, String includeDraft, String release, String version) { profile = StringUtils.isBlank(profile) ? defaultProfile : profile; return TerminologyServiceUtil.buildRetrieveMultipleValueSetsUri( - baseUrl, valueSetEndpoint, oid, profile, includeDraft, release, version); + baseUrl, valueSetEndpoint, oid, profile, includeDraft, release, version); } /** * @param codePath code path build to call VSAC services. - * @param apiKey user's UMLS ApiKey. + * @param apiKey user's UMLS ApiKey. * @return the response from VSAC is the statusCode is either 200 or 400 Status Code: 200 - * indicates a valid code Status Code, 400 indicates either CodeSystem or CodeSystem version - * or Code is not found. + * indicates a valid code Status Code, 400 indicates either CodeSystem or CodeSystem version + * or Code is not found. */ public VsacCode getCode(String codePath, String apiKey) { URI codeUri = TerminologyServiceUtil.buildRetrieveCodeUri(baseUrl, codePath); log.debug("Retrieving vsacCode for codePath {}", codePath); return terminologyClient - .get() - .uri(codeUri) - .headers(headers -> headers.setBasicAuth("apikey", apiKey)) - .exchangeToMono( - clientResponse -> { - if (clientResponse.statusCode().equals(HttpStatus.BAD_REQUEST) - || clientResponse.statusCode().equals(HttpStatus.OK)) { - return clientResponse.bodyToMono(VsacCode.class); - } else { - log.debug("Received NON-OK response while retrieving codePath {}", codePath); - return clientResponse.createException().flatMap(Mono::error); - } - }) - .block(); + .get() + .uri(codeUri) + .headers(headers -> headers.setBasicAuth("apikey", apiKey)) + .exchangeToMono( + clientResponse -> { + if (clientResponse.statusCode().equals(HttpStatus.BAD_REQUEST) + || clientResponse.statusCode().equals(HttpStatus.OK)) { + return clientResponse.bodyToMono(VsacCode.class); + } else { + log.debug("Received NON-OK response while retrieving codePath {}", codePath); + return clientResponse.createException().flatMap(Mono::error); + } + }) + .block(); } -} \ No newline at end of file +} diff --git a/src/test/java/gov/cms/madie/terminology/webclient/FhirTerminologyServiceWebClientTest.java b/src/test/java/gov/cms/madie/terminology/webclient/FhirTerminologyServiceWebClientTest.java index dc6e301..cede094 100644 --- a/src/test/java/gov/cms/madie/terminology/webclient/FhirTerminologyServiceWebClientTest.java +++ b/src/test/java/gov/cms/madie/terminology/webclient/FhirTerminologyServiceWebClientTest.java @@ -41,7 +41,8 @@ void initialize() { testValueSetParams = ValueSetsSearchCriteria.ValueSetParams.builder().oid("test-vs-id").build(); String baseUrl = String.format("http://localhost:%s", mockBackEnd.getPort()); fhirTerminologyServiceWebClient = - new FhirTerminologyServiceWebClient(baseUrl, MOCK_MANIFEST_URN, DEFAULT_PROFILE); + new FhirTerminologyServiceWebClient( + baseUrl, MOCK_MANIFEST_URN, MOCK_CODE_SYSTEM_URN, DEFAULT_PROFILE); } @AfterAll diff --git a/src/test/java/gov/cms/madie/terminology/webclient/TerminologyServiceWebClientTest.java b/src/test/java/gov/cms/madie/terminology/webclient/TerminologyServiceWebClientTest.java index 3ef7fd9..fbc8a0f 100644 --- a/src/test/java/gov/cms/madie/terminology/webclient/TerminologyServiceWebClientTest.java +++ b/src/test/java/gov/cms/madie/terminology/webclient/TerminologyServiceWebClientTest.java @@ -46,6 +46,7 @@ public class TerminologyServiceWebClientTest { "/valueset?id={oid}&profile={profile}&includeDraft={includeDraft}"; private static final String DEFAULT_PROFILE = "eCQM Update 2022-05-05"; private static final String API_KEY = UUID.randomUUID().toString(); + @BeforeEach void setUp() { when(webClientBuilderMock.baseUrl(anyString())).thenReturn(webClientBuilderMock);