|
| 1 | +const path = require('path'); |
| 2 | +const { Extractor } = require('./Extractor'); |
| 3 | +const { FHIRProcedureExtractor } = require('./FHIRProcedureExtractor'); |
| 4 | +const { getBundleEntriesByResourceType } = require('../helpers/fhirUtils'); |
| 5 | +const { checkCodeInVs } = require('../helpers/valueSetUtils'); |
| 6 | +const logger = require('../helpers/logger'); |
| 7 | + |
| 8 | +function getMCODESurgicalProcedures(fhirProcedures) { |
| 9 | + const surgicalProcedureVSFilepath = path.resolve(__dirname, '..', 'helpers', 'valueSets', 'ValueSet-mcode-cancer-related-surgical-procedure-vs.json'); |
| 10 | + return fhirProcedures.filter((procedure) => { |
| 11 | + const coding = procedure.resource.code ? procedure.resource.code.coding : []; |
| 12 | + // NOTE: Update when checkCodeInVS checks code and system (might be able to pass in the full Coding) |
| 13 | + return coding.some((c) => checkCodeInVs(c.code, surgicalProcedureVSFilepath)); |
| 14 | + }); |
| 15 | +} |
| 16 | + |
| 17 | +class MCODESurgicalProcedureExtractor extends Extractor { |
| 18 | + constructor({ baseFhirUrl, requestHeaders }) { |
| 19 | + super({ baseFhirUrl, requestHeaders }); |
| 20 | + this.fhirProcedureExtractor = new FHIRProcedureExtractor({ baseFhirUrl, requestHeaders }); |
| 21 | + } |
| 22 | + |
| 23 | + updateRequestHeaders(newHeaders) { |
| 24 | + this.fhirProcedureExtractor.updateRequestHeaders(newHeaders); |
| 25 | + } |
| 26 | + |
| 27 | + async getFHIRProcedures(mrn, context) { |
| 28 | + const proceduresInContext = getBundleEntriesByResourceType(context, 'Procedure', {}); |
| 29 | + if (proceduresInContext.length !== 0) { |
| 30 | + logger.debug('Procedure resources found in context.'); |
| 31 | + return proceduresInContext; |
| 32 | + } |
| 33 | + |
| 34 | + logger.debug('Getting procedures available for patient'); |
| 35 | + const procedureBundle = await this.fhirProcedureExtractor.get({ mrn, context }); |
| 36 | + |
| 37 | + logger.debug(`Found ${procedureBundle.entry.length} result(s) in Procedure search`); |
| 38 | + return procedureBundle.entry; |
| 39 | + } |
| 40 | + |
| 41 | + async get({ mrn, context }) { |
| 42 | + const fhirProcedures = await this.getFHIRProcedures(mrn, context); |
| 43 | + |
| 44 | + // Filter to only include procedures that are from MCODE surgical procedure VS |
| 45 | + const surgicalProcedures = getMCODESurgicalProcedures(fhirProcedures); |
| 46 | + |
| 47 | + return { |
| 48 | + resourceType: 'Bundle', |
| 49 | + type: 'collection', |
| 50 | + entry: surgicalProcedures, |
| 51 | + }; |
| 52 | + } |
| 53 | +} |
| 54 | + |
| 55 | +module.exports = { |
| 56 | + MCODESurgicalProcedureExtractor, |
| 57 | +}; |
0 commit comments