From 3daba11c94ae0e56c39e689ac3b5761596cf73fb Mon Sep 17 00:00:00 2001 From: JieuTang Date: Sun, 7 Aug 2022 03:02:00 +0800 Subject: [PATCH] feat: using with typescript can get response type --- .gitignore | 3 + src/DICOMwebWADORSURI.ts | 121 +++--- src/Frame.ts | 148 +++---- src/Instance.ts | 307 ++++++-------- src/Series.ts | 317 ++++++-------- src/Study.ts | 392 ++++++++---------- src/config/AllowProtocol.config.ts | 6 +- src/config/QueryMode.config.ts | 6 +- src/config/WADOParameter.config.ts | 27 +- src/config/WADORSStructure.config.ts | 55 +-- src/config/WADOURIStructure.config.ts | 50 +-- src/type/parameterType/FrameParameterType.ts | 7 + .../parameterType/InstanceParameterType.ts | 6 + src/type/parameterType/SeriesParameterType.ts | 5 + src/type/parameterType/StudyParameterType.ts | 4 + 15 files changed, 625 insertions(+), 829 deletions(-) create mode 100644 src/type/parameterType/FrameParameterType.ts create mode 100644 src/type/parameterType/InstanceParameterType.ts create mode 100644 src/type/parameterType/SeriesParameterType.ts create mode 100644 src/type/parameterType/StudyParameterType.ts diff --git a/.gitignore b/.gitignore index 40fc3e7..3fad892 100644 --- a/.gitignore +++ b/.gitignore @@ -104,3 +104,6 @@ dist # TernJS port file .tern-port + + +test.js \ No newline at end of file diff --git a/src/DICOMwebWADORSURI.ts b/src/DICOMwebWADORSURI.ts index 4e80de4..e9b21f8 100644 --- a/src/DICOMwebWADORSURI.ts +++ b/src/DICOMwebWADORSURI.ts @@ -1,60 +1,73 @@ +import _ from "lodash"; import URL from "url-parse"; +import Series from "./Series"; import Study from "./Study"; class DICOMwebWADORSURI { - // Token - isUseToken: boolean = false; - tokenObject: object = {}; - - // url-parse package - hostname: string = ""; - pathname: string = ""; - port: string = ""; - protocol: string = ""; - serverURL: string = ""; - studyInstanceUID: string = "" - - // Query Mode - queryMode: string = ""; - - // Response - response: object = {}; - - - async init() { - this.serverURL = await this._getServerURL(); - } - - async querySeries() { - const study = new Study(this.serverURL, this.queryMode, this.studyInstanceUID); - await study.querySeries(); - this.response = study; - } - - async renderAllSeries() { - const study = new Study(this.serverURL, this.queryMode, this.studyInstanceUID); - await study.renderAllSeries(); - this.response = study; - } - - async renderSpecificSeries(seriesInstanceUID: string) { - const study = new Study(this.serverURL, this.queryMode, this.studyInstanceUID); - await study.renderSpecificSeries(seriesInstanceUID); - this.response = study; - } - - async _getServerURL() { - let result; - - const serverURL = new URL(""); - serverURL.set("hostname", this.hostname); - serverURL.set("pathname", this.pathname); - serverURL.set("port", this.port); - serverURL.set("protocol", this.protocol); - result = serverURL.toString(); - - return result; - } + // Token + isUseToken: boolean = false; + tokenObject?: object; + + // url-parse package + hostname: string = ""; + pathname: string = ""; + port: string = ""; + protocol: string = ""; + serverURL: string = ""; + studyInstanceUID: string = ""; + + // Query Mode + queryMode: string = ""; + + // Response + response?: Study; + + async init() { + this.serverURL = await this._getServerURL(); + } + + async querySeries() { + const study = new Study( + this.serverURL, + this.queryMode, + this.studyInstanceUID + ); + await study.querySeries(); + this.response = study; + } + + async renderAllSeries() { + const study = new Study( + this.serverURL, + this.queryMode, + this.studyInstanceUID + ); + await study.renderAllSeries(); + this.response = study; + } + + async renderSpecificSeries(seriesInstanceUID: string) { + const study = new Study( + this.serverURL, + this.queryMode, + this.studyInstanceUID + ); + await study.renderSpecificSeries(seriesInstanceUID); + this.response = study; + } + + async _getServerURL() { + let result; + + const serverURL = new URL(""); + serverURL.set("hostname", this.hostname); + serverURL.set("pathname", this.pathname); + serverURL.set("port", this.port); + serverURL.set("protocol", this.protocol); + result = serverURL.toString(); + + return result; + } } -export default DICOMwebWADORSURI; \ No newline at end of file +export default DICOMwebWADORSURI; diff --git a/src/Frame.ts b/src/Frame.ts index 798c24d..5729214 100644 --- a/src/Frame.ts +++ b/src/Frame.ts @@ -1,100 +1,60 @@ import _ from "lodash"; -class Frame { - - uid: string = ""; - parameter: object = {}; - queryMode: string = ""; - url: object = {}; - - isUseToken: boolean = false; - tokenObject: object | null = null; - - - constructor(parameter: object, queryMode: string, numberOfFrame: string) { - this.uid = numberOfFrame; - - this.parameter = _.assign(parameter, { "{frames}": numberOfFrame }); - - this.queryMode = queryMode; - - this.url = { - "rs": { - "rendered": "{s}/studies/{study}/series/{series}/instances/{instance}/frames/{frames}/rendered" - }, - "uri": { - "rendered": "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}&objectUID={instance}&frameNumber={frames}&contentType=image/jpeg" - } - }; - - this.isUseToken = false; - this.tokenObject = null; - } - - async init() { - await this._validateQueryMode(); - await this._replaceUrlParameter(); - } - - - - - - - - - - - - - - - - - - +import { InstanceParameterType } from "./type/parameterType/InstanceParameterType"; +import { FrameParameterType } from "./type/parameterType/FrameParameterType"; - - - - - - - - - - - - - - - - - - - - - - - - - - - async _validateQueryMode() { - const queryModeValueSet = _.keys(this.url); - if (!(_.includes(queryModeValueSet, this.queryMode))) { - console.log(`查詢模式必須是 ${_.toString(queryModeValueSet)}`); - } - } - - async _replaceUrlParameter() { - _.forEach(_.get(this.url, this.queryMode), (urlTemplate, key) => { - _.forEach(this.parameter, (valueOfParameter, keyOfParameter) => { - urlTemplate = _.replace(urlTemplate, keyOfParameter, valueOfParameter); - }); - _.set(_.get(this.url, this.queryMode), key, urlTemplate); - }); +class Frame { + uid: string; + parameter: FrameParameterType; + queryMode: string; + url: object; + + isUseToken?: boolean; + tokenObject?: object; + + constructor( + parameter: InstanceParameterType, + queryMode: string, + numberOfFrame: string + ) { + this.uid = numberOfFrame; + + this.parameter = _.assign(parameter, { "{frames}": numberOfFrame }); + + this.queryMode = queryMode; + + this.url = { + rs: { + rendered: + "{s}/studies/{study}/series/{series}/instances/{instance}/frames/{frames}/rendered", + }, + uri: { + rendered: + "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}&objectUID={instance}&frameNumber={frames}&contentType=image/jpeg", + }, + }; + } + + async init() { + await this._validateQueryMode(); + await this._replaceUrlParameter(); + } + + async _validateQueryMode() { + const queryModeValueSet = _.keys(this.url); + if (!_.includes(queryModeValueSet, this.queryMode)) { + console.log(`查詢模式必須是 ${_.toString(queryModeValueSet)}`); } + } + + async _replaceUrlParameter() { + _.forEach(_.get(this.url, this.queryMode), (urlTemplate, key) => { + _.forEach(this.parameter, (valueOfParameter, keyOfParameter) => { + urlTemplate = _.replace(urlTemplate, keyOfParameter, valueOfParameter); + }); + _.set(_.get(this.url, this.queryMode), key, urlTemplate); + }); + } } -export default Frame \ No newline at end of file +export default Frame; diff --git a/src/Instance.ts b/src/Instance.ts index 5ac68b2..a7d5bf0 100644 --- a/src/Instance.ts +++ b/src/Instance.ts @@ -2,203 +2,130 @@ import _ from "lodash"; import axios, { AxiosRequestHeaders } from "axios"; import Frame from "./Frame"; -class Instance { - - uid: string = ""; - parameter: object = {}; - queryMode: string = ""; - url: object = {}; - - isUseToken: boolean = false; - tokenObject: object | null = null; - - metadata: object | null | undefined = null; - codeOfNumberOfFrames: string = ""; - Frames: Frame[] | null = null; - - - constructor(parameter: object, queryMode: string, uid: string) { - this.uid = uid; - - this.parameter = _.assign(parameter, { "{instance}": uid }); +import { SeriesParameterType } from "./type/parameterType/SeriesParameterType"; +import { InstanceParameterType } from "./type/parameterType/InstanceParameterType"; - this.queryMode = queryMode; - - this.url = { - "rs": { - "entire": "{s}/studies/{study}/series/{series}/instances/{instance}", - "rendered": "{s}/studies/{study}/series/{series}/instances/{instance}/rendered", - "metadata": "{s}/studies/{study}/series/{series}/instances/{instance}/metadata" - }, - "uri": { - "entire": "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}&objectUID={instance}", - "metadata": "{s}/studies/{study}/series/{series}/instances/{instance}/metadata" - } - }; - - this.isUseToken = false; - this.tokenObject = null; - - this.metadata = null; - - this.codeOfNumberOfFrames = "00280008"; - - this.Frames = null; - } - - async init() { - await this._validateQueryMode(); - await this._replaceUrlParameter(); - this.metadata = _.first(await this._getMetadata(_.get(_.get(this.url, this.queryMode), "metadata"))); - this.Frames = await this._getFrames(); - } - - async _getFrames() { - const result = []; - - const numberOfFrame = _.toInteger(_.first(_.get(_.get(this.metadata, this.codeOfNumberOfFrames), "Value"))); - - for (let i = 1; i <= numberOfFrame; i++) { - let tempObject; - tempObject = new Frame(this.parameter, this.queryMode, i.toString()); - await tempObject.init(); - result.push(tempObject); - } - - return result; +class Instance { + uid: string = ""; + parameter: InstanceParameterType; + queryMode: string = ""; + url: object = {}; + + isUseToken?: boolean = false; + tokenObject?: object; + + metadata?: object; + codeOfNumberOfFrames: string; + Frames?: Frame[]; + + constructor(parameter: SeriesParameterType, queryMode: string, uid: string) { + this.uid = uid; + + this.parameter = _.assign(parameter, { "{instance}": uid }); + + this.queryMode = queryMode; + + this.url = { + rs: { + entire: "{s}/studies/{study}/series/{series}/instances/{instance}", + rendered: + "{s}/studies/{study}/series/{series}/instances/{instance}/rendered", + metadata: + "{s}/studies/{study}/series/{series}/instances/{instance}/metadata", + }, + uri: { + entire: + "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}&objectUID={instance}", + metadata: + "{s}/studies/{study}/series/{series}/instances/{instance}/metadata", + }, + }; + + this.codeOfNumberOfFrames = "00280008"; + } + + async init() { + await this._validateQueryMode(); + await this._replaceUrlParameter(); + this.metadata = _.first( + await this._getMetadata( + _.get(_.get(this.url, this.queryMode), "metadata") + ) + ); + this.Frames = await this._getFrames(); + } + + async _getFrames(): Promise { + const result: Frame[] = []; + const numberOfFrame = _.toInteger( + _.first(_.get(_.get(this.metadata, this.codeOfNumberOfFrames), "Value")) + ); + + for (let i = 1; i <= numberOfFrame; i++) { + const tempObject = new Frame( + this.parameter, + this.queryMode, + i.toString() + ); + await tempObject.init(); + result.push(tempObject); } + return result; + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - async _validateQueryMode() { - const queryModeValueSet = _.keys(this.url); - if (!(_.includes(queryModeValueSet, this.queryMode))) { - console.log(`查詢模式必須是 ${_.toString(queryModeValueSet)}`); - } + async _validateQueryMode() { + const queryModeValueSet = _.keys(this.url); + if (!_.includes(queryModeValueSet, this.queryMode)) { + console.log(`查詢模式必須是 ${_.toString(queryModeValueSet)}`); } - - async _replaceUrlParameter() { - _.forEach(_.get(this.url, this.queryMode), (urlTemplate, key) => { - _.forEach(this.parameter, (valueOfParameter, keyOfParameter) => { - urlTemplate = _.replace(urlTemplate, keyOfParameter, valueOfParameter); - }); - _.set(_.get(this.url, this.queryMode), key, urlTemplate); + } + + async _replaceUrlParameter() { + _.forEach(_.get(this.url, this.queryMode), (urlTemplate, key) => { + _.forEach(this.parameter, (valueOfParameter, keyOfParameter) => { + urlTemplate = _.replace(urlTemplate, keyOfParameter, valueOfParameter); + }); + _.set(_.get(this.url, this.queryMode), key, urlTemplate); + }); + } + + async _getMetadata(metadataURL: string) { + return await this._getJsonResponseFromURL(metadataURL); + } + + async _getJsonResponseFromURL(inputUrl: string) { + let result; + let response; + + if (this.isUseToken) { + await axios({ + method: "get", + url: inputUrl, + headers: this.tokenObject as AxiosRequestHeaders, + }) + .then((res) => { + response = _.cloneDeep(res.data); + }) + .catch((error) => { + console.log(error); + }); + } else { + await axios({ + method: "get", + url: inputUrl, + }) + .then((res) => { + response = _.cloneDeep(res.data); + }) + .catch((error) => { + console.log(error); }); } - async _getMetadata(metadataURL: string) { - return await this._getJsonResponseFromURL(metadataURL); - } + result = _.cloneDeep(response); - async _getJsonResponseFromURL(inputUrl: string) { - let result; - let response; - - if (this.isUseToken) { - await axios({ - method: "get", - url: inputUrl, - headers: this.tokenObject as AxiosRequestHeaders - }).then( - (res) => { - response = _.cloneDeep(res.data); - } - ).catch( - (error) => { - console.log(error); - } - ) - } else { - await axios({ - method: "get", - url: inputUrl, - }).then( - (res) => { - response = _.cloneDeep(res.data); - } - ).catch( - (error) => { - console.log(error); - } - ) - } - - result = _.cloneDeep(response); - - return result; - } + return result; + } } -export default Instance \ No newline at end of file +export default Instance; diff --git a/src/Series.ts b/src/Series.ts index ebe83eb..9c7f6f0 100644 --- a/src/Series.ts +++ b/src/Series.ts @@ -1,212 +1,131 @@ import _ from "lodash"; import axios, { AxiosRequestHeaders } from "axios"; -import Instance from "./Instance" +import Instance from "./Instance"; -class Series { - - uid: string = ""; - parameter: object = {}; - queryMode: string = ""; - url: object = {}; - - isUseToken: boolean = false; - tokenObject: object | null = null; - - metadata: object | null | undefined = null; - codeOfSOPInstanceUID: string = ""; - Instances: (string | Instance)[] | null = null; - - constructor(parameter: object, queryMode: string, uid: string) { - this.uid = uid; - - this.parameter = _.assign(parameter, { "{series}": uid }); - - this.queryMode = queryMode; +import { StudyParameterType } from "./type/parameterType/StudyParameterType"; +import { SeriesParameterType } from "./type/parameterType/SeriesParameterType"; - this.url = { - "rs": { - "entire": "{s}/studies/{study}/series/{series}", - "rendered": "{s}/studies/{study}/series/{series}/rendered", - "metadata": "{s}/studies/{study}/series/{series}/metadata" - }, - "uri": { - "entire": "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}", - "metadata": "{s}/studies/{study}/series/{series}/metadata" - } - }; - - this.isUseToken = false; - this.tokenObject = null; - - this.metadata = null; - - this.codeOfSOPInstanceUID = "00080018"; - - this.Instances = null; - } - - async init(isRenderInstances = false) { - await this._validateQueryMode(); - await this._replaceUrlParameter(); - this.metadata = await this._getMetadata(_.get(_.get(this.url, this.queryMode), "metadata")); - if (isRenderInstances) this.Instances = await this._getInstances(); +class Series { + uid: string = ""; + parameter: SeriesParameterType; + queryMode: string = ""; + url: object = {}; + + isUseToken?: boolean = false; + tokenObject?: object; + + metadata?: object; + codeOfSOPInstanceUID: string = ""; + Instances?: Instance[]; + + constructor(parameter: StudyParameterType, queryMode: string, uid: string) { + this.uid = uid; + + this.parameter = _.assign(parameter, { "{series}": uid }); + + this.queryMode = queryMode; + + this.url = { + rs: { + entire: "{s}/studies/{study}/series/{series}", + rendered: "{s}/studies/{study}/series/{series}/rendered", + metadata: "{s}/studies/{study}/series/{series}/metadata", + }, + uri: { + entire: + "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}", + metadata: "{s}/studies/{study}/series/{series}/metadata", + }, + }; + + this.codeOfSOPInstanceUID = "00080018"; + } + + async init(isRenderInstances = false) { + await this._validateQueryMode(); + await this._replaceUrlParameter(); + this.metadata = await this._getMetadata( + _.get(_.get(this.url, this.queryMode), "metadata") + ); + if (isRenderInstances) this.Instances = await this._getInstances(); + } + + async _getInstances(): Promise { + const result: Instance[] = []; + + for (let i = 0; i < _.toArray(this.metadata).length; i++) { + const instanceMetadata = _.get(this.metadata, i); + + if (_.has(instanceMetadata, this.codeOfSOPInstanceUID)) { + const tempObject = new Instance( + this.parameter, + this.queryMode, + _.toString( + _.first( + _.get(_.get(instanceMetadata, this.codeOfSOPInstanceUID), "Value") + ) + ) + ); + await tempObject.init(); + result.push(tempObject); + } } + return result; + } - async _getInstances(): Promise<(string | Instance)[]> { - const result = []; - - for (let i = 0; i < _.toArray(this.metadata).length; i++) { - const instanceMetadata = _.get(this.metadata, i); - - let tempObject; - - if (_.has(instanceMetadata, this.codeOfSOPInstanceUID)) { - tempObject = new Instance(this.parameter, this.queryMode, _.toString(_.first(_.get(_.get(instanceMetadata, this.codeOfSOPInstanceUID), "Value")))); - await tempObject.init(); - } else { - tempObject = `這個 Instance 沒有 ${this.codeOfSOPInstanceUID}`; - } - result.push(tempObject); - } - return result; + async _validateQueryMode() { + const queryModeValueSet = _.keys(this.url); + if (!_.includes(queryModeValueSet, this.queryMode)) { + console.log(`查詢模式必須是 ${_.toString(queryModeValueSet)}`); } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - async _validateQueryMode() { - const queryModeValueSet = _.keys(this.url); - if (!(_.includes(queryModeValueSet, this.queryMode))) { - console.log(`查詢模式必須是 ${_.toString(queryModeValueSet)}`); - } - } - - async _replaceUrlParameter() { - _.forEach(_.get(this.url, this.queryMode), (urlTemplate, key) => { - _.forEach(this.parameter, (valueOfParameter, keyOfParameter) => { - urlTemplate = _.replace(urlTemplate, keyOfParameter, valueOfParameter); - }); - _.set(_.get(this.url, this.queryMode), key, urlTemplate); + } + + async _replaceUrlParameter() { + _.forEach(_.get(this.url, this.queryMode), (urlTemplate, key) => { + _.forEach(this.parameter, (valueOfParameter, keyOfParameter) => { + urlTemplate = _.replace(urlTemplate, keyOfParameter, valueOfParameter); + }); + _.set(_.get(this.url, this.queryMode), key, urlTemplate); + }); + } + + async _getMetadata(metadataURL: string) { + return await this._getJsonResponseFromURL(metadataURL); + } + + async _getJsonResponseFromURL(inputUrl: string) { + let result; + let response; + + if (this.isUseToken) { + await axios({ + method: "get", + url: inputUrl, + headers: this.tokenObject as AxiosRequestHeaders, + }) + .then((res) => { + response = _.cloneDeep(res.data); + }) + .catch((error) => { + console.log(error); + }); + } else { + await axios({ + method: "get", + url: inputUrl, + }) + .then((res) => { + response = _.cloneDeep(res.data); + }) + .catch((error) => { + console.log(error); }); } - async _getMetadata(metadataURL: string) { - return await this._getJsonResponseFromURL(metadataURL); - } - - async _getJsonResponseFromURL(inputUrl: string) { - let result; - let response; - - if (this.isUseToken) { - await axios({ - method: "get", - url: inputUrl, - headers: this.tokenObject as AxiosRequestHeaders - }).then( - (res) => { - response = _.cloneDeep(res.data); - } - ).catch( - (error) => { - console.log(error); - } - ) - } else { - await axios({ - method: "get", - url: inputUrl, - }).then( - (res) => { - response = _.cloneDeep(res.data); - } - ).catch( - (error) => { - console.log(error); - } - ) - } - - result = _.cloneDeep(response); + result = _.cloneDeep(response); - return result; - } + return result; + } } -export default Series \ No newline at end of file +export default Series; diff --git a/src/Study.ts b/src/Study.ts index 0378cb3..2d92e77 100644 --- a/src/Study.ts +++ b/src/Study.ts @@ -1,248 +1,196 @@ import _ from "lodash"; import axios, { AxiosRequestHeaders } from "axios"; import Series from "./Series"; +import { StudyParameterType } from "./type/parameterType/StudyParameterType"; class Study { - - uid: string = ""; - parameter: object = {}; - queryMode: string = ""; - url: object = {}; - - isUseToken: boolean = false; - tokenObject: object | null = null; - - metadata: object | null | undefined = null; - codeOfSeriesInstanceUID: string = ""; - Series: Series[] | null = null; - - constructor(serverURL: string, queryMode: string, uid: string) { - this.uid = uid; - - this.parameter = { - "{s}": serverURL, - "{study}": uid - }; - - this.queryMode = queryMode; - - this.url = { - "rs": { - "entire": "{s}/studies/{study}", - "rendered": "{s}/studies/{study}/rendered", - "metadata": "{s}/studies/{study}/series" - }, - "uri": { - "entire": "{s}/wado?requestType=WADO/&studyUID={study}", - "metadata": "{s}/studies/{study}/series" - } - }; - - this.isUseToken = false; - this.tokenObject = null; - - this.metadata = null; - - this.codeOfSeriesInstanceUID = "0020000E"; - - this.Series = null; + uid: string; + parameter: StudyParameterType; + queryMode: string; + url?: object; + + isUseToken?: boolean = false; + tokenObject?: object; + + metadata?: object; + codeOfSeriesInstanceUID: string; + Series?: Series[]; + + constructor(serverURL: string, queryMode: string, uid: string) { + this.uid = uid; + + this.parameter = { + "{s}": serverURL, + "{study}": uid, + }; + + this.queryMode = queryMode; + + this.url = { + rs: { + entire: "{s}/studies/{study}", + rendered: "{s}/studies/{study}/rendered", + metadata: "{s}/studies/{study}/series", + }, + uri: { + entire: "{s}/wado?requestType=WADO/&studyUID={study}", + metadata: "{s}/studies/{study}/series", + }, + }; + + this.codeOfSeriesInstanceUID = "0020000E"; + } + + async querySeries() { + await this._init(); + this.metadata = await this._getMetadata( + _.get(_.get(this.url, this.queryMode), "metadata") + ); + this.Series = await this._getSeries(); + } + + async renderAllSeries() { + if (_.isUndefined(this.Series)) { + await this.querySeries(); } - async querySeries() { - await this._init(); - this.metadata = await this._getMetadata(_.get(_.get(this.url, this.queryMode), "metadata")); - this.Series = await this._getSeries(); + for (let i = 0; i < _.toArray(this.Series).length; i++) { + const singleSeries: Series = _.get(this.Series, i) as Series; + await this.renderSpecificSeries(singleSeries.uid); } + } - async renderAllSeries() { - if (_.isNull(this.Series)) { - await this.querySeries(); - } - - for (let i = 0; i < _.toArray(this.Series).length; i++) { - const singleSeries: Series = _.get(this.Series, i) as Series; - await this.renderSpecificSeries(singleSeries.uid); - } + async renderSpecificSeries(seriesInstanceUID: string) { + if (_.isUndefined(this.Series)) { + await this.querySeries(); } - async renderSpecificSeries(seriesInstanceUID: string) { - if (_.isNull(this.Series)) { - await this.querySeries(); - } - - const seriesUidValueSet: string[] = []; - _.forEach(this.Series, (singleSeries) => { - seriesUidValueSet.push(singleSeries.uid); - }); - - if (!(_.includes(seriesUidValueSet, seriesInstanceUID))) { - console.log(`此 seriesInstanceUID: ${seriesInstanceUID} 不存在於此 StudyInstanceUID 之中。`); - } - - for (let i = 0; i < _.toArray(this.Series).length; i++) { - const singleSeries: Series = _.get(this.Series, i) as Series; - if (_.isEqual(singleSeries.uid, seriesInstanceUID)) { - const tempObject = await this._getSpecificSeries(seriesInstanceUID); - _.set(this.Series as object, i, tempObject); - } - } + const seriesUidValueSet: string[] = []; + if (!_.isUndefined(this.Series)) { + _.forEach(this.Series, (singleSeries) => { + seriesUidValueSet.push((singleSeries as Series).uid); + }); } - async _getSpecificSeries(seriesInstanceUID: string) { - let result; - - for (let i = 0; i < _.toArray(this.Series).length; i++) { - const singleSeries: Series = _.get(this.Series, i) as Series; - if (_.isEqual(singleSeries.uid, seriesInstanceUID)) { - const tempObject = new Series(singleSeries.parameter, singleSeries.queryMode, singleSeries.uid); - const isRenderInstances = true; - await tempObject.init(isRenderInstances); - result = tempObject; - } - } - - return result; + if (!_.includes(seriesUidValueSet, seriesInstanceUID)) { + console.log( + `此 seriesInstanceUID: ${seriesInstanceUID} 不存在於此 StudyInstanceUID 之中。` + ); } - async _init() { - await this._validateQueryMode(); - await this._replaceUrlParameter(); + for (let i = 0; i < _.toArray(this.Series).length; i++) { + const singleSeries: Series = _.get(this.Series, i) as Series; + if (_.isEqual(singleSeries.uid, seriesInstanceUID)) { + const tempObject = await this._getSpecificSeries(seriesInstanceUID); + _.set(this.Series as object, i, tempObject); + } } - - async _getSeries() { - const result = []; - - for (let i = 0; i < _.toArray(this.metadata).length; i++) { - const singleSeriesMetadata = _.get(this.metadata, i); - - let tempObject; - - if (_.has(singleSeriesMetadata, this.codeOfSeriesInstanceUID)) { - tempObject = new Series(this.parameter, this.queryMode, _.toString(_.first(_.get(_.get(singleSeriesMetadata, this.codeOfSeriesInstanceUID), "Value")))); - await tempObject.init(); - } else { - tempObject = `這個 Series 沒有 ${this.codeOfSeriesInstanceUID}`; - } - - result.push(_.cloneDeep(JSON.parse(JSON.stringify(tempObject)))); - } - return result; + } + + async _getSpecificSeries(seriesInstanceUID: string) { + let result; + + for (let i = 0; i < _.toArray(this.Series).length; i++) { + const singleSeries: Series = _.get(this.Series, i) as Series; + if (_.isEqual(singleSeries.uid, seriesInstanceUID)) { + const tempObject = new Series( + singleSeries.parameter, + singleSeries.queryMode, + singleSeries.uid + ); + const isRenderInstances = true; + await tempObject.init(isRenderInstances); + result = tempObject; + } } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - async _validateQueryMode() { - const queryModeValueSet = _.keys(this.url); - if (!(_.includes(queryModeValueSet, this.queryMode))) { - console.log(`查詢模式必須是 ${_.toString(queryModeValueSet)}`); - } + return result; + } + + async _init() { + await this._validateQueryMode(); + await this._replaceUrlParameter(); + } + + async _getSeries(): Promise { + const result: Series[] = []; + + for (let i = 0; i < _.toArray(this.metadata).length; i++) { + const singleSeriesMetadata = _.get(this.metadata, i); + + if (_.has(singleSeriesMetadata, this.codeOfSeriesInstanceUID)) { + const tempObject = new Series( + this.parameter, + this.queryMode, + _.toString( + _.first( + _.get( + _.get(singleSeriesMetadata, this.codeOfSeriesInstanceUID), + "Value" + ) + ) + ) + ); + await tempObject.init(); + result.push(_.cloneDeep(JSON.parse(JSON.stringify(tempObject)))); + } } + return result; + } - async _replaceUrlParameter() { - _.forEach(_.get(this.url, this.queryMode), (urlTemplate, key) => { - _.forEach(this.parameter, (valueOfParameter, keyOfParameter) => { - urlTemplate = _.replace(urlTemplate, keyOfParameter, valueOfParameter); - }); - _.set(_.get(this.url, this.queryMode), key, urlTemplate); - }); + async _validateQueryMode() { + const queryModeValueSet = _.keys(this.url); + if (!_.includes(queryModeValueSet, this.queryMode)) { + console.log(`查詢模式必須是 ${_.toString(queryModeValueSet)}`); } - - async _getMetadata(metadataURL: string) { - return await this._getJsonResponseFromURL(metadataURL); + } + + async _replaceUrlParameter() { + _.forEach(_.get(this.url, this.queryMode), (urlTemplate, key) => { + _.forEach(this.parameter, (valueOfParameter, keyOfParameter) => { + urlTemplate = _.replace(urlTemplate, keyOfParameter, valueOfParameter); + }); + _.set(_.get(this.url, this.queryMode), key, urlTemplate); + }); + } + + async _getMetadata(metadataURL: string) { + return await this._getJsonResponseFromURL(metadataURL); + } + + async _getJsonResponseFromURL(inputUrl: string) { + let result; + let response; + + if (this.isUseToken) { + await axios({ + method: "get", + url: inputUrl, + headers: this.tokenObject as AxiosRequestHeaders, + }) + .then((res) => { + response = _.cloneDeep(res.data); + }) + .catch((error) => { + console.log(error); + }); + } else { + await axios({ + method: "get", + url: inputUrl, + }) + .then((res) => { + response = _.cloneDeep(res.data); + }) + .catch((error) => { + console.log(error); + }); } - async _getJsonResponseFromURL(inputUrl: string) { - let result; - let response; - - if (this.isUseToken) { - await axios({ - method: "get", - url: inputUrl, - headers: this.tokenObject as AxiosRequestHeaders - }).then( - (res) => { - response = _.cloneDeep(res.data); - } - ).catch( - (error) => { - console.log(error); - } - ) - } else { - await axios({ - method: "get", - url: inputUrl, - }).then( - (res) => { - response = _.cloneDeep(res.data); - } - ).catch( - (error) => { - console.log(error); - } - ) - } + result = _.cloneDeep(response); - result = _.cloneDeep(response); - - return result; - } + return result; + } } -export default Study \ No newline at end of file +export default Study; diff --git a/src/config/AllowProtocol.config.ts b/src/config/AllowProtocol.config.ts index e0c43be..33e7f53 100644 --- a/src/config/AllowProtocol.config.ts +++ b/src/config/AllowProtocol.config.ts @@ -1,4 +1,4 @@ export default { - "http": "http:", - "https": "https:" -} \ No newline at end of file + http: "http:", + https: "https:", +}; diff --git a/src/config/QueryMode.config.ts b/src/config/QueryMode.config.ts index a77aee6..dc7fb44 100644 --- a/src/config/QueryMode.config.ts +++ b/src/config/QueryMode.config.ts @@ -1,4 +1,4 @@ export default { - "rs" : "rs", - "uri" : "uri" -} \ No newline at end of file + rs: "rs", + uri: "uri", +}; diff --git a/src/config/WADOParameter.config.ts b/src/config/WADOParameter.config.ts index 15bb4f2..7d4aa43 100644 --- a/src/config/WADOParameter.config.ts +++ b/src/config/WADOParameter.config.ts @@ -1,15 +1,14 @@ export default { - "Patient": { - "StudyInstanceUID": "0020000D" - }, - "Study": { - "SeriesInstanceUID": "0020000E" - }, - "Series": { - "SOPInstanceUID": "00080018" - }, - "Instance": { - "NumberOfFrames": "00280008" - } -} - + Patient: { + StudyInstanceUID: "0020000D", + }, + Study: { + SeriesInstanceUID: "0020000E", + }, + Series: { + SOPInstanceUID: "00080018", + }, + Instance: { + NumberOfFrames: "00280008", + }, +}; diff --git a/src/config/WADORSStructure.config.ts b/src/config/WADORSStructure.config.ts index 1ad064e..12e954e 100644 --- a/src/config/WADORSStructure.config.ts +++ b/src/config/WADORSStructure.config.ts @@ -1,27 +1,30 @@ export default { - "Description": { - "{s}": "ServerURL", - "{study}": "StudyInstanceUID", - "{series}": "SeriesInstanceUID", - "{instance}": "SOPInstanceUID", - "{frames}": "NumberOfFrames" - }, - "Study": { - "EntireURL": "{s}/studies/{study}", - "RenderedURL": "{s}/studies/{study}/rendered", - "MetadataURL": "{s}/studies/{study}/series" - }, - "Series": { - "EntireURL": "{s}/studies/{study}/series/{series}", - "RenderedURL": "{s}/studies/{study}/series/{series}/rendered", - "MetadataURL": "{s}/studies/{study}/series/{series}/metadata" - }, - "Instance": { - "EntireURL": "{s}/studies/{study}/series/{series}/instances/{instance}", - "RenderedURL": "{s}/studies/{study}/series/{series}/instances/{instance}/rendered", - "MetadataURL": "{s}/studies/{study}/series/{series}/instances/{instance}/metadata" - }, - "Frame": { - "RenderedURL": "{s}/studies/{study}/series/{series}/instances/{instance}/frames/{frames}/rendered" - } -} \ No newline at end of file + Description: { + "{s}": "ServerURL", + "{study}": "StudyInstanceUID", + "{series}": "SeriesInstanceUID", + "{instance}": "SOPInstanceUID", + "{frames}": "NumberOfFrames", + }, + Study: { + EntireURL: "{s}/studies/{study}", + RenderedURL: "{s}/studies/{study}/rendered", + MetadataURL: "{s}/studies/{study}/series", + }, + Series: { + EntireURL: "{s}/studies/{study}/series/{series}", + RenderedURL: "{s}/studies/{study}/series/{series}/rendered", + MetadataURL: "{s}/studies/{study}/series/{series}/metadata", + }, + Instance: { + EntireURL: "{s}/studies/{study}/series/{series}/instances/{instance}", + RenderedURL: + "{s}/studies/{study}/series/{series}/instances/{instance}/rendered", + MetadataURL: + "{s}/studies/{study}/series/{series}/instances/{instance}/metadata", + }, + Frame: { + RenderedURL: + "{s}/studies/{study}/series/{series}/instances/{instance}/frames/{frames}/rendered", + }, +}; diff --git a/src/config/WADOURIStructure.config.ts b/src/config/WADOURIStructure.config.ts index 38bf8d9..78e1b9e 100644 --- a/src/config/WADOURIStructure.config.ts +++ b/src/config/WADOURIStructure.config.ts @@ -1,25 +1,27 @@ export default { - "Description": { - "{s}": "ServerURL", - "{study}": "StudyInstanceUID", - "{series}": "SeriesInstanceUID", - "{instance}": "SOPInstanceUID", - "{frames}": "NumberOfFrames" - }, - "Study": { - "EntireURL": "{s}/wado?requestType=WADO/&studyUID={study}", - "MetadataURL": "{s}/studies/{study}/series" - }, - "Series": { - "EntireURL": "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}", - "MetadataURL": "{s}/studies/{study}/series/{series}/metadata" - }, - "Instance": { - "EntireURL": "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}&objectUID={instance}", - "MetadataURL": "{s}/studies/{study}/series/{series}/instances/{instance}/metadata" - }, - "Frame": { - "RenderedURL": "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}&objectUID={instance}&frameNumber={frames}&contentType=image/jpeg" - } -} - + Description: { + "{s}": "ServerURL", + "{study}": "StudyInstanceUID", + "{series}": "SeriesInstanceUID", + "{instance}": "SOPInstanceUID", + "{frames}": "NumberOfFrames", + }, + Study: { + EntireURL: "{s}/wado?requestType=WADO/&studyUID={study}", + MetadataURL: "{s}/studies/{study}/series", + }, + Series: { + EntireURL: "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}", + MetadataURL: "{s}/studies/{study}/series/{series}/metadata", + }, + Instance: { + EntireURL: + "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}&objectUID={instance}", + MetadataURL: + "{s}/studies/{study}/series/{series}/instances/{instance}/metadata", + }, + Frame: { + RenderedURL: + "{s}/wado?requestType=WADO/&studyUID={study}&seriesUID={series}&objectUID={instance}&frameNumber={frames}&contentType=image/jpeg", + }, +}; diff --git a/src/type/parameterType/FrameParameterType.ts b/src/type/parameterType/FrameParameterType.ts new file mode 100644 index 0000000..6df31ac --- /dev/null +++ b/src/type/parameterType/FrameParameterType.ts @@ -0,0 +1,7 @@ +export type FrameParameterType = { + "{s}": string; + "{study}": string; + "{series}": string; + "{instance}": string; + "{frames}": string; +}; diff --git a/src/type/parameterType/InstanceParameterType.ts b/src/type/parameterType/InstanceParameterType.ts new file mode 100644 index 0000000..2b16333 --- /dev/null +++ b/src/type/parameterType/InstanceParameterType.ts @@ -0,0 +1,6 @@ +export type InstanceParameterType = { + "{s}": string; + "{study}": string; + "{series}": string; + "{instance}": string; +}; diff --git a/src/type/parameterType/SeriesParameterType.ts b/src/type/parameterType/SeriesParameterType.ts new file mode 100644 index 0000000..9ea56a4 --- /dev/null +++ b/src/type/parameterType/SeriesParameterType.ts @@ -0,0 +1,5 @@ +export type SeriesParameterType = { + "{s}": string; + "{study}": string; + "{series}": string; +}; diff --git a/src/type/parameterType/StudyParameterType.ts b/src/type/parameterType/StudyParameterType.ts new file mode 100644 index 0000000..d5d5912 --- /dev/null +++ b/src/type/parameterType/StudyParameterType.ts @@ -0,0 +1,4 @@ +export type StudyParameterType = { + "{s}": string; + "{study}": string; +};