UNPKG

@careevolution/orchestrate

Version:

A TypeScript client for the Orchestrate API

389 lines (388 loc) 13.6 kB
import { handleBatchOverload } from "./batch.js"; const standardizeTargetSystems = [ "ICD-10-CM", "ICD-9-CM-Diagnosis", "SNOMED", "RxNorm", "LOINC", "CPT", "HCPCS", "NDC", "CVX", "http://hl7.org/fhir/sid/icd-10", "http://hl7.org/fhir/sid/icd-9", "http://snomed.info/sct", "http://www.nlm.nih.gov/research/umls/rxnorm", "http://loinc.org", "http://www.ama-assn.org/go/cpt", // TODO: "http://www.ama-assn.org/go/cpt-hcpcs" HCPCS URL "http://hl7.org/fhir/sid/ndc", "http://hl7.org/fhir/sid/cvx", ]; const standardizeResponseSystems = [ "http://hl7.org/fhir/sid/icd-10", "http://hl7.org/fhir/sid/icd-9", "http://snomed.info/sct", "http://hl7.org/fhir/sid/ndc", "http://hl7.org/fhir/sid/cvx", "http://www.nlm.nih.gov/research/umls/rxnorm", "http://loinc.org", ]; const classifyConditionSystems = [ "http://snomed.info/sct", "http://hl7.org/fhir/sid/icd-10-cm", "http://hl7.org/fhir/sid/icd-9-cm-diagnosis", "ICD-10-CM", "ICD-9-CM-Diagnosis", "SNOMED", ]; const covid19Condition = [ "Confirmed", "Suspected", "Exposure", "Encounter", "SignsAndSymptoms", "NonspecificRespiratoryViralInfection", ]; const classifyMedicationSystems = [ "RxNorm", "NDC", "CVX", "SNOMED", "http://www.nlm.nih.gov/research/umls/rxnorm", "http://hl7.org/fhir/sid/ndc", "http://hl7.org/fhir/sid/cvx", "http://snomed.info/sct", ]; const covid19Rx = ["vaccination", "immunoglobulin", "medication"]; const classifyObservationSystems = ["http://loinc.org", "LOINC", "http://snomed.info/sct", "SNOMED"]; const codeSystems = [ "ICD-10-CM", "ICD-9-CM-Diagnosis", "SNOMED", "RxNorm", "LOINC", "CPT", "HCPCS", "NDC", "CVX", "Argonaut", "C4BBClaimCareTeamRole", "C4BBClaimDiagnosisType", "C4BBCompoundLiteral", "CareEvolution", "CARIN-BB-Claim-Type", "CARIN-BB-DiagnosisType", "CdcRaceAndEthnicity", "ClaimCareTeamRoleCodes", "CMSRemittanceAdviceRemarkCodes", "DRG-FY2018", "DRG-FY2019", "DRG-FY2020", "DRG-FY2021", "DRG-FY2022", "DRG-FY2023", "fhir-address-use", "fhir-administrative-gender", "fhir-allergy-clinical-status", "fhir-allergy-intolerance-category", "Fhir-allergy-intolerance-category-dstu2", "fhir-allergy-intolerance-criticality", "fhir-allergy-intolerance-criticality-dstu2", "fhir-allergy-intolerance-status", "fhir-allergy-intolerance-type", "fhir-allergy-verification-status", "fhir-allergyintolerance-clinical", "fhir-allergyintolerance-verification", "fhir-care-plan-activity-status", "fhir-claim-type-link", "fhir-condition-category", "fhir-condition-category-dstu2", "fhir-condition-category-stu3", "fhir-condition-clinical", "fhir-condition-ver-status", "fhir-contact-point-system", "fhir-contact-point-system-DSTU2", "fhir-contact-point-use", "fhir-diagnosis-role", "fhir-diagnostic-order-priority", "fhir-diagnostic-order-status", "fhir-diagnostic-report-status", "fhir-document-reference-status", "fhir-encounter-admit-source", "fhir-encounter-class", "fhir-event-status", "fhir-explanationofbenefit-status", "fhir-fm-status", "fhir-goal-status", "fhir-goal-status-dstu2", "fhir-goal-status-stu3", "fhir-medication-admin-status", "fhir-medication-admin-status-R4", "fhir-medication-dispense-status", "fhir-medication-order-status", "fhir-medication-request-priority", "fhir-medication-request-status", "fhir-medication-statement-status", "fhir-medicationdispense-status", "fhir-medicationrequest-status", "fhir-name-use", "fhir-observation-status", "fhir-procedure-request-priority", "fhir-procedure-request-status", "fhir-reaction-event-severity", "fhir-referralstatus", "fhir-request-intent", "fhir-request-priority", "fhir-request-status", "fhir-task-intent", "fhir-task-status", "FhirCodes", "FhirCodesAlternate1", "FhirCodesAlternate2", "FhirCodesAlternate3", "FhirCodesAlternate4", "FhirCodesAlternate5", "FhirCodesAlternate6", "FhirCodesAlternate7", "HCC-V22", "HCC-V23", "HCC-V24", "HL7 Table 0001 - Administrative Sex", "HL7 Table 0002 - Marital Status", "HL7 Table 0004 - Patient Class", "HL7 Table 0005 - Race", "HL7 Table 0006 - Religion", "HL7 Table 0189 - Ethnic Group", "HL7ActCode", "HL7Acuity", "HL7ContactInfoUseCode", "HL7CurrentSmokingStatus", "HL7DetailedEthnicity", "HL7Ethnicity", "HL7Gender", "HL7MaritalStatus", "HL7NullFlavor", "HL7Race", "HL7RaceCategoryExcludingNulls", "HL7v3Religion", "ICD-9-CM (diagnosis codes)", "ICD-9-CM (procedure codes)", "InternetSocietyLanguage", "NCPDPDispensedAsWrittenOrProductSelectionCode", "OMOP", "POS", "ProviderTaxonomy", "Source Of Payment Typology", "UCUM", "UNII", "uscore-condition-category", "v2 Name Type", "X12ClaimAdjustmentReasonCodes", ]; const translateDomains = [ "Condition", "AllergyIntolerance", "MedicationDispense", "MedicationAdministration", "MedicationRequest", "ExplanationOfBenefit", "Encounter", "Procedure", "DiagnosticReport", "Observation", "ServiceRequest", "Patient", "Practitioner", "Person", "CarePlan", ]; const classifyValueSetSystems = [ "http://snomed.info/sct", "http://hl7.org/fhir/sid/icd-10-cm", "http://hl7.org/fhir/sid/icd-9-cm-diagnosis", "http://hl7.org/fhir/sid/ndc", "http://hl7.org/fhir/sid/cvx", ]; export class TerminologyApi { constructor(httpHandler) { this.httpHandler = httpHandler; } handleBatchOverload(url, request) { return handleBatchOverload(this.httpHandler, url, request); } classifyCondition(request) { return this.handleBatchOverload("/terminology/v1/classify/condition", request); } classifyMedication(request) { return this.handleBatchOverload("/terminology/v1/classify/medication", request); } classifyObservation(request) { return this.handleBatchOverload("/terminology/v1/classify/observation", request); } standardizeCondition(request) { return this.handleBatchOverload("/terminology/v1/standardize/condition", request); } standardizeMedication(request) { return this.handleBatchOverload("/terminology/v1/standardize/medication", request); } standardizeObservation(request) { return this.handleBatchOverload("/terminology/v1/standardize/observation", request); } standardizeProcedure(request) { return this.handleBatchOverload("/terminology/v1/standardize/procedure", request); } standardizeLab(request) { return this.handleBatchOverload("/terminology/v1/standardize/lab", request); } standardizeRadiology(request) { return this.handleBatchOverload("/terminology/v1/standardize/radiology", request); } /** * Describes a code system * @param request A code system name * @returns A populated CodeSystem * @link https://rosetta-api.docs.careevolution.com/fhir/codesystem.html */ getFhirR4CodeSystem(request) { const urlParameters = new URLSearchParams(); if (request.pageNumber) { urlParameters.append("page.num", request.pageNumber.toString()); } if (request.pageSize) { urlParameters.append("_count", request.pageSize.toString()); } if (request.conceptContains) { urlParameters.append("concept:contains", request.conceptContains); } let route = `/terminology/v1/fhir/r4/codesystem/${request.codeSystem}`; const urlParametersString = urlParameters.toString(); if (urlParametersString) { route += `?${urlParametersString}`; } return this.httpHandler.get(route); } /** * Describes available code systems * @returns A bundle of known CodeSystems * @link https://rosetta-api.docs.careevolution.com/fhir/codesystem.html */ summarizeFhirR4CodeSystems() { return this.httpHandler.get("/terminology/v1/fhir/r4/codesystem?_summary=true"); } /** * Describes available concept maps * @returns A bundle of known ConceptMaps * @link https://rosetta-api.docs.careevolution.com/fhir/conceptmap.html */ getFhirR4ConceptMaps() { return this.httpHandler.get("/terminology/v1/fhir/r4/conceptmap"); } /** * Standardizes source codings to a reference code * @param request The best source description of the concept * @returns A Parameters object with the `"result"` parameter of `"valueBoolean": true` indicating if the service was able to standardize the code * @link https://rosetta-api.docs.careevolution.com/fhir/conceptmap.html */ translateFhirR4ConceptMap(request) { let route = "/terminology/v1/fhir/r4/conceptmap/$translate"; const urlParameters = new URLSearchParams({ code: request.code }); if (request.domain) { urlParameters.append("domain", request.domain); } route += `?${urlParameters.toString()}`; return this.httpHandler.get(route); } /** * Retrieves the set of ValueSets described in a scope * @param request A scope identifier * @returns A bundle of ValueSets within the requested scope * @link https://rosetta-api.docs.careevolution.com/fhir/valueset.html */ summarizeFhirR4ValueSetScope(request) { const params = new URLSearchParams({ "extension.scope": request.scope, _summary: "true", }); const route = `/terminology/v1/fhir/r4/valueset?${params.toString()}`; return this.httpHandler.get(route); } /** * Summarizes the total number of codes in a ValueSet * @param request A ValueSet identifier * @returns A ValueSet resource with only the count populated * @link https://rosetta-api.docs.careevolution.com/fhir/valueset.html */ summarizeFhirR4ValueSet(request) { const parameters = new URLSearchParams({ _summary: "true", }); const route = `/terminology/v1/fhir/r4/valueset/${encodeURIComponent(request.id)}?${parameters.toString()}`; return this.httpHandler.get(route); } /** * Retrieves a ValueSet by identifier * @param request A ValueSet identifier * @returns A ValueSet resource * @link https://rosetta-api.docs.careevolution.com/fhir/valueset.html */ getFhirR4ValueSet(request) { const route = `/terminology/v1/fhir/r4/valueset/${encodeURIComponent(request.id)}`; return this.httpHandler.get(route); } /** * Retrieves a paginated list of ValueSets filtered by name or scope * @param request A paginated request for ValueSets * @returns A bundle of ValueSets that match the search criteria * @link https://rosetta-api.docs.careevolution.com/fhir/valueset.html */ getFhirR4ValueSetsByScope(request) { const parameters = new URLSearchParams(); if (request.name) { parameters.append("name", request.name); } if (request.pageNumber) { parameters.append("page.num", request.pageNumber.toString()); } if (request.pageSize) { parameters.append("_count", request.pageSize.toString()); } if (request.scope) { parameters.append("extension.scope", request.scope); } const route = `/terminology/v1/fhir/r4/valueset?${parameters.toString()}`; return this.httpHandler.get(route); } /** * Requests the available ValueSet scopes * @returns A unique ValueSet that contains a list of all scopes available on the server * @link https://rosetta-api.docs.careevolution.com/fhir/valueset.html */ getFhirR4ValueSetScopes() { return this.httpHandler.get("/terminology/v1/fhir/r4/valueset/Rosetta.ValueSetScopes"); } /** * In some situations it is useful to get the ValueSet(s) that a list of codes are members of. This can be used to categorize or group codes by ValueSet membership. For example, you may wish to: * * - Categorize a collection of NDC drug codes by their active ingredient. * - Categorize a collection of LOINC lab tests by the component they are measuring. * - Categorize a collection of ICD-10-CM Diagnoses into a broad set of disease groupings. * @param request A Parameters resource containing codes to classify * @returns A Parameters resource containing the classification results * @link https://rosetta-api.docs.careevolution.com/fhir/valueset.html */ getAllFhirR4ValueSetsForCodes(request) { const route = "/terminology/v1/fhir/r4/valueset/$classify"; return this.httpHandler.post(route, request); } /** * Summarizes a code system, typically used to determine number of codes * @param request A code system name * @returns An unpopulated CodeSystem * @link https://rosetta-api.docs.careevolution.com/fhir/codesystem.html */ summarizeFhirR4CodeSystem(request) { const route = `/terminology/v1/fhir/r4/codesystem/${encodeURIComponent(request.codeSystem)}?_summary=true`; return this.httpHandler.get(route); } }