From bf7919d825db353096e4eaeee356b7a792e9f79d Mon Sep 17 00:00:00 2001 From: chin Date: Sun, 22 May 2022 22:48:58 +0800 Subject: [PATCH] feat: retrieve study's rendered instances - fix the /studies can access /dicom-web/studies > Use new polka object to creat router, and import to > original polka object --- .../WADO-RS/retrieveRenderedStudy.js | 65 +++++++++++++++++++ api/dicom-web/index.js | 9 ++- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 api/dicom-web/controller/WADO-RS/retrieveRenderedStudy.js diff --git a/api/dicom-web/controller/WADO-RS/retrieveRenderedStudy.js b/api/dicom-web/controller/WADO-RS/retrieveRenderedStudy.js new file mode 100644 index 00000000..aef86147 --- /dev/null +++ b/api/dicom-web/controller/WADO-RS/retrieveRenderedStudy.js @@ -0,0 +1,65 @@ +const _ = require("lodash"); +const wadoService = require("./service/WADO-RS.service"); +const renderedService = require("./service/rendered.service"); +const { MultipartWriter } = require("../../../../utils/multipartWriter"); +const errorResponse = require("../../../../utils/errorResponse/errorResponseMessage"); +const { logger } = require("../../../../utils/log"); + +/** + * + * @param {import("http").incomingMessage} req + * @param {import("http").ServerResponse} res + * @returns + */ +module.exports = async function(req, res) { + let headerAccept = _.get(req.headers, "accept", ""); + logger.info(`[WADO-RS] [Get study's rendered instances, study UID: ${req.params.studyUID}]`); + if (!headerAccept == `multipart/related; type="image/jpeg"`) { + let badRequestMessage = errorResponse.getBadRequestErrorMessage(`header accept only allow \`multipart/related; type="image/jpeg"\`, exception : ${headerAccept}`); + res.writeHead(badRequestMessage.HttpStatus, { + "Content-Type": "application/dicom+json" + }); + return res.end(JSON.stringify(badRequestMessage)); + } + + try { + let instancesInStudy = await wadoService.getStudyImagesPath(req.params); + + if (instancesInStudy) { + let multipartWriter = new MultipartWriter([], res, req); + + for(let imagePathObj of instancesInStudy) { + let instanceFramesObj = await renderedService.getInstanceFrameObj(imagePathObj); + let dicomNumberOfFrames = _.get(instanceFramesObj, "00280008.Value.0", 1); + dicomNumberOfFrames = parseInt(dicomNumberOfFrames); + await writeStudyRenderedImages(req, dicomNumberOfFrames, instanceFramesObj, multipartWriter); + } + multipartWriter.writeFinalBoundary(); + } + + return res.end(); + } catch(e) { + res.writeHead(500, { + "Content-Type": "application/dicom+json" + }); + res.end(JSON.stringify(e)); + } +}; + +async function writeStudyRenderedImages(req, dicomNumberOfFrames, instanceFramesObj, multipartWriter) { + try { + for (let i = 0 ; i < dicomNumberOfFrames; i++) { + let transferSyntax = _.get(instanceFramesObj, "00020010.Value.0"); + _.set(req, "params.frameNumber", i+1); + let postProcessResult = await renderedService.postProcessFrameImage(req, instanceFramesObj, transferSyntax); + let buffer = postProcessResult.magick.toBuffer(); + multipartWriter.writeBuffer(buffer, { + "Content-Type": "image/jpeg", + "Content-Location": `/dicom-web/studies/${instanceFramesObj.studyUID}/series/${instanceFramesObj.seriesUID}/instances/${instanceFramesObj.instanceUID}/frames/${i+1}/rendered` + }); + } + } catch(e) { + console.error(e); + throw e; + } +} \ No newline at end of file diff --git a/api/dicom-web/index.js b/api/dicom-web/index.js index 5fde7493..eb9cf365 100644 --- a/api/dicom-web/index.js +++ b/api/dicom-web/index.js @@ -1,5 +1,6 @@ const Joi = require("joi"); -const { app } = require("../../app"); +const polka = require("polka"); +const app = polka(); const { validateParams } = require("../validator"); //#region QIDO-RS @@ -296,6 +297,12 @@ const renderedQueryValidation = { }) }; +app.get( + "/studies/:studyUID/rendered", + validateParams(renderedQueryValidation, "query", { allowUnknown: false }), + require("./controller/WADO-RS/retrieveRenderedStudy") +); + app.get( "/studies/:studyUID/series/:seriesUID/instances/:instanceUID/frames/:frameNumber/rendered", validateParams({