function isRequestorReferenced()

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);
        });
    });
}