diff --git a/healthcare/dicom/dicomWebStoreInstance.js b/healthcare/dicom/dicomWebStoreInstance.js new file mode 100644 index 0000000000..a0ce238b16 --- /dev/null +++ b/healthcare/dicom/dicomWebStoreInstance.js @@ -0,0 +1,70 @@ +/** + * Copyright 2019, Google, LLC + * Licensed under the Apache License, Version 2.0 (the `License`); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an `AS IS` BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-disable no-warning-comments */ + +'use strict'; + +const main = ( + projectId = process.env.GCLOUD_PROJECT, + cloudRegion = 'us-central1', + datasetId, + dicomStoreId, + dcmFile +) => { + // [START healthcare_dicomweb_store_instance] + const {google} = require('googleapis'); + const healthcare = google.healthcare('v1beta1'); + const fs = require('fs'); + const binaryData = fs.createReadStream(dcmFile); + + const dicomWebStoreInstance = async () => { + const auth = await google.auth.getClient({ + scopes: ['https://www.googleapis.com/auth/cloud-platform'], + }); + google.options({ + auth, + headers: { + 'Content-Type': 'application/dicom', + Accept: 'application/dicom+json', + }, + }); + + // TODO(developer): uncomment these lines before running the sample + // const cloudRegion = 'us-central1'; + // const projectId = 'adjective-noun-123'; + // const datasetId = 'my-dataset'; + // const dicomStoreId = 'my-dicom-store'; + // const dcmFile = 'file.dcm'; + const parent = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/dicomStores/${dicomStoreId}`; + const dicomWebPath = `studies`; + const request = { + parent, + dicomWebPath, + requestBody: binaryData, + }; + + const instance = await healthcare.projects.locations.datasets.dicomStores.storeInstances( + request + ); + console.log(`Stored DICOM instance:\n`, JSON.stringify(instance.data)); + }; + + dicomWebStoreInstance(); + // [END healthcare_dicomweb_store_instance] +}; + +// node dicomWebStoreInstance.js +main(...process.argv.slice(2)); diff --git a/healthcare/dicom/dicomweb.js b/healthcare/dicom/dicomweb.js deleted file mode 100644 index 2b9569597b..0000000000 --- a/healthcare/dicom/dicomweb.js +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Copyright 2018, Google, LLC - * Licensed under the Apache License, Version 2.0 (the `License`); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an `AS IS` BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -const {GoogleToken} = require('gtoken'); -const request = require('request-promise'); -const fs = require('fs'); - -const BASE_URL = 'https://healthcare.googleapis.com/v1beta1'; - -const getToken = (serviceAccountJson, cb) => { - const gtoken = new GoogleToken({ - keyFile: `${serviceAccountJson}`, - scope: ['https://www.googleapis.com/auth/cloud-platform'], // or space-delimited string of scopes - }); - - gtoken.getToken((err, token) => { - if (err) { - console.log('ERROR: ', err); - return; - } - cb(token); - }); -}; - -// [START healthcare_dicomweb_store_instance] -const dicomWebStoreInstance = async ( - token, - projectId, - cloudRegion, - datasetId, - dicomStoreId, - dcmFile -) => { - // Token retrieved in callback - // getToken(serviceAccountJson, function(cb) {...}); - // const cloudRegion = 'us-central1'; - // const projectId = 'adjective-noun-123'; - // const datasetId = 'my-dataset'; - // const dicomStoreId = 'my-dicom-store'; - // const dcmFile = 'IMG.dcm' - const parentName = `${BASE_URL}/projects/${projectId}/locations/${cloudRegion}`; - - const dicomWebPath = `${parentName}/datasets/${datasetId}/dicomStores/${dicomStoreId}/dicomWeb/studies`; - - const binaryData = fs.readFileSync(dcmFile); - - const options = { - url: dicomWebPath, - headers: { - authorization: `Bearer ${token}`, - 'Content-Type': `multipart/related; type=application/dicom`, - }, - body: binaryData, - method: 'POST', - }; - - try { - const results = await request(options); - console.log('Stored instance:\n'); - console.log(results); - } catch (err) { - console.error(err); - } -}; -// [END healthcare_dicomweb_store_instance] - -require(`yargs`) // eslint-disable-line - .demand(1) - .options({ - cloudRegion: { - alias: 'c', - default: 'us-central1', - requiresArg: true, - type: 'string', - }, - projectId: { - alias: 'p', - default: process.env.GCLOUD_PROJECT || process.env.GOOGLE_CLOUD_PROJECT, - description: - 'The Project ID to use. Defaults to the value of the GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT environment variables.', - requiresArg: true, - type: 'string', - }, - serviceAccount: { - alias: 's', - default: process.env.GOOGLE_APPLICATION_CREDENTIALS, - description: 'The path to your service credentials JSON.', - requiresArg: true, - type: 'string', - }, - }) - .command( - `dicomWebStoreInstance `, - `Handles the POST requests specified in the DICOMweb standard.`, - {}, - opts => { - const cb = function(token) { - dicomWebStoreInstance( - token, - opts.projectId, - opts.cloudRegion, - opts.datasetId, - opts.dicomStoreId, - opts.dcmFile - ); - }; - getToken(opts.serviceAccount, cb); - } - ) - .wrap(120) - .recommendCommands() - .epilogue( - `For more information, see https://cloud.google.com/healthcare/docs` - ) - .help() - .strict().argv; diff --git a/healthcare/dicom/system-test/dicomweb.test.js b/healthcare/dicom/system-test/dicomweb.test.js index 4bfa86a550..c29df6e55c 100644 --- a/healthcare/dicom/system-test/dicomweb.test.js +++ b/healthcare/dicom/system-test/dicomweb.test.js @@ -65,10 +65,10 @@ after(async () => { it('should store a DICOM instance', async () => { const output = await tools.runAsync( - `node dicomweb.js dicomWebStoreInstance ${datasetId} ${dicomStoreId} ${dcmFile}`, + `node dicomWebStoreInstance.js ${projectId} ${cloudRegion} ${datasetId} ${dicomStoreId} ${dcmFile}`, cwd ); - assert.ok(output.includes('Stored instance')); + assert.ok(output.includes('Stored DICOM instance')); }); it('should search DICOM instances', async () => {