Skip to content

Commit

Permalink
feat: add API of query for series in a study
Browse files Browse the repository at this point in the history
- Add `/dicom-web/studies/{studyUID}/series` QIDO-RS

# API Docs
- API Docs add tags
- API Docs add `/dicom-web/studies/{studyUID}/series` of QIDO-RS
  • Loading branch information
Chinlinlee committed May 3, 2022
1 parent c80d5d0 commit a2eb251
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 2 deletions.
4 changes: 3 additions & 1 deletion api/dicom-web/controller/QIDO-RS/queryAllStudies.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ const {
* @openapi
* /dicom-web/studies:
* get:
* tags:
* - QIDO-RS
* description: Query for studies
* parameters:
* - $ref: "#/components/parameters/StudyDate"
Expand Down Expand Up @@ -64,7 +66,7 @@ async function getStudyDicomJson(iQuery, limit, skip, req) {
let result = {
data: '',
status: false
}
};
let protocol = req.secure ? "https" : "http";
let retrieveUrl = `${protocol}://${req.headers.host}/${process.env.DICOMWEB_API}/studies`;
try {
Expand Down
113 changes: 113 additions & 0 deletions api/dicom-web/controller/QIDO-RS/queryStudies-Series.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
const _ = require('lodash');
const mongoose = require('mongoose');
const moment = require('moment');
const {
convertAllQueryToDICOMTag,
convertRequestQueryToMongoQuery,
getStudyLevelFields,
getSeriesLevelFields
} = require('./service/QIDO-RS.service');
const {
logger
} = require('../../../../utils/log');

/**
* @openapi
* /dicom-web/studies/{studyUID}/series:
* get:
* tags:
* - QIDO-RS
* description: Query for studies
* parameters:
* - $ref: "#/components/parameters/studyUID"
* - $ref: "#/components/parameters/StudyDate"
* - $ref: "#/components/parameters/StudyTime"
* - $ref: "#/components/parameters/AccessionNumber"
* - $ref: "#/components/parameters/ModalitiesInStudy"
* - $ref: "#/components/parameters/ReferringPhysicianName"
* - $ref: "#/components/parameters/PatientName"
* - $ref: "#/components/parameters/PatientID"
* - $ref: "#/components/parameters/StudyID"
* - $ref: "#/components/parameters/Modality"
* - $ref: "#/components/parameters/SeriesNumber"
* responses:
* 200:
* description: Query successfully
*/

/**
*
* @param {import('http').IncomingMessage} req
* @param {import('http').ServerResponse} res
*/
module.exports = async function (req, res) {
try {
let limit = req.query.limit || 100;
let skip = req.query.offset || 0;
delete req.query["limit"];
delete req.query["offset"];
let query = _.cloneDeep(req.query);
let queryKeys = Object.keys(query).sort();
for (let i = 0; i < queryKeys.length; i++) {
let queryKey = queryKeys[i];
if (!query[queryKey]) delete query[queryKey];
}

let dicomTagQuery = convertAllQueryToDICOMTag(query);
let studiesJson = await getStudyDicomJson(dicomTagQuery, limit, skip, req);
res.writeHead(200, {
"Content-Type": "application/dicom+json"
});
res.end(JSON.stringify(studiesJson.data));
} catch (e) {
let errorStr = JSON.stringify(e, Object.getOwnPropertyNames(e));
logger.error(`[QIDO-RS] [Error: ${errorStr}]`);
}
}

async function getStudyDicomJson(iQuery, limit, skip, req) {
logger.info(`[QIDO-RS] [Query series Level, Study UID: ${req.params.studyUID}]`);
let result = {
data: '',
status: false
};
let protocol = req.secure ? "https" : "http";
let retrieveUrl = `${protocol}://${req.headers.host}/${process.env.DICOMWEB_API}/studies`;
try {
iQuery = await convertRequestQueryToMongoQuery(iQuery);
let query = {
...req.params,
...iQuery.$match
}
logger.info(`[QIDO-RS] [Query for MongoDB: ${JSON.stringify(query)}]`);
let studyFields = getStudyLevelFields();
let seriesFields = getSeriesLevelFields();
let docs = await mongoose.model("dicomSeries")
.find(query, {
...studyFields,
...seriesFields
})
.limit(limit)
.skip(skip)
.exec();
result.data = docs.map(v => {
let obj = v.toObject();
delete obj._id;
delete obj.id;
obj["00801190"] = {
vr: "UR",
Value: [
`${retrieveUrl}/${obj["0020000D"]["Value"][0]}/series/${obj["0020000E"]["Value"][0]}`
]
};
return obj;
});
result.status = true;
return result;
} catch (e) {
console.error("get Series DICOM error", e);
result.data = e;
result.status = false;
return result;
}
}
2 changes: 2 additions & 0 deletions api/dicom-web/controller/STOW-RS/storeInstance.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ const bigValueTags = ["52009230", "00480200"];
* @openapi
* /dicom-web/studies:
* post:
* tags:
* - STOW-RS
* description: store DICOM instance
* requestBody:
* content:
Expand Down
3 changes: 2 additions & 1 deletion api/dicom-web/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ const { app } = require('../../app');

//#region QIDO-RS

app.get('/studies' , require('./controller/QIDO-RS/queryAllStudies'));
app.get("/studies" , require("./controller/QIDO-RS/queryAllStudies"));
app.get("/studies/:studyUID/series", require("./controller/QIDO-RS/queryStudies-Series"));

//#endregion

Expand Down
18 changes: 18 additions & 0 deletions docs/swagger/parameters/studies-series.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
components:
parameters:
"studyUID":
name: "studyUID"
in: path
required: true
schema:
type: string
"Modality":
name: "00080060"
in: query
schema:
type: string
"SeriesNumber":
name: "00200011"
in: query
schema:
type: string

0 comments on commit a2eb251

Please sign in to comment.