Skip to content

Commit

Permalink
Updates for additional SDS Queries
Browse files Browse the repository at this point in the history
Added conditions, medications, and service request queries
  • Loading branch information
Sean committed Dec 19, 2024
1 parent 9e936d2 commit 768a7a7
Show file tree
Hide file tree
Showing 9 changed files with 166 additions and 146 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "e-care-common-data-services",
"version": "1.4.7",
"version": "1.6.0",
"description": "Common data service for mcc-provider and mcc-care-planner",
"main": "build/main/index.js",
"typings": "build/main/index.d.ts",
Expand Down
14 changes: 12 additions & 2 deletions source/lib/condition/condition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,10 @@ export const getSupplementalConditions = async (launchURL: string, sdsClient: Cl
// Process third-party goals
const thirdPartyGoals: Condition[] = resourcesFrom(response) as Condition[];
thirdPartyGoals.forEach(condition => {

condition.code.text = condition.code.text + "(" + item2.resource.extension[0].valueUrl + ")"
condition.recorder = {
display: "(" + item2.resource.extension[0].valueUrl + ")"
};
allThirdPartyMappedConditions.push(condition);
});
}
Expand Down Expand Up @@ -180,7 +182,9 @@ export const getSummaryConditions = async (sdsURL: string, authURL: string, sdsS
recordProvenance(provenance1);
recordProvenance(provenance2);

const filteredConditions = [...conditions1, ...conditions2, ...sdsfilteredConditions2];
const thirdPartyStuff = await getSupplementalConditions(client.state.serverUrl, sdsClient);

const filteredConditions = [...conditions1, ...conditions2, ...sdsfilteredConditions2, ...thirdPartyStuff];

const mappedFilterConditions = await Promise.all(
filteredConditions.map(async (condition) => {
Expand All @@ -190,6 +194,12 @@ export const getSummaryConditions = async (sdsURL: string, authURL: string, sdsS
const provenance: Provenance = provenanceMap.get(`Condition/${condition.id}`);
transformedCondition.provenance = displayTransmitter(provenance);

if (!transformedCondition.provenance && condition.recorder) {
transformedCondition.provenance = condition.recorder.display
}



return transformedCondition;
})
);
Expand Down
11 changes: 9 additions & 2 deletions source/lib/condition/condition.util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,16 @@ export const transformToConditionSummary = async (fhirCondition: MccCondition):
const profileMapping = {
'2.16.840.1.113762.1.4.1222.159': 'CKD'
}
const code = fhirCondition.code.coding[0];
var code
if (fhirCondition?.code?.coding) {
code = fhirCondition?.code?.coding;
}

var codeName = ''
if (code) {
codeName = await getFilenameFromValueSetCode(code.system, code.code)
}

const codeName = await getFilenameFromValueSetCode(code.system, code.code)

const transformedData: MccConditionSummary = {
code: fhirCondition.code,
Expand Down
57 changes: 23 additions & 34 deletions source/lib/goal/goal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ import { displayDate } from '../service-request/service-request.util';
import {
getSupplementalDataClient,
notFoundResponse,
resourcesFrom,
// resourcesFrom,
resourcesFromObject,
resourcesFromObjectArray,
resourcesFromObjectArray2,
saveFHIRAccessData,
// saveFHIRAccessData,
transformToMccGoalSummary,
} from './goal.util';

Expand All @@ -26,8 +26,8 @@ enum ACTIVE_STATUS {
IGNORE
}

const LF_ID = '-MCP'
const fcCurrentStateKey = 'fhir-client-state' + LF_ID
// const LF_ID = '-MCP'
// const fcCurrentStateKey = 'fhir-client-state' + LF_ID

const ACTIVE_KEYS = {
proposed: ACTIVE_STATUS.ACTIVE,
Expand Down Expand Up @@ -233,40 +233,29 @@ export const getSummaryGoals = async (sdsURL: string, authURL: string, sdsScope:
*/


export const getGoals = async (sdsURL: string, authURL: string, sdsScope: string): Promise<MccGoal[]> => {
const client = await FHIR.oauth2.ready();

console.error('start saveFHIRAccessData');
// export const getGoalsWtF = async (): Promise<MccGoal[]> => {
// const client = await FHIR.oauth2.ready();
// await saveFHIRAccessData(fcCurrentStateKey, client.state, false).then(() => {
// console.log('fhirClientState saved/promise returned')
// }).catch((e) => console.log(e))
// const queryPath = `Goal`;
// const goalRequest: fhirclient.JsonArray = await client.patient.request(
// queryPath
// );

await saveFHIRAccessData(fcCurrentStateKey, client.state, false).then(() => {
console.log('fhirClientState saved/promise returned')
}).catch((e) => console.log(e))
// // goal from problem list item
// const filteredGoals: MccGoal[] = resourcesFrom(
// goalRequest
// ) as MccGoal[];

console.error('end saveFHIRAccessData');

const sdsClient: Client = await getSupplementalDataClient(client, sdsURL, authURL, sdsScope);
console.error(
`getGoals - ` + JSON.stringify(sdsClient)
);
// log.info(
// `getGoals - successful`
// );

const queryPath = `Goal`;
const goalRequest: fhirclient.JsonArray = await client.patient.request(
queryPath
);
// log.debug({ serviceName: 'getGoals', result: filteredGoals });

// goal from problem list item
const filteredGoals: MccGoal[] = resourcesFrom(
goalRequest
) as MccGoal[];

log.info(
`getGoals - successful`
);

log.debug({ serviceName: 'getGoals', result: filteredGoals });

return filteredGoals;
};
// return filteredGoals;
// };

export const getGoal = async (id: string): Promise<MccGoal> => {
if (!id) {
Expand Down
67 changes: 2 additions & 65 deletions source/lib/goal/goal.util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,9 @@ export const getSupplementalDataClient = async (currentClient: Client, sdsURL: s
return sdsClient
}
}
console.error("getSupplementalDataClient FHIR.client(sdsFhirAccessDataObject) sdsClient = ", sdsClient)
console.log("getSupplementalDataClient FHIR.client(sdsFhirAccessDataObject) sdsClient = ", sdsClient)
} else {
console.error("getSupplementalDataClient() authFhirAccessDataObject is null, cannot connect to client")
console.log("getSupplementalDataClient() authFhirAccessDataObject is null, cannot connect to client")
}
return sdsClient
}
Expand All @@ -186,69 +186,6 @@ export const getSupplementalDataClient = async (currentClient: Client, sdsURL: s
return sdsClient
}

// export const getSupplementalDataClientaaa = async (): Promise<Client | undefined> => {
// console.error('getSupplementalDataClient Start');
// let sdsClient: Client | undefined
// // const authURL = window['env']['REACT_APP_SHARED_DATA_AUTH_ENDPOINT']
// // const sdsURL = window['env']['REACT_APP_SHARED_DATA_ENDPOINT']
// // const sdsScope = window['env']['REACT_APP_SHARED_DATA_SCOPE']

// const sdsURL = "http://localhost:8080/fhir"
// const authURL = "https://gw.interop.community/MCCDevelopment/data"
// const sdsScope = "launch/patient openid fhirUser patient/* user/*.cruds patient/*.cruds"

// const sdsClientId = window['env']['REACT_APP_SHARED_DATA_CLIENT_ID']

// console.error('getSupplementalDataClient authURL: ', authURL)
// console.error('getSupplementalDataClient sdsURL: ', sdsURL)
// console.error('getSupplementalDataClient sdsScope: ', sdsScope)
// // console.log('getSupplementalDataClient sdsScope: ', sdsClientId)


// if (sdsClientId && sdsURL) {
// console.error('getSupplementalDataClient if (sdsClientId && sdsURL) == true; authorize in using client id')
// const sdsFhirAccessDataObject: fhirclient.ClientState | undefined =
// await extractFhirAccessDataObjectIfGivenEndpointMatchesAnyPriorEndpoint(sdsURL)
// if (sdsFhirAccessDataObject) {
// sdsClient = FHIR.client(sdsFhirAccessDataObject)
// }
// }

// else if (authURL && sdsURL && sdsScope) {
// console.error('getSupplementalDataClient else if (authURL && sdsURL && sdsScope) == true; authorize using existing token')

// console.error('getSupplementalDataClient authURL: ', authURL)
// console.error('getSupplementalDataClient sdsURL: ', sdsURL)
// console.error('getSupplementalDataClient sdsScope: ', sdsScope)

// const authFhirAccessDataObject: fhirclient.ClientState | undefined =
// await extractFhirAccessDataObjectIfGivenEndpointMatchesAnyPriorEndpoint(authURL)

// console.error('getSupplementalDataClient found extractFhirAccessDataObjectIfGivenEndpointMatchesAnyPriorEndpoint using ' + authURL);
// if (authFhirAccessDataObject) {
// console.error("getSupplementalDataClient authFhirAccessDataObject is truthy")
// // Replace the serverURL and client scope with Shared Data endpoint and scope
// var sdsFhirAccessDataObject = authFhirAccessDataObject
// sdsFhirAccessDataObject.serverUrl = sdsURL
// sdsFhirAccessDataObject.scope = sdsScope
// if (sdsFhirAccessDataObject.tokenResponse) {
// sdsFhirAccessDataObject.tokenResponse.scope = sdsScope
// }
// console.error("getSupplementalDataClient getSupplementalDataClient() sdsFhirAccessDataObject = ", sdsFhirAccessDataObject)
// // Connect to the client
// sdsClient = FHIR.client(sdsFhirAccessDataObject)
// console.error("getSupplementalDataClient FHIR.client(sdsFhirAccessDataObject) sdsClient = ", sdsClient)
// }
// else {
// console.error("getSupplementalDataClient() authFhirAccessDataObject is null, cannot connect to client")
// }
// }

// console.error('getSupplementalDataClient End');
// return sdsClient
// }


export const fhirOptions: fhirclient.FhirOptions = {
pageLimit: 0,
};
Expand Down
74 changes: 62 additions & 12 deletions source/lib/medication-request/medication-request.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
/* eslint-disable functional/immutable-data */
import { CodeableConcept } from 'fhir/r4';
import FHIR from 'fhirclient';
import Client from 'fhirclient/lib/Client';
import { fhirclient } from 'fhirclient/lib/types';

import { MccMedication, MccMedicationSummary, MccMedicationSummaryList } from '../../types/mcc-types';
import log from '../../utils/loglevel';
import { getConditionFromUrl } from '../careplan';
import { getConceptDisplayString } from '../goal/goal.util';
import { getConceptDisplayString, getSupplementalDataClient } from '../goal/goal.util';
import { convertNoteToString } from '../observation/observation.util';
import { displayDate } from '../service-request/service-request.util';

Expand All @@ -33,37 +34,86 @@ const ACTIVE_KEYS = {
unknown: ACTIVE_STATUS.INACTIVE,
}

export const getSummaryMedicationRequests = async (careplanId?: string): Promise<MccMedicationSummaryList> => {
const client = await FHIR.oauth2.ready();

const getSupplementalData = async (launchURL: string, sdsClient: Client): Promise<MccMedication[]> => {
let allThirdPartyMccMedicationSummary: MccMedication[] = [];
try {

const linkages = await sdsClient.request('Linkage?item=Patient/' + sdsClient.patient.id);
console.log("patientId +linkages " + JSON.stringify(linkages));
const urlSet = new Set();
urlSet.add(launchURL)
// Loop through second set of linkages
for (const entry2 of linkages.entry) {
for (const item2 of entry2.resource.item) {
if (item2.type === 'alternate' && !urlSet.has(item2.resource.extension[0].valueUrl)) {
urlSet.add(item2.resource.extension[0].valueUrl);

// Prepare FHIR request headers
const fhirHeaderRequestOption = {} as fhirclient.RequestOptions;
const fhirHeaders = {
'X-Partition-Name': item2.resource.extension[0].valueUrl
};
fhirHeaderRequestOption.headers = fhirHeaders;
fhirHeaderRequestOption.url = 'MedicationRequest?subject=' + item2.resource.reference;
const response = await sdsClient.request(fhirHeaderRequestOption);
const thirdPartyMccMedication: MccMedication[] = resourcesFromObjectArray(response) as MccMedication[];
thirdPartyMccMedication.forEach(mccMedication => {
mccMedication.recorder = {
display: "(" + item2.resource.extension[0].valueUrl + ")"
};
allThirdPartyMccMedicationSummary.push(mccMedication);
});
}
}
}
} catch (error) {
console.error("An error occurred: " + error.message);
}

return allThirdPartyMccMedicationSummary;
};


export const getSummaryMedicationRequests = async (sdsURL: string, authURL: string, sdsScope: string): Promise<MccMedicationSummaryList> => {

const theCurrentClient = await FHIR.oauth2.ready();

const sdsClient: Client = await getSupplementalDataClient(theCurrentClient, sdsURL, authURL, sdsScope);

const activeMedications: MccMedicationSummary[] = [];
const inactiveMedications: MccMedicationSummary[] = [];

const queryPath = `MedicationRequest`;
const goalRequest: fhirclient.JsonObject = await client.patient.request(
const medicationRequest: fhirclient.JsonObject = await theCurrentClient.patient.request(
queryPath
);

log.debug({ serviceName: 'getSummaryMedicationRequests', result: { goalRequest, careplanId } });
log.debug({ serviceName: 'getSummaryMedicationRequests', result: { medicationRequest } });

// goal from problem list item
const filteredMedicationRequests: MccMedication[] = resourcesFromObjectArray(
goalRequest
const medicationRequests: MccMedication[] = resourcesFromObjectArray(
medicationRequest
) as MccMedication[];

const mappedMedicationRequest: MccMedicationSummary[] = await Promise.all(filteredMedicationRequests.map(async (mc) => {
const sdsMedicationRequests: MccMedication[] = await getSupplementalData(theCurrentClient.state.serverUrl, sdsClient);


const allMedicationRequests: MccMedication[] = [...medicationRequests, ...sdsMedicationRequests];

const mappedMedicationRequest: MccMedicationSummary[] = await Promise.all(allMedicationRequests.map(async (mc) => {
const condition = mc.reasonReference ? await getConditionFromUrl(mc.reasonReference[0].reference) : { code: [] as CodeableConcept }
const where = mc.recorder ? mc.recorder.display : '';
return {
type: mc.resourceType,
fhirId: mc.id,
status: mc.status,
medication: mc.medicationCodeableConcept ? mc.medicationCodeableConcept.text : mc.medicationReference ? mc.medicationReference.display : 'missing',
dosages: mc.dosageInstruction ? mc.dosageInstruction[0].text : '',
requestedBy: mc.requester ? mc.requester.display : '',
requestedBy: mc.requester ? mc.requester.display + where : where,
reasons: condition ? getConceptDisplayString(condition.code) : '',
effectiveDate: mc.authoredOn ? displayDate(mc.authoredOn) : '',
refillsPermitted: 'Unknown',
notes: mc.note ? convertNoteToString(mc.note) : '',
notes: mc.note ? convertNoteToString(mc.note) : ''
}
}))

Expand Down Expand Up @@ -95,7 +145,7 @@ export const getSummaryMedicationRequests = async (careplanId?: string): Promise
`getSummaryMedicationRequests - successful`
);

log.debug({ serviceName: 'getSummaryMedicationRequests', result: { mccMedicationSummaryRequest, careplanId } });
log.debug({ serviceName: 'getSummaryMedicationRequests', result: { mccMedicationSummaryRequest } });

return mccMedicationSummaryRequest;
};
Expand Down
Loading

0 comments on commit 768a7a7

Please sign in to comment.