diff --git a/extensions/default/src/DicomWebDataSource/index.js b/extensions/default/src/DicomWebDataSource/index.js index 1d0621cc5..0999e6651 100644 --- a/extensions/default/src/DicomWebDataSource/index.js +++ b/extensions/default/src/DicomWebDataSource/index.js @@ -1,6 +1,6 @@ import { api } from 'dicomweb-client'; import { mapParams, search, processResults } from './qido.js'; -import IWebApi from '@ohif/core'; +import { IWebApiDataSource } from '@ohif/core'; /** * @@ -22,7 +22,7 @@ function createDicomWebApi(dicomWebConfig) { const dicomWebClient = new api.DICOMwebClient(config); - return IWebApi({ + return IWebApiDataSource.create({ query: { studies: { mapParams: mapParams.bind(), diff --git a/platform/core/src/DataSources/DicomWebApi.js b/platform/core/src/DataSources/DicomWebApi.js index fcdd8f5a5..fad4c5102 100644 --- a/platform/core/src/DataSources/DicomWebApi.js +++ b/platform/core/src/DataSources/DicomWebApi.js @@ -1,6 +1,6 @@ import { api } from 'dicomweb-client'; import { mapParams, search, processResults } from './qido.js'; -import IWebApi from './IWebApi.js'; +import IWebApiDataSource from './IWebApiDataSource.js'; /** * @@ -22,7 +22,7 @@ function createDicomWebApi(dicomWebConfig) { const dicomWebClient = new api.DICOMwebClient(config); - return IWebApi({ + return IWebApiDataSource.create({ query: { studies: { mapParams: mapParams.bind(), diff --git a/platform/core/src/DataSources/IWebApi.js b/platform/core/src/DataSources/IWebApi.js deleted file mode 100644 index 9fa938085..000000000 --- a/platform/core/src/DataSources/IWebApi.js +++ /dev/null @@ -1,47 +0,0 @@ -import {dicomMetadataStore} from '@ohif/core'; - -/** - * Factory function that creates a new "Web API" data source. - * A "Web API" data source is any source that fetches data over - * HTTP. This function serves as an "adapter" to wrap those calls - * so that all "Web API" data sources have the same interface and can - * be used interchangeably. - * - * It's worth noting that a single implementation of this interface - * can define different underlying sources for "read" and "write" operations. - */ -function createWebApiDataSource({ query, retrieve, retrieveMetadata }) { - const defaultQuery = { - studies: { - /** - * @param {string} params.patientName - * @param {string} params.mrn - * @param {object} params.studyDate - * @param {string} params.description - * @param {string} params.modality - * @param {string} params.accession - * @param {string} params.sortBy - * @param {string} params.sortDirection - - * @param {number} params.page - * @param {number} params.resultsPerPage - */ - mapParams: params => params, - requestResults: () => {}, - processResults: results => results, - }, - series: {}, - instances: {}, - }; - - const defaultRetrieve = {}; - - return { - query, - retrieve: {}, - retrieveMetadata: retrieveMetadata.bind(null, dicomMetadataStore); - // then go get all series level metadata. - // Store this in the DICOM MetadataStore. - }; -} - -export { createWebApiDataSource }; diff --git a/platform/core/src/DataSources/IWebApiDataSource.js b/platform/core/src/DataSources/IWebApiDataSource.js index e3f10dde9..3848e6574 100644 --- a/platform/core/src/DataSources/IWebApiDataSource.js +++ b/platform/core/src/DataSources/IWebApiDataSource.js @@ -8,7 +8,7 @@ * It's worth noting that a single implementation of this interface * can define different underlying sources for "read" and "write" operations. */ -function createWebApiDataSource({ query, retrieve }) { +function create({ query, retrieve, retrieveMetadata }) { const defaultQuery = { studies: { /** @@ -36,7 +36,14 @@ function createWebApiDataSource({ query, retrieve }) { return { query, retrieve: {}, + // retrieveMetadata: retrieveMetadata.bind(null, dicomMetadataStore); + // then go get all series level metadata. + // Store this in the DICOM MetadataStore. }; } -export { createWebApiDataSource }; +const IWebApiDataSource = { + create, +}; + +export default IWebApiDataSource; diff --git a/platform/core/src/index.js b/platform/core/src/index.js index 018033602..bc845328e 100644 --- a/platform/core/src/index.js +++ b/platform/core/src/index.js @@ -29,7 +29,7 @@ import { UIViewportDialogService, } from './services'; -import * as IWebApiDataSource from './DataSources/IWebApiDataSource'; +import IWebApiDataSource from './DataSources/IWebApiDataSource'; const OHIF = { MODULE_TYPES, diff --git a/platform/viewer/src/routes/DataSourceWrapper.jsx b/platform/viewer/src/routes/DataSourceWrapper.jsx index 5734e0e7f..00f949272 100644 --- a/platform/viewer/src/routes/DataSourceWrapper.jsx +++ b/platform/viewer/src/routes/DataSourceWrapper.jsx @@ -1,8 +1,9 @@ /* eslint-disable react/jsx-props-no-spreading */ import React from 'react'; import PropTypes from 'prop-types'; +import { MODULE_TYPES } from '@ohif/core'; // -import { extensionManager } from '../App.js'; +import { appConfig, extensionManager } from '../App.js'; /** * Uses route properties to determine the data source that should be passed @@ -14,8 +15,39 @@ import { extensionManager } from '../App.js'; */ function DataSourceWrapper(props) { const { children: LayoutTemplate, ...rest } = props; - console.log('data source wrapper', props); - console.log(extensionManager); + // TODO: Fetch by type, name, etc? + const dataSourceModules = extensionManager.modules[MODULE_TYPES.DATA_SOURCE]; + // TODO: Good usecase for flatmap? + const webApiDataSources = dataSourceModules.reduce((acc, curr) => { + const mods = []; + curr.module.forEach(mod => { + if (mod.type === 'webApi') { + mods.push(mod); + } + }); + return acc.concat(mods); + }, []); + + // Grabbing first for now. This isn't hydrated yet, but we should + // hydrate it somewhere based on config... + // ~ default.js + const firstAppConfigDataSource = appConfig.dataSources[0]; + const dataSourceConfig = firstAppConfigDataSource.configuration; + const firstWebApiDataSource = webApiDataSources[0]; + const dataSource = firstWebApiDataSource.createDataSource(dataSourceConfig); + + console.log(dataSource, 'dsm'); + + // Route props --> studies.mapParams + // mapParams --> studies.search + // studies.search --> studies.processResults + // studies.processResults --> + // But only for LayoutTemplate type of 'list'? + // Or no data fetching here, and just hand down my source + + // const studies = dataSource.query.studies.search(); + + // console.log(studies); return (