in src/smartAuthorizationHelper.ts [41:89]
function isRequestorReferenced(
requestorIds: string[],
requestorResourceType: string,
sourceResource: any,
fhirVersion: FhirVersion,
): boolean {
const sourceResourceType = sourceResource.resourceType;
let matrix: any;
if (fhirVersion === '4.0.1') {
matrix = resourceReferencesMatrixV4;
} else if (fhirVersion === '3.0.1') {
matrix = resourceReferencesMatrixV3;
} else {
throw new Error('Unsupported FHIR version detected');
}
let possiblePaths: string[] = [];
if (matrix[sourceResourceType] && matrix[sourceResourceType][requestorResourceType]) {
possiblePaths = matrix[sourceResourceType][requestorResourceType];
}
// The paths within the FHIR resources may contain arrays so we must check if array at every level
return possiblePaths.some((path) => {
const pathComponents: string[] = path.split('.');
let tempResource = sourceResource;
let rootQueue = [];
let nextQueue = [tempResource[pathComponents[0]]];
for (let i = 1; i < pathComponents.length; i += 1) {
rootQueue = nextQueue;
nextQueue = [];
while (rootQueue.length > 0) {
tempResource = rootQueue.shift();
if (tempResource) {
if (Array.isArray(tempResource)) {
// eslint-disable-next-line no-loop-func
tempResource.forEach((x) => {
nextQueue.push(x[pathComponents[i]]);
});
} else {
nextQueue.push(tempResource[pathComponents[i]]);
}
}
}
}
return nextQueue.flat().some((x) => {
return x && x.reference && requestorIds.includes(x.reference);
});
});
}