Skip to content

Commit b3fbc29

Browse files
committed
Add util function for getting encounters from context. Add FHIREncounterExtractor
1 parent 2882a4a commit b3fbc29

File tree

7 files changed

+80
-2
lines changed

7 files changed

+80
-2
lines changed

src/client/MCODEClient.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const {
1414
FHIRAllergyIntoleranceExtractor,
1515
FHIRConditionExtractor,
1616
FHIRDocumentReferenceExtractor,
17+
FHIREncounterExtractor,
1718
FHIRMedicationOrderExtractor,
1819
FHIRMedicationRequestExtractor,
1920
FHIRMedicationStatementExtractor,
@@ -40,6 +41,7 @@ class MCODEClient extends BaseClient {
4041
FHIRAllergyIntoleranceExtractor,
4142
FHIRConditionExtractor,
4243
FHIRDocumentReferenceExtractor,
44+
FHIREncounterExtractor,
4345
FHIRMedicationOrderExtractor,
4446
FHIRMedicationRequestExtractor,
4547
FHIRMedicationStatementExtractor,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const { BaseFHIRExtractor } = require('./BaseFHIRExtractor');
2+
3+
class FHIREncounterExtractor extends BaseFHIRExtractor {
4+
constructor({ baseFhirUrl, requestHeaders, version }) {
5+
super({ baseFhirUrl, requestHeaders, version });
6+
this.resourceType = 'Encounter';
7+
}
8+
}
9+
10+
module.exports = {
11+
FHIREncounterExtractor,
12+
};

src/extractors/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const { FHIRAdverseEventExtractor } = require('./FHIRAdverseEventExtractor');
1414
const { FHIRAllergyIntoleranceExtractor } = require('./FHIRAllergyIntoleranceExtractor');
1515
const { FHIRConditionExtractor } = require('./FHIRConditionExtractor');
1616
const { FHIRDocumentReferenceExtractor } = require('./FHIRDocumentReferenceExtractor');
17+
const { FHIREncounterExtractor } = require('./FHIREncounterExtractor');
1718
const { FHIRMedicationOrderExtractor } = require('./FHIRMedicationOrderExtractor');
1819
const { FHIRMedicationRequestExtractor } = require('./FHIRMedicationRequestExtractor');
1920
const { FHIRMedicationStatementExtractor } = require('./FHIRMedicationStatementExtractor');
@@ -40,6 +41,7 @@ module.exports = {
4041
FHIRAllergyIntoleranceExtractor,
4142
FHIRConditionExtractor,
4243
FHIRDocumentReferenceExtractor,
44+
FHIREncounterExtractor,
4345
FHIRMedicationOrderExtractor,
4446
FHIRMedicationRequestExtractor,
4547
FHIRMedicationStatementExtractor,

src/helpers/contextUtils.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,23 @@ function getConditionEntriesFromContext(mrn, context) {
2121
return conditionsInContext;
2222
}
2323

24+
/**
25+
* Parses context for Encounter resources
26+
* @param {Object} context - Context object consisting of a FHIR Bundle
27+
* @return {Array} All the encounter resources found in context
28+
*/
29+
function getEncountersFromContext(context) {
30+
logger.debug('Getting encounter resources from context');
31+
const encountersInContext = getBundleResourcesByType(context, 'Encounter');
32+
if (encountersInContext.length === 0) {
33+
throw Error('Could not find any encounter resources in context; ensure that an EncounterExtractor is used earlier in your extraction configuration');
34+
}
35+
logger.debug(`Condition resources found in context. Found ${encountersInContext.length} condition resources.`);
36+
return encountersInContext;
37+
}
38+
2439
module.exports = {
2540
getConditionEntriesFromContext,
41+
getEncountersFromContext,
2642
getPatientFromContext,
2743
};

src/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const {
2525
FHIRAllergyIntoleranceExtractor,
2626
FHIRConditionExtractor,
2727
FHIRDocumentReferenceExtractor,
28+
FHIREncounterExtractor,
2829
FHIRMedicationOrderExtractor,
2930
FHIRMedicationRequestExtractor,
3031
FHIRMedicationStatementExtractor,
@@ -62,7 +63,7 @@ const {
6263
} = require('./helpers/conditionUtils');
6364
const { getDiseaseStatusCode, getDiseaseStatusEvidenceCode, mEpochToDate } = require('./helpers/diseaseStatusUtils');
6465
const { formatDate, formatDateTime } = require('./helpers/dateUtils');
65-
const { getConditionEntriesFromContext, getPatientFromContext } = require('./helpers/contextUtils');
66+
const { getConditionEntriesFromContext, getEncountersFromContext, getPatientFromContext } = require('./helpers/contextUtils');
6667

6768
module.exports = {
6869
// CLI Related utilities
@@ -91,6 +92,7 @@ module.exports = {
9192
FHIRAllergyIntoleranceExtractor,
9293
FHIRConditionExtractor,
9394
FHIRDocumentReferenceExtractor,
95+
FHIREncounterExtractor,
9496
FHIRMedicationOrderExtractor,
9597
FHIRMedicationRequestExtractor,
9698
FHIRMedicationStatementExtractor,
@@ -130,5 +132,6 @@ module.exports = {
130132
mEpochToDate,
131133
// Context operations
132134
getConditionEntriesFromContext,
135+
getEncountersFromContext,
133136
getPatientFromContext,
134137
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const { FHIREncounterExtractor } = require('../../src/extractors/FHIREncounterExtractor.js');
2+
3+
const MOCK_URL = 'http://example.com';
4+
const MOCK_HEADERS = {};
5+
6+
const extractor = new FHIREncounterExtractor({ baseFhirUrl: MOCK_URL, requestHeaders: MOCK_HEADERS });
7+
describe('FHIREncounterExtractor', () => {
8+
test('Constructor sets resourceType as Encounter', () => {
9+
expect(extractor.resourceType).toEqual('Encounter');
10+
});
11+
});

test/helpers/contextUtils.test.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const { getConditionEntriesFromContext, getPatientFromContext } = require('../../src/helpers/contextUtils');
1+
const { getConditionEntriesFromContext, getEncountersFromContext, getPatientFromContext } = require('../../src/helpers/contextUtils');
22

33
const MOCK_PATIENT_MRN = '123';
44

@@ -61,3 +61,35 @@ describe('getConditionFromContext', () => {
6161
.toThrow('Could not find any conditions in context; ensure that a ConditionExtractor is used earlier in your extraction configuration');
6262
});
6363
});
64+
65+
describe('getEncountersFromContext', () => {
66+
const encounterResource = {
67+
resourceType: 'Encounter',
68+
id: 'EncounterExample01',
69+
};
70+
const encounterContext = {
71+
resourceType: 'Bundle',
72+
type: 'collection',
73+
entry: [
74+
{
75+
fullUrl: 'context-url-1',
76+
resource: encounterResource,
77+
},
78+
{
79+
fullUrl: 'context-url-2',
80+
resource: { ...encounterResource, id: 'EncounterExample02' },
81+
},
82+
],
83+
};
84+
85+
test('Should return all Encounter resources in context', () => {
86+
const encounters = getEncountersFromContext(encounterContext);
87+
expect(encounters).toHaveLength(2);
88+
expect(encounters[0]).toEqual(encounterResource);
89+
});
90+
91+
test('Should throw an error if there are no encounters in context', () => {
92+
expect(() => getEncountersFromContext(MOCK_PATIENT_MRN, {}))
93+
.toThrow('Could not find any encounter resources in context; ensure that an EncounterExtractor is used earlier in your extraction configuration');
94+
});
95+
});

0 commit comments

Comments
 (0)