All files / extensions/default/src/DicomWebProxyDataSource index.ts

0% Statements 0/28
0% Branches 0/8
0% Functions 0/12
0% Lines 0/28

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77                                                                                                                                                         
import { IWebApiDataSource } from '@ohif/core';
import { createDicomWebApi } from '../DicomWebDataSource/index';
 
/**
 * This datasource is initialized with a url that returns a JSON object with a
 * dicomWeb datasource configuration array present in a "servers" object.
 *
 * Only the first array item is parsed, if there are multiple items in the
 * dicomWeb configuration array
 *
 */
function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager: AppTypes.ServicesManager) {
  const { name } = dicomWebProxyConfig;
  let dicomWebDelegate = undefined;
 
  const implementation = {
    initialize: async ({ params, query }) => {
      const url = query.get('url');
 
      if (!url) {
        throw new Error(`No url for '${name}'`);
      } else {
        const response = await fetch(url);
        const data = await response.json();
        Iif (!data.servers?.dicomWeb?.[0]) {
          throw new Error('Invalid configuration returned by url');
        }
 
        dicomWebDelegate = createDicomWebApi(
          data.servers.dicomWeb[0].configuration || data.servers.dicomWeb[0],
          servicesManager
        );
        dicomWebDelegate.initialize({ params, query });
      }
    },
    query: {
      studies: {
        search: params => dicomWebDelegate.query.studies.search(params),
      },
      series: {
        search: (...args) => dicomWebDelegate.query.series.search(...args),
      },
      instances: {
        search: (studyInstanceUid, queryParameters) =>
          dicomWebDelegate.query.instances.search(studyInstanceUid, queryParameters),
      },
    },
    retrieve: {
      directURL: (...args) => dicomWebDelegate.retrieve.directURL(...args),
      series: {
        metadata: async (...args) => dicomWebDelegate.retrieve.series.metadata(...args),
      },
    },
    store: {
      dicom: (...args) => dicomWebDelegate.store(...args),
    },
    deleteStudyMetadataPromise: (...args) => dicomWebDelegate.deleteStudyMetadataPromise(...args),
    getImageIdsForDisplaySet: (...args) => dicomWebDelegate.getImageIdsForDisplaySet(...args),
    getImageIdsForInstance: (...args) => dicomWebDelegate.getImageIdsForInstance(...args),
    getStudyInstanceUIDs({ params, query }) {
      let studyInstanceUIDs = [];
 
      // there seem to be a couple of variations of the case for this parameter
      const queryStudyInstanceUIDs =
        query.get('studyInstanceUIDs') || query.get('studyInstanceUids');
      Iif (!queryStudyInstanceUIDs) {
        throw new Error(`No studyInstanceUids in request for '${name}'`);
      }
      studyInstanceUIDs = queryStudyInstanceUIDs.split(';');
      return studyInstanceUIDs;
    },
  };
  return IWebApiDataSource.create(implementation);
}
 
export { createDicomWebProxyApi };