diff --git a/src/main/java/gov/cms/madie/terminology/dto/Code.java b/src/main/java/gov/cms/madie/terminology/dto/Code.java index 1763dcd..6be5c12 100644 --- a/src/main/java/gov/cms/madie/terminology/dto/Code.java +++ b/src/main/java/gov/cms/madie/terminology/dto/Code.java @@ -11,4 +11,5 @@ public class Code { private String version; private String codeSystem; private String codeSystemOid; + private boolean active; } 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 3e29b22..d5d5af3 100644 --- a/src/main/java/gov/cms/madie/terminology/service/FhirTerminologyService.java +++ b/src/main/java/gov/cms/madie/terminology/service/FhirTerminologyService.java @@ -2,6 +2,7 @@ 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.Code; @@ -12,6 +13,7 @@ import gov.cms.madie.terminology.repositories.CodeSystemRepository; import gov.cms.madie.terminology.util.TerminologyServiceUtil; import gov.cms.madie.terminology.webclient.FhirTerminologyServiceWebClient; +import gov.cms.madie.terminology.webclient.TerminologyServiceWebClient; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -35,6 +37,7 @@ public class FhirTerminologyService { private final FhirTerminologyServiceWebClient fhirTerminologyServiceWebClient; private final MappingService mappingService; private final CodeSystemRepository codeSystemRepository; + private final TerminologyServiceWebClient terminologyServiceWebClient; @Cacheable("manifest-list") public List getManifests(UmlsUser umlsUser) { @@ -132,8 +135,8 @@ public List retrieveAllCodeSystems(UmlsUser umlsUser) { return allCodeSystems; } - public Code retrieveCode(String code, String codeSystemName, String version, String apiKey) { - if (StringUtils.isEmpty(code) + public Code retrieveCode(String codeName, String codeSystemName, String version, String apiKey) { + if (StringUtils.isEmpty(codeName) || StringUtils.isEmpty(codeSystemName) || StringUtils.isEmpty(version)) { return null; @@ -143,15 +146,25 @@ public Code retrieveCode(String code, String codeSystemName, String version, Str if (codeSystem == null) { return null; } - String codeJson = fhirTerminologyServiceWebClient.getCodeResource(code, codeSystem, apiKey); + String codeJson = fhirTerminologyServiceWebClient.getCodeResource(codeName, codeSystem, apiKey); Parameters parameters = fhirContext.newJsonParser().parseResource(Parameters.class, codeJson); - return Code.builder() - .name(code) - .codeSystem(codeSystemName) - .version(version) - .display(parameters.getParameter("display").getValue().toString()) - .codeSystemOid(parameters.getParameter("Oid").getValue().toString()) - .build(); + Code code = + Code.builder() + .name(codeName) + .codeSystem(codeSystemName) + .version(version) + .display(parameters.getParameter("display").getValue().toString()) + .codeSystemOid(parameters.getParameter("Oid").getValue().toString()) + .build(); + String codePath = + TerminologyServiceUtil.buildCodePath( + code.getCodeSystem(), code.getVersion(), code.getName()); + // TODO: this is ridiculous + VsacCode svsCode = terminologyServiceWebClient.getCode(codePath, apiKey); + if (svsCode.getStatus().equalsIgnoreCase("ok")) { + code.setActive("Yes".equals(svsCode.getData().getResultSet().get(0).getActive())); + } + return code; } private void recursiveRetrieveCodeSystems( diff --git a/src/test/java/gov/cms/madie/terminology/service/FhirTerminologyServiceTest.java b/src/test/java/gov/cms/madie/terminology/service/FhirTerminologyServiceTest.java index b052175..180b521 100644 --- a/src/test/java/gov/cms/madie/terminology/service/FhirTerminologyServiceTest.java +++ b/src/test/java/gov/cms/madie/terminology/service/FhirTerminologyServiceTest.java @@ -2,6 +2,7 @@ import ca.uhn.fhir.context.FhirContext; import com.okta.commons.lang.Collections; +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.Code; @@ -11,6 +12,7 @@ import gov.cms.madie.terminology.models.UmlsUser; import gov.cms.madie.terminology.repositories.CodeSystemRepository; import gov.cms.madie.terminology.webclient.FhirTerminologyServiceWebClient; +import gov.cms.madie.terminology.webclient.TerminologyServiceWebClient; import org.apache.commons.io.FileUtils; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.CodeSystem; @@ -48,8 +50,10 @@ class FhirTerminologyServiceTest { @Mock FhirTerminologyServiceWebClient fhirTerminologyServiceWebClient; @Mock FhirContext fhirContext; @Mock MappingService mappingService; - @InjectMocks FhirTerminologyService fhirTerminologyService; @Mock CodeSystemRepository codeSystemRepository; + @Mock TerminologyServiceWebClient terminologyServiceWebClient; + @InjectMocks FhirTerminologyService fhirTerminologyService; + List codeSystemEntries; private UmlsUser umlsUser; private static final String TEST_HARP_ID = "te$tHarpId"; @@ -407,12 +411,20 @@ void testRetrieveCodeSuccessfully() { + "}"; var codeSystem = gov.cms.madie.terminology.models.CodeSystem.builder().build(); + var codeResultSet = new VsacCode.VsacDataResultSet(); + codeResultSet.setActive("Yes"); + var codeData = new VsacCode.VsacData(); + codeData.setResultSet(List.of(codeResultSet)); + VsacCode vsacCode = new VsacCode(); + vsacCode.setStatus("ok"); + vsacCode.setData(codeData); when(codeSystemRepository.findByNameAndVersion(anyString(), anyString())) .thenReturn(Optional.of(codeSystem)); when(fhirTerminologyServiceWebClient.getCodeResource(codeName, codeSystem, TEST_API_KEY)) .thenReturn(codeJson); when(fhirContext.newJsonParser()).thenReturn(FhirContext.forR4().newJsonParser()); + when(terminologyServiceWebClient.getCode(anyString(), anyString())).thenReturn(vsacCode); Code code = fhirTerminologyService.retrieveCode(codeName, codeSystemName, version, TEST_API_KEY); assertThat(code.getName(), is(equalTo(codeName)));